更新时间:2023-10-27 gmt 08:00

节点访问(nodeport)-凯发k8国际娱乐官网入口

操作场景

节点访问 ( nodeport )是指在每个节点的ip上开放一个静态端口,通过静态端口对外暴露服务。创建nodeport服务时,kubernetes会自动创建一个集群内部ip地址(clusterip),集群外部的客户端通过访问 :,流量会通过nodeport服务对应的clusterip转发到对应的pod。

图1 nodeport访问

约束与限制

  • “节点访问 ( nodeport )”默认为vpc内网访问,如果需要使用弹性ip通过公网访问该服务,请提前在集群的节点上绑定弹性ip。
  • 创建service后,如果服务亲和从集群级别切换为节点级别,连接跟踪表将不会被清理,建议用户创建service后不要修改服务亲和属性,如需修改请重新创建service。
  • cce turbo集群仅支持集群级别服务亲和。
  • 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控制台,单击集群名称进入集群。
  2. 在左侧导航栏中选择“服务”,在右上角单击“创建服务”
  3. 设置集群内访问参数。
    • service名称:自定义服务名称,可与工作负载名称保持一致。
    • 访问类型:选择“节点访问 nodeport”
    • 命名空间:工作负载所在命名空间。
    • 服务亲和:详情请参见。
      • 集群级别:集群下所有节点的ip 节点端口均可以访问到此服务关联的负载,服务访问会因路由跳转导致一定性能损失,且无法获取到客户端源ip。
      • 节点级别:只有通过负载所在节点的ip 节点端口才可以访问此服务关联的负载,服务访问没有因路由跳转导致的性能损失,且可以获取到客户端源ip。
    • 选择器:添加标签,service根据标签选择pod,填写后单击“确认添加”。也可以引用已有工作负载的标签,单击“引用负载标签”,在弹出的窗口中选择负载,然后单击“确定”
    • ipv6:默认不开启,开启后服务的集群内ip地址(clusterip)变为ipv6地址,具体请参见如何通过cce搭建ipv4/ipv6双栈集群?该功能仅在1.15及以上版本的集群创建时开启了ipv6功能才会显示。
    • 端口配置:
      • 协议:请根据业务的协议类型选择。
      • 服务端口:service使用的端口,端口范围为1-65535。
      • 容器端口:工作负载程序实际监听的端口,需用户确定。例如nginx默认使用80端口。
      • 节点端口:即nodeport,建议选择“自动生成”;也可以指定端口,默认范围为30000-32767。
  4. 单击“确定”,创建service。

kubectl命令行创建

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

  1. 请参见,使用kubectl连接集群。
  2. 创建并编辑nginx-deployment.yaml以及nginx-nodeport-svc.yaml文件。

    其中,nginx-deployment.yaml和nginx-nodeport-svc.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

    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表示在通过节点端口访问
  3. 创建工作负载。

    kubectl create -f nginx-deployment.yaml

    回显如下,表示工作负载已创建完成。

    deployment "nginx" created

    kubectl get po

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

    name                     ready     status             restarts   age
    nginx-2601814895-qhxqv   1/1       running            0          9s
  4. 创建服务。

    kubectl create -f nginx-nodeport-svc.yaml

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

    service "nginx-nodeport" created

    kubectl get svc

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

    # kubectl get svc
    name             type        cluster-ip     external-ip   port(s)          age
    kubernetes       clusterip   10.247.0.1             443/tcp          4d8h
    nginx-nodeport   nodeport    10.247.30.40   <none>        8080:30000/tcp   18s
  5. 访问service。

    默认情况下,nodeport类型service可以通过任意节点ip:节点端口访问。

    在集群同vpc下或集群容器内都可以访问,如果给节点绑定公网ip,也可以使用公网ip访问。如下所示,在集群上创建一个容器,从容器中使用节点ip:节点端口访问。

    # kubectl get node -owide
    name           status   roles    age    internal-ip    external-ip   os-image                kernel-version                container-runtime
    10.100.0.136   ready       152m   10.100.0.136           centos linux 7 (core)   3.10.0-1160.25.1.el7.x86_64   docker://18.9.0
    10.100.0.5     ready       152m   10.100.0.5             centos linux 7 (core)   3.10.0-1160.25.1.el7.x86_64   docker://18.9.0
    # kubectl run -i --tty --image nginx:alpine test --rm /bin/sh
    if you don't see a command prompt, try pressing enter.
    / # curl 10.100.0.136:30000
    welcome to nginx!
    
    

    if you see this page, the nginx web server is successfully installed and working. further configuration is required.

    for online documentation and support please refer to .
    commercial support is available at .

    thank you for using nginx.

    / #
分享:
网站地图