Atividade 03 - Recursos Básicos do Kubernetes

Preparando a VM da atividade de Docker para conectar ao cluster Kubernetes

Do desktop do curso, execute o comando abaixo para copiar o arquivo de configuração do cluster para a VM da atividade de Docker

scp master:/root/.kube/config docker:/root/.kube/config 

Na máquina do docker, instale o kubectl

cat <<EOF | tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://pkgs.k8s.io/core:/stable:/v1.33/rpm/
enabled=1
gpgcheck=1
gpgkey=https://pkgs.k8s.io/core:/stable:/v1.33/rpm/repodata/repomd.xml.key
EOF

yum install -y kubectl

kubectl completion bash | tee /etc/bash_completion.d/kubectl
source /etc/bash_completion.d/kubectl

Execute os exercícios da máquina do docker.

Pods

Criar um Pod no Kubernetes utilizando dois métodos: imperativo (linha de comando) e declarativo (arquivo YAML).

Parte 1: Criando um Pod de forma Imperativa

Execute o comando abaixo para criar um Pod chamado meu-pod, usando a imagem nginx:

kubectl run meu-pod --image=registry.nuvem.unicamp.br/curso-kubernetes/nginx

Verifique se o Pod foi criado corretamente:

kubectl get pods

Veja detalhes do Pod:

kubectl describe pod meu-pod

Delete o Pod criado:

kubectl delete pod meu-pod

Parte 2: Criando um Pod de forma Declarativa

Crie um arquivo chamado pod.yaml com o seguinte conteúdo:

apiVersion: v1
kind: Pod
metadata:
  name: meu-pod
spec:
  containers:
    - name: meu-container
      image: registry.nuvem.unicamp.br/curso-kubernetes/nginx
      ports:
        - containerPort: 80

Aplique o arquivo para criar o Pod:

kubectl apply -f pod.yaml

Confirme a criação do Pod:

kubectl get pods

Veja os logs do Pod:

kubectl logs meu-pod

Acessando o shell dentro de um Pod

kubectl exec -ti meu-pod -- /bin/bash

Para remover o Pod, use:

kubectl delete -f pod.yaml

Deployment

Criar um Deployment no Kubernetes utilizando dois métodos: imperativo (linha de comando) e declarativo (arquivo YAML).

Parte 1: Criando um Deployment de forma Imperativa

Execute o comando abaixo para criar um Deployment chamado meu-deployment, com 3 réplicas da imagem nginx:

kubectl create deployment meu-deployment --image=registry.nuvem.unicamp.br/curso-kubernetes/nginx --replicas=3

Verifique se o Deployment foi criado corretamente:

kubectl get deployments

Veja os Pods gerenciados pelo Deployment:

kubectl get pods

Para escalar o Deployment para 5 réplicas:

kubectl scale deployment meu-deployment --replicas=5

Para deletar o Deployment:

kubectl delete deployment meu-deployment

Parte 2: Criando um Deployment de forma Declarativa

Crie um arquivo chamado deployment.yaml com o seguinte conteúdo:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: meu-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: minha-app
  template:
    metadata:
      labels:
        app: minha-app
    spec:
      containers:
        - name: meu-container
          image: registry.nuvem.unicamp.br/curso-kubernetes/nginx
          ports:
            - containerPort: 80

Aplique o arquivo para criar o Deployment:

kubectl apply -f deployment.yaml

Confirme a criação do Deployment e visualize os Pods:

kubectl get deployments
kubectl get pods

Para atualizar a imagem do Deployment para nginx:1.21:

kubectl set image deployment/meu-deployment meu-container=registry.nuvem.unicamp.br/curso-kubernetes/nginx:1.21

Para remover o Deployment:

kubectl delete -f deployment.yaml

Pergunta para reflexão:

Qual a vantagem de usar um Deployment em vez de um ReplicaSet? O que acontece com os Pods quando alteramos a imagem do Deployment? Como podemos fazer rollback para uma versão anterior do Deployment? Como verificar o histórico de revisões de um Deployment?

StatefulSets

Criar um StatefulSet no Kubernetes utilizando o método declarativo (arquivo YAML).

Crie um arquivo chamado statefulset.yaml com o seguinte conteúdo:

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: meu-mysql
spec:
  serviceName: meu-mysql
  replicas: 3
  selector:
    matchLabels:
      app: meu-mysql
  template:
    metadata:
      labels:
        app: meu-mysql
    spec:
      containers:
        - name: meu-container
          image: registry.nuvem.unicamp.br/curso-kubernetes/mysql:8.0
          ports:
            - containerPort: 3306
          env:
            - name: MYSQL_ROOT_PASSWORD
              value: "minha-senha-de-root"
            - name: MYSQL_DATABASE
              value: "meu-banco"
            - name: MYSQL_USER
              value: "meu-usuario"
            - name: MYSQL_PASSWORD
              value: "minha-senha"

Aplique o arquivo para criar o StatefulSet:

kubectl apply -f statefulset.yaml

Confirme a criação do StatefulSet e visualize os Pods:

kubectl get statefulsets
kubectl get pods

Para remover o StatefulSet:

kubectl delete -f statefulset.yaml

Services

Criar um Service do tipo ClusterIP que exponha um Pod (ou Deployment) criado previamente, usando um arquivo YAML.

Pré-requisito

Um Pod ou Deployment com o label app: nginx já deve estar criado. Exemplo (se necessário):

kubectl create deployment nginx --image=nginx

Crie um arquivo chamado nginx-service.yaml com o seguinte conteúdo:

apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  selector:
    app: nginx
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
  type: ClusterIP

Aplique o Service:

kubectl apply -f nginx-service.yaml

Verifique a criação:

kubectl get svc nginx-service
kubectl describe svc nginx-service

Teste a comunicação:

Crie um Pod temporário para testar o acesso interno ao Service:

kubectl run test-pod --rm -it --image=busybox -- /bin/sh

Dentro do shell:

wget -qO- http://nginx-service

Projeto

Faça a build do container da aplicação e envie para o Registry da Unicamp. (registry.nuvem.unicamp.br/curso-kubernetes/projeto-<SEU_USUARIO>)

Crie um StatefulSet para o banco de dados criado na aula 1 e exponha um Service para ele.

Crie um Deployment para a aplicação python criada na aula 1 e exponha um Service para ela.

Teste a aplicação utilizando o comando a seguir

kubectl port-forward <NOME_SERVICO> 5000:5000

E acesse o localhost:5000