Ambiente INCA - Instalação kubernetes
Descrição da Arquitetura Kubernetes Node master: responsável por orquestrar as operações do cluster, realizar deploys, comandar os healthchecks e etc. Nodes workers: responsáveis por receber os pods da aplicação, fazer proxy entre os mesmos e garantir a quantidade de containers solicitada rodando entre eles. 2. Instalações e Configurações Instalar o Docker e alguns CLI´s do Kubernetes em todos os clusters. Importante: deve ser retirado das VMs a possibilidade de swap de disco. 2.1. Instalando o Docker Fazer o download e instalar a versão do Docker mais recente. https://kubernetes.io/docs/setup/production-environment/container-runtimes/#docker Configurando o Docker: cat <<EOF | sudo tee /etc/docker/daemon.json {
"exec-opts": ["native.cgroupdriver=systemd"], "log-driver": "json-file", "log-opts": { "max-size": "100m" }, "storage-driver": "overlay2"
} EOF sudo mkdir -p /etc/systemd/system/docker.service.d Iniciando o Docker: sudo systemctl daemon-reload sudo systemctl restart docker Também é possível iniciar o serviço do Docker no boot utilizando o comando abaixo: sudo systemctl enable docker Projeto ModRED (sistema de modernização do REDOME) 2.2. Instalando os componentes do Kubernetes (kubeadm, kubelet e kubectl) Kubeadm: realiza o bootstrap do cluster. Kubelet: roda em todos os nodes gerenciando os papéis, iniciando pods, containers e mantendo os mesmos saudáveis. Kubectl: realiza a comunicação com o cluster e executar todas as operações de orquestração. apt-get update && apt-get install -y apt-transport-https curl curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add - cat <<EOF >/etc/apt/sources.list.d/kubernetes.list deb http://apt.kubernetes.io/ kubernetes-xenial main EOF apt-get update apt-get install -y kubelet kubeadm kubectl 2.3. Criando o node master Executar o comando: kubeadm init Ao final da execução serão exibidos outros comandos a serem executados para finalizar a configuração e o comando necessário para configurar os nodes workers. Exemplo: Your Kubernetes master has initialized successfully!To start using your cluster, you need to run the following as a regular user:mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/configYou should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
https://kubernetes.io/docs/concepts/cluster-administration/addons/You can now join any number of
machines by running the following on each node as root:Your Kubernetes master has initialized successfully!To start using your cluster, you need to run the following as a regular user:mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/configYou should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at: Projeto ModRED (sistema de modernização do REDOME)
https://kubernetes.io/docs/concepts/cluster-administration/addons/You can now join any number of
machines by running the following on each node as root:kubeadm join 172.31.85.6:6443 --token izzg7r.ueqzp7ndzxp8g5xq --discovery-token-ca-cert-hash sha256:e0244a52257be9e8cba49303e0472eb25020c6bd6c68f583653ed1700260fd0a 2.4. Criando os nodes workers Após instalar o Docker e os CLI’s do Kubernetes em todos os nodes vamos rodar o comando informado na inicialização do cluster. Ele é baseado na seguinte estrutura. kubeadm join <ip-do-master>:6443 --token <token> --discovery-token-ca-cert-hash sha256:<discoverytoken> No caso do exemplo descrito no item 2.3., seria executar: kubeadm join 172.31.85.6:6443 --token izzg7r.ueqzp7ndzxp8g5xq --discovery-token-ca-cert-hash sha256:e0244a52257be9e8cba49303e0472eb25020c6bd6c68f583653ed1700260fd0a Após executar o comando gerado na criação do cluster em todos os Nodes, podemos a partir do master listar todos os nodes vinculados ao cluster. kubectl get nodes 2.5. Instalar Ingress e CoreDNS No node master também devem ser instalados o NGINX Igress Controller e o Coredns. CoreDNS é um servidor DNS que serve como o DNS do cluster Kubernetes. https://kubernetes.io/docs/tasks/administer-cluster/coredns/ NGINX Ingress Controller para Kubernetes faz o balanceamento de carga básico, encerramento SSL / TLS, suporte para regravações de URI e criptografia SSL / TLS upstream. Por padrão, os pods de serviços do Kubernetes não são acessíveis da rede externa, mas apenas por outros pods dentro do cluster do Kubernetes. O Kubernetes tem uma configuração integrada para balanceamento de carga HTTP, chamada Ingress, que define regras para conectividade externa com serviços Kubernetes. Os usuários que precisam fornecer acesso externo aos serviços do Kubernetes criam um recurso Ingress que define regras, incluindo o caminho do URI, o nome do serviço de apoio e outras informações. O controlador do Ingress pode então programar Projeto ModRED (sistema de modernização do REDOME) automaticamente um balanceador de carga de front-end para habilitar a configuração do Ingress. https://docs.nginx.com/nginx-ingress-controller/installation/installation-with-manifests/ 2.6. Instalar o certificado 2.6.1. Instalar os recursos CustomResourceDefinition. $ kubectl apply --validate=false -f https://raw.githubusercontent.com/jetstack/certmanager/release-0.12/deploy/manifests/00-crds.yaml 2.6.2. Criar um namespace para cert-manager. $ kubectl create ns cert-manager 2.6.3. Adicionar o repositório Jetstack Helm e atualizar o cache. $ helm repo add jetstack https://charts.jetstack.io $ helm repo update 2.6.4. Instalar o cert-manager Helm chart. $ helm install --name cert-manager --namespace cert-manager --version v0.12.0 jetstack\cert-manager 2.6.5. Verificar se os pods do cert-manager foram criados e esperar que todos estejam em execução. $ kubectl get pods -n cert-manager 2.6.6. Criar uma chave no namespace cert-manager e salvar no arquivo chamado secretkey. $ kubectl create secret generic acme-route53 --from-file=secret-access-key=./secretkey -n certmanager 2.6.7. Criar um recurso do tipo ClusterIssuer que será usado para emitir certificados. Criar no namespace cert-manager para um melhor gerenciamento. apiVersion: cert-manager.io/v1alpha2 kind: ClusterIssuer metadata: Projeto ModRED (sistema de modernização do REDOME) name: letsencrypt-prod namespace: cert-manager spec: acme: server: https://acme-v02.api.letsencrypt.org/directory email: YOUR EMAIL ID privateKeySecretRef: name: letsencrypt-prod solvers: - selector: dnsZones: - "YOUR DOMAIN" dns01: route53: region: YOUR REGION accessKeyID: YOUR ACCESS KEY secretAccessKeySecretRef: name: acme-route53 key: secret-access-key 2.6.8. Verificar o status do recurso ClusterIssuer. Se o status mostrar 'False’, verificar os registros do pod 'cert-manager-6bcc9d894d-d7s9j' para solucionar o problema. $ kubectl get clusterissuer -n cert-manager 2.6.9. Criar um novo certificado. apiVersion: cert-manager.io/v1alpha2 kind: Certificate metadata: name: nginx-tls namespace: YOUR NAMESPACE spec: secretName: nginx-tls issuerRef: name: letsencrypt-prod kind: ClusterIssuer dnsNames: - '*.YOUR.DOMAIN' acme: Projeto ModRED (sistema de modernização do REDOME) config: - dns01: provider: route53 domains: - '*.YOUR.DOMAIN' 2.6.10. Verificar o status do certificado. $ kubectl get cert -n YOUR_NAMESPACE 2.6.11. Vincular o certificado ao controlador do Ingress. apiVersion: extensions/v1beta1 kind: Ingress metadata: name: nginx namespace: default annotations: kubernetes.io/ingress.class: "nginx" cert-manager.io/cluster-issuer: "letsencrypt-prod" spec: tls: - hosts: - "YOUR.DOMAIN" - "*.YOUR.DOMAIN" secretName: nginx-tls rules: - host: YOUR.DOMAIN http: paths: - path: / backend: serviceName: YOUR-SERVICE servicePort: 80 https://medium.com/@karan.b