O Minikube é uma ferramenta que facilita executar o Kubernetes localmente, executando um cluster de Kubernetes com um único nó.
É muito bom para testar funcionalidades, aprender a trabalhar com o Kubernetes ou passar raiva tentando interpretar um tutorial de instalação de uma ferramenta do Kubernetes no seu Minikube.
Vamos ver nesse artigo também o Helm, que é um gerenciador de pacotes do Kubernetes. Imagine um apt-get, npm, pip, etc… só que para instalar pacotes de recursos pré-configurados.
Instalando o Minikube
Para instalar no OSX:
Você pode usar o Homebrew, que é o modo mais fácil: brew cask install minikube
Ou instalar via linha de comando mesmo:
curl -Lo minikube https://storage.googleapis.com/minikube/releases/v0.30.0/minikube-darwin-amd64 && chmod +x minikube && sudo mv minikube /usr/local/bin/
Para instalar no Linux:
curl -Lo minikube https://storage.googleapis.com/minikube/releases/v0.30.0/minikube-linux-amd64 && chmod +x minikube && sudo mv minikube /usr/local/bin/
Requisitos
kubectl
macOS
Linux
VirtualBox ou KVM
É possível rodar o Minikube com a opção
a —-vm-driver=none
, rodando os componentes do Kubernetes direto no host, ao invés de uma VM. Docker será necessário. Se você usar essa opção, configure uma Bridge Network para o docker. Senão, ele poderá mudar entre as reinicializações de rede, causando perda de conectividade ao cluster.
minikube start
Nota: para alguns exemplos abaixo, como deployar um app, talvez seja necessário uma alocação melhor de recursos para o minikube suportar, se estiver tendo problema, pare o minikube minikube stop
e reinicie ele com mais memória: minikube start --memory=4096 --cpus=4
Para poder trabalhar com o daemon do docker no seu mac/linux, use o comando docker-env:
minikube docker-env
Basta rodar: eval $(minikube docker-env)
Para acessar o dashboard do Kuberntes: minikube dashboard
Instalando o Helm
OSX:
brew install kubernetes-helm
Linux:
curl https://raw.githubusercontent.com/kubernetes/helm/master/scripts/get > get_helm.sh
chmod 700 get_helm.sh
./get_helm.sh
Para iniciar o helm, basta digitar: helm init
Caso ocorra algum problema, tente usar com essas flags:
helm init --service-account default --client-only
Agora é só ver os pacotes disponíveis com o comando helm search
Se essa é primeira vez que você está tendo contato com Kubernetes, seu contexto do kubectl
já vai estar correto, caso contrário (você já tenha usado o kubectl
alguma vez em outro cluster) rode o comando a seguir para mudar o contexto para o minikube:
kubectl config use-context minikube
Acessando a VM
Basta digitarminikube ssh
Caso queira mais detalhes sobre o que está acontecendo ao digitar esse comando, basta dar um exit
e rodar novamente o comando com a seguinte flag:
minikube ssh -v 7
Habilitando o Ingress
O ingress é um conjunto de regras que permite que as conexões de entrada cheguem nos services do cluster do Kubernetes, já que normalmente, o cluster do kubernetes é protegido por firewall da Internet. Os recursos do Kubernetes, como services, pods, e etc, têm IPs somente roteáveis pela rede do cluster e não estão diretamente acessíveis fora do cluster.
Basta rodar minikube addons enable ingress
e voilá, tudo funcionando. Caso queira ver todos os addons rodando: minikube addons list
Visualizando namespaces
É possível visualizar no painel do Kubernetes digitando minikube dashboard
e clicando em Namespaces no menu lateral
Via linha de comando, os namespaces estão disponíveis através do comandokubectl get namespaces --show-labels
:
Criando namespaces de desenvolvimento, QA e produção
{
"kind": "Namespace",
"apiVersion": "v1",
"metadata": {
"name": "dev",
"labels": {
"name": "dev"
}
}
}
Basta salvar o arquivo e rodar kubectl create -f namespace-dev.json
e você terá seu cluster de desenvolvimento.
{
"kind": "Namespace",
"apiVersion": "v1",
"metadata": {
"name": "qa",
"labels": {
"name": "qa"
}
}
}
Para QA: kubectl create -f namespace-qa.json
{
"kind": "Namespace",
"apiVersion": "v1",
"metadata": {
"name": "prod",
"labels": {
"name": "prod"
}
}
}
E por fim, em produção: kubectl create -f namespace-prod.json
Caso você rode novamente o comando de listar os namespaces, verá que agora eles estão criados: kubectl get namespaces --show-labels
Deployando uma aplicação no cluster
Vamos fazer um deploy de um encurtador de url direto no minikube. O código fonte pode ser conferido aqui.
Primeiro vamos criar um deploy para o banco de dados (Postgres), com o arquivo abaixo:
apiVersion: apps/v1beta1
kind: Deployment
metadata:
name: postgres
spec:
template:
metadata:
labels:
app: postgres
spec:
containers:
- name: postgres
image: postgres:9.6.5
ports:
- containerPort: 5432
env:
- name: POSTGRES_DB
value: url_shortener_db
- name: POSTGRES_USER
value: user
- name: POSTGRES_PASSWORD
value: mysecretpassword
kubectl create -f deployment-postgres-minikube.yaml
Para verificar se foi criado corretamente, basta digitar:
kubectl get pods --selector=app=postgres
Para ver se o pod está rodando, basta executar:
kubectl exec -it postgres-74bdd6978d-k8f9p bash
Uma vez dentro do seu pod, você pode rodar o comando para ver se o Postgres está funcionando corretamente:
psql -U user -d url_shortener_db
Atenção: pode ser necessário rodar su — postgres
antes, caso você esteja como root
, pois o postgresql não permite acesso como usuário root.
Agora vamos expor o pod, através de um serviço:
apiVersion: v1
kind: Service
metadata:
name: postgres
spec:
ports:
- port: 5432
selector:
app: postgres
kubectl create -f service-postgres-minikube.yaml
Para checar que o serviço está de pé:
kubectl get services
Agora que já temos o banco de dados, é hora de deployar a aplicação:
apiVersion: apps/v1beta1
kind: Deployment
metadata:
name: webapp
spec:
template:
metadata:
labels:
app: webapp
spec:
containers:
- image: xcoulon/go-url-shortener:0.1.0
name: go-url-shortener
env:
- name: POSTGRES_HOST
value: postgres
- name: POSTGRES_PORT
value: 5432
- name: POSTGRES_DATABASE
value: url_shortener_db
- name: POSTGRES_USER
value: user
- name: POSTGRES_PASSWORD
value: mysecretpassword
ports:
- containerPort: 8080
kubectl create -f deployment-webapp-minikube.yaml
Para verificar o pod do webapp rodando execute o comando a seguir
kubectl get all -l app=webapp
Com isso, podemos ver que o status do pod está Running
:)
Agora vamos dar uma olhada nos logs:
kubectl logs po/webapp-78c4f886f5-wtrl9
Você pode encontrar uma explicação mais detalhada aqui (em inglês).
O Minikube é um projeto muito legal, se você estiver disposto a ter um pouco de paciência, pois nem sempre será rápido!
RECADO FINAL! Ter um cluster de Kubernetes para aprender, explorar ferramentas ou mesmo tentar desenvolver Controllers custa caro, então o Minikube se torna uma ótima alternativa ao prover um ambiente de exploração a zero custo.
Autor: Guilherme Esteves