文档首页 > > 用户指南> 网络管理> 节点访问 ( NodePort )

节点访问 ( NodePort )

分享
更新时间: 2020/01/22 GMT+08:00

节点访问 ( NodePort )是指在每个节点的IP上开放一个静态端口,通过静态端口对外暴露服务。节点访问 ( NodePort )会路由到ClusterIP服务,这个ClusterIP服务会自动创建。通过请求 <NodeIP>:<NodePort>,可以从集群的外部访问一个NodePort服务。

节点访问有VPC内网访问或弹性公网IP访问两种方式。

  • VPC内网访问

    VPC内网访问是指工作负载可以让同一VPC内其他工作负载访问,通过集群节点的IP的服务地址访问。

    主要场景:同一VPC内其他工作负载需要访问kubernetes集群内部的工作负载。

    图1 VPC内网访问(通过集群节点IP访问)
  • 弹性公网IP访问

    弹性公网IP访问可以通过弹性IP从公网访问工作负载,一般用于系统中需要暴露到公网的服务。

    弹性IP访问方式需要给集群内任一节点绑定弹性IP,并设置一个映射在节点上的端口,其中节点端口的范围在30000-32767之间,例如访问地址为10.117.117.117:30000。

    图2 弹性公网IP访问

通过控制台操作

您可以在创建工作负载时通过控制台设置Service访问方式,本节以nginx为例进行说明。

  1. 参考创建无状态负载(Deployment)创建有状态负载(StatefulSet),在“工作负载访问设置”步骤,单击“添加服务”

    • 访问类型:选择“节点访问 ( NodePort )”
    • 服务名称:自定义服务名称,可与工作负载名称保持一致。
    • 服务亲和:
      • 集群级别:集群下所有节点的IP+访问端口均可以访问到此服务关联的负载,服务访问会因路由跳转导致一定性能损失,且无法获取到客户端源IP。
      • 节点级别:只有通过负载所在节点的IP+访问端口才可以访问此服务关联的负载,服务访问没有因路由跳转导致的性能损失,且可以获取到客户端源IP。
    • 端口配置:
      • 协议:请根据业务的协议类型选择。
      • 容器端口:容器镜像中工作负载实际监听的端口,取值范围为1-65535。
      • 访问端口:容器端口映射到节点私有IP上的端口,建议选择“自动生成”
        • 自动生成:系统会自动分配端口号。
        • 指定端口:指定固定的节点端口,默认取值范围为30000-32767。若指定端口时,请确保同个集群内的端口唯一性。

  2. 单击“下一步”进入“高级设置”页面,直接单击“创建”
  3. 单击“查看工作负载详情”,在访问方式页签中获取访问地址,例如“192.168.0.160:30358”

kubectl命令行创建-VPC内访问

您可以通过kubectl命令行设置Service访问方式。本节以nginx为例,说明kubectl命令实现VPC内访问的方法。

前提条件

请参见通过kubectl或web-terminal插件连接CCE集群配置kubectl命令,使弹性云服务器连接集群。

操作步骤

  1. 登录已配置好kubectl命令的弹性云服务器。登录方法请参见登录Linux弹性云服务器
  2. 创建并编辑nginx-deployment.yaml以及nginx-nodeport-svc.yaml文件。

    其中,nginx-deployment.yaml和nginx-nodeport-svc.yaml为自定义名称,您可以随意命名。

    vi nginx-deployment.yaml

    apiVersion: extensions/v1beta1
    kind: Deployment
    metadata:
      name: nginx
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: nginx
      strategy:
        type: RollingUpdate
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
          - image: nginx 
            imagePullPolicy: Always
            name: nginx
          imagePullSecrets:
          - name: default-secret

    vi nginx-nodeport-svc.yaml

    apiVersion: v1
    kind: Service
    metadata:
      labels:
        app: nginx
      name: nginx-nodeport
    spec:
      ports:
      - name: service
    #   nodePort: 30000
        port: 80
        protocol: TCP
        targetPort: 80
      selector:
        app: nginx
      type: NodePort
    表1 关键参数说明

    参数

    参数类型

    描述

    nodePort

    Integer

    对应界面上的访问端口,取值范围为30000 ~ 32767,不填写表示自动生成。

    port

    Integer

    集群虚拟IP的访问端口,取值范围为1 ~ 65535。

    protocol

    String

    该端口的IP协议,支持“TCP”和“UDP”。

    targetPort

    String

    对应界面上的容器端口,取值范围为1 ~ 65535。

    type

    String

    对应界面上的访问类型,NodePort表示“节点私有IP”。

  3. 创建工作负载。

    kubectl create -f nginx-deployment.yaml

    回显如下,表示工作负载已开始创建。

    deployment "nginx" created

    kubectl get po

    回显如下,工作负载状态为Running,表示工作负载已处于运行状态。

    NAME                     READY     STATUS             RESTARTS   AGE
    etcd-0                   0/1       ImagePullBackOff   0          48m
    icagent-m9dkt            0/0       Running            0          3d
    nginx-2601814895-qhxqv   1/1       Running            0          9s

  4. 创建服务。

    kubectl create -f nginx-nodeport-svc.yaml

    回显如下,表示服务开始创建。

    service "nginx-nodeport" created

    kubectl get svc

    回显如下,表示服务已创建完成。

    NAME             TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
    etcd-svc         ClusterIP   None           <none>        3120/TCP       49m
    kubernetes       ClusterIP   10.247.0.1     <none>        443/TCP        3d
    nginx-nodeport   NodePort    10.247.4.225   <none>        80:30000/TCP   7s

  5. 采用curl命令访问工作负载验证工作负载是否可以正常访问。

    curl 192.168.2.240:30000

    其中192.168.2.240为集群中任意一个节点的IP地址,30000为节点开放的端口号。

    回显如下,表示可正常访问。

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

