- Python: Linguagem de programação principal.
- Flask: Framework web utilizado para construir a aplicação.
- Redis: Banco de dados em memória utilizado para armazenamento de dados.
- Docker: Utilizado para containerização da aplicação.
- GitHub Actions: Utilizado para integração contínua e automação de tarefas.
- Cosign: Utilizado para assinatura e verificação de imagens de contêiner.
- Kyverno: Utilizado para políticas de segurança no Kubernetes.
- Kubernetes: Utilizado para orquestração de contêineres em produção.
- Prometheus: Utilizado para monitoramento e alertas.
- APKO: Utilizado para construção de imagens de contêiner.
- Melange: Utilizado para construção de pacotes.
- Helm: Utilizado para gerenciamento de pacotes Kubernetes.Ferramentas e Tecnologias Utilizadas GitHub Actions Redis Flask Python YAML AquaSec Docker Kubernetes Prometheus
Nessa primeira fase, o foco é na construção de uma imagem distroless, com somente a aplicação, e fazendo o apontamento para um segundo container, sendo esse da base, através de uma variável de ambiente.
Os passos são os seguintes:
#git clone git@github.com:badtuxx/giropops-senhas.git
#docker image build -t lpampolha/linuxtips-giropops-senhas:6.0 .
#docker run --name redis -d -p 6379:6379 redis #docker container run --name giropops-senhas -d -p 5000:5000 lpampolha/linuxtips-giropops-senhas:6.0
Aqui usaremos o Trivy para fazer um scan na imagem, a fim de verificar vulnerabilidades (CVEs).
Acesse o site https://trivy.dev, busque os repositórios que estejam de acordo com o sabor de Linux que você estiver utilizando, e mande ver
#sudo apt-get install wget apt-transport-https gnupg
#wget -qO - https://aquasecurity.github.io/trivy-repo/deb/public.key | gpg --dearmor | sudo tee /usr/share/keyrings/trivy.gpg > /dev/null
#echo "deb [signed-by=/usr/share/keyrings/trivy.gpg] https://aquasecurity.github.io/trivy-repo/deb generic main" | sudo tee -a /etc/apt/sources.list.d/trivy.list
#sudo apt-get update
#sudo apt-get install trivy
´Testando a imagem´
#trivy image lpampolha/linuxtips-giropops-senhas:6.0
-Vá até https://docs.sigstore.dev/system_config/installation/
-Instalando o Cosign
#curl -O -L "https://github.com/sigstore/cosign/releases/latest/download/cosign-linux-amd64"
#sudo mv cosign-linux-amd64 /usr/local/bin/cosign
#sudo chmod +x /usr/local/bin/cosign
-Gerando o par de chaves para assinar a imagem
#cosign generate-key-pair
-Insira uma senha. Após isso serão geradas as chaves pública e privada
#cosign sign --key cosign.key lpampolha/linuxtips-giropops-senhas:6.0
-Verificando se a imagem é segura
#cosign verify --key cosign.pub lpampolha/linuxtips-giropops-senhas:6.0
Com a imagem criada, sem vulnerabilidades e assinada, vamos ao Kubernetes
Primeiro vamos testar os manifestos da aplicação e do Redis. Os arquivos estão no diretório k8s. Nesse primeiro momento iremos subir a aplicação e o Redis, e expô-los através dos services.
#k apply -f giropops-senhas-deployment.yaml #k apply -f giropops-senhas-service.yaml #k apply -f redis-deployment.yaml #k apply -f redis-service.yaml
Agora vamos criar um secret para autenticar no Docker Hub, a fim de acessar imagens privadas. Para isso devemos codificar o conteúdo do arquivo ~/.docker/config.json, com o sequinte comando:
#base64 ~/.docker/config.json
Depois vamos executar o seguinte arquivo:
Agora é criar o arquivo dockerhub-secret.yaml, com o seguinte conteúdo:
kind: Secret apiVersion: v1 metadata: name: docker-hub-secret type: kubernetes.io/dockerconfigjson data: .dockerconfigjson: | #aqui entra o valor do config.json do docker codificado
Para baixar a imagem privada, será necessário usar o campo spec.imagePullSecrets
spec: containers: - name: nginx-secret image: lpampolha/linuxtips-giropops-senhas:6.0 imagePullSecrets: - name: docker-hub-secret
Um ConfigMap é um objeto da API usado para armazenar dados não-confidenciais em pares chave-valor. Pods podem consumir ConfigMaps como variáveis de ambiente, argumentos de linha de comando ou como arquivos de configuração em um volume.
Um ConfigMap ajuda a desacoplar configurações vinculadas ao ambiente das imagens de container, de modo a tornar aplicações mais facilmente portáveis.
Com o Ingress é possível expôr rotas http e https de fora do cluster para um serviço de dentro do cluster.
Antes de instalá-lo no Kind, existe a necessidade de adicionar algumas linhas no manifesto do cluster. O arquivo para a recriação é o cluster.yaml, que está dentro do diretório k8s. Após recriar o Cluster, execute os dois próximos comandos:
Visite a página https://kind.sigs.k8s.io/docs/user/ingress/
#kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/kind/deploy.yam
#kubectl wait --namespace ingress-nginx \ 130 ↵
--for=condition=ready pod
--selector=app.kubernetes.io/component=controller
--timeout=90s
Vamos dar um apply no diretório k8s, a fim de subir os deploys e serviços
#k apply -f k8s/ configmap/configmap-giropops-senhas created secret/docker-hub-secret created deployment.apps/giropops-senhas created service/giropops-senhas created deployment.apps/redis created service/redis-service created
Agora sim vamos ao nosso Ingress
#k apply -f k8s/ingress.yaml
Funcionando
O Helm é um gerenciador de pacotes para Kubernetes que facilita a definição, instalação e atualização de aplicações complexas no Kubernetes.
#curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 #chmod 700 get_helm.sh #./get_helm.sh
#mkdir -p helm/chart #cd helm/chart #vim Chart.yaml
Após isso, vamos criar o diretório templates, e adicionar os manifestos do K8s nele.
#mkdir templates #cp ../../k8s/* templates
Agora criaremos o values.yaml
#vim values.yaml
Crie um novo diretório chamado charts




