Kubernetes: Usando Kubernetes na IBM Cloud

Existe um curso sobre Kubernetes na IBM Cloud, o link é o seguinte https://courses.cognitiveclass.ai/

Os exemplos do curso estão no GitHub https://github.com/IBM/container-service-getting-started-wt

Importante: os comandos bx ou bluemix foram depreciados, agora utilizar o comando ibmcloud

= Pré-requisitos =

1) Instalando os pré-requisitos no MacOS

brew install kubectl brew cask install ibm-cloud-cli brew install cfssl brew install docker

2) Login na IBM Cloud

ibmcloud login

Para Login Federado ou para Funcionário IBM use "ibmcloud login -sso"

3) Adicionando os plugins para criar e gerenciar clusters Kubernetes

ibmcloud plugin install container-service -r Bluemix ibmcloud plugin install container-registry -r Bluemix

4) Listando plug-ins instalados...

ibmcloud plugin list

= Provisionando um Cluster na IBM Cloud =


 * Via linha de comando

ibmcloud ks cluster-create --name 


 * Via console


 * Vá no endereço https://cloud.ibm.com/clusters/ e localize a entrada IBM Cloud Kubernetes Servivces.

= Deploy no K8s na IBM Cloud=

1) Login na IBM Cloud

ibmcloud login

2) Pegando o ip do cluster

Estou usando a versão free, então vou pegar o ip.

ibmcloud ks clusters --cluster 

Com o resultado

ID                                                      IP Público        IP Particular    Tipo   Estado   Status   Zona    Versão kube-brl8ua4f0d7u1d9g9lt0-ebassok8scl-default-00000015  159.122.179.120   10.144.185.225   free   normal   Ready    mil01   1.18.4_1517

Guarde o IP Público para ser usado abaixo

Deploy de um nginx no K8s na IBM Cloud
1) Iniciando a aplicação

kubectl run nginx --image nginx

2) Verifique o status pelo comando

kubectl get pods

3) Quando o status estiver como RUNNING, execute

kubectl expose pod nginx --type="NodePort" --port=80 4) Pegando a porta do serviço

kubectl get svc

Com o resultado NAME              TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE kubernetes        ClusterIP   172.21.0.1              443/TCP          5d20h liberty           NodePort    172.21.241.213          9080:31943/TCP   5d18h nginx             NodePort    172.21.177.201          80:30965/TCP     6m10s nginx-service-np  NodePort    172.21.123.52           8082:30000/TCP   5d19h

Vou acessar usando o IP Público mais a porta

Deploy do echo server (Nginx)
2) Iniciando a aplicação

kubectl run my-echo --image gcr.io/google_containers/echoserver:1.8

3) Verifique o status pelo comando

kubectl get pods

4) Quando o status estiver como RUNNING, execute

kubectl expose pod my-echo --type=NodePort --port=8080

5) Pegando a porta do serviço

kubectl get svc

Vou acessar usando o IP Público mais a porta

Deploy do liberty (java)
2) Iniciando a aplicação

kubectl run my-liberty --image open-liberty --port=9080

3) Verifique o status pelo comando

kubectl get pods

4) Quando o status estiver como RUNNING, execute

kubectl expose pod my-liberty --type=NodePort --port=9080

5) Pegando a porta do serviço

kubectl get svc

Vou acessar usando o IP Público mais a porta

= Deploy da sua Primeira aplicação no IBM Cloud=

No Lab1, temos o deploy de uma aplicação que exibe o hostname. Os arquivos principais do lab são:


 * Dockerfile : define os atributos da image. Busca uma image com o Node.js e instala a aplicação app.js
 * app.js : Aplicação em Node.js que pronta o hostmame
 * package.json: define as dependências necessários pela aplicação app.js

Clonando os exemplos do Github

mkdir Curso cd Curso git clone https://github.com/IBM/container-service-getting-started-wt.git

Push da imagem para o IBM Cloud Container Registry
1) Começando o Lab1

cd Lab1

2) Login na IBM Cloud

ibmcloud login --sso

3) Login na IBM Cloud Container Registry.

ibmcloud cr login

4) Criando uma namespace

ibmcloud cr namespace-add 

namespaces é um forma de organização de cluster. No dia a dia, seria projeto1_prod, projeto1_dev, projeto2_prod, ...

5) Criando uma docker image

