Este blog faz parte de uma série de blogs com várias partes que mostra como executar seus aplicativos no Kubernetes. Ele usará o Couchbase, an open source NoSQL distributed document database, as the Docker
container.
A primeira parte (Couchbase no Kubernetes) explained how to start the Kubernetes cluster using Vagrant. That is a simple and easy way to develop, test, and deploy
Kubernetes cluster on your local machine. But this could be of limited use rather soon as the resources are constrained by the local machine. So what do you do?
Kubernetes cluster can be installed on Amazon as well. This second part will show:
- How to setup and start the Kubernetes cluster on Amazon Web Services
- Execute o contêiner do Docker no cluster do Kubernetes
- Expor o pod no Kubernetes como serviço
- Desligar o cluster
Aqui está uma visão geral rápida:
Let’s dig into the details!
Setup Kubernetes Cluster on Amazon Web Services
Getting Started on AWS EC2 provide complete instructions to start Kubernetes cluster on Amazon. Make sure to have the pre-requisites (AWS account, AWS CLI, Full EC2 access)
met before you follow these instructions. Kubernetes cluster can be created on Amazon as:
1 2 |
definir PROVEDOR DE KUBERNETES=aws ./agrupamento/cubo-para cima.sh |
By default, this provisions a new VPC and a 4 node Kubernetes cluster in us-west-2a
(Oregon) with t2.micro
instances running on Ubuntu. This means 5 AMIs (one for master and 4 for the worker nodes) are created. Some
properties that are worth updating:
- Conjunto
NUM_MINIONS
environment variable to whatever number of nodes are required in the cluster. Set it to 2 if you want only two worker nodes to be created. - Each instance size is 1.1.x is
t2.micro
. SetMASTER_SIZE
eMINION_SIZE
environment variables tom3.medium
otherwise the nodes are going to crawl.
Se você baixou o Kubernetes de github.com/kubernetes/kubernetes/releasestodos os valores podem ser alterados em cluster/aws/config-default.sh
. Starting Kubernetes on
Amazon shows the following log:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 |
./kubernetes/agrupamento/cubo-para cima.sh ... Início agrupamento usando provedor: aws ... chamando verificar-pré-requisitos ... chamando cubo-para cima Início agrupamento usando os distribuição: vivid Carregamento para Amazon S3 +++ Preparação servidor alcatrão para S3 Armazenamento: kubernetes-preparação-0eaf81fbc51209dd47c13b6d8b424149/desenvolvimento { "InstanceProfile": { "InstanceProfileId": "AIPAJMNMKZSXNWXQBHXHI", "Roles": [ { "RoleName": "kubernetes-master", "AssumeRolePolicyDocument": { "Versão": "2012-10-17", "Declaração": [ { "Ação": "sts:AssumeRole", "Efeito": "Permitir", "Principal": { "Serviço": "ec2.amazonaws.com" } } ] }, "CreateDate": "2016-02-29T23:19:17Z", "Path": "/", "RoleId": "AROAJW7ER37BPXX5KFTFS", "Arn": "arn:aws:iam::598307997273:role/kubernetes-master" } ], "Arn": "arn:aws:iam::598307997273:instance-profile/kubernetes-master", "CreateDate": "2016-02-29T23:19:19Z", "Path": "/", "InstanceProfileName": "kubernetes-master" } } { "InstanceProfile": { "InstanceProfileId": "AIPAILRAU7RF4R2SDCULG", "Path": "/", "Arn": "arn:aws:iam::598307997273:instance-profile/kubernetes-minion", "Roles": [ { "Path": "/", "AssumeRolePolicyDocument": { "Declaração": [ { "Efeito": "Permitir", "Ação": "sts:AssumeRole", "Principal": { "Serviço": "ec2.amazonaws.com" } } ], "Versão": "2012-10-17" }, "RoleName": "kubernetes-minion", "Arn": "arn:aws:iam::598307997273:role/kubernetes-minion", "RoleId": "AROAIBEPV6VW4IEE6MRHS", "CreateDate": "2016-02-29T23:19:21Z" } ], "InstanceProfileName": "kubernetes-minion", "CreateDate": "2016-02-29T23:19:22Z" } } Usando SSH chave com (AWS) impressão digital: 39:b3:cb:c1:af:6a:86:de:98:95:01:3d:9a:56:bb:8b Criação de vpc. Adição etiqueta para vpc-7b46ac1f: Nome=kubernetes-vpc Adição etiqueta para vpc-7b46ac1f: KubernetesCluster=kubernetes Usando VPC vpc-7b46ac1f Criação de sub-rede. Adição etiqueta para sub-rede-cc906fa8: KubernetesCluster=kubernetes Usando sub-rede sub-rede-cc906fa8 Criação de Internet Gateway. Usando Internet Gateway igw-40055525 Associação rota tabela. Criação de rota tabela Adição etiqueta para rtb-f2dc1596: KubernetesCluster=kubernetes Associação rota tabela rtb-f2dc1596 para sub-rede sub-rede-cc906fa8 Adição rota para rota tabela rtb-f2dc1596 Usando Rota Tabela rtb-f2dc1596 Criação de mestre segurança grupo. Criação de segurança grupo kubernetes-mestre-kubernetes. Adição etiqueta para sg-308b3357: KubernetesCluster=kubernetes Criação de lacaio segurança grupo. Criação de segurança grupo kubernetes-lacaio-kubernetes. Adição etiqueta para sg-3b8b335c: KubernetesCluster=kubernetes Usando mestre segurança grupo: kubernetes-mestre-kubernetes sg-308b3357 Usando lacaio segurança grupo: kubernetes-lacaio-kubernetes sg-3b8b335c Início Mestre Adição etiqueta para i-b71a6f70: Nome=kubernetes-mestre Adição etiqueta para i-b71a6f70: Função=kubernetes-mestre Adição etiqueta para i-b71a6f70: KubernetesCluster=kubernetes Em espera para mestre para ser pronto Tentativa 1 para verificar para mestre nodeWaiting para instância i-b71a6f70 para spawn Dormir para 3 segundos... Em espera para instância i-b71a6f70 para spawn Dormir para 3 segundos... Em espera para instância i-b71a6f70 para spawn Dormir para 3 segundos... Em espera para instância i-b71a6f70 para spawn Dormir para 3 segundos... Em espera para instância i-b71a6f70 para spawn Dormir para 3 segundos... Em espera para instância i-b71a6f70 para spawn Dormir para 3 segundos... [mestre em execução @52.34.244.195] Fixação persistente dados volume (vol-e072d316) para mestre { "Dispositivo": "/dev/sdb", "Estado": "attaching", "InstanceId": "i-b71a6f70", "VolumeId": "vol-e072d316", "AttachTime": "2016-03-02T18:10:15.985Z" } Tentativa 1 para verificar para SSH para mestre [ssh para mestre de trabalho] Tentativa 1 para verificar para sal-mestre [sal-mestre não de trabalho ainda] Tentativa 2 para verificar para sal-mestre [sal-mestre não de trabalho ainda] Tentativa 3 para verificar para sal-mestre [sal-mestre não de trabalho ainda] Tentativa 4 para verificar para sal-mestre [sal-mestre não de trabalho ainda] Tentativa 5 para verificar para sal-mestre [sal-mestre não de trabalho ainda] Tentativa 6 para verificar para sal-mestre [sal-mestre não de trabalho ainda] Tentativa 7 para verificar para sal-mestre [sal-mestre não de trabalho ainda] Tentativa 8 para verificar para sal-mestre [sal-mestre não de trabalho ainda] Tentativa 9 para verificar para sal-mestre [sal-mestre não de trabalho ainda] Tentativa 10 para verificar para sal-mestre [sal-mestre não de trabalho ainda] Tentativa 11 para verificar para sal-mestre [sal-mestre não de trabalho ainda] Tentativa 12 para verificar para sal-mestre [sal-mestre não de trabalho ainda] Tentativa 13 para verificar para sal-mestre [sal-mestre não de trabalho ainda] Tentativa 14 para verificar para sal-mestre [sal-mestre em execução] Criação de lacaio configuração Criação de dimensionamento automático grupo 0 lacaios iniciado; esperando 0 lacaios iniciado; esperando 0 lacaios iniciado; esperando 0 lacaios iniciado; esperando 2 lacaios iniciado; pronto Em espera 3 minutos para agrupamento para settle ..................Re-em execução sal highstate Em espera para agrupamento inicialização. Isso vontade continuamente verificar para ver se o API para kubernetes é acessível. Isso pode loop para sempre se lá foi alguns não capturado erro durante iniciar para cima. Kubernetes agrupamento criado. agrupamento "aws_kubernetes" definir. usuário "aws_kubernetes" definir. contexto "aws_kubernetes" definir. trocado para contexto "aws_kubernetes". Escreveu configuração para aws_kubernetes para /Usuários/arungupta/.cubo/configuração Sanidade verificação agrupamento... Tentativa 1 para verificar Docker em nó @ 52.37.172.215 ...não de trabalho ainda Tentativa 2 para verificar Docker em nó @ 52.37.172.215 ...não de trabalho ainda Tentativa 3 para verificar Docker em nó @ 52.37.172.215 ...de trabalho Tentativa 1 para verificar Docker em nó @ 52.27.90.19 ...de trabalho Kubernetes agrupamento é em execução. O mestre é em execução em: https://52.34.244.195 O usuário nome e senha para uso é localizado em /Usuários/arungupta/.cubo/configuração. ... chamando validar-agrupamento Em espera para 2 pronto nós. 1 pronto nós, 2 registrado. Repetição de tentativas. Encontrado 2 nó(s). NOME RÓTULOS STATUS IDADE ip-172-20-0-92.us-oeste-2.compute.internal kubernetes.io/nome do host=ip-172-20-0-92.us-oeste-2.compute.internal Pronto 56s ip-172-20-0-93.us-oeste-2.compute.internal kubernetes.io/nome do host=ip-172-20-0-93.us-oeste-2.compute.internal Pronto 35s Validar saída: NOME STATUS MENSAGEM ERRO controlador-gerente Saudável ok nulo programador Saudável ok nulo etcd-0 Saudável {"saúde": "true" (verdadeiro)} nulo etcd-1 Saudável {"saúde": "true" (verdadeiro)} nulo Aglomerado validação bem-sucedido Feito, listagem agrupamento serviços: Kubernetes mestre é em execução em https://52.34.244.195 Elasticsearch é em execução em https://52.34.244.195/api/v1/proxy/namespaces/kube-system/services/elasticsearch-logging Heapster é em execução em https://52.34.244.195/api/v1/proxy/namespaces/kube-system/services/heapster Kibana é em execução em https://52.34.244.195/api/v1/proxy/namespaces/kube-system/services/kibana-logging KubeDNS é em execução em https://52.34.244.195/api/v1/proxy/namespaces/kube-system/services/kube-dns KubeUI é em execução em https://52.34.244.195/api/v1/proxy/namespaces/kube-system/services/kube-ui Grafana é em execução em https://52.34.244.195/api/v1/proxy/namespaces/kube-system/services/monitoring-grafana InfluxDB é em execução em https://52.34.244.195/api/v1/proxy/namespaces/kube-system/services/monitoring-influxdb |
Amazon Console shows:
Three instances are created as shown – one for master node and two for worker nodes. Username and password for the Kubernetes master are stored in /Users/arungupta/.kube/config
. Look for a section like:
1 2 3 4 5 6 |
- nome: aws_kubernetes usuário: cliente-certificado-dados: DADOS cliente-chave-dados: DADOS senha: 3FkxcAURLCWBXc9H nome de usuário: administrador |
Run Docker container in Kubernetes Cluster on Amazon
Agora que o cluster está em funcionamento, obtenha uma lista de todos os nós:
1 2 3 4 |
./kubernetes/agrupamento/kubectl.sh obter não NOME RÓTULOS STATUS IDADE ip-172-20-0-92.us-oeste-2.compute.internal kubernetes.io/nome do host=ip-172-20-0-92.us-oeste-2.compute.internal Pronto 18m ip-172-20-0-93.us-oeste-2.compute.internal kubernetes.io/nome do host=ip-172-20-0-93.us-oeste-2.compute.internal Pronto 18m |
It shows two worker nodes. Create a new Couchbase pod:
1 2 |
./kubernetes/agrupamento/kubectl.sh executar couchbase --imagem=arungupta/couchbase controlador de replicação "couchbase" criado |
Observe como o nome da imagem pode ser especificado na CLI. Esse comando cria um controlador de replicação com um único pod. O pod usa arungupta/couchbase Imagem do Docker
that provides a pre-configured Couchbase server. Any Docker image can be specified here. Get all the RC resources:
1 2 3 |
./kubernetes/agrupamento/kubectl.sh obter rc CONTROLADOR CONTAINER(S) IMAGEM(S) SELETOR RÉPLICAS IDADE couchbase couchbase arungupta/couchbase executar=couchbase 1 12m |
This shows the Replication Controller that is created for you. Get all the Pods:
1 2 3 |
./kubernetes/agrupamento/kubectl.sh obter po NOME PRONTO STATUS RESTARTS IDADE couchbase-kil4y 1/1 Em execução 0 12m |
The output shows the Pod that is created as part of the Replication Controller. Get more details about the Pod:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
./kubernetes/agrupamento/kubectl.sh descrever po couchbase-kil4y Nome: couchbase-kil4y Namespace: padrão Imagem(s): arungupta/couchbase Nó: ip-172-20-0-93.us-oeste-2.compute.internal/172.20.0.93 Início Tempo: Quarta, 02 Mar 2016 10:25:47 -0800 Rótulos: executar=couchbase Status: Em execução Motivo: Mensagem: IP: 10.244.1.4 Replicação Controladores: couchbase (1/1 réplicas criado) Contêineres: couchbase: Contêineres ID: doca://1c33e4f28978a5169a5d166add7c763de59839ed1f12865f4643456efdc0c60e Imagem: arungupta/couchbase Imagem ID: doca://080e2e96b3fc22964f3dec079713cdf314e15942d6eb135395134d629e965062 QoS Nível: CPU: Estável Solicitações: CPU: 100m Estado: Em execução Iniciado: Quarta, 02 Mar 2016 10:26:18 -0800 Pronto: Verdadeiro Reiniciar Contagem: 0 Meio ambiente Variáveis: Condições: Tipo Status Pronto Verdadeiro Volumes: padrão-token-xuxn5: Tipo: Secreto (a segredo que deve preencher este volume) SecretName: padrão-token-xuxn5 Eventos: FirstSeen Visto pela última vez Contagem De SubobjetoCaminho Motivo Mensagem ───────── ──────── ───── ──── ───────────── ────── ─────── 13m 13m 1 {programador } Programado Com sucesso atribuído couchbase-kil4y para ip-172-20-0-93.us-oeste-2.compute.internal 13m 13m 1 {cubeta ip-172-20-0-93.us-oeste-2.compute.internal} implicitamente necessário contêiner POD Puxado Contêineres imagem "gcr.io/google_containers/pause:0.8.0" já presente em máquina 13m 13m 1 {cubeta ip-172-20-0-93.us-oeste-2.compute.internal} implicitamente necessário contêiner POD Criado Criado com doca id 3830f504a7b6 13m 13m 1 {cubeta ip-172-20-0-93.us-oeste-2.compute.internal} implicitamente necessário contêiner POD Iniciado Iniciado com doca id 3830f504a7b6 13m 13m 1 {cubeta ip-172-20-0-93.us-oeste-2.compute.internal} especificação.contêineres{couchbase} Puxar Puxar imagem "arungupta/couchbase" 12m 12m 1 {cubeta ip-172-20-0-93.us-oeste-2.compute.internal} especificação.contêineres{couchbase} Puxado Com sucesso puxado imagem "arungupta/couchbase" 12m 12m 1 {cubeta ip-172-20-0-93.us-oeste-2.compute.internal} especificação.contêineres{couchbase} Criado Criado com doca id 1c33e4f28978 12m 12m 1 {cubeta ip-172-20-0-93.us-oeste-2.compute.internal} especificação.contêineres{couchbase} Iniciado Iniciado com doca id 1c33e4f28978 |
Expose Pod on Kubernetes as Service
Agora que nosso pod está em execução, como posso acessar o servidor Couchbase? Você precisa expô-lo fora do cluster do Kubernetes. O kubectl expose
command takes a pod, service or replication controller and expose it as a Kubernetes Service. Let’s
expose the replication controller previously created and expose it:
1 2 |
./kubernetes/agrupamento/kubectl.sh expor rc couchbase --alvo-porto=8091 --porto=8091 --tipo=Balanceador de carga serviço "couchbase" exposto |
Get more details about the Service:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
./kubernetes/agrupamento/kubectl.sh descrever serviço couchbase Nome: couchbase Namespace: padrão Rótulos: executar=couchbase Seletor: executar=couchbase Tipo: Balanceador de carga IP: 10.0.158.93 Balanceador de carga Ingresso: a44d3f016e0a411e5888f0206c9933da-1869988881.us-oeste-2.elb.amazonaws.com Porto: 8091/TCP NodePort: 32415/TCP Pontos finais: 10.244.1.4:8091 Sessão Afinidade: Nenhum Eventos: FirstSeen Visto pela última vez Contagem De SubobjetoCaminho Motivo Mensagem ───────── ──────── ───── ──── ───────────── ────── ─────── 7s 7s 1 {serviço-controlador } Criando o balanceador de carga Criação de carregar balanceador 5s 5s 1 {serviço-controlador } CriadoLoadBalancer Criado carregar balanceador |
O Loadbalancer
attribute Ingress gives you the address of the load balancer that is now publicly accessible. Wait for 3 minutes to let the load balancer settle down. Access it using port 8091 and the login page for
Couchbase Web Console shows up:
Digite as credenciais como "Administrator" e "password" para ver o console da Web:
Assim, você acabou de acessar seu pod fora do cluster do Kubernetes.
Shutdown Kubernetes Cluster
Por fim, desligue o cluster usando cluster/kube-down.sh
roteiro.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
./kubernetes/agrupamento/cubo-para baixo.sh Trazendo para baixo agrupamento usando provedor: aws Exclusão ELBs em: vpc-7b46ac1f Em espera para ELBs para ser excluído Todos ELBs excluído Exclusão automático-dimensionamento grupo: kubernetes-lacaio-grupo Exclusão automático-dimensionamento lançamento configuração: kubernetes-lacaio-grupo Exclusão instâncias em VPC: vpc-7b46ac1f Em espera para instâncias para ser excluído Instâncias não ainda excluído: i-45077282 i-44077283 i-b71a6f70 Dormir para 3 segundos... Instâncias não ainda excluído: i-45077282 i-44077283 i-b71a6f70 Dormir para 3 segundos... Instâncias não ainda excluído: i-45077282 i-44077283 i-b71a6f70 Dormir para 3 segundos... Instâncias não ainda excluído: i-45077282 i-44077283 i-b71a6f70 Dormir para 3 segundos... Instâncias não ainda excluído: i-45077282 i-44077283 i-b71a6f70 Dormir para 3 segundos... Instâncias não ainda excluído: i-45077282 i-44077283 i-b71a6f70 Dormir para 3 segundos... Instâncias não ainda excluído: i-45077282 i-44077283 i-b71a6f70 Dormir para 3 segundos... Instâncias não ainda excluído: i-45077282 i-44077283 i-b71a6f70 Dormir para 3 segundos... Instâncias não ainda excluído: i-45077282 i-44077283 i-b71a6f70 Dormir para 3 segundos... Instâncias não ainda excluído: i-45077282 i-44077283 i-b71a6f70 Dormir para 3 segundos... Instâncias não ainda excluído: i-45077282 i-44077283 i-b71a6f70 Dormir para 3 segundos... Instâncias não ainda excluído: i-45077282 i-44077283 i-b71a6f70 Dormir para 3 segundos... Instâncias não ainda excluído: i-44077283 i-b71a6f70 Dormir para 3 segundos... Todos instâncias excluído Exclusão VPC: vpc-7b46ac1f Limpeza para cima segurança grupo: sg-308b3357 Limpeza para cima segurança grupo: sg-3b8b335c Limpeza para cima segurança grupo: sg-e3813984 Exclusão segurança grupo: sg-308b3357 Exclusão segurança grupo: sg-3b8b335c Exclusão segurança grupo: sg-e3813984 Feito |
For a complete clean up, you still need to explicitly delete the S3 bucket where Kubernetes binaries are stored.
Aproveite!