- Helm
O Helm é um projeto graduado da CNCF, que seu proposito é atuar como um gerenciador de pacotes criado para facilitar a instalação de aplicações e suas dependências no Kubernetes. Podemos comparar o Helm com o apt-get
do Debian, pois com apenas um comando você consegue instalar aplicações e suas dependencias no Kubernetes e ainda, fazer o gerenciamento de suas versões, podendo fazer o upgrade ou downgrade sem maiores problemas e rapidamente. O Helm não é somente utilizado para fazer a instalação de aplicativos de terceiros, você consegue criar charts, que são os pacotes que o Helm utiliza para a instalação e configuração do aplicativo no Kubernetes. O chart é composto por arquivos que definem como e qual deve ser o comportamento da aplicação dentro do cluster. É no chart que você define o seu deployment
, o service
, ingress
e qualquer outra coisa necessária para a instalação e configuração da app desejada, e para isso, utilizamos os templates, que serão abordados mais para frente.
Estamos falando de um projeto bem legal da CNCF, então é justo a gente abordar um pouco sobre Cloud Native que é uma iniciativa TOP de mercado, com muitos projetos legais que estão classificados em graduados, incubados e sandbox. O próprio Kubernetes é mantido pela CNFF, graduado e em constante evolução pela comunidade. Aqui na página do Helm do GitHub possui mais detalhes sobre a ferramenta, commits, PRs e issues que estão sendo tratadas pela comunidade.
Antes de prosseguir com nosso teste de aplicação usando NGINX, precisamos certificar dos seguintes pontos:
- Necessário um cluster de Kubernetes para que você possa avançar.
- Ter o conhecimento básico em Kubernetes e Linux como base.
Para se fazer a instalação do Helm nos sistemas operacionais basta seguir os passos abaixo, é bem simples.
- From Script (Linux)
$ 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
- From Homebrew (macOS)
brew install helm
- From Chocolatey (Windows)
choco install kubernetes-helm
Para que nao tenhamos surpresas durante o deploy usando Helm Charts, temos que testar nossa aplicacao para garantir que TUDO esteja funcional demais. Para isso, com o cluster já em execução, execute os comando abaixo para que você possa deployar o deployment.yml
e o outro arquivo service.yml
. Vamos usar aqui como exemplo um servidor web NGINX
para que possamos exemplificar da melhor forma o workflow de deploy do Helm Chart.
- Deployando primeiro o arquivo de
deployment
:
kubectl create deployment nginx03 --image=nginx
apiVersion: apps/v1
kind: Deployment
metadata:
generation: 1
labels:
app: nginx03
name: nginx03
namespace: default
spec:
progressDeadlineSeconds: 600
replicas: 1
revisionHistoryLimit: 10
selector:
matchLabels:
app: nginx02
strategy:
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%
type: RollingUpdate
template:
metadata:
labels:
app: nginx03
spec:
containers:
- image: nginx
imagePullPolicy: Always
name: nginx
resources:
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
dnsPolicy: ClusterFirst
restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
- Criando nosso arquivo de
services
:
kubectl create services -f nginx_helm_service.yml
apiVersion: v1
kind: Service
metadata:
labels:
app: nginx
run: nginx
name: nginxhelm
namespace: default
spec:
externalTrafficPolicy: Cluster
internalTrafficPolicy: Cluster
ports:
- name: nginxhelm
port: 80
protocol: TCP
targetPort: 80
selector:
run: nginx
sessionAffinity: None
type: NodePort
# kubectl get deployments.apps
NAME READY UP-TO-DATE AVAILABLE AGE
grafana-labz 1/1 1 1 2d8h
nginx-example 1/1 1 1 30h
nginx02 1/1 1 1 19h
nginx03 1/1 1 1 10h
primeiro-deployment 1/1 1 1 29h
# kubectl get pods
NAME READY STATUS RESTARTS AGE
busybox 1/1 Running 28 (20m ago) 28h
busybox-configmap-file 1/1 Running 105 (14m ago) 7d11h
grafana-labz-6db6bc44bb-xshdl 1/1 Running 0 2d8h
init-demo 1/1 Running 0 3d21h
nginx 1/1 Running 2 (4d4h ago) 12d
nginx-example-747ddb8bc7-tmp8n 1/1 Running 0 30h
nginx02-7d786956cd-gh2pp 1/1 Running 0 19h
nginx03-5999959778-bt588 1/1 Running 0 10h
primeiro-deployment-66b459c7d8-jkzqh 1/1 Running 0 29h
webserver 1/1 Running 1 (4d4h ago) 9d
# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.2 <none> 443/TCP 12d
nginx NodePort 10.100.128.83 <none> 80:30907/TCP 29h
nginx03 NodePort 10.108.254.206 <none> 80:32453/TCP 10h
nginxhelm NodePort 10.106.167.203 <none> 80:31355/TCP 17h
primeiro-deployment NodePort 10.102.126.167 <none> 80:32573/TCP 29h
Veja que eu fiz deploy dos arquivos manualmente, ou seja, tive que rodar o comando kubectl
para subir os arquivos YML
de nomedeployments
, services
. A ideia do Helm comeca agora, pois ele vai entrar como um gerenciador de pacotes dentro do Kubernetes.
Para que possamos criar nossa estrutura do Helm Chart completa, existe um comando que faz isso de forma mais legal e automatizada.
$ helm create nginxcharts
# tree nginxcharts/
nginxcharts/
├── charts
├── Chart.yaml
├── templates
│ ├── deployment.yaml
│ ├── _helpers.tpl
│ ├── hpa.yaml
│ ├── ingress.yaml
│ ├── NOTES.txt
│ ├── serviceaccount.yaml
│ ├── service.yaml
│ └── tests
│ └── test-connection.yaml
└── values.yaml
3 directories, 10 files
# helm install ./nginxcharts --generate-name
NAME: nginxcharts-1656402303
LAST DEPLOYED: Tue Jun 28 04:45:04 2022
NAMESPACE: default
STATUS: deployed
REVISION: 1
NOTES:
1. Get the application URL by running these commands:
export NODE_PORT=$(kubectl get --namespace default -o jsonpath="{.spec.ports[0].nodePort}" services nginxcharts-1656402303)
export NODE_IP=$(kubectl get nodes --namespace default -o jsonpath="{.items[0].status.addresses[0].address}")
echo http://$NODE_IP:$NODE_PORT
Agora que efetuamos nosso deployment com Helm Chart, temos que verificar se esta espelhando corretamente no browser. Para isso, basta digitar o Ip do seu cluster + a porta que esta sendo usada pelo services
.
Welcome to nginx!
If you see this page, the nginx web server is successfully installed and working. Further configuration is required.
For online documentation and support please refer to nginx.org.
Commercial support is available at nginx.com.
Thank you for using nginx.
Pull requests are welcome. For major changes, please open an issue first to discuss what you would like to change.
Please make sure to update tests as appropriate.