Day 8
Sumário
- 🎥 Intro Day-8 - 02:50
 - 📖 O que iremos ver hoje?
 - 🎥 O que são as Secrets do Kubernetes? - 05:16
 - 🎥 Conhecendo todos os tipos de Secrets e o que é a codificação base64 - 13:21
 - 📖 O que são os Secrets e o Base64
 - 🎥 Criando um Secret do tipo Opaque - 07:22
 - 📖 Criando o nosso primeiro Secret
 - 🎥 Utilizando o nosso Secret como variável de ambiente no Pod - 06:34
 - 📖 Utilizando o nosso Secret dentro de um Pod
 - 🎥 Criando um Secret para autenticar no Docker Hub do tipo dockerconfigjson e usar imagens privadas - 22:05
 - 📖 Criando um Secret para autenticar no Docker Hub
 - 🎥 Criando um Secret do tipo tls para armazenar um certificado e chave TLS - 06:39
 - 📖 Criando um Secret do tipo TLS
 - 🎥 O que são os ConfigMaps? - 02:09
 - 🎥 Criando um ConfigMap para adicionar um arquivo no Pod e configurar SSL no Nginx - 26:48
 - 📖 Criando e utilizando ConfigMaps
 - 🎥 Encerramento Day-8 - 01:06
 - 📖 Encerramento Day-8
 - 📝 Desafio Prático do Day8
 
Legenda
🎥 - Aula gravada
📖 - Material complementar
📝 - Atividade
Dia 8
No dia 8, vamos aprender sobre Secrets e ConfigMaps. Vamos entender o que são, como criar e como utilizar esses recursos no Kubernetes.
Material complementar: Leitura complementar do Day-8
Secrets
Secrets são objetos do Kubernetes que armazenam informações sensíveis, como senhas, tokens, chaves de acesso, etc. Por padrão o Kubernetes armazena os Secrets em base64, mas é importante saber que base64 não é uma forma segura de criptografar informações, é apenas uma forma de codificar.
Material complementar: Kubernetes: Secret
Temos 7 tipos de Secrets padrão no Kubernetes:
- Opaque: armazena chaves e valores arbitrários
 - kubernetes.io/service-account-token: armazena o token de um service account
 - kubernetes.io/dockercfg: armazena credenciais para acessar um registry do Docker (.dockercfg)
 - kubernetes.io/dockerconfigjson: armazena credenciais para acessar um registry do Docker (.docker/config.json)
 - kubernetes.io/basic-auth: armazena credenciais de autenticação básica
 - kubernetes.io/ssh-auth: armazena chaves SSH
 - kubernetes.io/tls: armazena certificados e chaves TLS
 
Para listar os Secrets do cluster, execute o comando:
kubectl get secrets
# ou
kubectl get secrets --all-namespaces
# ou 
kubectl get secrets -A
Os secrets são armazenados em base64, para codificar uma string em base64, execute o comando:
echo -n "minha-senha" | base64
Para decodificar uma string em base64, execute o comando:
echo "bWluaGEtc2VuaGE=" | base64 -d
# ou
base64 -d <<< "bWluaGEtc2VuaGE="
Exemplo de Secret
Vamos criar um Secret do tipo Opaque, que é o tipo mais genérico de Secret. Esse tipo de Secret é utilizado para armazenar chaves e valores arbitrários.
apiVersion: v1
kind: Secret
metadata:
  name: my-secret
type: Opaque
data:
  # echo -n "admin" | base64
  username: YWRtaW4=
  # echo -n "admin123" | base64
  password: YWRtaW4xMjM=
Para criar o Secret, execute o comando:
kubectl apply -f secret.yaml
Para listar os Secrets do cluster, execute o comando:
kubectl get secrets my-secret
# ou
kubectl get secrets my-secret -o yaml
# ou com describ
kubectl describe secrets my-secret
Utilizando o Secret em um Pod
Para utilizar o Secret em um Pod, adicione o volume do Secret no Pod e adicione o volumeMounts no container.
apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
    - name: my-container
      image: nginx
      env:
        - name: USERNAME
          valueFrom:
            secretKeyRef:
              name: my-secret
              key: username
        - name: PASSWORD
          valueFrom:
            secretKeyRef:
              name: my-secret
              key: password
