一、service工作模式-ClusterIP
可以实现跨主机服务发现及负载均衡
1、集群内部之间可以互相访问
[wjjk8s@server1 manifest]$ kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx-deployment-d46f5678b-kk699 1/1 Running 0 26s
nginx-deployment-d46f5678b-t64jn 1/1 Running 0 26s
[wjjk8s@server1 manifest]$ kubectl run test -it --image=busyboxplus --image-pull-policy='IfNotPresent'
If you don't see a command prompt, try pressing enter.
/ # curl 10.244.1.51 #可以直接访问,整个集群的主机都可以相互访问
2、使用service–ClusterIP来使内部主机访问pod
[wjjk8s@server1 manifest]$ kubectl explain service.spec #查看使用帮助
选择器:标签
创建service.yaml
selector:
app: nginx
[wjjk8s@server1 manifest]$ kubectl apply -f service.yaml
[wjjk8s@server1 manifest]$ kubectl describe svc myservice #类型为ClusterIP,只限于集群内部访问
Type: ClusterIP
[wjjk8s@server1 manifest]$ kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 10d
myservice ClusterIP 10.110.241.240 <none> 80/TCP 9s
[wjjk8s@server1 manifest]$ kubectl attach test -it #进入容器,成功访问
/ # curl 10.102.1.156
外部主机:
[root@server2 ~]# iptables -t nat -nL | grep 10.102.1.156
KUBE-MARK-MASQ tcp -- !10.244.0.0/16 10.102.1.156 /* default/myservice: cluster IP */ tcp dpt:80
KUBE-SVC-DN4K6DJYBW27OJYO tcp -- 0.0.0.0/0 10.102.1.156 /* default/myservice: cluster IP */ tcp dpt:80
3、通过lvs实现pod负载均衡
(1)安装ipvsadm
在集群node节点server1/2/4:
[root@server1 ~]# yum install -y ipvsadm
[root@server2 ~]# yum install -y ipvsadm
[root@server4 ~]# yum install -y ipvsadm
(2)刷新,使用lvs模式:在master节点,设置集群的 lvs模式
server1:
[wjjk8s@server1 ~]$ kubectl -n kube-system edit cm kube-proxy #将模式改为ipvs即可
configmap/kube-proxy edited
[wjjk8s@server1 ~]$ kubectl -n kube-system get pod | grep kube-proxy | awk '{system ("kubectl delete pod "$1" -n kube-system")}'
[wjjk8s@server1 ~]$ kubectl -n kube-system get pod | grep kube-proxy #再次查看成功变更
(3)lvs策略自动出现
[root@server2 ~]# ipvsadm -l
(4)删除server.yaml后iptables策略不存在,lvs创建后iptables策略也不重新生成了,但是lvs策略更新
[root@server2 ~]# ipvsadm -ln
(5)将副本改为4个
[wjjk8s@server1 manifest]$ kubectl describe svc myservice #查看会自动做服务发现
但是发现lvs负载均衡策略没有更改,除非删除后重新启动apply -f service.yaml
[wjjk8s@server1 manifest]$ kubectl delete -f service.yaml
service "myservice" deleted
[wjjk8s@server1 manifest]$ kubectl apply -f service.yaml
service/myservice created
[root@server2 ~]# ipvsadm -ln
TCP 10.106.77.77:80 rr
-> 10.244.1.57:80 Masq 1 0 0
-> 10.244.1.58:80 Masq 1 0 0
-> 10.244.2.67:80 Masq 1 0 0
-> 10.244.2.68:80 Masq 1 0 0
二、service工作模式-NodePort类型
1、更改类型
[wjjk8s@server1 manifest]$ kubectl edit svc myservice #运行时更改
外部网页可直接访问
[wjjk8s@server1 manifest]$ vim service.yaml #删除后直接文件更改
2、kubernetes提供了一个DNS插件给service,可以通过解析的方式访问
[wjjk8s@server1 manifest]$ kubectl get svc #改回ClusterIP
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 11d
myservice ClusterIP 10.111.100.242 <none> 80/TCP 6s
[wjjk8s@server1 manifest]$ kubectl attach test -it
/ # nslookup myservice
/ # nslookup myservice.default.svc.cluster.local
/ # curl myservice.default.svc.cluster.local
三、service工作模式-LoadBalancer模式
[wjjk8s@server1 manifest]$ vim service.yaml
[wjjk8s@server1 manifest]$ kubectl apply -f service.yaml
[wjjk8s@server1 manifest]$ kubectl get svc
外部网络页面成功访问
四、service工作模式-ExternalName模式
1、随机分配ip
[wjjk8s@server1 manifest]$ vim exter.yaml
spec:
type: ExternalName
externalName: reg.westos.org
[wjjk8s@server1 manifest]$ kubectl apply -f exter.yaml
[wjjk8s@server1 manifest]$ kubectl get svc
myservice ExternalName <none> reg.westos.org <none> 11s
#service和pod无关,没有分配ip,只是通过cname方式添加了一条记录
外部更改地址后集群内部不需要任何更改,还是ping myservice.default.svc.cluster.local
2、service允许为其分配一个公有IP
[wjjk8s@server1 manifest]$ vim exter.yaml
[wjjk8s@server1 manifest]$ kubectl apply -f exter.yaml
[wjjk8s@server1 manifest]$ kubectl get svc
访问指定ip可以访问到集群的pod中
[root@server2 ~]# curl 172.25.1.100