Kubernetes: Usando Kubernetes na IBM Cloud: Difference between revisions
| (21 intermediate revisions by the same user not shown) | |||
| Line 37: | Line 37: | ||
* Via linha de comando  | * Via linha de comando  | ||
  ibmcloud   |   ibmcloud ks cluster-create --name <name-of-cluster>  | ||
* Via console  | * Via console  | ||
: Vá no endereço https://  | : Vá no endereço https://cloud.ibm.com/clusters/ e localize a entrada '''IBM Cloud Kubernetes Servivces'''.  | ||
<br>  | <br>  | ||
<br>  | <br>  | ||
<br>  | <br>  | ||
= 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 <CLUSTER_NAME>  | |||
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       <none>        443/TCP          5d20h  | |||
 liberty            NodePort    172.21.241.213   <none>        9080:31943/TCP   5d18h  | |||
 nginx              NodePort    172.21.177.201   <none>        80:'''30965'''/TCP     6m10s  | |||
 nginx-service-np   NodePort    172.21.123.52    <none>        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=  | = Deploy da sua Primeira aplicação no IBM Cloud=  | ||
<br>  | <br>  | ||
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  | Clonando os exemplos do Github  | ||
| Line 54: | Line 151: | ||
  cd Curso  |   cd Curso  | ||
  <nowiki>git clone https://github.com/IBM/container-service-getting-started-wt.git</nowiki>  |   <nowiki>git clone https://github.com/IBM/container-service-getting-started-wt.git</nowiki>  | ||
<br>  | |||
<br>  | <br>  | ||
| Line 73: | Line 171: | ||
  ibmcloud cr namespace-add <my_namespace>  |   ibmcloud cr namespace-add <my_namespace>  | ||
namespaces é um forma de organização de cluster. No dia a dia, seria projeto1_prod, projeto1_dev, projeto2_prod, ...  | |||
5) Criando uma docker image  | 5) Criando uma docker image  | ||
| Line 97: | Line 197: | ||
Anotar o ip público do '''worker'''.  | Anotar o ip público do '''worker'''.  | ||
<br>  | |||
<br>  | |||
<br>  | <br>  | ||
| Line 125: | Line 227: | ||
Outros comandos: [[Kubernetes:_Trabalhando_com_o_kubectl#Para_achar_a_porta|Para achar a porta]], [[Kubernetes:_Trabalhando_com_o_kubectl#Para_remover_o_Deployment|Para remover o Deployment]] , [[Kubernetes:_Trabalhando_com_o_kubectl#Para_remover_o_Service|Para remover o Service]]  | Outros comandos: [[Kubernetes:_Trabalhando_com_o_kubectl#Para_achar_a_porta|Para achar a porta]], [[Kubernetes:_Trabalhando_com_o_kubectl#Para_remover_o_Deployment|Para remover o Deployment]] , [[Kubernetes:_Trabalhando_com_o_kubectl#Para_remover_o_Service|Para remover o Service]]  | ||
<br>  | |||
<br>  | <br>  | ||
= Escalando e atualizando aplicações -- services, replica sets e health checks =  | = Escalando e atualizando aplicações -- services, replica sets e health checks =  | ||
1) Começando o Lab2  | |||
 cd ..  | |||
 cd Lab2  | |||
<br>  | |||
== Adicionando Replicas ==  | == Adicionando Replicas ==  | ||
| Line 166: | Line 276: | ||
<br>  | <br>  | ||
<br>  | <br>  | ||
= 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/<namespace>/watson ./watson  | |||
 docker build -t registry.ng.bluemix.net/<namespace>/watson-talk ./watson-talk  | |||
2) push da image Watson para o IBM Cloud Container Registry.  | |||
 docker push registry.ng.bluemix.net/<namespace>/watson  | |||
 docker push registry.ng.bluemix.net/<namespace>/watson-talk  | |||
3) Edite o arquivo '''watson-deployment.yml''' e altere a tag '''<namespace>''' 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 <name-of-cluster> 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 <name-of-cluster>  | |||
3) Testando a aplicação no navegador  | |||
 http://<public-IP>:30080/analyze/"Today is a beautiful day"  | |||
Será mostrado um JSON na tela  | |||
= Ver também =  | = Ver também =  | ||
Latest revision as of 19:03, 23 June 2020
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 <name-of-cluster>
- 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 <CLUSTER_NAME>
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 <none> 443/TCP 5d20h liberty NodePort 172.21.241.213 <none> 9080:31943/TCP 5d18h nginx NodePort 172.21.177.201 <none> 80:30965/TCP 6m10s nginx-service-np NodePort 172.21.123.52 <none> 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 <my_namespace>
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/<my_namespace>/hello-world:1 .
6) Verificando a imagem
docker images
7) Fazendo o push da image
docker push registry.ng.bluemix.net/<my_namespace>/hello-world:1
8) Verifique que o cluster está pronto pra uso
ibmcloud cs clusters
verificar se o estado está NORMAL
ibmcloud cs workers <yourclustername>
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 <yourclustername>
Exemplo no Mac:
export KUBECONFIG=/Users/<user_name>/.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/<my_namespace>/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/<name-of-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/<namespace>/watson ./watson docker build -t registry.ng.bluemix.net/<namespace>/watson-talk ./watson-talk
2) push da image Watson para o IBM Cloud Container Registry.
docker push registry.ng.bluemix.net/<namespace>/watson docker push registry.ng.bluemix.net/<namespace>/watson-talk
3) Edite o arquivo watson-deployment.yml e altere a tag <namespace> 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 <name-of-cluster> 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 <name-of-cluster>
3) Testando a aplicação no navegador
http://<public-IP>:30080/analyze/"Today is a beautiful day"
Será mostrado um JSON na tela