- Kubernetes (K8s) é um sistema de orquestração de contêiners open-source que automatiza a implantação, o dimensionamento e a gestão de aplicações em contêiners.
- Ele foi originalmente projetado pelo Google e agora é mantido pela Cloud Native Computing Foundation.
- A palavra "Kubernetes" vem do Grego (κυβερνήτης -kyvernítis) que significa Timoneiro, Comandante. Kubernetes v1.0, foi lançado em 21 de julho de 2015.
- POD – um grupo de um ou mais containers.
- SERVICE – expõe seu pods por uma rede interna ou externa.
- DEPLOYMENT – gera os pods, configura e os mantém vivos.
- NODE – uma VM ou maquina física que compõe o cluster do kubernetes.
- CONFIGMAP – objeto responsável por guardar configurações para execução dos pods
- Chocolatey
- NodeJS
- VirtualBox ou Hyper-V
Instalar a kubectl
$ choco install kubernetes-cli
Instalar o minikube
$ choco install minikube
Inicializar o minikube
$ minikube config set kubernetes-version v1.15.3
$ minikube start
Caso utilize o Hyper-v
$ minikube start --vm-driver hyperv --hyperv-virtual-switch "minikube_switch”
Agora precisamos descobrir qual o ip que é exposto nosso cluster do minikube
$ minikube status
host: Running
kubelet: Running
apiserver: Running
kubectl: Correctly Configured: pointing to minikube-vm at 172.18.70.199
Nesse lab consideramos que o ip foi adicionado ao arquivo hosts e nomeado como minikube Ex: 172.18.70.199 minikube
Instalando o gerenciador de pacotes Helm
$ choco install kubernetes-helm
Inicializando o Helm e instalando o pacote tiller no minikube
$ helm init --wait
Adicionando o repositório de pacotes do helm
$ helm repo add stable https://kubernetes-charts.storage.googleapis.com/
Para facilitar a tarefa utilizaremos um Helm Chart o mongodb-replicaset
Instalando o mongodb-replicaset no minikube
$ helm install --name lab stable/mongodb-replicaset
$ kubectl get pod
Recuperar as informações referente ao cluster
$ for ((i = 0; i < 3; ++i)); \
do kubectl exec \
--namespace default \
lab-mongodb-replicaset-$i -- sh \
-c 'mongo --eval="printjson(rs.isMaster())"';\
done
...
"hosts" : [
"lab-mongodb-replicaset-0.lab-mongodb-replicaset.default.svc.cluster.local:27017",
"lab-mongodb-replicaset-1.lab-mongodb-replicaset.default.svc.cluster.local:27017",
"lab-mongodb-replicaset-2.lab-mongodb-replicaset.default.svc.cluster.local:27017"
],
...
Agora vamos efetuar a implantacao de um deployment do mongo-express dentro do nosso minikube
Para efetuar o replace das variaveis dentro dos templates utilizaremos o pacote npm envsub
$ npm i -g envsub
Agora utilizando o envsub vamos efetuar a substituicao da variavel {{HOSTS_LIST}} e criar o arquivo de deployment
$ envsub --syntax handlebars --env HOSTS_LIST=lab-mongodb-replicaset-0.lab-mongodb-replicaset.default.svc.cluster.local,lab-mongodb-replicaset-1.lab-mongodb-replicaset.default.svc.cluster.local,lab-mongodb-replicaset-2.lab-mongodb-replicaset.default.svc.cluster.local mongo-express/deployment.template.yaml mongo-express/deployment.yaml
Agora vamos executar o deploy
$ kubectl apply -f mongo-express/deployment.yaml
$ kubectl get deployment
$ kubectl describe deployment mongo-express
$ kubectl get pods -l=app=mongo-express
$ kubectl expose deployment mongo-express --port=8081 --type=NodePort
$ kubectl get service
...
mongo-express NodePort 10.109.51.68 <none> 8081:30210/TCP 6s
$ start chrome http://minikube:30210/
A porta de saida será definida automaticamente, subistitua pela porta definida em seu serviço
Agora vamos disponibilizar dentro de nosso cluster uma Webapi para gerenciamento de tarefas backend-api
O Código fonte dessa aplicacao esta na pasta source-files/backend/, para os que nao possuem docker uma imagem já foi preparada para utilização earthworm013/minikube-lab-backend
Nativamente a aplicação expõe a porta 3003
Utilizaremos nesse passo os arquivos de deploy contidos na pasta ./backend, utilizaremos também o kustomize para efetuar a composição desse deploy
$ envsub --syntax handlebars --env CONNECTION_STRING="mongodb://lab-mongodb-replicaset-0.lab-mongodb-replicaset.default.svc.cluster.local:27017,lab-mongodb-replicaset-1.lab-mongodb-replicaset.default.svc.cluster.local:27017,lab-mongodb-replicaset-2.lab-mongodb-replicaset.default.svc.cluster.local:27017?readPreference=primary&replicaSet=rs0&retryWrites=true" backend/kustomization.template.yaml backend/kustomization.yaml
Agora vamos executar o apply via kustomize, apos criado o arquivo de configuracao vamos executar o seginte comando
$ kubectl apply -k backend/
Para validar a exposicao da api podemos executar um cURL
$ curl --request POST \
--url http://minikube:30003/api/todos \
--header 'Content-Type: application/json' \
--data '{"description": "Participar do kubernetes - development lab"}'
$ curl -X GET http://minikube:30003/api/todos
No processo anterior vimos que o backend-api foi exporto por 2 servicos "backend-api-external-srvc" e "backend-api-internal-srvc", agora vamos utilizar o serviço "backend-api-internal-srvc" para expor seu endpoint via nginx, após isso vamos remover a service que da acesso direto a api backend-api.
Para inicializar o deploy execute o comando
$ kubectl apply -k backend-proxy/
Após a inicialização podemos verificar o funcionamento pelo commando
$ curl --request POST \
--url http://minikube:30080/v1/backend-api/todos \
--header 'Content-Type: application/json' \
--data '{"description": "Remover a service backend-api-external-srvc"}'
$ curl -X GET http://minikube:30080/v1/backend-api/todos
Agora que garantimos o funcionamento do proxy, vamos remover a service que expoe o backend-api fora de nosso cluster
$ kubectl delete service backend-api-external-srvc
Chegamos ao passo final, implantar o aplicativo de interface do usuário.
O Código fonte dessa aplicacao esta na pasta source-files/frontend/, para os que nao possuem docker uma imagem já foi preparada para utilização earthworm013/minikube-lab-frontend
$ kubectl apply -k user-interface/
Após a inicialização podemos verificar o funcionamento pelo commando
$ curl -X GET http://minikube:30000/
$ start chrome http://minikube:30000/
Bem agora que implantamos nossa estrutura inicial é hora de aplicar o conhecimento e ir mais além.
O desafio agora é criar uma estrutura de configuracoes para os aplicativos, com 2 ambientes, developmet e produção.