Cluster Kubernetes com Rancher [Lab Session]
Tags: community, rancher, kubernetes
Published: 2024-01-29 10:35:02

Neste laboratório foi provisionado um cluster kubernetes com três nodes utilizando rancher single node para gerenciamento. Toda estrutura foi provisionada na AWS.

![](https://cdn-images-1.medium.com/max/2004/1*h0QsIAG3taudAEbdVseFIg.png)

Utilizamos o [terraform](https://www.terraform.io/downloads) para provisionar grande parte da estrutura, como: instâncias EC2 e suas dependências, [Docker](https://www.docker.com/), [Rancher](https://rancher.com/), *network load balancer*, *security groups* e *target group*.

![Topologia alcançada](https://cdn-images-1.medium.com/max/3840/1*XZW9POqSdJ548c20s4d4Cw.png)

[Código terraform aqui.](https://github.com/paulofponciano/lab-rancher-v2.4-k8s-aws)

### Pré-requisitos

* [Terraform](https://www.terraform.io/downloads) instalado

* [AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html) instalado

* Credenciais administrativas da conta alvo/aws configuradas localmente

* AWS VPC provisionada com duas subnets públicas e ao menos uma privada ([https://medium.com/@paulofponciano/provisionamento-de-aws-vpc-base-com-terraform-a1db1834290a](https://medium.com/@paulofponciano/provisionamento-de-aws-vpc-base-com-terraform-a1db1834290a))

* *Key pair* provisionada (para acessar as instâncias após provisionamento)

* Domínio válido — Não é necessariamente pré-requisito, mas vai ajudar muito

### Variáveis

Entrada de informações para identificação do ambiente, região de provisionamento e subnets:

```tf
variable "project_name" {
  default = "my-k8s-project"
}
    
variable "env" {
  default = "dev"
}
    
#For k8s cluster
variable "instance_name" {
  type = list(string)
  default = [
    "k8s-node-01",
    "k8s-node-02",
    "k8s-node-03",
  ]
}

#For rancher
variable "rancher_name" {
  default = "rancher-node"
}

#For rancher and NLB
variable "subnet_id_public_az1" {
  default = "subnet-*****************"
}

variable "subnet_id_public_az2" {
  default = "subnet-*****************"
}

#For k8s cluster
variable "subnet_id_private_az1" {
  default = "subnet-*****************"
}

variable "aws_details" {
  type = map(string)
  default = {
    region        = "us-west-2"
    instance_type = "t3.medium"
    key_name      = "k8s-kp" #keypair (.pem)
  }
}
```

### Construção

- Após finalizar a execução do código terraform, identifique qual IP público foi provisionado para o Rancher e CNAME provisionado para o *Network load balancer*. Crie as duas entradas no DNS do seu domínio:

![](https://cdn-images-1.medium.com/max/2204/1*qqFH4ZGG3Liz318xFB2uRw.png)

- Acesse o rancher pelo navegador e defina a nova senha do usuário ‘admin’, na sequência, defina a URL de acesso:

![](https://cdn-images-1.medium.com/max/2472/1*jkpBa0nTHb4C8Qxz5ePyMg.png)

![](https://cdn-images-1.medium.com/max/2472/1*dt4VHvO1oJ2bBWLrdz1OeQ.png)

- Adicione um novo *cluster* em ‘Add Cluster’ e escolha ‘From existing nodes (Custom)’, pois vamos utilizar os três *nodes* k8s privisionados com terraform:

![](https://cdn-images-1.medium.com/max/3464/1*r05oYz4YJkMiW0KXk05crw.png)

![](https://cdn-images-1.medium.com/max/3464/1*UbB1lAoD3QKNa-pZt2Sw7A.png)

- Defina um nome para seu *cluster* em ‘Cluster Name’. Em *Advanced Options*, marque como *Disabled* a opção Nginx Ingress — Usaremos o Traefik como proxy reverso:

![](https://cdn-images-1.medium.com/max/3464/1*bNtK0hVN-j035z2MBAayZw.png)

- Na próxima etapa, selecione as *roles* que serão executadas: etcd, Control Plane e Worker. Também informe o nome do primeiro *node* kubernetes:

![](https://cdn-images-1.medium.com/max/3464/1*Buqk84SXCcWFOJ5vY-4IiQ.png)

Ainda nesse passo, é importante copiar o comando que é gerado logo abaixo:

![Comando para adicionar os nodes K8S no Rancher](https://cdn-images-1.medium.com/max/2664/1*BbVWgZvblax0FOVJJnByNA.png)

*Cluster* criado:

![](https://cdn-images-1.medium.com/max/3464/1*1vf6JiMp9sr4UaZTXUYPKw.png)

- Conecte nos três *nodes* criados para o K8S, e execute o comando copiado no passo anterior, mas lembre-se de alterar apenas o valor do *— node-name* de acordo com a sequência definida (k8s-node-02, k8s-node-03):

![](https://cdn-images-1.medium.com/max/3840/1*H8Vz5Bee1uoNMHcBJk84Fg.png)

Após executar o comando nos três *nodes*, aguarde o *deploy*:

![](https://cdn-images-1.medium.com/max/3460/1*cIhK4_2nhMAk9h6YUqaKfg.png)

*Deploy* finalizado e *nodes* ativos:

![](https://cdn-images-1.medium.com/max/3460/1*569Ao8pqwAFGy8oR2Q-L5Q.png)

- No dashboard do *cluster*, execute ‘Launch kubectl’ para executar alguns comandos diretamente no *cluster*:

![](https://cdn-images-1.medium.com/max/3460/1*04VHsldTBGA0obYEYrx8sQ.png)

![Launch kubectl](https://cdn-images-1.medium.com/max/3354/1*tjtkfs3YPeBWpOrVlbeucQ.png)

Execute:

`kubectl apply -f [https://raw.githubusercontent.com/traefik/traefik/v1.7/examples/k8s/traefik-rbac.yaml](https://raw.githubusercontent.com/traefik/traefik/v1.7/examples/k8s/traefik-rbac.yaml)`

`kubectl apply -f [https://raw.githubusercontent.com/traefik/traefik/v1.7/examples/k8s/traefik-ds.yaml](https://raw.githubusercontent.com/traefik/traefik/v1.7/examples/k8s/traefik-ds.yaml)`

![](https://cdn-images-1.medium.com/max/3258/1*aaCFKzhTEpTUuwkK82YDhQ.png)

Crie o arquivo ui.yml para *deploy* do traefik:

`touch ui.yml`

Insira o conteúdo abaixo em ui.yml:

```yaml
---
apiVersion: v1
kind: Service
metadata:
  name: traefik-web-ui
  namespace: kube-system
spec:
  selector:
    k8s-app: traefik-ingress-lb
  ports:
  - name: web
    port: 80
    targetPort: 8080
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: traefik-web-ui
  namespace: kube-system
spec:
  rules:
  - host: traefik.sevira.ninja
    http:
      paths:
      - path: /
        backend:
          serviceName: traefik-web-ui
          servicePort: web
```

Faça o *apply* para *deploy* do traefik:

`kubectl apply -f ui.yml`

![](https://cdn-images-1.medium.com/max/3258/1*U2P0qkgPbIFKmOcDY7yLjw.png)

*Deploy* finalizado e traefik ativo:

![](https://cdn-images-1.medium.com/max/2860/1*8lrex6tDJkq9Iud6AmMakg.png)

![](https://cdn-images-1.medium.com/max/2988/1*1sY76s45UzaeuEePLSlwCQ.png)

- Na console AWS, adicione os *nodes* K8S no *target group* que foi criado na execução do terraform:

![](https://cdn-images-1.medium.com/max/3308/1*E5fLbXbBAiQSmOF7FlWpBw.png)

Após o passo anterior, veja que é possível acessar o traefik através da URL definida tanto no DNS do domínio, quanto no arquivo ui.yml:

![Web UI Traefik](https://cdn-images-1.medium.com/max/3354/1*vQFSsjFCGYve9jXVfHwlhA.png)

Até aqui, o ambiente já está disponível para iniciar o *deploy* de suas aplicações. Pode ser utilizado o próprio catálogo do Rancher — Em ‘Apps’.

Grafana, por exemplo:

![](https://cdn-images-1.medium.com/max/2962/1*PDD0JJxf4-oqw31N8YL8sg.png)

Defina ‘Grafana Admin Password’ e em ‘Hostname’, uma nova URL que pode ser criada em seu domínio:

![](https://cdn-images-1.medium.com/max/2962/1*_mEv_f1mFYQwJ6BDkN9-bw.png)

![Pod grafana em um node](https://cdn-images-1.medium.com/max/2938/1*pXCOiWN8_vKjDkGprlp7BA.png)

![Ingress grafana](https://cdn-images-1.medium.com/max/2938/1*zsxZ8klIFJqUN0w3VzR3hA.png)

![Registro no DNS](https://cdn-images-1.medium.com/max/2176/1*qWiemdmwjOrQqu50OOlHQA.png)

![](https://cdn-images-1.medium.com/max/3266/1*1Vz0UUED5tetWLurS3HeHQ.png)

Happy building!