使用Deployment创建的Pod会动态创建和销毁。每个Pod的IP地址是动态生成的。当pod异常停止,deployment控制器自动产生新Pod时会重新生成新的IP地址。这样其他服务就无法正确找到pod了,k8s通过定义service一般使用标签选择器选择pod,对pod进行在逻辑上分组,对整个分组定义访问策略,这一组pod可以被service访问。调用者只需要使用service发布的服务,不需要关注pod的地址是否发生变。
0.创建测试deployment为后续创建service提供pod
0.1创建deployment模板
vi nginxdeployment-sercice.yml
内容如下:
0.2.创建Deployment
kubectl apply -f nginxdeployment-sercice.yml
0.3查看pod
kubectl get pods -o wide
1.Service对外提供服务
1.1.ClusterIP
默认的服务,为service分配一个集群内部可以访问的固定虚拟IP(ClusterIP),仅可集群内的机器和集群中的pod可以使用。
1.1.1创建模板
vi nginxsercice1.yml
内容如下;
1.1.2创建service
kubectl create -f nginxsercice1.yml
1.1.3查看service
kubectl get svc
kubectl describe svc nginxservice1
1.1.4使用ClusterIP+端口访问
1.2.NodePort
基于ClusterIP生成的ClusterIP,把这个IP地址及端口映射到master和各个node上,集群外的机器可以使用master或node的ip+端口访问服务
1.2.1创建模板
vi nginxsercice-nodeport.yml
内容如下:
注意:nodeport的取值范围为30000~32767
1.2.2创建service
kubectl create -f nginxsercice-nodeport.yml
1.2.3 使用集群外集群访问
1.3.LoadBalancer
使用外部均衡器访问,基于ClusterIP方式和NodePort方式,使用外部负载均衡器,由负载均衡器映射到各个node的端口上
1.31.创建模板文件
vi nginxsercice-loadbalancer.yml
内容如下:
status:
loadBalancer:
igress:
– ip :云服务商提供的LoadBalancer的IP
注意:
1.如果集群没有在公有云的IaaS平台运行则会一直处于Pending状态
2.如果在私有集群中,可以尝试使用MetalLB解决上述问题
1.4.headless service
只可在集群的内部Pod中访问,使用DNS提供稳定的网络ID来进行访问,不分配ClusterIP也不使用kube-proxy进行反向代理和负载均衡
1.4.1.创建模板文件
vi nginxsercice-headlessservice.yml
内容如下:
1.4.2创建service
kubectl apply -f nginxsercice-headlessservice.yml
1.4.3查看service
kubectl get service
注意:集群内外的机器不能直接访问headlessservice服务,只能由Pod访问,而且需要通过DNS方式。访问形式为[ServiceName].[Namespace].svc.[ClusterDomain]
2.将外部服务定义为Service
2.1 ExternalName
把外部的服务通过指定的规则映射到k8s集群中为集群内部提供服务
2.1.1.创建模板文件
vi nginxsercice-externalname.yml
内容如下:
2.1.2创建service
2.1.3查看service
kubectl get service
进入pod容器内部
kubectl exec -ti nginxdeployment-service-746777b75f-tgbr6 — /bin/sh
查询DNS信息
nslookup nginxsercice-externalname.svc.cluster.local