K8s集群核心概念:Service
我们在之前的学习过程中遇到一个问题,就是如果Pod被误删除,那么Controller重新拉起一个新的Pod时,我们发现PodIP地址是变化着的,我们访问必须更新IP地址。
这样对于大量的Pod运行应用来说,我们对Pod完全无法控制的,因此在K8s集群中我们引入另一个概念Service。
学习目标:
了解Service是什么?
了解Service作用
了解Service类型
了解Service参数
掌握Service创建方法
掌握Service删除方法
课程内容:
Service介绍:
不是实体服务,实体服务有自己的守护进程、有自己运行的配置文件,有自己运行的数据文件。
是一条iptables或者ipvs的转发规则。
Service仅仅是一个服务。
Service作用:
通过Service为Pod客户端提供访问Pod方法,即客户端访问Pod入口。
Service通过Pod标签与Pod进行关联的。
说明:
Pod是有自己的IP地址。PodIP地址是经常发生变化。
Service的IP地址是很少发生变化的。用户通过Service来访问Pod。通过域名进行访问。
给Pod一个标签,Service通过selector选择器来选择标签,就进行了关联。
Service类型:
ClusterIP:
默认:分配一个集群内部可以访问的虚拟IP。但是这只能在集群内的主机访问。
NodePort:
在每个Node上分配一个端口作为外部访问入口。
Loadbalance负载均衡:
工作在特定Cloud Provider上,例如:Google CloudPod、AWS、OpenStack,在云平台上。
通过这种访问来访问。
ExternalName:
表示把集群外部的服务引入到集群内部来,即实现了集群内部Pod和集群外部的服务进行通信。
Service参数:
port:访问service使用的端口
targetPort: Pod中容器使用的端口
NodePort:通过Node实现集群外网用户访问k8s集群内service(随机端口号:30000~32767)
如果手动指定应该在这个范围之内。
service创建:
Service的创建在工作中有两种方式:命令行创建;通过资源清单配置文件创建
1)通过kubectl命令行创建:
默认创建Service为ClusterIP类型:
创建Deployment类型应用:
[root@master1 ~]# kubectl create deployment nginx-app --image=nginx:latest --replicas=1
deployment.apps/nginx-app created
验证Deployment类型应用创建情况:
[root@master1 ~]# kubectl get deployment.apps
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-app 1/1 1 1 2m13s
创建Service与Deployment类型应用关联:
创建Service:
[root@master1 ~]# kubectl expose deployment.apps nginx-app --type=ClusterIP --target-port=80 --port=80
service/nginx-app exposed
说明:
expose:创建service,把pod暴露出去的意思,就是service。
deployment.apps 控制器类型
nginx-app:应用名称 也是service的名称
--type=ClusterIP: 指定Service类型,默认就是clusterIP。
--target-port=80: 暴露Pod容器当中的端口
--port=80: 指定service所对应的端口
访问Service以实现访问Pod目的:
[root@master1 ~]# kubectl get service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 3d3h
nginx NodePort 10.101.138.1 <none> 80:30831/TCP 3d2h
nginx-app ClusterIP 10.96.178.232 <none> 80/TCP 2m38s
[root@master1 ~]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 3d3h
nginx NodePort 10.101.138.1 <none> 80:30831/TCP 3d2h
nginx-app ClusterIP 10.96.178.232 <none> 80/TCP 29m
[root@master1 ~]# curl http://10.96.178.232
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
[root@master1 ~]# kubectl get endpoints
NAME ENDPOINTS AGE
kubernetes 192.168.17.146:6443 3d3h
nginx <none> 3d2h
nginx-app 10.244.189.72:80 31m
说明:
endpoints:端点
10.244.189.72:80,就是PodIP地址+Pod端口。
通过YAML资源清单文件创建:
编写用于创建Service资源清单文件:
[root@master1 ~]# cat 04_create_deployment_service_clusterip.yaml
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-app4
labels:
app: nginx
spec:
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx-app4
image: nginx:latest
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: nginx-app4
spec:
type: ClusterIP
selector:
app: nginx
ports:
- protocol: TCP
port: 80
targetPort: 80
说明:selector选择器的作用。
应用Service资源清单文件创建应用:
[root@master1 ~]# kubectl apply -f 04_create_deployment_service_clusterip.yaml
deployment.apps/nginx-app4 created
service/nginx-app4 created
[root@master1 ~]# kubectl get service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 3d3h
nginx NodePort 10.101.138.1 <none> 80:30831/TCP 3d3h
nginx-app ClusterIP 10.96.178.232 <none> 80/TCP 51m
nginx-app4 ClusterIP 10.100.97.203 <none> 80/TCP 68s
[root@master1 ~]# curl http://10.100.97.203:80
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
endpoints端点对应的是两台容器。
[root@master1 ~]# kubectl get endpoints
NAME ENDPOINTS AGE
kubernetes 192.168.17.146:6443 3d3h
nginx 10.244.189.73:80,10.244.235.136:80 3d3h
nginx-app 10.244.189.72:80 52m
nginx-app4 10.244.189.73:80,10.244.235.136:80 3m6s
Services还具备一个负载均衡的功能。
[root@master1 ~]# kubectl exec -it nginx-app4-5b9b79dc66-8hrlp bash
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
root@nginx-app4-5b9b79dc66-8hrlp:/# cd /usr/share/nginx/html
root@nginx-app4-5b9b79dc66-8hrlp:/usr/share/nginx/html# ls
50x.html index.html
root@nginx-app4-5b9b79dc66-8hrlp:/usr/share/nginx/html# echo "nginx-app4-pod2" > index.html
root@nginx-app4-5b9b79dc66-8hrlp:/usr/share/nginx/html# cat index.html
nginx-app4-pod2
root@nginx-app4-5b9b79dc66-8hrlp:/usr/share/nginx/html# exit
exit
root@nginx-app4-5b9b79dc66-nzpdx:/usr/share/nginx/html# echo "nginx-app4-pod1" > index.html
root@nginx-app4-5b9b79dc66-nzpdx:/usr/share/nginx/html# cat index.html
nginx-app4-pod1
root@nginx-app4-5b9b79dc66-nzpdx:/usr/share/nginx/html# exit
exit
[root@master1 ~]# kubectl get service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 3d4h
nginx NodePort 10.101.138.1 <none> 80:30831/TCP 3d3h
nginx-app ClusterIP 10.96.178.232 <none> 80/TCP 71m
nginx-app4 ClusterIP 10.100.97.203 <none> 80/TCP 21m
[root@master1 ~]#
[root@master1 ~]#
[root@master1 ~]#
[root@master1 ~]# curl http://10.100.97.203:80
nginx-app4-pod1
[root@master1 ~]# curl http://10.100.97.203:80
nginx-app4-pod2
[root@master1 ~]# curl http://10.100.97.203:80
nginx-app4-pod1
[root@master1 ~]# curl http://10.100.97.203:80
nginx-app4-pod2
我们连续curl,可以看到Service具有负载均衡的功能。K8s功能非常强大。
负载均衡具有权重、ip_hash等,我们再继续研究。