---
apiVersion: v1
kind: secret
metadata:
  name: my-secret
type: Opaque
data:
  username: YWRtaW4=
  password: YWRtaW4xMjM=
Para criar o Pod, execute o comando:
kubectl apply -f exemplo.yaml
E para verificar se o Secret foi utilizado no Pod, execute o comando:
kubectl exec -it my-pod -- env
Exemplo de Secret para Docker Hub
Vamos criar um Secret para autenticar no Docker Hub do tipo dockerconfigjson, que é utilizado para armazenar credenciais para acessar um registry do Docker.
apiVersion: v1
kind: Secret
metadata:
  name: docker-secret
type: kubernetes.io/dockerconfigjson
data:
  .dockerconfigjson: ewoJImF1dGhzIjogewoJCSJkb2NrZXIuaW8iOiB7CgkJCQkiYXV0aCI6ICJhZG1pbiIsCgkJCQkicGFzc3dvcmQiOiAiYWRtaW4xMjMifQoJCX0KfQo=
Utilizar o Secret no Pod:
apiVersion: v1
kind: Pod
metadata:
  name: docker-pod
spec:
  containers:
    - name: docker-container
      image: nginx
  imagePullSecrets:
    - name: docker-secret
Exemplo de Secret para TLS
Vamos criar um Secret do tipo tls para armazenar um certificado e chave TLS.
Podemos criar um certificado para testar utilizando o comando:
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout chave-privada.key -out certificado.crt
apiVersion: v1
kind: Secret
metadata:
  name: tls-secret
type: kubernetes.io/tls
data:
  # cat cert.pem | base64
  tls.crt: base64-encode-certificate
  # cat key.pem | base64
  tls.key: base64-encode-key
Ou
kubectl create secret tls tls-secret --cert=cert.pem --key=key.pem
Utilizar o Secret no Pod:
apiVersion: v1
kind: Pod
metadata:
  name: tls-pod
spec:
  containers:
    - name: tls-container
      image: nginx
      volumeMounts:
        - name: tls
          mountPath: /etc/nginx/ssl
  volumes:
    - name: tls
      secret:
        secretName: tls-secret
ConfigMaps
ConfigMaps são objetos do Kubernetes que armazenam configurações, como variáveis de ambiente, arquivos de configuração, etc. ConfigMaps são utilizados para armazenar informações não sensíveis. A diferença entre ConfigMaps e Secrets é que ConfigMaps são armazenados em texto puro, enquanto Secrets são armazenados em base64.
Exemplo de ConfigMap (Nginx + SSL)
Vamos criar um ConfigMap para adicionar um arquivo no Pod e configurar SSL no Nginx.
apiVersion: v1
kind: ConfigMap
metadata:
  name: nginx-config
data:
  ssl.conf: |
    ssl_certificate /etc/nginx/ssl/tls.crt;
    ssl_certificate_key /etc/nginx/ssl/tls.key;
---
apiVersion: v1
kind: Secret
metadata:
  name: tls-secret
type: kubernetes.io/tls
data:
  certificado.crt: base64-encode-certificate
  certificado.key: base64-encode-key
---
apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod
spec:
  containers:
    - name: nginx-container
      image: nginx
      volumeMounts:
        - name: tls
          mountPath: /etc/nginx/ssl
        - name: config
          mountPath: /etc/nginx/conf.d
  volumes:
    - name: tls
      secret:
        secretName: tls-secret
        items:
          - key: certificado.crt
            path: tls.crt
          - key: certificado.key
            path: tls.key
    - name: config
      configMap:
        name: nginx-config