kubectl命令行创建-弹性公网IP

本节以nginx为例,说明kubectl命令实现公网访问的方法。

前提条件

请参见通过kubectl或web-terminal插件连接CCE集群配置kubectl命令,使弹性云服务器连接集群。

操作步骤

  1. 登录已配置好kubectl命令的弹性云服务器。登录方法请参见登录Linux弹性云服务器
  2. 创建并编辑nginx-deployment.yaml以及nginx-eip-svc.yaml文件。

    其中,nginx-deployment.yaml和nginx-eip-svc.yaml为自定义名称,您可以随意命名。

    vi nginx-deployment.yaml

    apiVersion: extensions/v1beta1
    kind: Deployment
    metadata:
      name: nginx
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: nginx
      strategy:
        type: RollingUpdate
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
          - image: nginx 
            imagePullPolicy: Always
            name: nginx
          imagePullSecrets:
          - name: default-secret

    vi nginx-eip-svc.yaml

    apiVersion: v1
    kind: Service
    metadata:
      labels:
        app: nginx
      name: nginx-eip
    spec:
      ports:
      - name: service0
        nodePort: 30000
        port: 80
        protocol: TCP
        targetPort: 80
      selector:
        app: nginx
      type: NodePort
    表2 关键参数说明

    参数

    参数类型

    描述

    nodePort

    Integer

    对应界面上的访问端口,取值范围为30000 ~ 32767,不填写表示自动生成。

    port

    Integer

    集群虚拟IP的访问端口,取值范围为1 ~ 65535。

    protocol

    String

    该端口的IP协议,支持“TCP”和“UDP”。

    targetPort

    String

    对应界面上的容器端口,取值范围为1 ~ 65535。

    type

    String

    对应界面上的访问类型,弹性IP需要基于“NodePort”类型的服务。

  3. 创建工作负载。

    kubectl create -f nginx-deployment.yaml

    回显如下表示工作负载开始创建。

    deployment "nginx" created

    kubectl get po

    回显如下,工作负载状态为Running,表示工作负载已运行中。

    NAME                     READY     STATUS             RESTARTS   AGE
    etcd-0                   0/1       ImagePullBackOff   0          59m
    icagent-m9dkt            0/0       Running            0          3d
    nginx-2601814895-sf71t   1/1       Running            0          8s

  4. 创建服务。

    kubectl create -f nginx-eip-svc.yaml

    回显如下表示服务已创建成功。

    service "nginx-eip" created

    kubectl get svc

    回显如下表示服务访问方式已设置成功。

    NAME         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
    etcd-svc     ClusterIP   None             <none>        3120/TCP       59m
    kubernetes   ClusterIP   10.247.0.1       <none>        443/TCP        3d
    nginx-eip    NodePort    10.247.120.135   <none>        80:30000/TCP   7s

  5. 在浏览器中输入访问地址,例如为10.78.44.60:30000访问地址。

    其中10.78.44.60为弹性IP地址,30000为上一步中获取的节点端口号。

    图3 通过弹性IP访问nginx(二)

