Observação:

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:

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

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 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

  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 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

  1. Gere o usuário Auth Token seguindo as etapas fornecidas aqui: Obtendo um Token de Autenticação

  2. 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

  3. 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 ou axaxnpcrorw5/oracleidentitycloudservice/jdoe@acme.com

  4. 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

  1. Crie um arquivo chamado add-imagepullsecret.yaml.

  2. 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
    
  3. Substitua o endereço OCIR padrão phx.ocir.io/axaxnpcrorw5 pelo que você está usando.

  4. 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

  1. 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
    
  2. Criar os recursos

    kubectl apply -f test-pod.yaml
    
  3. Valide se o pod foi criado com sucesso.

    kubectl get pods -n testns
    # NAME      READY   STATUS    RESTARTS   AGE
    # testpod   1/1     Running   0          2m4s
    
  4. 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

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

    kubectl delete -f test-pod.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.