# 节点访问（NodePort）
节点访问（NodePort）是Kubernetes中一种基础的服务类型，它在集群内访问服务的基础上增加了节点端口映射功能，即在每个节点的IP上开放一个静态端口，通过静态端口对外暴露服务。创建NodePort服务时，Kubernetes同样会自动创建一个集群内部IP地址（ClusterIP），集群外部的客户端通过访问 \<NodeIP\>:\<NodePort\>时，流量会通过NodePort服务对应的ClusterIP转发到对应的Pod。
在业务需要临时或低流量访问的场景中，您可以选择通过NodePort类型服务暴露节点端口进行访问。例如，在测试环境中，当您部署和调试一个Web应用服务时，可以使用NodePort类型。
图1NodePort访问   
![](https://support.huaweicloud.com/usermanual-cce/zh-cn_image_0000002342124982.png "点击放大")
#### 约束与限制
- "节点访问 ( NodePort )"默认为VPC内网访问，如果需要使用弹性IP通过公网访问该服务，请提前在集群的节点上绑定弹性IP。
- 创建Service后，如果服务亲和从集群级别切换为节点级别，连接跟踪表将不会被清理，建议用户创建Service后不要修改服务亲和属性，如需修改请重新创建Service。
- CCE Turbo集群（云原生2.0网络模型）中，如果未开启Dataplane V2，仅当Service的后端对接使用主机网络（HostNetwork）的Pod时，亲和级别支持配置为节点级别。开启Dataplane V2后，Service亲和级别支持配置为节点级别。
- VPC网络模式下，当某容器A通过NodePort类型服务发布时，且服务亲和设置为节点级别（即externalTrafficPolicy为local），部署在同节点的容器B将无法通过节点IP+NodePort访问容器A。
- v1.21.7及以上的集群创建的NodePort类型服务时，节点上的NodePort端口默认不会用netstat显示：如果集群转发模式为iptables，可使用**iptables -t nat -L** 查看端口；如果集群转发模式为IPVS，可使用**ipvsadm -Ln**查看端口。
 
#### 创建NodePort类型Service
您可以通过以下方式进行创建。
- [通过控制台创建]
  1. 登录[CCE控制台](https://console.huaweicloud.com/cce2.0/?#/cce/cluster/list)，单击集群名称进入集群。
  
  2. 在左侧导航栏中选择"服务"，在右上角单击"创建服务"。
  
  3. 设置节点访问基础配置参数。 
     
     | 参数    | 说明                                                                                                                                                               |
     |:---|:---|
     | 访问类型 | 选择"节点访问"。                                                                                                                                                      |
     | 服务名称   | 自定义服务名称，可与工作负载名称保持一致。                                                                                                                                          |
     | 命名空间 | 工作负载所在命名空间。                                                                                                                                                   |
     | 选择器   | 您可以添加Pod标签的键值，Service将会根据标签与工作负载的Pod进行关联，将流量导向包含该标签的Pod。 您也可以引用已有工作负载的标签，单击"引用负载标签"，在弹出的窗口中选择负载，然后单击"确定"。 |
        
     
     
  
  4. 填写访问设置参数。 
     
     | 参数      | 说明                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |
     |:---|:---|
     | 服务亲和  | 选择将外部流量路由到节点本地或集群范围的端点，详情请参见[服务亲和（externalTrafficPolicy）](https://support.huaweicloud.com/usermanual-cce/cce_10_0249.html#cce_10_0249__section18134208069)。 - 集群级别：集群下所有节点的IP+节点端口均可以访问到此服务关联的负载，服务访问会因路由跳转导致一定性能损失，且无法获取到客户端源IP。  - 节点级别：只有通过负载所在节点的IP+节点端口才可以访问此服务关联的负载，服务访问没有因路由跳转导致的性能损失，且可以获取到客户端源IP。                                                                                                                                                                                   |
     | 协议版本 | 选择服务的集群内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。    - 节点端口：即NodePort，通过节点IP访问时使用的端口，建议选择"自动生成"；也可以指定端口，默认范围为30000-32767。   |
        
     
     
  
  5. 单击"创建"，创建Service。创建完成后，您可以通过\<节点IP\>:\<节点端口\>进行访问。从集群同VPC下的云服务器或集群内部的容器都可以访问该地址，如果给节点绑定公网IP，也可以使用公网IP访问。 
     ![](https://support.huaweicloud.com/usermanual-cce/zh-cn_image_0000002350732652.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-nodeport-svc.yaml文件，配置Service参数。其中nginx-nodeport-svc.yaml为自定义名称，您可以随意命名。 
     ```
     vi nginx-nodeport-svc.yaml
     ```
     内容如下：
     ```
     apiVersion: v1
     kind: Service
     metadata:
       labels:
         app: nginx
       name: nginx-nodeport
     spec:
       ports:
       - name: service
         nodePort: 30000     # 节点端口，取值范围为30000-32767
         port: 8080          # 访问Service的端口
         protocol: TCP       # 访问Service的协议，支持TCP和UDP
         targetPort: 80      # Service访问目标容器的端口，此端口与容器中运行的应用强相关，如本例中nginx镜像默认使用80端口
       selector:             # 标签选择器，Service通过标签选择Pod，将访问Service的流量转发给Pod，此处选择带有 app:nginx 标签的Pod
         app: nginx
       type: NodePort        # Service的类型，NodePort表示在通过节点端口访问
     ```
     
     
  
  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-nodeport-svc.yaml
     ```
     回显如下，表示服务开始创建。
     ```
     service/nginx-nodeport created
     ```
     查看已创建的Service。
     ```
     kubectl get svc
     ```
     回显如下，表示服务已创建完成。
     ```
     NAME             TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)          AGE
     kubernetes       ClusterIP   10.247.0.1     <none>        443/TCP          4d8h
     nginx-nodeport   NodePort    10.247.30.40   <none>        8080:30000/TCP   18s
     ```
     
     
  
  6. 访问Service。默认情况下，NodePort类型Service可以通过*任意节点IP:节点端口* 访问。从集群同VPC下的云服务器或集群内部的容器都可以访问该类型的Service，如果给节点绑定公网IP，也可以使用公网IP访问。
     
     如下所示，在集群上创建一个容器，从容器中使用*节点IP:节点端口*访问。
     1. 查看节点IP。
        ```
        kubectl get node -owide
        ```
        回显如下：
        ```
        NAME           STATUS   ROLES    AGE    INTERNAL-IP    EXTERNAL-IP   OS-IMAGE                KERNEL-VERSION                CONTAINER-RUNTIME
        10.100.0.136   Ready    <none>   152m   10.100.0.136   <none>        CentOS Linux 7 (Core)   3.10.0-1160.25.1.el7.x86_64   docker://18.9.0
        10.100.0.5     Ready    <none>   152m   10.100.0.5     <none>        CentOS Linux 7 (Core)   3.10.0-1160.25.1.el7.x86_64   docker://18.9.0
        ```
        
     
     2. 创建一个Pod并进入到容器内，如下所示。
        ```
        kubectl run -i --tty --image nginx:alpine test --rm /bin/sh
        ```
        
     
     3. 使用curl命令访问Service。
        ```
        curl 10.100.0.136:30000
        ```
        回显如下：
        ```
        / # <!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>
        / #
        ```
        
     
     
     
     
   
#### 相关文档
- 创建NodePort类型的服务后，您可以通过节点IP进行访问。如果您需要对外提供网络访问，使用NodePort通常是不安全的，建议[创建负载均衡类型的服务](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/)查询。
 