Para criar o ConfigMap, execute o comando:
kubectl apply -f nginx.yaml
Desafio
Objetivos 1
- 🏗️ Crie um Secret no Kubernetes que contenha o certificado e a chave privada para o HTTPS. Verifique se o Secret foi criado corretamente e se o tipo está correto.
 - 🎯 Crie um ConfigMap com a configuração do Nginx. Certifique-se de que a configuração está correta e de que o ConfigMap está corretamente configurado.
 - 💼 Verifique se o Nginx está rodando e se seu status é "Running".
 - 🕵️♀️ Certifique-se de que o HTTPS está funcionando corretamente. Para fazer isso, você pode executar curl -k https:\\localhost:<PORTA>.
 - 📝 Verifique o certificado do Nginx e certifique-se de que está correto.
 - 💡 Verifique se o Service é do tipo NodePort na porta 32400 e está redirecionando para a porta 443 do container.
 - 📝 Verifique se o Nginx está rodando na porta 443.
 - 🎯 O nome do Pod precisa ser nginx-https.
 - 🎯 O nome do Service precisa ser nginx-service.
 - 🎯 O nome do ConfigMap precisa ser nginx-config.
 - 🎯 O nome do Secret precisa ser nginx-secret.
 - 🎯 O certificado e a chave privada precisam estar no diretório /root/manifests.
 - 🎯 O arquivo de configuração do Nginx precisa estar no diretório /root/manifests.
 - 🎯 O arquivo de configuração do Nginx precisa se chamar nginx.conf.
 - 🎯 O certificado precisa se chamar nginx.crt.
 - 🎯 A chave privada precisa se chamar nginx.key.
 - 🎯 O manifesto do Pod precisa se chamar nginx-https-pod.yaml.
 
Solução 1
Criar o certificado e a chave privada:
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout nginx.key -out nginx.crt
#
kubectl create secret tls nginx-secret --cert=nginx.crt --key=nginx.key
Criar o ConfigMap:
apiVersion: v1
kind: ConfigMap
metadata:
  name: nginx-config
data:
  nginx.conf: |
    events {}
    http {
      server {
        listen 80;
        listen 443 ssl;
        server_name localhost;
        ssl_certificate /etc/nginx/ssl/tls.crt;
        ssl_certificate_key /etc/nginx/ssl/tls.key;
        location / {
          root /usr/share/nginx/html;
          index index.html;
        }
      }
    }
  index.html: |
    <html>
      <head>
        <title>Descomplicando o Kubernetes</title>
      </head>
      <body>
        <h1>Descomplicando o Kubernetes</h1>
      </body>
    </html>
---
apiVersion: v1
kind: Pod
metadata:
  name: nginx-https
  labels:
    app: nginx
spec:
  containers:
    - name: nginx
      image: nginx
      volumeMounts:
        - name: ssl
          mountPath: /etc/nginx/ssl
        - name: config
          mountPath: /etc/nginx
        - name: html
          mountPath: /usr/share/nginx/html
      ports:
        - containerPort: 80
          name: http
        - containerPort: 443
          name: https
      resources:
        requests:
          cpu: 100m
          memory: 128Mi
        limits:
          cpu: 250m
          memory: 256Mi
  volumes:
    - name: ssl
      secret:
        secretName: nginx-secret
        items:
          - key: tls.crt
            path: tls.crt
          - key: tls.key
            path: tls.key
    - name: config
      configMap:
        name: nginx-config
        items:
          - key: nginx.conf
            path: nginx.conf
    - name: html
      configMap:
        name: nginx-config
        items:
          - key: index.html
            path: index.html
---
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  type: NodePort
  ports:
    - port: 32400
      targetPort: 443
      nodePort: 32400
  selector:
    app: nginx
aplicar o desafio:
kubectl apply -f nginx-https-pod.yaml
kubectl delete -f nginx-https-pod.yaml
#
kubectl get secrets
kubectl describe secret nginx-secret
#
kubectl get pods
kubectl describe pod nginx-https
kubectl logs nginx-https
#
kubectl get svc
kubectl describe svc nginx-service
#
curl -k https://localhost:443
Objetivos 2
Neste desafio, você terá que resolver um problema com o nosso ConfigMap e Secret do nosso Nginx. Você tem que descobrir o que está errado e corrigir o problema em 05 minutos.
Instruções Alguma coisa aconteceu e o Nginx que você configurou no desafio anterior não está funcionando corretamente. Você precisa descobrir o que está errado e corrigir o problema.
- 🕵️♀️ Verifique se está tudo certo com o Pod, Secret, ConfigMap e outras coisas que você achar necessário.
 
Solução 2
O secret estava errado, então foi recriado:
kubectl get secret
kubectl describe secret nginx-secret
kubectl delete secret nginx-secret
kubectl create secret tls nginx-secret --cert=nginx.crt --key=nginx.key
#
kubectl delete -f nginx-https-pod.yaml
kubectl apply -f nginx-https-pod.yaml