K8s---service
目录一、service简介二、IPVS模式的service三、创建service【ClusterIP方式】headless service“无头服务”NodePort方式外部访问service的第二种方式(使用于公网)外部访问service的第三种方式:ExternalName。一、service简介Service可以看作是一组提供相同服务的Pod对外的访问接口。借助Service,应用可以方便地
·
目录
外部访问service的第三种方式:ExternalName。
一、service简介
Service可以看作是一组提供相同服务的Pod对外的访问接口。借助Service,应
用可以方便地实现服务发现和负载均衡。
Service默认只支持4层负载均衡能力,没有7层功能。(可以通过Ingress实现)
Service的类型:
- ClusterIP:默认值,k8s系统给service自动分配的虚拟IP,只能在集群内部访问。
- NodePort:将Service通过指定的Node上的端口暴露给外部,访问任意一个
- NodeIP:nodePort都将路由到ClusterIP。
- LoadBalancer:在 NodePort 的基础上,借助 cloud provider 创建一个外部的负 载均衡器,并将请求转发到<NodeIP>:NodePort,此模式只能在云服务器上使用。
- ExternalName:将服务通过 DNS CNAME 记录方式转发到指定的域名(通过 spec.externlName 设定)
二、IPVS模式的service
- Service 是由 kube-proxy 组件,加上 iptables 来共同实现的.
- kube-proxy 通过 iptables 处理 Service 的过程,需要在宿主机上设置相当多的iptables规则,如果宿主机有大量的Pod,不断刷新iptables规则,会消耗大量的CPU资源。
- IPVS模式的service,可以使K8s集群支持更多量级的Pod。
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
三、创建service
【ClusterIP方式】
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 #回收
headless service“无头服务”
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
NodePort方式
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
外部访问service的第二种方式(使用于公网)
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
外部访问service的第三种方式:ExternalName。
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
更多推荐
已为社区贡献6条内容
所有评论(0)