Kubernetes começando

Kubernetes começando

Kubernetes é uma plataforma de código aberto para gerenciar aplicações de contêineres em um conjunto de máquinas físicas ou virtuais. A inspiração original para Kubernetes foi o sistema Borg do Google. Borg é um sistema de gerenciamento de cluster que lida com centenas de milhares de empregos e aplicativos em enormes data centers do Google. Kubernetes pretendia ser uma versão mais amigável do sistema de gerenciamento de cluster que todos poderiam usar.

A popularidade dos contêineres no processo de desenvolvimento de software está tornando os Kubernetes populares também. No antigo processo de desenvolvimento de software, os aplicativos foram implantados em máquinas host físicas. Desenvolvedores que trabalham em diferentes componentes do aplicativo necessário para manter um ambiente coesivo. Operação e o pessoal de TI precisava gerenciar cuidadosamente executáveis, configurações e bibliotecas. Diferentes componentes do aplicativo podem entrar em conflito durante o processo de integração. Além disso, o processo foi suscetível a erros humanos e falhas.

Máquinas virtuais (VM) ajudaram a trazer algum nível de confiabilidade ao processo. Mas ainda era difícil gerenciar aplicativos. Além disso, as VMs são caras para manter. Recipientes mudaram a paisagem. Com os contêineres, foi possível para desenvolvedores que trabalhavam em diferentes componentes do mesmo software para manter ambientes separados. Os contêineres são leves, baratos e rápidos. Esses benefícios deram origem à idéia de desenvolver software usando microsserviços, onde cada contêiner serve uma tarefa específica para o aplicativo.

Com o aumento do uso de contêineres, o Kubernetes tornou -se uma ferramenta eficaz para agendar e executar aplicativos em clusters. Como plataforma, pode libertar desenvolvedores do ônus de lidar com qualquer tipo de máquinas. Em vez de projetar infraestruturas centradas no hospedeiro com considerações físicas ou virtuais, os desenvolvedores podem começar a projetar para infraestrutura centrada no contêiner. Kubernetes fornece a camada necessária de abstração.

Parte 1: Conceitos

Componentes mestres

Os componentes principais são os serviços de controle para o cluster. Esses componentes lidam com decisões e eventos globais. Qualquer nó no cluster pode executá -los. No entanto, atribuir nós específicos a esses componentes é considerado uma boa prática.

Kube-apiserver

O Kube-Apiserver serve a API Kubernetes. Kubernetes API implementa uma interface repousante. Funciona como a ponte entre vários componentes do Kubernetes, como vagens, serviços, controladores de replicação e outros. É responsável pela consistência da comunicação entre a loja etcd e os contêineres implantados.

etcd

O etcd é responsável por armazenar todos os dados do cluster Kubernetes. O projeto etcd foi desenvolvido pela equipe Coreos. É uma loja de valor-chave distribuída e leve que usa API HTTP/JSON. Nós no cluster podem usar dados de configuração do etcd para descobrir serviços e se recuperar de estados com falha. Devido à importância dos dados, etcd devem ser backup corretamente.

Kube-controller-manager

O Kube controller-manager administra vários controladores para fornecer serviços diferentes. Por exemplo, os controladores de nó recuperam nós com falha e controladores de replicação mantêm o número correto de pods. Cada controlador é executado como um fio separado e depende das informações do ETCD para executar suas tarefas.

Manager-controlador da nuvem

O gerente-controlador da nuvem fornece controladores específicos para a nuvem. Pode ser desativado no manager Kube controlador. O gerente-controlador da nuvem foi separado do núcleo para permitir que o núcleo Kubernetes evoluir independentemente do código específico do provedor de nuvem. No passado, as dependências estavam causando problemas.

Kube-Scheduler

O Kube-Scheduler é responsável pela distribuição de carga de trabalho. Ele acompanha os requisitos de recursos e atribui nós para pods recém -criados. Ele também cuida dos requisitos de qualidade dos serviços.

Addons