验证访问方式

  • VPC内网访问验证
  1. 在管理控制台首页,单击“计算 > 弹性云服务器
  2. 在弹性云服务器页面,找到同一VPC内任意一台云服务器,并确认连接到访问地址中IP与端口的安全组是开放的。

    图4 确认安全组开放

  3. 单击“远程登录”,弹出登录页面,输入用户密码登录。
  4. 使用curl命令访问工作负载验证工作负载是否可以正常访问。

    VPC内网访问方式在集群内会分配一个集群虚拟IP,即可以在集群内部通过集群虚拟IP的验证方式验证。其中,集群虚拟IP访问端口默认与容器端口一致,例如此示例的访问端口为80端口。

    curl 192.168.0.160:30358

    其中“192.168.0.160:30358”3中获取到的访问地址。

    回显如下表示访问成功。

    <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访问验证
  1. 工作负载创建成功后,单击“工作负载 > 无状态负载 Deployment”“工作负载 > 有状态负载 StatefulSet”,在工作负载列表页面,单击工作负载名称进入工作负载详情页,在“访问方式”页签下,获取方式地址,例如“10.78.27.59:30911”
  2. 单击访问地址,即可跳转到访问页面。

    图5 通过弹性IP访问nginx(一)

工作负载创建完成后设置

您可以在工作负载创建完成后对Service进行配置,此配置对工作负载状态无影响,且实时生效。具体操作如下:

  1. 登录CCE控制台,在左侧导航栏中选择“工作负载 > 无状态 ( Deployment )”,在工作负载列表页单击要设置Service的工作负载名称。

    如果当前Service被关联到Ingress,则更新Service的端口信息后Ingress将不可用,需要删除重建。

  2. “访问方式”页签,单击“添加Service”。
  3. “添加Service”页面,访问类型选择“节点访问 ( NodePort )”
  4. 设置节点访问参数:

    • 服务名称:自定义服务名称,可与工作负载名称保持一致。
    • 集群名称:工作负载所在集群的名称,此处不可修改。
    • 命名空间:工作负载所在命名空间,此处不可修改。
    • 关联工作负载:要添加Service的工作负载,此处不可修改。
    • 服务亲和:
      • 集群级别:集群下所有节点的IP+访问端口均可以访问到此服务关联的负载,服务访问会因路由跳转导致一定性能损失,且无法获取到客户端源IP。
      • 节点级别:只有通过负载所在节点的IP+访问端口才可以访问此服务关联的负载,服务访问没有因路由跳转导致的性能损失,且可以获取到客户端源IP。
    • 端口配置:
      • 协议:请根据业务的协议类型选择。
      • 容器端口:容器镜像中工作负载程序实际监听的端口,需用户确定。nginx程序实际监听的端口为80。
      • 访问端口:容器端口映射到节点私有IP上的端口,建议选择“自动生成”
        • 自动生成:系统会自动分配端口号。
        • 指定端口:指定固定的节点端口,默认取值范围为30000-32767。若指定端口时,请确保同个集群内的端口唯一性。

  5. 单击“创建”。工作负载已添加“节点访问 ( NodePort )”的服务。

更新Service

您可以在添加完Service后,更新此Service的端口配置,操作步骤如下:

  1. 登录CCE控制台,在左侧导航栏中选择“资源管理 > 网络管理”,在Service页签下,选择对应的集群和命名空间,单击需要更新端口配置的Service后的“更新”
  2. 在更新Service页面,访问类型选择“节点访问 ( NodePort )”
  3. 更新节点访问参数:

    • 集群名称:工作负载所在集群的名称,此处不可修改。
    • 命名空间:工作负载所在命名空间,此处不可修改。
    • 关联工作负载:要添加Service的工作负载,此处不可修改。
    • 服务亲和:
      • 集群级别:集群下所有节点的IP+访问端口均可以访问到此服务关联的负载,服务访问会因路由跳转导致一定性能损失,且无法获取到客户端源IP。
      • 节点级别:只有通过负载所在节点的IP+访问端口才可以访问此服务关联的负载,服务访问没有因路由跳转导致的性能损失,且可以获取到客户端源IP。
    • 端口配置:
      • 协议:请根据业务的协议类型选择。
      • 容器端口:容器镜像中工作负载程序实际监听的端口,需用户确定。nginx程序实际监听的端口为80。
      • 访问端口:容器端口映射到节点私有IP上的端口,建议选择“自动生成”
        • 自动生成:系统会自动分配端口号。
        • 指定端口:指定固定的节点端口,默认取值范围为30000-32767。若指定端口时,请确保同个集群内的端口唯一性。

  4. 单击“更新”。工作负载已更新Service。
分享:

    相关文档

    相关产品

文档是否有解决您的问题?

提交成功!

非常感谢您的反馈,我们会继续努力做到更好!

反馈提交失败,请稍后再试!

*必选

请至少选择或填写一项反馈信息

字符长度不能超过200

提交反馈 取消

如您有其它疑问,您也可以通过华为云社区问答频道来与我们联系探讨

跳转到云社区