Pesquisa de site

Instalar e configurar o controlador Traefik Ingress em k0s


Umcontrolador Ingressé uma API que gerencia o acesso externo aos serviços em um cluster Kubernetes e outros ambientes em contêineres. O roteamento do tráfego em torno de aplicativos no Kubernetes traz desafios e complexidades. Um controlador de entrada resolve esse problema fornecendo uma ponte entre o Kubernetes e serviços externos. Um controlador Ingress pode fornecer balanceamento de carga, hospedagem virtual baseada em nome e terminação SSL

As principais tarefas executadas por um Controlador Ingress são:

  • Gerencie o tráfego de saída dentro de um cluster para serviços que precisam se comunicar com outros serviços fora de um cluster
  • Aceite o tráfego de fora da plataforma Kubernetes e faça o balanceamento de carga para pods (contêineres) em execução dentro da plataforma
  • Monitore os pods em execução no Kubernetes e atualize automaticamente as regras de balanceamento de carga quando os pods forem adicionados ou removidos de um serviço

Traefik Ingress Controller é um controlador de entrada do Kubernetes que gerencia o acesso aos serviços de cluster com suporte à especificação do Ingress. Ele foi originalmente projetado para fornecer um serviço de proxy reverso leve, mas com o tempo ganhou a capacidade de ser integrado a clusters Kubernetes.

Existem outras alternativas ao Traefik que incluem caddy eingress-nginx. O Traefik Ingress Controller é preferido devido aos seguintes recursos:

  • Possui um painel com uma interface bonita
  • É muito extensível com middlewares
  • Possui documentação repleta de exemplos para cada tipo de provedor, para cada recurso
  • Lida com a renovação automática do certificado TLS sem problemas

Neste guia, veremos como instalar e configurar o Traefik Ingress Controller no k0s.

Etapa 1 – Configurar cluster Kubernetes usando k0s

K0S é uma nova distribuição leve do Kubernetes da Mirantis que fornece o mínimo de extensões. Isso permite que os usuários personalizem suas preferências, como definir entrada, armazenamento e configurar o cluster durante a inicialização e controladores no manifesto CRD.

Para configurar um cluster Kubernetes usando k0s, use o auxílio do guia abaixo:

  • Implantar cluster Kubernetes no Linux com k0s

Depois de configurado, instale e configure kubectl usando o comando:

curl -LO "https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl"
chmod +x kubectl
sudo mv kubectl /usr/local/bin

Permitir que o kubectl acesse seu cluster/

export KUBECONFIG=/var/lib/k0s/pki/admin.conf

Ou defina-o como permanente

mkdir ~/.kube
sudo cp /var/lib/k0s/pki/admin.conf ~/.kube/config
sudo chown $USER:$USER  ~/.kube/config

Veja os nós disponíveis no cluster:

# kubectl get nodes
NAME     STATUS     ROLES           AGE    VERSION
master   Ready      control-plane   115s   v1.26.2+k0s
node1    Ready      <none>          75s    v1.26.2+k0s
node2    NotReady   <none>          61s    v1.26.2+k0s

Passo 2 – Instale o controlador Traefik Ingress

Neste guia, instalaremos o controlador Traefik Ingress usando Helm. Comece instalando o Helm conforme abaixo

curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3
chmod 700 get_helm.sh
sudo ./get_helm.sh

Verifique a instalação:

$ helm version
version.BuildInfo{Version:"v3.11.1", GitCommit:"293b50c65d4d56187cd4e2f390f0ada46b4c4737", GitTreeState:"clean", GoVersion:"go1.18.10"}

Adicione o repositório do leme Traefik Ingress

helm repo add traefik https://helm.traefik.io/traefik
helm repo update

Instale o controlador Traefik Ingress usando o gráfico do leme.

helm install traefik traefik/traefik

Saída de amostra:

NAME: traefik
LAST DEPLOYED: Fri Aug 12 17:09:03 2022
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None

Como alternativa, você pode instalar o controlador Traefik Ingress com parâmetros adicionais conforme mostrado:

