Skip to content

Service

1. 简介

Service用来作为Pod的服务发现和负载均衡的。 Alt text

2. 准备工作

修改Deployment中所有Pod的首页:

sh
[root@node101 ~]# kubectl get pod -n zk-dev
NAME                      READY   STATUS    RESTARTS   AGE
my-dep-59cf8c8bb7-99hwf   1/1     Running   0          73m
my-dep-59cf8c8bb7-bg746   1/1     Running   0          73m
my-dep-59cf8c8bb7-qmvfg   1/1     Running   0          55s
## 将my-dep-59cf8c8bb7-99hwf中首页设置为1111
[root@node101 ~]# kubectl exec -it my-dep-59cf8c8bb7-99hwf -n zk-dev -- /bin/bash
root@my-dep-59cf8c8bb7-99hwf:/# echo 1111 > /usr/share/nginx/html/index.html 
root@my-dep-59cf8c8bb7-99hwf:/# exit
exit
## 将my-dep-59cf8c8bb7-bg746中首页设置为2222
[root@node101 ~]# kubectl exec -it my-dep-59cf8c8bb7-bg746 -n zk-dev -- /bin/bash
root@my-dep-59cf8c8bb7-bg746:/# echo 2222 > /usr/share/nginx/html/index.html 
root@my-dep-59cf8c8bb7-bg746:/# exit
exit
## 将my-dep-59cf8c8bb7-qmvfg中首页设置为3333
[root@node101 ~]# kubectl exec -it my-dep-59cf8c8bb7-qmvfg -n zk-dev -- /bin/bash
root@my-dep-59cf8c8bb7-qmvfg:/# echo 3333 > /usr/share/nginx/html/index.html 
root@my-dep-59cf8c8bb7-qmvfg:/# exit
exit

3. 定义Service

3.1 ClusterIP模式

在集群内部访问,暴露IP和端口,默认使用的是ClusterIP模式,此外还有NodePort模式:

sh
[root@node101 ~]# kubectl expose deploy my-dep --port=8000 --target-port=80 -n zk-dev
service/my-dep exposed
## 查看定义的Service暴露的IP地址
[root@node101 ~]# kubectl get service -n zk-dev
NAME     TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
my-dep   ClusterIP   10.97.200.136   <none>        8000/TCP   55s
[root@node101 ~]# for i in {1..10}; do echo "这是第$i次: 结果是$(curl -s 10.97.200.136:8000)"; done
这是第1次: 结果是1111
这是第2次: 结果是2222
这是第3次: 结果是2222
这是第4次: 结果是1111
这是第5次: 结果是3333
这是第6次: 结果是3333
这是第7次: 结果是3333
这是第8次: 结果是3333
这是第9次: 结果是2222
这是第10次: 结果是1111

可以看到通过10.97.200.136:8000进行访问,实现了负载均衡的效果。此外Service同时也提供了域名方式访问,域名规则为服务名.名称空间名.svc,需要注意的是通过域名访问只能在Pod内部使用:

sh
[root@node101 ~]# kubectl exec -it my-dep-59cf8c8bb7-qmvfg -n zk-dev -- /bin/bash
## 域名地址为my-dep.zk-dev.svc:8000
root@my-dep-59cf8c8bb7-qmvfg:/#  for i in {1..10}; do echo "\350\277\231\346\230\257\347\254\254$i\346\254\241: \347\273\223\346\236
\234\346\230\257$(curl -s my-dep.zk-dev.svc:8000)"; done
这是第1次: 结果是1111
这是第2次: 结果是2222
这是第3次: 结果是3333
这是第4次: 结果是3333
这是第5次: 结果是2222
这是第6次: 结果是3333
这是第7次: 结果是1111
这是第8次: 结果是1111
这是第9次: 结果是3333
这是第10次: 结果是1111
## 但如果是在外面机器节点上直接执行是不行的
[root@node101 ~]# curl  my-dep.zk-dev.svc:8000
curl: (6) Could not resolve host: my-dep.zk-dev.svc

3.2 NodePort模式

所谓NodePort模式就是在每一个Node节点的相关Pod上面都会开一个端口(范围是:30000-32767),用来暴露Service服务给外部访问:

sh
[root@node101 ~]# kubectl delete svc my-dep -n zk-dev
service "my-dep" deleted
[root@node101 ~]# kubectl expose deploy my-dep --port=8000 --target-port=80 --type=NodePort -n zk-dev
service/my-dep exposed
[root@node101 ~]# kubectl get svc -n zk-dev
NAME     TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
my-dep   NodePort   10.102.234.76   <none>        8000:31470/TCP   5s

直接通过公网访问,node101,node102,node103都可以通过31470访问:
Alt text

4. 查看Service

已经暴露的Service,可以查看信息:

sh
[root@node101 ~]# kubectl get service -A
NAMESPACE              NAME                                   TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)                  AGE
default                kubernetes                             ClusterIP   10.96.0.1        <none>        443/TCP                  18d
kube-system            kube-dns                               ClusterIP   10.96.0.10       <none>        53/UDP,53/TCP,9153/TCP   18d
kubernetes-dashboard   kubernetes-dashboard-api               ClusterIP   10.100.203.92    <none>        8000/TCP                 9d
kubernetes-dashboard   kubernetes-dashboard-auth              ClusterIP   10.104.68.46     <none>        8000/TCP                 9d
kubernetes-dashboard   kubernetes-dashboard-kong-proxy        ClusterIP   10.109.148.178   <none>        443/TCP                  9d
kubernetes-dashboard   kubernetes-dashboard-metrics-scraper   ClusterIP   10.101.150.36    <none>        8000/TCP                 9d
kubernetes-dashboard   kubernetes-dashboard-web               ClusterIP   10.96.125.245    <none>        8000/TCP                 9d
zk-dev                 my-dep                                 ClusterIP   10.97.200.136    <none>        8000/TCP                 176m
## 简介service为svc
[root@node101 ~]# kubectl get svc -n zk-dev
NAME     TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
my-dep   ClusterIP   10.97.200.136   <none>        8000/TCP   176m

5. 编辑Service

5.1 使用编辑命令

使用kubectl edit命令直接编辑Service的YAML配置,保存后会自动应用更新:

sh
[root@node101 ~]# kubectl get svc -n zk-dev
NAME     TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
my-dep   NodePort   10.102.234.76   <none>        8000:31470/TCP   2d19h

5.2 使用YAML文件更新