目录

一、service简介

二、IPVS模式的service

 三、创建service

【ClusterIP方式】

headless service“无头服务”

NodePort方式

外部访问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 

 

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