Service
1. 简介
Service用来作为Pod的服务发现和负载均衡的。
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访问:
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