Como criar um serviço e uma entrada

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êineres hello-app detectam atividade na porta TCP 50000 e os contêineres node-hello detectam atividade na porta TCP 8080. Para hello-app, é possível ver o efeito da variável de ambiente PORT 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 em port. Neste exemplo, 10.105.252.237:60000. A solicitação é encaminhada a um pod membro em targetPort. 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 em targetPort. 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 em port. Neste exemplo, 10.105.252.237:60001. A solicitação é encaminhada a um pod membro em targetPort. 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 em targetPort. 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 do hello-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