使用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