docker build --tag registry.ng.bluemix.net//hello-world:1.

6) Verificando a imagem

docker images

7) Fazendo o push da image

docker push registry.ng.bluemix.net//hello-world:1

8) Verifique que o cluster está pronto pra uso

ibmcloud cs clusters

verificar se o estado está NORMAL ibmcloud cs workers

Verifica se os workers estão no estado NORMAL com o status READY

Anotar o ip público do worker.

Deploy da aplicação
1) Execute o comando e defina as variáveis de ambiente

ibmcloud cs cluster-config

Exemplo no Mac:

export KUBECONFIG=/Users//.bluemix/plugins/container-service/clusters/pr_firm_cluster/kube-config-prod-par02-pr_firm_cluster.yml

2) Iniciando a aplicação

kubectl run hello-world --image=registry.ng.bluemix.net//hello-world:1

3) Verifique o status pelo comando

kubectl get pods

4) Quando o status estiver como RUNNING, execute

kubectl expose deployment/hello-world --type="NodePort" --port=8080

Com o navegador, acesse o ip e porta para visualizar

Outros comandos: Para achar a porta, Para remover o Deployment, Para remover o Service

= Escalando e atualizando aplicações -- services, replica sets e health checks =

1) Começando o Lab2

cd .. cd Lab2

Adicionando Replicas

 * Adicionando replicas via linha de comando

Adicionando via linha de comando

$ kubectl scale --replicas=10 deployment hello-world


 * Adicionando replicas via arquivo de configuração

Adicionando via edição da configuração

kubectl edit deployment/

Alterar o item replicas

...   spec: replicas: 1

Salve e feche o arquivo

Verificando o rollout da alteração
Verificando o rollout da alteração

kubectl rollout status deployment/hello-world

Após o rollout verifique se os pods estão executando.

kubectl get pods

o STATUS deve ser RUNNING.

= Deploy de uma aplicação com IBM Watson =

1) Começando o Lab3

cd ../Lab3

Construindo as images do Watson
1) Build das images

docker build -t registry.ng.bluemix.net/ /watson ./watson docker build -t registry.ng.bluemix.net/ /watson-talk ./watson-talk

2) push da image Watson para o IBM Cloud Container Registry.

docker push registry.ng.bluemix.net/ /watson docker push registry.ng.bluemix.net/ /watson-talk

3) Edite o arquivo watson-deployment.yml e altere a tag   para a que você está utilizando

Criando uma instância do Watson service
1) Verifique o space e o org

ibmcloud login

Se quiser alterar execute o comando ibmcloud target --cf

2) Criando o serviço

ibmcloud cf create-service tone_analyzer standard tone

onde tone é o nome do serviço

Note: When you add the Tone Analyzer service to your account, a message is displayed that the service is not free. If you limit your API calls, this course does not incur charges from the Watson service.

3) Conferindo se o serviço foi criado

ibmcloud cf services

Bind do serviço para o Cluster
1) Execute

ibmcloud cs cluster-service-bind  default tone

2) Verifique os secrets criado pelo comando anterior kubectl get secrets.

Criando pods e services
Agora que o serviço está vinculado ao cluster, vamos expor o secret do seu pod para que ele possa utilizar o serviço. Para fazer isso, crie um Secret datastore como parte de sua configuração de implantação.

Isso foi feito para você no watson-deployment.yml:

volumeMounts: - mountPath: /opt/service-bind name: service-bind-volume volumes: - name: service-bind-volume secret: defaultMode: 420 secretName: binding-tone # from the kubectl get secrets command above

1) Construa a aplicação através do arquivo watson-deployment.yml:

kubectl create -f watson-deployment.yml

2) Verificando que o pod foi criado

kubectl get pods

Your secret has now been created. Note that for this lab, this has been done for you.

Verificando a aplicação
1) Verifique o Kubernetes via:


 * via Kubernetes dashboard na IBM Cloud


 * via comando kubectl

kubectl get pods kubectl get deployments kubectl get services

2) Anote o IP público da aplicação através do output do comando

ibmcloud cs workers 

3) Testando a aplicação no navegador

http://:30080/analyze/"Today is a beautiful day"

Será mostrado um JSON na tela

= Ver também =


 * Docker: Trabalhando com Containers
 * Artigos sobre Cloud
 * Mais Artigos sobre Cloud / WebDev / Tecnologias