# 集群内访问（ClusterIP）
集群内访问（ClusterIP）是Kubernetes默认的服务类型，它为集群内部提供了一种稳定的网络访问方式。Kubernetes会从服务网段中分配一个仅在集群内部可访问的虚拟IP（称为集群IP），同时CoreDNS会注册一个"集群内部域名"的DNS记录，允许通过"集群内部域名"进行解析和访问。集群内部域名格式为"\<服务名称\>.\<工作负载所在命名空间\>.svc.cluster.local:\<端口号\>"，例如"nginx.default.svc.cluster.local:80"。
如果您只需要在集群内部进行服务间的通信，而不需要将服务暴露给集群外部，可以使用ClusterIP类型的服务。例如，集群中部署的前端应用Pod需要访问同一集群中部署的后端数据库，此时后端数据库可以配置为ClusterIP类型，以确保仅在集群内部可访问。
关于集群内访问（ClusterIP）的原理如[图1]所示，您可以更直观地了解该类型服务的访问通道、容器端口与访问端口映射规则。
图1集群内访问   
![](https://support.huaweicloud.com/usermanual-cce/zh-cn_image_0000001243981117.png "点击放大")
#### 创建ClusterIP类型Service
您可以通过以下方式进行创建。
- [通过控制台创建]
  1. 登录[CCE控制台](https://console.huaweicloud.com/cce2.0/?#/cce/cluster/list)，单击集群名称进入集群。
  
  2. 在左侧导航栏中选择"服务"，在右上角单击"创建服务"。
  
  3. 设置集群内访问基础配置参数。 
     
     | 参数  | 说明                                                                                                                                      |
     |:---|:---|
     | 访问类型 | 选择"集群内访问"。                                                                                                                            |
     | 服务名称 | 自定义服务名称，可与工作负载名称保持一致。                                                                                                                   |
     | 命名空间 | 工作负载所在命名空间。                                                                                                                          |
     | 选择器  | 您可以添加Pod标签的键值，Service将会根据标签与工作负载的Pod进行关联，将流量导向包含该标签的Pod。 您也可以引用已有工作负载的标签，单击"引用负载标签"，在弹出的窗口中选择负载，然后单击"确定"。 |
        
     
     
  
  4. 填写访问设置参数。 
     
     | 参数      | 说明                                                                                                                                                                                                                                                                                                                                                                |
     |:---|:---|
     | 协议版本 | 选择服务的集群内IP地址（ClusterIP）的协议版本，根据不同的使用场景，可选择IPv4、IPv6、IPv4/IPv6 （默认使用IPv4）、IPv6/IPv4 （默认使用IPv6）。默认选择IPv4。 **该功能仅在1.15及以上版本的集群创建时开启了IPv6功能才会显示。** 具体请参见[如何通过CCE搭建IPv4/IPv6双栈集群？](https://support.huaweicloud.com/bestpractice-cce/cce_bestpractice_00222.html)                                                                         |
     | 端口配置  | - 协议：请根据业务支持的协议类型选择。  - 容器端口：业务容器进程实际监听的端口，您需要根据运行的容器镜像确定，端口范围为1\~65535。例如Nginx默认使用80端口，而MySQL的默认访问端口为3306。  - 服务端口：通过服务的ClusterIP访问时使用的端口，您可以根据需求进行自定义，端口范围为1\~65535。   |
        
     
     
  
  5. 单击"创建"，创建Service。创建完成后，您可以在集群中通过\<ClusterIP\>:\<服务端口\>进行访问。 
     ![](https://support.huaweicloud.com/usermanual-cce/zh-cn_image_0000002384321013.png "点击放大")
     
     
     
   
- [通过kubectl命令行创建]
  您可以通过kubectl命令行设置Service访问方式。本节以nginx为例，说明kubectl命令实现集群内访问的方法。
  1. 使用kubectl连接集群，详情请参见[通过kubectl连接集群](https://support.huaweicloud.com/usermanual-cce/cce_10_0107.html)。
  
  2. 创建并编辑nginx-deployment.yaml文件，配置示例工作负载，详情请参见[创建无状态负载（Deployment）](https://support.huaweicloud.com/usermanual-cce/cce_10_0047.html)。其中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
     ```
     
     
  
  3. 创建并编辑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表示在集群内访问
     ```
     
     
  
  4. 创建工作负载。 
     ```
     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
     ```
     
     
  
  5. 创建服务。 
     ```
     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
     ```
     
     
  
  6. 您可以在集群内的容器或节点上访问Service。 
     1. 创建一个Pod并进入到容器内，如下所示。
        ```
        kubectl run -i --tty --image nginx:alpine test --rm /bin/sh
        ```
        
     
     2. 使用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>
        ```
        
     
     
     
     
   
#### 相关文档
- 创建ClusterIP类型的服务后，您可以在集群内进行访问。如果您需要对外提供网络访问，建议[创建负载均衡类型的服务](https://support.huaweicloud.com/usermanual-cce/cce_10_0681.html)或[创建Ingress](https://support.huaweicloud.com/usermanual-cce/cce_10_0248.html)。
- 如果您在使用Service时出现无法访问的问题，请参见[工作负载网络异常时，如何定位排查？](https://support.huaweicloud.com/cce_faq/cce_faq_00202.html)寻找解决方案。
- 更多关于Kubernetes Service的API结构，您可以访问[Kubernetes官方网站](https://kubernetes.io/zh-cn/docs/reference/kubernetes-api/service-resources/service-v1/)查询。
 
