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.
![Clique para ampliar](https://support.huaweicloud.com/intl/pt-br/usermanual-cce/pt-br_image_0000001199501230.png)
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
- Efetue logon no console do CCE e clique no nome do cluster para acessar o console do cluster.
- Escolha Networking no painel de navegação e clique em Create Service no canto superior direito.
- 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.
- 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.
- Use o kubectl para se conectar ao cluster. Para mais detalhes, consulte Conexão a um cluster usando o kubectl.
- 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.
- 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
- 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
- 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> / #