Observação:
- Este tutorial requer acesso ao Oracle Cloud. Para se inscrever e obter uma conta gratuita, consulte Conceitos Básicos do Oracle Cloud Infrastructure Free Tier.
- Ele usa valores de exemplo para credenciais, tenancy e compartimentos do Oracle Cloud Infrastructure. Ao concluir seu laboratório, substitua esses valores por valores específicos do seu ambiente de nuvem.
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:
- balanceador de carga interno:
false - forma:
fixed - largura de banda:
100Mbps - protocolo do listener:
TCP
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
-
Implante Kyverno no cluster do OKE.
-
Saiba como usar Kyverno para forçar a criação de balanceadores de carga internos por padrão.
Pré-requisitos
-
Inscreva-se ou entre na sua Conta do Oracle Cloud.
-
Use um cluster existente do OKE ou use o fluxo de Criação Rápida para criar um.
-
kubectlinstalado e configurado para acessar o cluster do OKE.
Tarefa 1: Instalar Kyverno
A página da web Kyverno descreve dois métodos para instalar Kyverno em um cluster de Kubernetes, usando:
- Gráficos Helm
- YAMLs
Neste tutorial, vamos nos concentrar em como instalar Kyverno usando os gráficos de Helm.
Tarefa 1.1: Instalar helm
-
Dependendo do sistema operacional que você estiver, passe este guia e instale
helm. -
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
-
Adicione o repositório Kyverno Helm.
$ helm repo add kyverno https://kyverno.github.io/kyverno/ "kyverno" has been added to your repositories -
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!⎈ -
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
-
Crie um arquivo chamado
enforce-internal-loadbalancer.yaml. -
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" -
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.
-
Crie o comando
ClusterPolicyno 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
-
Crie um arquivo chamado
test-service.yamlcontendo 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 -
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" } -
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
-
Exclua o balanceador de carga criado durante o teste:
$ kubectl delete -f test_service.yaml -
Desinstale Kyverno executando o comando:
$ helm uninstall kyverno -n kyverno
Links Relacionados
- Documentação do OKE
- Serviços OKE do tipo Balanceador de Carga
- Oracle Cloud Free Tier
- Acesse a sua Conta do Oracle Cloud
- Kyverno homepage
Confirmações
- Autor - Andrei Ilas (Arquiteto de Nuvem Principal)
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.
Enforce internal Oracle Container Engine for Kubernetes Load Balancer services using Kyverno
F83798-01
July 2023
Copyright © 2023, Oracle and/or its affiliates.