Os complementos são vagens e serviços usados ​​para implementar recursos de cluster. Os usuários podem usar o gerenciador de complementos para criar e manter addons. Alguns complementos importantes e úteis são DNS, interface da web (painel), monitoramento de recursos de contêineres e registro no nível do cluster.

Componentes do nó

Uma máquina de trabalho em Kubernetes é chamada de nó. Os componentes do nó estão presentes em todos os nó e lidam com diferentes aspectos da carga de trabalho.

Kubelet

O serviço Kubelet em cada nó é o agente principal. Ele mantém o controle dos pods atribuídos ao seu nó através do Apiserver ou arquivo de configuração local. Ele se comunica com os componentes principais para descobrir solicitações de trabalho e relatar o status de seu nó.

kube-proxy

O Kube-Proxy é um pequeno serviço de proxy em cada nó para lidar com a sub-rede de host individual. Pode executar o balanceamento de carga rudimentar para TCP e UDP.

Docker

Kubernetes dependem principalmente do Docker para executar contêineres. É capaz de criar aplicativos a partir de imagens do Docker.

rkt

Kubernetes também suporta contêineres RKT. O suporte é atualmente experimental.

Supervisor

O supervisor pode ser usado para monitorar e controlar Kubelets e Docker Recipadores.

fluentd

O Fluentd é um Deamon para fornecer o registro no nível do CUSTER.

Cargas de trabalho

As cargas de trabalho de Kubernetes podem ser definidas da seguinte forma:

Vagens

Um pod é uma unidade fundamental na carga de trabalho de Kubernetes. Os contêineres não são atribuídos individualmente aos hosts. Grupos de recipientes, geralmente pertencentes a um aplicativo, são representados como uma vagem e o pod é então implantado no host como uma única unidade. Claro, um pod pode conter apenas um contêiner. Isso geralmente é mais comum em Kubernetes. No entanto, os contêineres são agrupados com base nas necessidades de recursos e aplicativos. O agrupamento destina -se a otimizar o compartilhamento de recursos.

Controladores

Controladores como conjuntos de réplicas, controlador de replicação, implantações, conjuntos estabelecidos, coleta de lixo e trabalhos de cron ajudam a gerenciar cargas de trabalho de Kubernetes. Controladores de replicação gerenciam o número de pods. Começa e termina as vagens para manter o número correto de vagens em execução. Controlador de implantação ajuda a alterar vagens e objetos de implantação para atingir o estado de implantação desejado.

Outras idéias importantes

Serviços

As vagens de Kubernetes são criadas e destruídas regularmente. Portanto, é difícil acompanhá -los através de endereços IP. A natureza dinâmica dos pods dificulta a comunicação entre si. Um serviço funciona como uma abstração. Ele fornece a política para alcançar um conjunto lógico de pods. Em Kubernetes, um serviço é um objeto de descanso. Serviços simplificam o design do contêiner.

Rótulos

Os rótulos são uma maneira poderosa de acompanhar e gerenciar grupos de componentes de trabalho. Os rótulos são pares de valores-chave que funcionam como tags arbitrárias para ajudar a obter um controle mais refinado sobre diferentes funções do sistema.

Parte 2: projeto prático

Executando um projeto Minikube

Minikube é um binário que configura um único cluster de Kubernetes em uma máquina local. Neste projeto, um nó.O aplicativo JS será transformado em uma imagem de contêiner do docker e a imagem será executada no Minikube.

Instalando Minikube, Kubectl, Hypervisor, NodeJs e Docker

Você pode instalar a ferramenta de linha de comando Minikube e Kubernetes Kubectl no Mac OS X, Linux e Windows com vários hipervisores. As instruções para diferentes sistemas operacionais estão disponíveis aqui. Além disso, você precisará de nodejs instalados em sua máquina para executar o exemplo do aplicativo Helloworld. Você pode instalar o docker aqui.

Iniciando um cluster

Use o seguinte comando para iniciar um cluster:

$ minikube comece a iniciar Kubernetes locais v1.7.5 Cluster… Iniciando VM… baixando o Minikube ISO 106.36 MB / 106.36 MB [=============================================] 100.00% 0s recebendo endereço IP da VM… movendo arquivos para cluster… Configurando certificados… conectando -se ao cluster… Configurando Kubeconfig… Componentes de cluster iniciantes… Kubectl está agora configurado para usar o cluster. 

Use o comando abaixo para ver se o cluster está funcionando corretamente:

$ kubectl cluster-info kubernetes mestre está em execução em https: // 192.168.99.100: 8443

Crie imagem do aplicativo

Vamos criar um servidor.Arquivo JS com o seguinte conteúdo:

var http = requer ('http');
var handleRequest = function (solicitação, resposta)
console.log ('Recebido solicitação de URL:' + solicitação.url);
resposta.Writehead (200);
resposta.fim ('Olá mundo!');
;
var www = http.createServer (Handlerequest);
www.Ouça (8080);

Você pode executar o seguinte comando:

$ Node Server.JS

E verifique se o servidor está em execução em http: // localhost: 8080. Você deveria ver “Olá mundo!”Texto na página da web.

Converter em contêiner do docker

No mesmo diretório que o servidor.JS Crie um arquivo Dockerfile com o seguinte texto:

Do nó: 6.9.2
Exponha 8080
Cópia do servidor.JS .
CMD Node Server.JS

O DockerFile criará uma imagem que começará no nó: 6.9.2 imagem no hub do documento.
Queremos executar as imagens do Docker localmente. Portanto, o comando a seguir dirá ao Docker que use o Minikube Deamon para o Docker Image Storage:

$ EVAL $ (Minikube Docker-env)

Você pode usar avaliar $ (minikube docker -env -u) para alterá -lo de volta ao padrão.
Agora vamos construir a imagem do Docker:

$ Docker Build -t My Node: V1 . Enviando contexto de construção para o Docker Daemon 3.072KB Etapa 1: do nó: 6.9.2 6.9.2: Puxando da biblioteca/nó 75A822CD7888: Pull Complete 57DE64C72267: Pull completo 4306BE1E8943: Pull completo 871436AB7225: Pull completo 0110C26A367: Pull 1f04fe713f1b: complete 0110C26a367: 60FAF429D6C97D928C762CB36F1940F4456CE4BD33FBDC34DE94A5E043 Status: Recebida Imagem mais recente para Node: 6.9.2 ---> faaadb4aaf9b Etapa 2: Exponha 8080 ---> em execução em DA7D251B3FD5 ---> 881F9FB69B2C Remoção de contêiner intermediário DA7D251B3FD5 Etapa 3: Copiar servidor.JS . ---> 0ACF61D9E75E Remoção de contêiner intermediário 3A4025539CF6 Etapa 4: CMD Node Server.JS ---> Runnando em 8aa9a4cbd723 ---> 41445e5c48fe removendo o contêiner intermediário 8aa9a4cbd723 construído com sucesso 41445e5c48fe 

Implantar para o cluster
Para implantar meu nó: v1, execute o seguinte comando:

$ kubectl run my-node --image = my-node: v1 --port = 8080 implantação "my-node" criada

Ele criará um pod no cluster. Podemos verificar os status do pod com os seguintes comandos:

