Observação:

Imponha serviços internos do Oracle Container Engine for Kubernetes Load Balancer usando Kyverno

Introdução

O Oracle Cloud Infrastructure Container Engine for Kubernetes (OKE) é um serviço totalmente gerenciado, escalável e altamente disponível que você pode usar para implantar seus aplicativos de contêineres na nuvem.

Os aplicativos em execução no cluster do OKE podem ser expostos usando os serviços do tipo LoadBalancer. Para cada serviço, o cloud-controller-manager incorporado do OKE criará um Balanceador de Carga do Oracle Cloud Infrastructure (OCI) e configurará automaticamente o backend para incluir os nós de trabalho do OKE. A configuração do Balanceador de Carga do OCI pode ser controlada usando anotações e, em caso de ausência, o cloud-controller-manager assumirá os seguintes padrões:

Usando o Kyverno, podemos aproveitar os Webhooks de Admissão Mutante do Kubernetes e definir uma política com um conjunto de anotações padrão que pretendemos adicionar a Serviços do tipo LoadBalancer criado no cluster do OKE.

Objetivos

Pré-requisitos

Tarefa 1: Instalar Kyverno

A página da web Kyverno descreve dois métodos para instalar Kyverno em um cluster de Kubernetes, usando:

Neste tutorial, vamos nos concentrar em como instalar Kyverno usando os gráficos de Helm.

Tarefa 1.1: Instalar helm

  1. Dependendo do sistema operacional que você estiver, passe este guia e instale helm.

  2. Confirme se a instalação foi bem-sucedida executando o seguinte comando:

    $ helm version
    version.BuildInfo{Version:"v3.8.1", GitCommit:"5cb9af4b1b271d11d7a97a71df3ac337dd94ad37", GitTreeState:"clean", GoVersion:"go1.17.5"}
    

Tarefa 1.2: Instalar Kyverno no modo autônomo

  1. Adicione o repositório Kyverno Helm.

    $ helm repo add kyverno https://kyverno.github.io/kyverno/
    "kyverno" has been added to your repositories
    
  2. Digitalize o novo repositório para gráficos.

    $ helm repo update
    Hang tight while we grab the latest from your chart repositories...
    ...Successfully got an update from the "kyverno" chart repository
    Update Complete. ⎈Happy Helming!⎈
    
  3. Instale Kyverno no namespace kyverno.

    $ helm install kyverno kyverno/kyverno -n kyverno --create-namespace
    NAME: kyverno
    LAST DEPLOYED: Fri Jun 16 17:50:48 2023
    NAMESPACE: kyverno
    STATUS: deployed
    REVISION: 1
    NOTES:
    Chart version: 3.0.1
    Kyverno version: v1.10.0
    
    Thank you for installing kyverno! Your release is named kyverno.
    
    The following components have been installed in your cluster:
    - CRDs
    - Admission controller
    - Reports controller
    - Cleanup controller
    - Background controller
    

