Estos contenidos se han traducido de forma automática para su comodidad, pero Huawei Cloud no garantiza la exactitud de estos. Para consultar los contenidos originales, acceda a la versión en inglés.
Actualización más reciente 2024-09-10 GMT+08:00

NodePort

Escenario

Un Service está expuesto en la dirección IP de cada nodo en un puerto estático (NodePort). Se crea automáticamente un Service de ClusterIP, al que se enrutará el Service de NodePort. Al solicitar <NodeIP>:<NodePort>, puede acceder a un Service de NodePort desde fuera del clúster.

Figura 1 Acceso a NodePort

Notas y restricciones

  • De forma predeterminada, se accede a un NodePort Service dentro de una VPC. Si necesita usar un EIP para acceder a un NodePort Service a través de redes públicas, vincule un EIP al nodo del clúster de antemano.
  • Después de crear un Service, si la configuración de afinidad se cambia del nivel de clúster al nivel de nodo, la tabla de seguimiento de conexiones no se borrará. Se recomienda no modificar la configuración de afinidad del Service después de que se haya creado el Servicio. Si necesita modificarlo, vuelva a crear un Service.
  • En el modo de red de VPC, cuando el contenedor A se publica con un servicio de NodePort y la afinidad del servicio se establece en el nivel de nodo (es decir, externalTrafficPolicy se establece en local), el contenedor B desplegado en el mismo nodo no puede acceder al contenedor A con la dirección IP del nodo y el servicio de NodePort.
  • Cuando se crea un servicio de NodePort en un clúster de v1.21.7 o posterior, el puerto del nodo no se muestra mediante netstat de forma predeterminada. Si el modo de reenvío del clúster es iptables, ejecute el comando iptables -t nat -L para ver el puerto. Si el modo de reenvío del clúster es ipvs, ejecute el comando ipvsadm -nL para ver el puerto.

Creación de un Service de NodePort

  1. Inicie sesión en la consola de CCE y haga clic en el nombre del clúster para acceder al clúster.
  2. Elija Networking en el panel de navegación y haga clic en Create Service en la esquina superior derecha.
  3. Establezca los parámetros de acceso dentro del clúster.

    • Service Name: Especifique un nombre de Service, que puede ser el mismo que el nombre de la carga de trabajo.
    • Service Type: Seleccione NodePort.
    • Namespace: Espacio de nombres al que pertenece la carga de trabajo.
    • Service Affinity: Para más información, véase externalTrafficPolicy (afinidad del Service).
      • Cluster level: las direcciones IP y los puertos de acceso de todos los nodos de un clúster pueden acceder a la carga de trabajo asociada con el Service. El acceso al Service causará una pérdida de rendimiento debido a la redirección de la ruta y no se puede obtener la dirección IP de origen del cliente.
      • Node level: Solo la dirección IP y el puerto de acceso del nodo donde se encuentra la carga de trabajo pueden acceder a la carga de trabajo asociada con el Service. El acceso al Service no causará pérdida de rendimiento debido a la redirección de la ruta, y se puede obtener la dirección IP de origen del cliente.
    • Selector: Agregue una etiqueta y haga clic en Add. Un Service selecciona un pod basado en la etiqueta agregada. También puede hacer clic en Reference Workload Label para hacer referencia a la etiqueta de una carga de trabajo existente. En el cuadro de diálogo que se muestra, seleccione una carga de trabajo y haga clic en OK.
    • IPv6: Esta función está deshabilitada por defecto. Una vez habilitada esta función, la dirección IP del clúster del Service cambia a una dirección IPv6. Para obtener más información, consulte ¿Cómo creo un clúster de doble pila IPv4/IPv6? Este parámetro solo está disponible en clústeres de v1.15 o posterior con IPv6 habilitado (establecido durante la creación del clúster).
    • Configuraciones del puerto
      • Protocol: protocolo utilizado por el Service.
      • Service Port: puerto utilizado por el Service. El número de puerto se encuentra dentro del rango de 1 a 65535.
      • Container Port: puerto en el que escucha la carga de trabajo. Por ejemplo, Nginx utiliza el puerto 80 de forma predeterminada.
      • Node Port: Se recomienda seleccionar Auto. También puede especificar un puerto. El puerto predeterminado oscila entre 30000 y 32767.

  4. Haga clic en OK.

Uso de kubectl

Puede ejecutar comandos kubectl para establecer el tipo de acceso. En esta sección se utiliza una carga de trabajo de Nginx como ejemplo para describir cómo establecer un Service de NodePort mediante kubectl.

  1. Utilice kubectl para conectarse al clúster. Para obtener más información, véase Conexión a un clúster con kubectl.
  2. Cree y edite los archivos nginx-deployment.yaml y nginx-nodeport-svc.yaml.

    Los nombres de archivo están definidos por el usuario. nginx-deployment.yaml y nginx-nodeport-svc.yaml son simplemente nombres de archivo de ejemplo.

    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     # Node port. The value ranges from 30000 to 32767.
        port: 8080          # Port for accessing a Service.
        protocol: TCP       # Protocol used for accessing a Service. The value can be TCP or UDP.
        targetPort: 80      # Port used by a Service to access the target container. This port is closely related to the applications running in a container. In this example, the Nginx image uses port 80 by default.
      selector:             # Label selector. A Service selects a pod based on the label and forwards the requests for accessing the Service to the pod. In this example, select the pod with the app:nginx label.
        app: nginx
      type: NodePort        # Service type. NodePort indicates that the Service is accessed through a node port.

  3. Cree una carga de trabajo.

    kubectl create -f nginx-deployment.yaml

    Si se muestra información similar a la siguiente, se ha creado la carga de trabajo.

    deployment "nginx" created

    kubectl get po

    Si se muestra la información similar a la siguiente, la carga de trabajo se está ejecutando.

    NAME                     READY     STATUS             RESTARTS   AGE
    nginx-2601814895-qhxqv   1/1       Running            0          9s

  4. Cree un Service.

    kubectl create -f nginx-nodeport-svc.yaml

    Si se muestra información similar a la siguiente, se está creando el Service.

    service "nginx-nodeport" created

    kubectl get svc

    Si se muestra la información similar a la siguiente, se ha creado el 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

  5. Acceda al Servicio.

    De forma predeterminada, se puede acceder a un Service de NodePort con Any node IP address:Node port.

    Se puede acceder al Service desde un nodo en otro clúster en la misma VPC o en otro pod del clúster. Si una dirección IP pública está vinculada al nodo, también puede usar la dirección IP pública para acceder al Service. Cree un contenedor en el clúster y acceda al contenedor con Node IP address:Node port.

    # 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
    # kubectl run -i --tty --image nginx:alpine test --rm /bin/sh
    If you do not see a command prompt, try pressing Enter.
    / # 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>
    / #