$ KUBECTL GET NOME DE NOMEGAÇÕES DESENHADAS DESENHADAS ATIVADOS ATUAIS DISPONÍVEIS DO MY NODE 1 1 1 34SS 
$ KUBECTL GET PODS Nome Pronto Status Reinicia Age My-Node-276881918-QTH5S 1/1 Running 0 1M 
$ KUBECTL Get Eventos LastSeen FirstSeen Count Nome Kind Subobject Tipo de razão Mensagem de fonte 32m 32m 1 Minikube Nó normal Kube-proxy, Minikube Iniciando Kube-Proxy. 32m 32m 1 minikube nó de partida normal Kubelet, minikube inicial. 32m 32m 2 minikube Node Normal NodeHasSufficientDisk kubelet, minikube Node minikube status is now: NodeHasSufficientDisk 32m 32m 2 minikube Node Normal NodeHasSufficientMemory kubelet, minikube Node minikube status is now: NodeHasSufficientMemory 32m 32m 2 minikube Node Normal NodeHasNoDiskPressure kubelet, minikube Node minikube status is now: NodeHasNoDiskPressure 32m 32m 1 minikube Node Normal NodeAllocatableEnforced kubelet, minikube Updated Node Allocatable limit across pods 32m 32m 1 minikube Node Normal RegisteredNode controllermanager Node minikube event: Registered Node minikube in NodeController 32m 32m 1 minikube Node Normal NodeReady kubelet, minikube Node minikube status is now: NodeReady 6m 6m 1 nó miniKube Normal RegistroDNode ControllerManager Node Minikube Evento: Node registrado Minikube no NodeController 5m 5m 1 minikube nó de partida normal Kubelet,Minikube iniciando Kubelet. 5m 5m 1 nó minikubo kubelet forçado nodeallocatable UFFABILDMEMORY 5m 5m 1 minikube Node Normal NodeHasNoDiskPressure kubelet, minikube Node minikube status is now: NodeHasNoDiskPressure 5m 5m 1 minikube Node Normal NodeNotReady kubelet, minikube Node minikube status is now: NodeNotReady 5m 5m 1 minikube Node Normal Starting kube-proxy, minikube Starting kube-proxy. 5m 5m 1 Minikube Nó Nodeteady Kubelet, Minikube Node Minikube O status é agora: NodeReady 2M 2M 1 My-node-276881918-QTH5S POD Normal Padrão agendado-QTHEDULER 2M 2M-NODE MY-NODE 276881918 -276881918-QTH5S POD Normal bem-sucedido MountVolume Kubelet, Minikube MountVolume.A configuração foi bem-sucedida para o volume "padrão-token-r5pl1" 2m 2m 1 my-node-276881918-qth5s spec especific.Contêineres meu nó norma.Contêineres meu nó Normal criou Kubelet, Minikube criou contêiner 2m 2m 1 my-node-276881918-qth5s Pod especial.Contêineres meu nó Normal Iniciado Kubelet, Minikube Iniciado Recipiente 2m 2m 1 My-node-276881918 Replicaset Normal bem-sucedido bem-sucedido REPLICASET-CONTROLLER CRIADO: My-Node-2768881918-QTH5S 2m 1 My-Node Deployment Normment ScalingReplicas réplica up Definir meu nó-276881918 

Criar um serviço
Uma vagem é inacessível. Você precisa criar um serviço para tornar o pod acessível ao mundo. O comando a seguir deve criar o serviço necessário:

$ KUBECTL Exponha a implantação my-node --type = Service de LoadBalancer "My Node" exposto

Você pode verificar o status do serviço como este:

$ kubectl Get Services Nome do cluster-ip portas externas-IP da (s) idade (s) Kubernetes 10.0.0.1  443/TCP 34M My Node 10.0.0.213  8080: 31460/TCP 31S 

Se você usar o seguinte comando, ele abrirá o serviço em um navegador da web:

Serviço $ Minikube My-Node Abrindo o serviço Kubernetes Padrão/My-Node no navegador padrão… 

Você pode verificar o que está acontecendo em seu pod com o comando "logs" - Kubectl Logs [Nameofthepod].

$ KUBECTL LOGS MY-NODE-276881918-QTH5S Recebido Pedido de URL: / Recebido Solicitação de URL: / Favicon.ico 

Os logs acima estão mostrando as solicitações feitas ao servidor.Aplicativo JS em execução no cluster.

Limpando
Você pode excluir o serviço e o pod com os seguintes comandos:

$ kubectl Excluir serviço my-node Service "my-node" excluído $ kubectl delete implantação my-node [/code] implantação "my-node"

Você pode parar o minikube:

$ minikube pare de parar de kubernetes locais cluster ... a máquina parou. 

Conclusão

Kubernetes é um vasto sistema com recursos em larga escala. A documentação de Kubernetes é o melhor lugar para aprender sobre esta poderosa tecnologia.

Um estudo mais aprofundado:
Documentação de Kubernetes: https: // kubernetes.io/docs