Este conteúdo foi traduzido por máquina para sua conveniência e a Huawei Cloud não pode garantir que o conteúdo foi traduzido com precisão. Para exibir o conteúdo original, use o link no canto superior direito para mudar para a página em inglês.
Atualizado em 2024-11-28 GMT+08:00

NodePort

Cenário

Um Serviço é exposto no endereço IP de cada nó em uma porta estática (NodePort). Quando você cria um Serviço NodePort, o Kubernetes aloca automaticamente um endereço IP interno (ClusterIP) do cluster. Quando os clientes fora do cluster acessarem <NodeIP>:<NodePort>, o tráfego será encaminhado para o pod de destino por meio do ClusterIP do Serviço NodePort.

Figura 1 Acesso a NodePort

Restrições

  • Por padrão, um Serviço NodePort é acessado dentro de uma VPC. Para usar um EIP para acessar um Serviço NodePort por meio de redes públicas, vincule um EIP ao nó do cluster com antecedência.
  • Depois que um Serviço é criado, se a configuração de afinidade for alternada do nível do cluster para o nível do nó, a tabela de rastreamento de conexão não será limpa. Não modifique a configuração de afinidade de Serviço após a criação do Serviço. Para modificá-lo, crie um Serviço novamente.
  • Os clusters do CCE Turbo suportam apenas afinidade de serviço em nível de cluster.
  • No modo de rede da VPC, quando o contêiner A é publicado por meio de um serviço NodePort e a afinidade do serviço é definida no nível do nó (ou seja, externalTrafficPolicy é definido como local), o contêiner B implementado no mesmo nó não pode acessar o contêiner A por meio do endereço IP do nó e do serviço NodePort.
  • Quando um serviço NodePort é criado em um cluster v1.21.7 ou posterior, a porta no nó não é exibida usando netstat por padrão. Se o modo de encaminhamento de cluster for iptables, execute o comando iptables -t nat -L para exibir a porta. Se o modo de encaminhamento de cluster for IPVS, execute o comando ipvsadm -Ln para exibir a porta.

Criar um Serviço NodePort

  1. Efetue logon no console do CCE e clique no nome do cluster para acessar o console do cluster.
  2. Escolha Networking no painel de navegação e clique em Create Service no canto superior direito.
  3. Defina os parâmetros de acesso dentro do cluster.

    • Service Name: especifique um nome do Serviço, que pode ser o mesmo que o nome da carga de trabalho.
    • Service Type: selecione NodePort.
    • Namespace: namespace ao qual a carga de trabalho pertence.
    • Service Affinity: para mais detalhes, consulte externalTrafficPolicy (afinidade de serviço).
      • Cluster level: os endereços IP e as portas de acesso de todos os nós em um cluster podem acessar a carga de trabalho associada ao Serviço. O acesso ao Serviço causará perda de desempenho devido ao redirecionamento de rota e o endereço IP de origem do cliente não pode ser obtido.
      • Node level: somente o endereço IP e a porta de acesso do nó onde a carga de trabalho está localizada podem acessar a carga de trabalho associada ao Serviço. O acesso ao Serviço não causará perda de desempenho devido ao redirecionamento de rota e o endereço IP de origem do cliente pode ser obtido.
    • Selector: adicione um rótulo e clique em Confirm. Um Serviço seleciona um pod com base no rótulo adicionado. Você também pode clicar em Reference Workload Label para fazer referência ao rótulo de uma carga de trabalho existente. Na caixa de diálogo exibida, selecione uma carga de trabalho e clique em OK.
    • IPv6: esta função está desativada por padrão. Depois que essa função é ativada, o endereço IP do cluster do Serviço muda para um endereço IPv6. Para obter detalhes, consulte Criação de um cluster IPv4/IPv6 de pilha dupla no CCE. Este parâmetro está disponível apenas em clusters de v1.15 ou posterior com IPv6 habilitado (definido durante a criação do cluster).
    • Port Settings
      • Protocol: protocolo utilizado pelo Serviço.
      • Service Port: porta utilizada pelo Serviço. O número da porta varia de 1 a 65535.
      • Container Port: porta na qual a carga de trabalho escuta. Por exemplo, o Nginx usa a porta 80 por padrão.
      • Node Port: é aconselhável selecionar Auto. Você também pode especificar uma porta. A porta padrão varia de 30000 a 32767.

  4. Clique em OK.

Usar o kubectl

Você pode executar comandos kubectl para definir o tipo de acesso. Esta seção usa uma carga de trabalho do Nginx como exemplo para descrever como definir um Serviço NodePort usando kubectl.

  1. Use o kubectl para se conectar ao cluster. Para mais detalhes, consulte Conexão a um cluster usando o kubectl.
  2. Crie e edite os arquivos nginx-deployment.yaml e nginx-nodeport-svc.yaml.

    Os nomes dos arquivos são definidos pelo usuário. nginx-deployment.yaml e nginx-nodeport-svc.yaml são apenas nomes de arquivo de exemplo.

    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. Crie uma carga de trabalho.

    kubectl create -f nginx-deployment.yaml

    Se forem exibidas informações semelhantes às seguintes, a carga de trabalho foi criada.

    deployment "nginx" created

    kubectl get po

    Se informações semelhantes às seguintes forem exibidas, a carga de trabalho está em execução.

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

  4. Crie um Serviço.

    kubectl create -f nginx-nodeport-svc.yaml

    Se forem exibidas informações semelhantes às seguintes, o Serviço foi criado.

    service "nginx-nodeport" created

    kubectl get svc

    Se forem apresentadas informações semelhantes às seguintes, o Serviço foi criado.

    # 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. Acesse o Serviço.

    Por padrão, um Serviço NodePort pode ser acessado usando Any node IP address:Node port.

    O Serviço pode ser acessado de um nó em outro cluster na mesma VPC ou em outro pod no cluster. Se um endereço IP público estiver vinculado ao nó, você também poderá usar o endereço IP público para acessar o Serviço. Crie um contêiner no cluster e acesse o contêiner usando 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>
    / #