helm upgrade --install traefik \
    --namespace traefik \
    --set dashboard.enabled=true \
    --set rbac.enabled=true \
    --set nodeSelector.node-type=master \
    --set="additionalArguments={--api.dashboard=true,--log.level=INFO,--providers.kubernetesingress.ingressclass=traefik-internal,--serversTransport.insecureSkipVerify=true}" \
    traefik/traefik \
    --version <version>

Verifique a instalação:

# kubectl get all
NAME                          READY   STATUS    RESTARTS   AGE
pod/traefik-f89df87d4-bqqpf   1/1     Running   0          72s

NAME                 TYPE           CLUSTER-IP       EXTERNAL-IP   PORT(S)                      AGE
service/kubernetes   ClusterIP      10.96.0.1        <none>        443/TCP                      3m48s
service/traefik      LoadBalancer   10.111.222.143   <pending>     80:30619/TCP,443:32519/TCP   72s

NAME                      READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/traefik   1/1     1            1           72s

NAME                                DESIRED   CURRENT   READY   AGE
replicaset.apps/traefik-f89df87d4   1         1         1       72s

A partir da saída acima, temos um serviço LoadBalancer com um endereço IP externo pendente. Isso será configurado posteriormente no guia.

Visualize os CRDs do Traefik com o comando;

# kubectl get crd |grep traefik
ingressroutes.traefik.containo.us       2022-08-12T09:45:05Z
ingressroutetcps.traefik.containo.us    2022-08-12T09:45:05Z
ingressrouteudps.traefik.containo.us    2022-08-12T09:45:05Z
middlewares.traefik.containo.us         2022-08-12T09:45:05Z
middlewaretcps.traefik.containo.us      2022-08-12T09:45:05Z
serverstransports.traefik.containo.us   2022-08-12T09:45:05Z
tlsoptions.traefik.containo.us          2022-08-12T09:45:05Z
tlsstores.traefik.containo.us           2022-08-12T09:45:05Z
traefikservices.traefik.containo.us     2022-08-12T09:45:05Z

Passo 3 – Instalar e configurar o MetalLB

MetalLB é uma solução Kubernetes que permite monitorar serviços do tipo LoadBalancer e atribuir-lhes um endereço IP de uma piscina virtual. Ele permite acessar serviços Kubernetes a partir de um IP lógico.

Isso pode ser instalado usando os comandos:

git clone https://github.com/techviewleo/metalLB.git && cd metalLB
kubectl apply -f namespace.yaml
kubectl apply -f metallb.yaml

Crie o mapa de configuração

vim metallb-config.yaml

O arquivo contém um pool virtual com um intervalo de IP endereçável que funciona em sua máquina local.

apiVersion: v1
kind: ConfigMap
metadata:
  namespace: metallb-system
  name: config
data:
  config: |
    address-pools:
    - name: default
      protocol: layer2
      addresses:
      - 192.168.205.40-192.168.205.50

Aplique o manifesto com o comando:

kubectl apply -f metallb-config.yaml

Depois disso, o serviço LoadBalalcer terá um endereço IP externo conforme mostrado:

# kubectl get svc
NAME         TYPE           CLUSTER-IP       EXTERNAL-IP      PORT(S)                      AGE
kubernetes   ClusterIP      10.96.0.1        <none>           443/TCP                      6m25s
traefik      LoadBalancer   10.111.222.143   192.168.205.40   80:30619/TCP,443:32519/TCP   3m49s

Agora atualize a entrada DNS do seu domínio adicionando o endereço IP fornecido a /etc/hosts

$ sudo vim /etc/hosts
192.168.205.40 traefik.computingforgeeks.com

Passo 4 – Implante e acesse o painel Traefik

Agora que seu cluster tem um endereço IP/nome de domínio, você pode acessar facilmente o Traefik Dashboard e os serviços da web. Mas atualmente o serviço não está disponível porque não temos nenhum Ingress criado.

# curl http://traefik.computingforgeeks.com
404 page not found

