集群内访问(ClusterIP)
集群内访问(ClusterIP)是Kubernetes默认的服务类型,它为集群内部提供了一种稳定的网络访问方式。Kubernetes会从服务网段中分配一个仅在集群内部可访问的虚拟IP(称为集群IP),同时CoreDNS会注册一个“集群内部域名”的DNS记录,允许通过“集群内部域名”进行解析和访问。集群内部域名格式为“<服务名称>.<工作负载所在命名空间>.svc.cluster.local:<端口号>”,例如“nginx.default.svc.cluster.local:80”。
如果您只需要在集群内部进行服务间的通信,而不需要将服务暴露给集群外部,可以使用ClusterIP类型的服务。例如,集群中部署的前端应用Pod需要访问同一集群中部署的后端数据库,此时后端数据库可以配置为ClusterIP类型,以确保仅在集群内部可访问。
关于集群内访问(ClusterIP)的原理如图1所示,您可以更直观地了解该类型服务的访问通道、容器端口与访问端口映射规则。
创建ClusterIP类型Service
- 登录CCE控制台,单击集群名称进入集群。
- 在左侧导航栏中选择“服务”,在右上角单击“创建服务”。
- 设置集群内访问参数。
参数
说明
Service名称
自定义服务名称,可与工作负载名称保持一致。
访问类型
选择“集群内访问”。
命名空间
工作负载所在命名空间。
选择器
Service将会根据标签与工作负载的Pod进行关联,将流量导向包含该标签的Pod。
您可以添加Pod标签的键值,填写后单击“确认添加”。
您也可以引用已有工作负载的标签,单击“引用负载标签”,在弹出的窗口中选择负载,然后单击“确定”。
协议版本
请根据业务选择不同版本的IP地址,具体请参见如何通过CCE搭建IPv4/IPv6双栈集群?。该功能仅在1.15及以上版本的集群创建时开启了IPv6功能才会显示。
端口配置
- 协议:请根据业务支持的协议类型选择。
- 容器端口:业务容器进程实际监听的端口,您需要根据运行的容器镜像确定,端口范围为1~65535。例如Nginx默认使用80端口,而MySQL的默认访问端口为3306。
- 服务端口:通过服务的ClusterIP访问时使用的端口,您可以根据需求进行自定义,端口范围为1~65535。
- 单击“确定”,创建Service。创建完成后,您可以在集群中通过<ClusterIP>:<服务端口>进行访问。
您可以通过kubectl命令行设置Service访问方式。本节以nginx为例,说明kubectl命令实现集群内访问的方法。
- 使用kubectl连接集群,详情请参见通过kubectl连接集群。
- 创建并编辑nginx-deployment.yaml文件,配置示例工作负载,详情请参见创建无状态负载(Deployment)。其中nginx-deployment.yaml为自定义名称,您可以随意命名。
vi nginx-deployment.yaml
内容如下:apiVersion: apps/v1 kind: Deployment metadata: name: nginx spec: replicas: 1 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - image: nginx:latest name: nginx imagePullSecrets: - name: default-secret
- 创建并编辑nginx-clusterip-svc.yaml文件,用于配置Service参数。其中nginx-clusterip-svc.yaml为自定义名称,您可以随意命名。
vi nginx-clusterip-svc.yaml
内容如下:apiVersion: v1 kind: Service metadata: labels: app: nginx name: nginx-clusterip spec: ports: - name: service0 port: 8080 # 访问Service的端口 protocol: TCP # 访问Service的协议,支持TCP和UDP targetPort: 80 # Service访问目标容器的端口,此端口与容器中运行的应用强相关,如本例中nginx镜像默认使用80端口 selector: # 标签选择器,Service通过标签选择Pod,将访问Service的流量转发给Pod,此处选择带有 app:nginx 标签的Pod app: nginx type: ClusterIP # Service的类型,ClusterIP表示在集群内访问
- 创建工作负载。
kubectl create -f nginx-deployment.yaml
回显如下,表示工作负载已经创建。
deployment/nginx created
查看已创建的工作负载。
kubectl get pod
回显如下,工作负载状态为Running,表示工作负载已处于运行中状态。
NAME READY STATUS RESTARTS AGE nginx-2601814895-znhbr 1/1 Running 0 15s
- 创建服务。
kubectl create -f nginx-clusterip-svc.yaml
回显如下,表示服务已开始创建。
service/nginx-clusterip created
查看已创建的Service。
kubectl get svc
回显如下,表示服务已创建成功,CLUSTER-IP已生成。
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.247.0.1 <none> 443/TCP 4d6h nginx-clusterip ClusterIP 10.247.74.52 <none> 8080/TCP 14m
- 您可以在集群内的容器或节点上访问Service。
- 创建一个Pod并进入到容器内,如下所示。
kubectl run -i --tty --image nginx:alpine test --rm /bin/sh
- 使用curl命令访问Service。
- 通过IP:Port访问:
curl 10.247.74.52:8080
- 通过域名:Port访问(该方式不支持在节点上访问):
curl nginx-clusterip.default.svc.cluster.local:8080
其中nginx-clusterip为Service名称,default为Service所在的命名空间,svc.cluster.local为集群内服务的DNS域。
您也可以根据实际情况简化域名,例如Service和发起访问的Pod在同个命名空间内可以直接使用nginx-clusterip:8080访问,跨命名空间则可以使用nginx-clusterip.default:8080访问。
访问成功后,回显如下:
<!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> <style> body { width: 35em; margin: 0 auto; font-family: Tahoma, Verdana, Arial, sans-serif; } </style> </head> <body> <h1>Welcome to nginx!</h1> <p>If you see this page, the nginx web server is successfully installed and working. Further configuration is required.</p> <p>For online documentation and support please refer to <a href="http://nginx.org/">nginx.org</a>.<br/> Commercial support is available at <a href="http://nginx.com/">nginx.com</a>.</p> <p><em>Thank you for using nginx.</em></p> </body> </html>
- 通过IP:Port访问:
- 创建一个Pod并进入到容器内,如下所示。
相关文档
- 创建ClusterIP类型的服务后,您可以在集群内进行访问。如果您需要对外提供网络访问,建议创建负载均衡类型的服务或创建Ingress。
- 如果您在使用Service时出现无法访问的问题,请参见工作负载网络异常时,如何定位排查?寻找解决方案。
- 更多关于Kubernetes Service的API结构,您可以访问Kubernetes官方网站查询。