Agora vamos falar de Helm e a facilidade que ele traz para instalar pacotes. O Helm é um gerenciador de pacotes; a melhor maneira de encontrar, compartilhar e instalar softwares para Kubernetes. Imagine um npm, um dockerhub, um pip ou quem sabe um homebrew… um centralizador de pacotes que facilita a sua vida na hora de instalar/atualizar um pacote.
O Helm é mantido pela CNCF junto com Microsoft, Google, Bitnami e a comunidade do Helm.
Iremos também explorar um dos pacotes mais usados no Kubernetes, que é o Istio, usado para conectar, controlar e observar serviços, além de garantir a segurança.
Quando estiver usando o Istio em produção, é importante saber em que estágio estão as features desejadas (alpha, beta, stable), pois isso impacta diretamente na maneira como a manutenção precisará ser feita.
Não queremos nenhuma ligação no meio da noite, não é mesmo?
Para trazer uma experiência legal, usaremos também o Kiali, que é um pacote que traz um admin para que você possa visualmente acompanhar o que está acontecendo com seu Istio.
Atenção
Caso tenha feito o tutorial anterior, é importante rodar o comandominikube destroy
, pois o Minikube consome bastante memória e cpu e pode ficar bem lento se continuarmos adicionando coisas em cima dele antes de limpá-lo por completo. Se você ainda está fazendo o tutorial anterior ou quer aprimorar/mudar seu banco & webapp, não rode o comando pois ele irá zerar tudo que fizemos anteriormente.
Algumas tarefas desse tutorial podem demorar um pouco para finalizar, por isso sugiro no mínimo alocar 4GB de memória ao iniciar o Minikube.
minikube start --memory=4096 --cpus=4
Se você estiver no macOS, lembre-se de adicionar a flag--vm-driver=xhyve
Instalando Istio & istioctl
Primeiro passo é baixar o Istio:
curl -L https://git.io/getLatestIstio | sh -
Após isso, vamos movê-lo para o bin, ao invés de simplesmente adicionar a pasta em que ele foi baixado ao path, como diz a imagem.
cd istio-1.0.3
sudo mv bin/istioctl /usr/local/bin
O comando istioctl
estará disponível para você através da linha de comando:
Ainda dentro da pasta do Istio, vamos criar o Service Account do Tiller:
kubectl create -f install/kubernetes/helm/helm-service-account.yaml
Inicie o Tiller no cluster:
helm init --service-account tiller
Após isso, o pod do Tiller deverá estar criado para prosseguir (lembrando que, dependendo da alocação de recursos que você colocou no minikube start
, a criação desse pod pode demorar um pouco).
Para ver se está criado, basta rodar:
kubectl -n kube-system get po
Apesar de ter alocado 4GB, demorou aproximadamente 15 min para o container ser criado, então caso você prossiga sem esperar ele ser criado, pode ver o seguinte erro:
Error: could not find a ready tiller pod
Finalmente, vamos instalar o Istio:
helm install install/kubernetes/helm/istio --name istio --namespace istio-system
Após criar, basta rodar o comando a seguir para checar se está tudo ok:
kubectl get svc -n istio-system
Vamos verificar também o estado dos pods criados pelo Istio:
kubectl get pods -n istio-system
Como vocês podem ver, um pod entrou em CrashLoopBackOff
e eu fui pesquisar para entender o que ocorreu. Investigando, descobri que isso pode acontecer devido a algum erro na instalação (como a demora do minikube), fazendo com que o istio-cidatel-*
seja montado antes, inviabilizando os secrets que o istio-security-post-install-*
necessita para rodar. A solução (workaround) que eu encontrei, foi forçar a deleção do pod para ele ser recriado com sucesso e finalizado sem erros.
kubectl delete pod istio-security-post-install-pvvz8 -n istio-system --grace-period=0 --force
Agora o istio-security-post-install-*
finalizou com sucesso:
Instalando uma aplicação de exemplo do Istio
Agora, vamos instalar o Bookinfo, que é uma aplicação exemplo do próprio Istio, composto de quatro micro serviços separados, usados para demonstrar vários recursos do Istio.
A aplicação exibe informações sobre um livro, semelhante a um catálogo único de uma livraria on-line. Na página, há uma descrição do livro, detalhes do livro (ISBN, número de páginas e assim por diante) e algumas resenhas de livros. Ele é dividido em quatro micro serviços separados:
productpage
(Página do produto): O micro serviço de productpage chama os micro serviços de details e reviews para preencher a página
details
(Detalhes): O micro serviço de details contém informações do livro
reviews
(Resenhas): O micro serviço de reviews contém resenhas de livros. Ele também chama o micro serviço de ratings
ratings
(Classificações): O micro serviço de ratings contém informações de classificação de livros que acompanham uma resenha do livro.
kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml
Agora vamos definir o gateway do Ingress:
istioctl create -f samples/bookinfo/networking/bookinfo-gateway.yaml
Vamos verificar se está tudo no ar, começando pelos serviços:
kubectl get services
E os pods:
kubectl get pods
Hora de confirmar que a aplicação está no ar, com tudo certinho.
export INGRESS_HOST=$(minikube ip)export INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="http")].nodePort}')export GATEWAY_URL=$INGRESS_HOST:$INGRESS_PORT
Rode o comando echo $GATEWAY_URL
para garantir que você tem um ip e uma porta, caso contrário, você precisará trocar a porta buscando nas specs o http2
ao invés do http
dessa maneira:
Basta checar no browser, a url dessa maneira no Linux:
xdg-open http://${GATEWAY_URL}/productpage
Ou no macOS:
open http://${GATEWAY_URL}/productpage
Instalando o Kiali para deixar tudo mais visual
A primeira coisa, é que precisaremos usar um comando chamadoenvsubst
que vem no Ubuntu por padrão, mas não existe no macOS. Caso você esteja usando o macOS, você vai precisar do homebrew para rodar os seguintes comandos e instalar o pacote gettext
:
brew install gettext
brew link --force gettext
Mãos a obra! Primeiro vamos pegar alguns arquivos do Kiali que são fundamentais para podermos instalá-lo:
O Configmap:
curl https://raw.githubusercontent.com/kiali/kiali/master/deploy/kubernetes/kiali-configmap.yaml | \
VERSION_LABEL=master envsubst > kiali-configmap.yaml
Os Secrets:
curl https://raw.githubusercontent.com/kiali/kiali/master/deploy/kubernetes/kiali-secrets.yaml | \
VERSION_LABEL=master envsubst > kiali-secrets.yaml
E o próprio Kiali:
curl https://raw.githubusercontent.com/kiali/kiali/master/deploy/kubernetes/kiali.yaml | \
IMAGE_NAME=kiali/kiali \
IMAGE_VERSION=latest \
NAMESPACE=istio-system \
VERSION_LABEL=master \
VERBOSE_MODE=4 envsubst > kiali.yaml
Uma vez que você tenha todos os arquivos necessários, é hora de criá-los no namespace istio-system
que criamos no Minikube nas etapas anteriores:
kubectl create -f kiali-configmap.yaml -n istio-system
kubectl create -f kiali-secrets.yaml -n istio-system
kubectl create -f kiali.yaml -n istio-system
Vamos ver se tudo foi criado corretamente, checando primeiro os serviços com o comando:
kubectl get svc kiali -n istio-system
Lembrando que a porta que aparece aqui (no meu caso 30788) é importante pois vamos usá-la para acessar o admin.
E depois os pods:
kubectl get pods -n istio-system
O penúltimo pod foi criado com sucesso. Agora basta digitar minikube ip
para descobrir o seu ip do Minikube e usar com a porta que descobrimos anteriormente:
Basta logar com admin admin para ver o Overview (essa credencial se encontra no arquivo kiali-secrets.yaml que baixamos no início da instalação):
Hey, espera aí, não vai embora não
Para mais informações referentes a Helm, Istio & Kiali; acessem os links abaixo:
Autor: Guilherme Esteves