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.
Injete o atributo ImagePullSecrets nos pods do Kubernetes 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.
O Oracle Cloud Infrastructure Registry (também conhecido como Container Registry ou OCIR) é um registro gerenciado pela Oracle que permite simplificar seu desenvolvimento para o workflow de produção. O Container Registry facilita para você como desenvolvedor para armazenar, compartilhar e gerenciar imagens de contêiner.
Você pode criar repositórios de imagens de contêiner públicos ou privados no OCIR:
-
As imagens armazenadas nos repositórios públicos podem ser acessadas sem fornecer credenciais.
-
As imagens armazenadas nos repositórios privados exigem autenticação e autorização.
Para extrair a imagem do registro privado OCIR, o Kubernetes precisa de credenciais. O atributo spec.imagePullSecrets
no arquivo de configuração do Pod especifica uma lista de segredos do Kubernetes com credenciais que os nós de trabalho devem usar para extrair as imagens do contêiner dos registros.
Para simplificar a aplicação manifesta e implantação, e para desacoplar algumas das configurações específicas do cluster do OKE ao integrar com o OCIR, podemos usar Kyverno. Esse projeto de incubação sob CNCF pode validar, mutar, gerar e limpar recursos do Kubernetes usando a definição de Políticas. Podemos aproveitar esse produto para silenciar os manifestos que estamos submetendo à API do Kubernetes quando estamos criando novos pods e injetando o atributo imagePullSecrets
, necessário para extrair as imagens do contêiner armazenadas no OCIR.
Objetivos
-
Implante Kyverno no cluster do OKE.
-
Saiba como usar Kyverno para ativar a criação do segredo OCIR em novos namespaces e injetar o
spec.imagePullSecrets
nos novos pods.
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.
-
kubectl
instalado 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 comando a seguir.
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 Aug 30 12:20:33 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: Criar Segredo ImagePull do Kubernetes
-
Gere o usuário
Auth Token
seguindo as etapas fornecidas aqui: Obtendo um Token de Autenticação -
Certifique-se de que as políticas adequadas estejam configuradas para permitir o acesso do usuário ao OCIR: Políticas para Controlar o Acesso ao Repositório
-
Confirme o URL do registro OCIR, o nome de usuário e a senha:
O URL de Registro se baseia na chave de região do OCI:
<region-key>.ocir.io
Exemplo: Para a região OCI Phoenix:
phx.ocir.io
O Nome do Usuário se baseia no namespace da tenancy, no nome do usuário do oci e no IDP(se usado):
<tenancy-namespace>/<username>
ou<tenancy-namespace>/oracleidentitycloudservice/<username>
Exemplo:
axaxnpcrorw5/jdoe@acme.com
ouaxaxnpcrorw5/oracleidentitycloudservice/jdoe@acme.com
-
Crie o segredo do Kubernetes chamado
ocirsecret
.kubectl create secret docker-registry ocirsecret --docker-server='<OCIR registry>' --docker-username='<username>' --docker-password='<auth-token>'
Exemplo:
kubectl create secret docker-registry ocirsecret --docker-server='phx.ocir.io' --docker-username='axaxnpcrorw5/jdoe@acme.com' --docker-password='cxOY5NL<AnBN}<123{_6'
Tarefa 3: Definir Kyverno necessário ClusterPolicies
-
Crie um arquivo chamado
add-imagepullsecret.yaml
. -
Copie e cole o texto abaixo no arquivo.
--- apiVersion: kyverno.io/v1 kind: ClusterPolicy metadata: name: inject-imagepullsecret-to-namespace annotations: policies.kyverno.io/title: Clone imagePullSecret secret to new namespaces policies.kyverno.io/subject: Namespace policies.kyverno.io/description: >- ImagePullSecrets must be present in the same namespace as the pods using them. This policy monitors for new namespaces being created (except kube-system and kyverno), and automatically clones into the namespace the `ocirsecret` from the `default` namespace. spec: generateExisting: true rules: - name: inject-imagepullsecret-to-namespace match: any: - resources: kinds: - Namespace exclude: any: - resources: namespaces: - kube-system - kube-node-lease - kube-public - kyverno generate: apiVersion: v1 kind: Secret name: ocirsecret namespace: "{{ request.object.metadata.name }}" synchronize: true clone: namespace: default name: ocirsecret --- apiVersion: kyverno.io/v1 kind: ClusterPolicy metadata: name: add-imagepullsecrets annotations: policies.kyverno.io/title: Add imagePullSecrets policies.kyverno.io/subject: Pod policies.kyverno.io/description: >- Images coming from certain registries require authentication in order to pull them, and the kubelet uses this information in the form of an imagePullSecret to pull those images on behalf of your Pod. This policy searches pod spec for images coming from a registry which contains `phx.ocir.io/axaxnpcrorw5` and, if found, will mutate the Pod to add an imagePullSecret called `ocirsecret`. spec: rules: - name: add-imagepullsecret match: any: - resources: kinds: - Pod context: - name: images_in_ocir variable: jmesPath: "[request.object.spec.containers[*].image.contains(@, 'phx.ocir.io/axaxnpcrorw5'), request.object.spec.initContainers[*].image.contains(@, 'phx.ocir.io/axaxnpcrorw5')][]" default: [] preconditions: all: - key: true operator: In value: "{{ images_in_ocir }}" mutate: patchStrategicMerge: spec: imagePullSecrets: - name: ocirsecret
-
Substitua o endereço OCIR padrão
phx.ocir.io/axaxnpcrorw5
pelo que você está usando. -
Crie o
ClusterPolicy
no cluster e execute o comando abaixo para impor a política.kubectl apply -f add-imagepullsecret.yaml # clusterpolicy.kyverno.io/inject-imagepullsecret-to-namespace created # clusterpolicy.kyverno.io/add-imagepullsecrets created
Tarefa 4: Teste
-
Crie um arquivo chamado
test-pod.yaml
contendo o texto abaixo:Observação: Preencha o URL da imagem do repositório privado no espaço reservado.
--- apiVersion: v1 kind: Namespace metadata: name: testns --- apiVersion: v1 kind: Pod metadata: labels: run: testpod name: testpod namespace: testns spec: containers: - args: - /bin/sh - -c - sleep infinity image: <image_from_OCIR> # eg: phx.ocir.io/axaxnpcrorw5/nginx:latest name: test resources: {} dnsPolicy: ClusterFirst restartPolicy: Always
-
Criar os recursos
kubectl apply -f test-pod.yaml
-
Valide se o pod foi criado com sucesso.
kubectl get pods -n testns # NAME READY STATUS RESTARTS AGE # testpod 1/1 Running 0 2m4s
-
Valide se o segredo foi clonado do namespace padrão para o novo namespace criado.
kubectl get secret -n testns # NAME TYPE DATA AGE # ocirsecret kubernetes.io/dockerconfigjson 1 2m56s
Tarefa 5: Limpar
-
Exclua o balanceador de carga criado durante o teste.
kubectl delete -f test-pod.yaml
-
Desinstale Kyverno executando o comando.
helm uninstall kyverno -n kyverno
Links Relacionados
- Documentação do OKE
- Documentação do OCIR
- Oracle Cloud Free Tier
- Acesse a sua Conta do Oracle Cloud
- Kyverno homepage
- Registro privado de imagem do Kubernetes
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.
Inject the ImagePullSecrets attribute into Kubernetes pods using Kyverno
F86190-02
September 2023
Copyright © 2023, Oracle and/or its affiliates.