Tarefa 2: Definir padrões de Serviço usando ClusterPolicy

  1. Crie um arquivo chamado enforce-internal-loadbalancer.yaml.

  2. Copie e cole o texto abaixo no arquivo.

    apiVersion: kyverno.io/v1
    # The `ClusterPolicy` kind applies to the resources deployed in any namespace.
    kind: ClusterPolicy
    metadata:
    name: mutate-oci-services
    spec:
    rules:
    # As part of this rule we intend to mutate Flexible Load Balancers.
    - name: mutate-lb-services
       # We look for all requests to Create or Update Kubernetes Services.
       match:
          resources:
          kinds:
          - Service
          operations:
          - CREATE
          - UPDATE
       # We exclude services with the label: "service-type: external".
       exclude:
          resources:
          selector:
             matchLabels:
                service-type: "external"
       # Out of all the services we are interested in those of type Load Balancer where the annotation oci.oraclecloud.com/load-balancer-type is not present or equal to "nlb".
       preconditions:
          all:
          - key: ""
          operator: Equals
          value: LoadBalancer
          - key: ""
          operator: NotEquals
          value: "nlb"
       # We mutate the request by appending the annotations required to create an internal Load Balancer.
       mutate:
          patchStrategicMerge:
          metadata:
             annotations:
                service.beta.kubernetes.io/oci-load-balancer-internal: "true"
                # service.beta.kubernetes.io/oci-load-balancer-subnet1: "ocid1.subnet.oc1...3gi7y5a"
    # As part of this rule we intend to mutate Network Load Balancers.
    - name: mutate-nlb-services
       # We look for all requests to Create or Update Kubernetes Services with the annotation oci.oraclecloud.com/load-balancer-type: "nlb".
       match:
          resources:
          kinds:
          - Service
          annotations:
             oci.oraclecloud.com/load-balancer-type: "nlb"
          operations:
          - CREATE
          - UPDATE
       # We exclude services with the label: "service-type: external".
       exclude:
          resources:
          selector:
             matchLabels:
                service-type: "external"
       # Out of all the services we are interested in those of type Load Balancer.
       preconditions:
          all:
          - key: ""
          operator: Equals
          value: LoadBalancer
       # We mutate the request by appending the annotations required to create an internal NetworkLoad Balancer.
       mutate:
          patchStrategicMerge:
          metadata:
             annotations:
                oci-network-load-balancer.oraclecloud.com/internal: "true"
                # oci-network-load-balancer.oraclecloud.com/subnet: "ocid1.subnet.oc1...3gi7y5a"
    
  3. Salve o arquivo.

    Observação: para obter uma lista de todas as anotações suportadas no OKE para o tipo de serviço LoadBalancer, consulte Resumo de Anotações para Balanceadores de Carga e Balanceadores de Carga de Rede.

  4. Crie o comando ClusterPolicy no cluster e execute abaixo para impor a política:

    $ kubectl apply -f enforce-internal-loadbalancer.yaml
    clusterpolicy.kyverno.io/mutate-oci-services created
    

Tarefa 3: Teste

  1. Crie um arquivo chamado test-service.yaml contendo o texto abaixo:

    apiVersion: v1
    kind: Service
    metadata:
    name: my-nginx-svc
    labels:
       app: nginx
       # service-type: external
    annotations:
       oci.oraclecloud.com/load-balancer-type: "lb"
    spec:
    type: LoadBalancer
    ports:
    - port: 80
    selector:
       app: nginx
    
  2. Valide se as anotações necessárias para criar um LoadBalancer interno são adicionadas usando o comando abaixo:

    $ kubectl apply -f test_service.yaml --dry-run=server -o json | jq ".metadata.annotations"
    {
    "kubectl.kubernetes.io/last-applied-configuration": "{\"apiVersion\":\"v1\",\"kind\":\"Service\",\"metadata\":{\"annotations\":{\"oci.oraclecloud.com/load-balancer-type\":\"lb\"},\"labels\":{\"app\":\"nginx\"},\"name\":\"my-nginx-svc\",\"namespace\":\"default\"},\"spec\":{\"ports\":[{\"port\":80}],\"selector\":{\"app\":\"nginx\"},\"type\":\"LoadBalancer\"}}\n",
    "oci.oraclecloud.com/load-balancer-type": "lb",
    "policies.kyverno.io/last-applied-patches": "mutate-lb-services.mutate-oci-services.kyverno.io: added /metadata/annotations/service.beta.kubernetes.io~1oci-load-balancer-internal\n",
    "service.beta.kubernetes.io/oci-load-balancer-internal": "true"
    }
    
  3. Você pode validar se o balanceador de carga interno foi criado com sucesso executando o comando:

    $ kubectl apply -f test_service.yaml
    

Tarefa 4: Limpar

  1. Exclua o balanceador de carga criado durante o teste:

    $ kubectl delete -f test_service.yaml
    
  2. Desinstale Kyverno executando o comando:

    $ helm uninstall kyverno -n kyverno
    

Confirmações

Mais Recursos de Aprendizagem

Explore outros laboratórios no site docs.oracle.com/learn ou acesse mais conteúdo de aprendizado gratuito no canal YouTube do Oracle Learning. Além disso, visite education.oracle.com/learning-explorer para se tornar um Oracle Learning Explorer.

Para obter a documentação do produto, visite o Oracle Help Center.