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