赞
踩
目录
外部访问service的第三种方式:ExternalName。
Service可以看作是一组提供相同服务的Pod对外的访问接口。借助Service,应
用可以方便地实现服务发现和负载均衡。
Service默认只支持4层负载均衡能力,没有7层功能。(可以通过Ingress实现)
Service的类型:
- kubectl get pod
- kubectl get pod -n kube-system
- #查看状态是否就绪
-
- kubectl get all
- kubectl delete svc liveness-http
- iptables -t nat -nL
- kubectl get svc
开启kube-proxy的ipvs模式:
- yum install -y ipvsadm
- ipvsadm -ln
- #查看策略,目前是空的
-
- kubectl -n kube-system get pod
- kubectl -n kube-system get svc
-
- kubectl -n kube-system get cm
- #所有服务的配置都存在cm里,里面有一个kube-proxy
-
- kubectl -n kube-system edit cm kube-proxy
- #编辑kube-proxy:【mode: "ipvs"】
- kubectl -n kube-system get pod
-
- kubectl get pod -n kube-system |grep kube-proxy | awk '{system("kubectl delete pod "$1" -n kube-system")}'
- //更新kube-proxy podservice【原理是删除pod,控制器自动创建一份,类似于刷新】
-
- kubectl -n kube-system get pod
- #运行可以看到已经生效
- ipvsadm -ln
-
- lsmod | grep ip_vs
- 内核里的ip_vs模块
server3:
lsmod | grep ip_vs
server2:
- ip addr
- 换成ipvs模式之后,系统会出现kube-ipvs0接口,集群内每隔节点都有,会出现相应的vip
-
- kubectl get pod -n kube-system
- 可以看到在kube-system 里面有两个coredns
-
- kubectl get pod -n kube-system -o wide
- #出现的两个coredns其实就是dns pod
-
- kubectl -n kube-system get svc
- 有一个svc的ip地址
-
- kubectl -n kube-system describe svc kube-dns
- 可以看到有两个Endpoints
- ipvsadm -ln
- mkdir service
- cd service/
- vim clusterip.yml
- cd ..
- cd pod/
- ls
- kubectl apply -f deploy.yml
-
- kubectl get pod
- 用deploy控制器创建3个pod
-
- kubectl get pod --show-labels
- 可以看到标签是myapp
-
- cd ..
- cd service/
- kubectl apply -f clusterip.yml
-
- kubectl get svc
- 可以看到创建的svc获得的集群地址10.96.125.96
-
- ip addr
- 刚获取的集群地址会出现在kube-ipvs0
-
- ipvsadm -ln
- 也会创建出相应的策略【10.96.125.96地址地下有三个pod】
- kubectl get pod
-
- kubectl get pod --show-labels
- 是通过标签匹配的
-
- kubectl describe svc web-service
- 【service选择的后端是通过标签匹配的】
- kubectl get pod -o wide
注意: ClusterIP仅限集群内部
- curl 10.96.125.96 #访问集群地址
-
- curl 10.96.125.96/hostname.html
- #此命令多执行几次可以看到是均衡的【轮叫,不是随机均衡的】
-
- ipvsadm -ln
- 可以看到有调度过程
可以通过dns来访问
- kubectl get pod -n kube-system
-
- kubectl get svc -n kube-system
- #dns的ip地址是由svc来提供的
-
- kubectl run -it demo --image=busyboxplus --restart=Never
-
- --/ # curl 10.96.125.96
- 在集群内部可以访问到
-
- --/ # curl 10.96.125.96/hostname.html
- 多执行几次可以发现是负载均衡的
-
- --/ # curl web-service
- 不知道ip的情况下,可以访问服务
-
- --/ # curl web-service/hostname.html
- 多执行几次可以发现是负载均衡的
-
- --/ # nslookup web-service
- 直接访问服务名字是因为有解析的
-
- --/ # cat /etc/resolv.conf
- 可以看到dns的svc
- kubectl delete pod demo #回收
- kubectl edit svc web-service
- kubectl delete -f clusterip.yml
- vim clusterip.yml 【clusterIP: None】
- kubectl apply -f clusterip.yml
-
- kubectl get svc
- 可以看到服务没有ip
-
- kubectl describe svc web-service
- #服务后边还有后端
-
- kubectl run -it demo --image=busyboxplus --restart=Never
- --/ # curl web-service
- 直接访问svc名称也可以【完全通过dns来实现的】
-
- --/ # curl web-service/hostname.html
- 负载均衡
- --/ # cat /etc/resolv.conf
-
- kubectl delete pod demo
- yum install -y bind-utils
-
- dig -t A web-service.default.svc.cluster.local. @10.96.0.10
- #web-service的A记录 service是10.96.0.10
-
- kubectl -n kube-system get svc
- kubectl -n kube-system get pod
- kubectl -n kube-system get pod -o wide
-
- dig -t A web-service.default.svc.cluster.local. @10.244.0.4
- 【访问的svc地址其实是负载到后端的两个pod上】
-
- kubectl delete -f clusterip.yml
- cp clusterip.yml svc.yml
- vim svc.yml 【type: NodePort】
- kubectl apply -f svc.yml
- kubectl get pod
-
- kubectl get svc
- #NodePort实际上是在ClusterIP的基础之上,又绑定了32516端口
-
- ipvsadm -ln
集群外部访问:
真机:
- curl 172.25.70.2:32516
-
- curl 172.25.70.2:32516/hostname.html
- 负载均衡
-
- curl 172.25.70.3:32516/hostname.html
- 访问任何一个节点都可以
server3:
- yum install -y ipvsadm
- ipvsadm -ln
- kubectl edit svc web-service
- 编辑【type:LoadBalancer 】
-
- kubectl get svc
- 可以看到已经生效了
-
- kubectl edit configmap -n kube-system kube-proxy
- 编辑:strictARP: true
-
- kubectl get pod -n kube-system |grep kube-proxy | awk '{system("kubectl delete pod "$1" -n kube-system")}'
- #刷新使刚才修改的生效
-
- mkdir metallb
- cd metallb/
下载metallb-v0.11.0.yaml文件【本次网速太慢,从其他电脑传过来的】
- ls
- vim metallb-v0.11.0.yaml
- #查看文件中镜像
网页:建立一个新项目
server1:
下载镜像并上传到私有仓库
注意:路径要跟server2的metallb-v0.11.0.yaml这个文件中镜像的路径吻合
- docker load -i metallb-v0.11.0.tar
- 导入镜像
- docker push reg.westos.org/metallb/controller:v0.11.0
- docker push reg.westos.org/metallb/speaker:v0.11.0
- 上传镜像
- kubectl apply -f metallb-v0.11.0.yaml
- kubectl -n metallb-system get pod
-
- kubectl -n metallb-system get pod -o wide
- 查看状态是否就绪
- vim configmap.yml
- ip addr
-
- kubectl apply -f configmap.yml
- #生效
-
- kubectl get svc
- 生效之后可以获得刚才的172.25.70.100这个地址
真机中:
- curl 172.25.70.100
- 可以访问成功
- curl 172.25.70.100/hostname.html
- vim ex-svc.yml
- kubectl apply -f ex-svc.yml
-
- kubectl get svc
- 可以看到又建立了一个svc(my-service),没有ip地址,有一个外部的域名
-
- dig -t A my-service.default.svc.cluster.local. @10.96.0.10
- 访问my-service访问的域名是test.westos.org
-
- vim ex-svc.yml
- 外部域名变更为:www.baidu.com
- kubectl apply -f ex-svc.yml
-
- kubectl get svc
- 外部域名发生变化,但集群内的svc不变
-
- dig -t A my-service.default.svc.cluster.local. @10.96.0.10
- 访问svc又变为www.baidu.com
分配一个共有ip
【这个必须手工管理】
- vim ex-ip.yml
- #分配的地址确保没有被占用
-
- kubectl get pod --show-labels
- kubectl apply -f ex-ip.yml
- kubectl get svc
- kubectl delete svc my-service
-
- kubectl delete svc web-service
- #删除掉不需要的svc
-
- kubectl get svc
- 可以看到外部分配了一个地址
真机:
ping 172.25.70.111 【不通,需要手动创建】
- ip addr
- 可以看到已经加了地址,负载均衡策略有了但是外部访问不料
-
- curl 172.25.70.111
- 集群内部可以访问
-
- curl 172.25.70.111/hostname.html
- 负载均衡
-
- ip addr add 172.25.70.111/24 dev eth0
- 手动添加地址
真机中
- ping 172.25.70.111
- curl 172.25.70.111
- curl 172.25.70.111/hostname.html
- 【手动添加地址之后外部可以访问了】
- kubectl describe svc ex-ip
- ip addr del 172.25.70.111/24 dev eth0
- kubectl delete svc ex-ip
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。