O painel do Traefik escuta na porta 9000 que não foi exposta. Para expô-lo, edite o serviço Traefik:

kubectl edit svc/traefik

No arquivo aberto, encontre o segmento ports e adicione as linhas abaixo:

  ports:
........
  - name: traefik
    port: 9000
    protocol: TCP
    targetPort: traefik
......

Salve o arquivo e verifique se as alterações foram feitas:

# kubectl get svc
NAME         TYPE           CLUSTER-IP      EXTERNAL-IP      PORT(S)                                                       AGE
kubernetes   ClusterIP      10.96.0.1       <none>           443/TCP                                                       9m16s
traefik   LoadBalancer   10.106.13.208   192.168.205.40   80:30504/TCP,443:30232/TCP,9000:31827/TCP   13m

Agora prossiga e acesse o Traefik Dashboard usando a URL http://domain_name:9000/dashboard/ (não esqueça de incluir a barra no final da URL)

Etapa 5 – Teste o Traefik Ingress no Kubernetes

Para testar se o Controlador Traefik Ingress no k0s está funcionando conforme desejado, criaremos uma aplicação simples conforme abaixo;

vim whoami.yaml

Adicione as linhas abaixo ao arquivo:

---
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: whoami
  name: whoami
spec:
  replicas: 1
  selector:
    matchLabels:
      app: whoami
  template:
    metadata:
      labels:
        app: whoami
    spec:
      containers:
        - image: traefik/whoami:latest
          name: whoami
          ports:
            - containerPort: 80

Aplique o manifesto:

kubectl create -f whoami.yaml

Crie um serviço do tipo ClusterIP para o aplicativo

vim service.yaml

Adicione as linhas abaixo:

---
apiVersion: v1
kind: Service
metadata:
  name: whoami-svc
spec:
  type: ClusterIP
  selector:
    app: whoami
  ports:
    - port: 80

Crie o serviço:

kubectl create -f service.yaml

Verifique a criação:

# kubectl describe svc whoami
Name:              whoami-svc
Namespace:         default
Labels:            <none>
Annotations:       <none>
Selector:          app=whoami
Type:              ClusterIP
IP Family Policy:  SingleStack
IP Families:       IPv4
IP:                10.102.149.75
IPs:               10.102.149.75
Port:              <unset>  80/TCP
TargetPort:        80/TCP
Endpoints:         10.244.1.5:80
Session Affinity:  None
Events:            <none>

Agora, esse aplicativo ainda não estará acessível até que você crie um Ingress para expor o serviço.

vim app-ingress.yaml

Adicione as linhas abaixo e substitua host pelo nome de domínio adicionado em /etc/hosts para o endereço IP externo:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: whoami-http
  annotations:
    traefik.ingress.kubernetes.io/router.entrypoints: web
spec:
  rules:
    - host: traefik.computingforgeeks.com
      http:
        paths:
          - path: /whoami
            pathType: Prefix
            backend:
              service:
                name: whoami-svc
                port:
                  number: 80

Aplique o ingresso:

kubectl apply -f app-ingress.yaml

Visualize o Ingress criado:

# kubectl get Ingress
NAME          CLASS    HOSTS                           ADDRESS   PORTS   AGE
whoami-http   <none>   traefik.computingforgeeks.com             80      9s

Agora acesse a implantação usando a URL http://domain_name/whoami

É isso!

Considerações finais

Isso marca o fim deste guia sobre como instalar e configurar o Traefik Ingress Controller em k0s. O conhecimento aqui adquirido pode ser utilizado para configurar serviços Kubernetes e acessá-los remotamente por meio de um nome de domínio. Espero que isso tenha sido de grande significado para você.

Ver mais:

  • Implante o controlador Nginx Ingress no Kubernetes usando Helm Chart
  • Use certificados Let's Encrypt SSL em entradas/rotas do OpenShift 4.x
  • Instale MicroK8s Kubernetes no Rocky Linux 9/AlmaLinux 9

Artigos relacionados: