Nesta página, mostramos como criar um objeto de Entrada do Kubernetes em um cluster de usuário nos clusters do Anthos no VMware (GKE On-Prem). Um objeto Entrada precisa estar associado a um ou mais objetos Serviço, e cada um deles associado a um conjunto de pods.
SSH na estação de trabalho de administrador
Implemente SSH na estação de trabalho de administrador:
ssh -i ~/.ssh/vsphere_workstation ubuntu@[IP_ADDRESS]
[IP_ADDRESS] é o endereço IP da sua estação de trabalho de administrador.
Siga todas as etapas restantes neste tópico na sua estação de trabalho de administrador.
Como criar uma implantação
Veja o manifesto de uma implantação:
apiVersion: apps/v1 kind: Deployment metadata: name: hello-deployment spec: selector: matchLabels: greeting: hello replicas: 3 template: metadata: labels: greeting: hello spec: containers: - name: hello-world image: "gcr.io/google-samples/hello-app:2.0" env: - name: "PORT" value: "50000" - name: hello-kubernetes image: "gcr.io/google-samples/node-hello:1.0" env: - name: "PORT" value: "8080"
Para este exercício, é importante entender os pontos a seguir sobre o manifesto de implantação:
Cada pod que pertence à implantação tem o rótulo
greeting: hello
.Cada pod tem dois contêineres.
Os campos
env
especificam que os contêinereshello-app
detectam atividade na porta TCP 50000 e os contêineresnode-hello
detectam atividade na porta TCP 8080. Parahello-app
, é possível ver o efeito da variável de ambientePORT
observando o código-fonte.
Copie o manifesto em um arquivo denominado hello-deployment.yaml
e crie a implantação:
kubectl apply --kubeconfig [USER_CLUSTER_KUBECONFIG] -f hello-deployment.yaml
em que [USER_CLUSTER_KUBECONFIG] é o arquivo kubeconfig do cluster de usuário.
Como expor sua implantação com um Serviço
Se quiser oferecer uma forma estável para os clientes enviarem solicitações aos pods da implantação, crie um Serviço.
Veja aqui um manifesto para um Serviço que expõe a implantação a clientes dentro e fora do cluster:
apiVersion: v1 kind: Service metadata: name: hello-service spec: type: NodePort selector: greeting: hello ports: - name: world-port protocol: TCP port: 60000 targetPort: 50000 - name: kubernetes-port protocol: TCP port: 60001 targetPort: 8080
Copie o manifesto para um arquivo chamado hello-service.yaml
e crie o Service:
kubectl apply --kubeconfig [USER_CLUSTER_KUBECONFIG] -f hello-service.yaml
Veja o Serviço:
kubectl --kubeconfig [USER_CLUSTER_KUBECONFIG] get service hello-service --output yaml
A saída mostra os valores nodePort
que foram atribuídos ao Serviço:
apiVersion: v1 kind: Service metadata: ... name: hello-service namespace: default ... spec: clusterIP: 10.105.252.237 externalTrafficPolicy: Cluster ports: - name: world-port nodePort: 31807 port: 60000 protocol: TCP targetPort: 50000 - name: kubernetes-port nodePort: 30734 port: 60001 protocol: TCP targetPort: 8080 selector: greeting: hello sessionAffinity: None type: NodePort status: loadBalancer: ingress: - {}
Na saída anterior, o campo ports
é uma matriz de objetos
ServicePort:
um chamado world-port
e outro chamado kubernetes-port
.
Veja como um cliente pode chamar o Serviço usando world-port
:
Um cliente executando em um dos nós do cluster pode enviar uma solicitação para o
clusterIP
emport
. Neste exemplo, 10.105.252.237:60000. A solicitação é encaminhada a um pod membro emtargetPort
. Neste exemplo, [POD_IP_ADDRESS]:50000.Um cliente pode enviar uma solicitação para o endereço IP de qualquer nó de cluster em
nodePort
. Neste exemplo, [NODE_IP_ADDRESS]:31807. A solicitação é encaminhada a um pod membro emtargetPort
. Neste exemplo, [POD_IP_ADDRESS]:50000.
Veja como um cliente pode chamar o Serviço usando kubernetes-port
:
Um cliente executando em um dos nós do cluster pode enviar uma solicitação para o
clusterIP
emport
. Neste exemplo, 10.105.252.237:60001. A solicitação é encaminhada a um pod membro emtargetPort
. Neste exemplo, [POD_IP_ADDRESS]:8080.Um cliente pode enviar uma solicitação para o endereço IP de qualquer nó de cluster em
nodePort
. Neste exemplo, [NODE_IP_ADDRESS]:30734. A solicitação é encaminhada a um pod membro emtargetPort
. Neste exemplo, [POD_IP_ADDRESS]:8080.
Como criar um Ingress
Veja aqui um manifesto de uma Entrada:
apiVersion: networking.k8s.io/v1beta1 kind: Ingress metadata: name: my-ingress spec: rules: - http: paths: - path: /greet-the-world backend: serviceName: hello-service servicePort: 60000 - path: /greet-kubernetes backend: serviceName: hello-service servicePort: 60001
Copie o manifesto em um arquivo chamado my-ingress.yaml
e crie a
Entrada:
kubectl apply --kubeconfig [USER_CLUSTER_KUBECONFIG] -f my-ingress.yaml
Como parte da criação do cluster do usuário, você especificou um endereço IP virtual (VIP, na sigla em inglês)
para a entrada, fornecendo um valor para usercluster.vips.ingressvip
no
arquivo de configuração do cluster do usuário.
Quando um cliente envia uma solicitação ao VIP de entrada do cluster de usuário, a solicitação é roteada para o balanceador de carga F5 BIG-IP. O balanceador de carga encaminha a solicitação para um Serviço de entrada em execução no cluster de usuário. O Serviço de entrada está configurado para encaminhar a solicitação a back-ends diferentes, dependendo do caminho no URL da solicitação.
É importante entender que há dois Serviços diferentes relacionados às etapas deste tópico:
Seu Serviço chamado
hello-service
. É um Serviço que você criou para expor os pods da implantação dohello-deployment
.O Serviço de entrada que é executado no namespace
gke-system
do cluster de usuário. Esse serviço faz parte da infraestrutura do cluster.
Caminho /greet-the-world
No manifesto de Entrada, há uma regra que diz que o caminho
/greet-the-world
está associado a serviceName: hello-service
e
servicePort: 60000
. Lembre-se de que 60000 é o valor da port
no campo world-port
do Serviço hello-service
.
- name: world-port nodePort: 31807 port: 60000 protocol: TCP targetPort: 50000
O Serviço de entrada escolhe um nó de cluster e encaminha a solicitação para o nó
em nodePort
. Neste exemplo, [NODE_IP_ADDRESS]:31807. As regras do iptables
no nó encaminham a solicitação para um pod membro na porta 50000. O
contêiner que detecta atividade na porta 50000 exibe uma mensagem Hello World!
.
Caminho /greet-kubernetes
No manifesto de Entrada, há uma regra que diz que o caminho
/greet-kubernetes
está associado a serviceName: hello-service
e
servicePort: 60001
. Lembre-se de que 60001 é o valor da port
no campo kubernetes-port
do seu Serviço hello-service
.
- name: kubernetes-port nodePort: 30734 port: 60001 protocol: TCP targetPort: 8080
O Serviço de entrada escolhe um nó de cluster e encaminha a solicitação para o nó
em nodePort
. Neste exemplo, [NODE_IP_ADDRESS]:30734. As regras do iptables
no nó encaminham a solicitação para um pod membro na porta 8080.
O contêiner que detecta atividade na porta 8080 exibe uma mensagem Hello Kubernetes!
.
Teste o Entrada:
Teste o Entrada usando o caminho /greet-the-world
:
curl [USER_CLUSTER_INGRESS_VIP]/greet-the-world
A saída mostra uma mensagem Hello, world!
:
Hello, world! Version: 2.0.0 Hostname: ...
Teste o Entrada usando o caminho /greet-kubernetes
:
curl [USER_CLUSTER_INGRESS_VIP]/greet-kubernetes
A saída mostra uma mensagem Hello, Kubernetes!
:
Hello Kubernetes!
Limpeza
Exclua o Entrada:
kubectl --kubeconfig [USER_CLUSTER_KUBECONFIG] delete ingress my-ingress
Exclua o Serviço:
kubectl --kubeconfig [USER_CLUSTER_KUBECONFIG] delete service hello-service
Exclua a implantação:
kubectl --kubeconfig [USER_CLUSTER_KUBECONFIG] delete deployment hello-deployment