Não é segredo que o K8S tem uma excelente comunidade e geralmente boa documentação. Nele você pode encontrar facilmente a resposta para muitas perguntas. Mas, como qualquer outra documentação, ela não pode cobrir absolutamente tudo. Neste artigo, tentarei fornecer instruções detalhadas sobre como implantar e configurar o Traefik para usar como um controlador do Ingress.

O que é o Ingress?
O ingresso é um objeto de API que controla o acesso externo aos serviços em um cluster, principalmente por meio de HTTP / HTTPS. Para que o recurso do Ingress funcione, você precisa de um controlador do Ingress. Se você usa o GCE, o controlador do Ingress já está implantado no assistente. No entanto, se você mesmo fez o download do cluster, por exemplo, do kops
para a AWS, precisará implantar o controlador do Ingress. No minikube, isso é resolvido incluindo o suplemento do Ingress.
Controladores de ingresso
A função do controlador Ingress pode ser desempenhada pelo NGINX Ingress Controller, Kong, Octavia Ingress Controller, etc. Neste artigo, consideraremos uma ferramenta como o Traefik e veremos como você pode usá-lo como um controlador Ingress para serviços em um cluster.
Porque
Por que usar um controlador Ingress se você pode fornecer acesso a cada serviço através do NodePort
ou LoadBalancer
? Em resumo, isso permite um ponto central para proxy de todo o tráfego. Ou seja, usando o controlador Ingress, você precisa apenas de um LoadBalancer para Traefik e nada mais. Este pacote resolverá todo o tráfego.
Componentes Traefik
O Traefik anunciou suporte ao Kubernetes Ingress na versão 1.4. No entanto, o Traefik 1.7, lançado recentemente, possui a opção publishService publishedService,
que pode atualizar o campo de status
no Ingress, que não estava nas versões anteriores. A seguir, é apresentada uma lista de componentes que serão necessários para operar.
Criar:
- namespace
- conta de serviço
- Segredo TLS
- função de cluster
- ligação de função de cluster
- configmap
- implantação
- serviço para http e https
- serviço para o painel Traefik
- Ingress
Namespace
Crie um espaço para nome:
kubectl create namespace traefik
TLS Secret
(aprox. por. - no exemplo abaixo, por algum motivo o autor duplica a mesma configuração, consulte a configuração atual no arquivo README fornecido pelo link abaixo)
Primeiro, crie um certificado:
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout ./tls.key -out ./tls.crt -subj "/CN=*.example.com"
Crie um certificado TLS:
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout ./tls.key -out ./tls.crt -subj "/CN=*.example.com"
Criar segredo:
kubectl create secret tls traefik-ui-tls-cert --key ./tls.key --cert ./tls.crt
Por conveniência, criei um arquivo README com esses comandos e enviei-o para o meu GitHub .
ConfigMap
--- apiVersion: v1 kind: ConfigMap metadata: name: traefik-configmap namespace: traefik data: traefik.toml: | defaultEntryPoints = ["http","https"] [entryPoints] [entryPoints.http] address = ":80" [entryPoints.https] address = ":443" [entryPoints.https.tls] [[entryPoints.https.tls.certificates]] CertFile = "/ssl/tls.crt" KeyFile = "/ssl/tls.key" [entryPoints.traefik] address = ":8080" [entryPoints.traefik.auth.basic] users = ["admin:$apr1$zjjGWKW4$W2JIcu4m26WzOzzESDF0W/"] [kubernetes] [kubernetes.ingressEndpoint] publishedService = "traefik/traefik" [ping] entryPoint = "http" [api] entryPoint = "traefik"
Por padrão, os EntryPoints são as portas 80
e 443
.
O http
EntryPoint escuta :80
e não possui regras adicionais
O EntryPoint https
atende :443
e contém uma regra para conectar certificados TLS.
O traefik
EntryPoint escuta :8080
e usa autenticação básica. Nome de usuário é admin
, senha é admin
.
A definição do nó de extremidade correspondente Ingress no Kubernetes é feita especificando publishService
e deve consistir no valor do namespace
e no nome do service
para o Traefik. Nesse caso, é traefik / traefik
.
ping
ou verificação de saúde usarão o entryPoint http
.
api
ou dashboard / ui usará o entryPoint traefik
.
Observe que você pode definir entryPoints adicionais com uma porta. Essa porta pode proxy de tráfego para qualquer porta, em vez de portas dinâmicas e NodePort
.
Função de cluster
A conta de serviço do Traefik deve ter permissão para atualizar o campo de Ingress status
do Ingress status
. Este é um parâmetro importante e ainda não foi apresentado na documentação oficial do Traefik :
--- kind: ClusterRole apiVersion: rbac.authorization.k8s.io/v1beta1 metadata: name: traefik-ingress-controller rules: - apiGroups: - "" resources: - services - endpoints - secrets verbs: - get - list - watch - apiGroups: - extensions resources: - ingresses verbs: - get - list - watch - apiGroups: - extensions resources: - ingresses/status verbs: - update
As últimas 6 linhas são muito importantes para a operação correta.
Implantação
A implantação é bem simples. Vamos percorrer brevemente os principais blocos:
volumes: - name: traefik-ui-tls-cert secret: secretName: traefik-ui-tls-cert - name: traefik-configmap configMap: name: traefik-configmap
Defina os volumes
para o ConfigMap e o Secret, que poderão ser usados no volumeMounts
.
volumeMounts: - mountPath: "/ssl" name: "traefik-ui-tls-cert" - mountPath: "/config" name: "traefik-configmap"
As verificações de integridade são realizadas na porta 80, conforme definido no ConfigMap.
Abra portas para todos os entryPoints especificados no arquivo de configuração:
ports: - name: http containerPort: 80 - name: https containerPort: 443 - name: dashboard containerPort: 8080
Lembro que alguns exemplos e documentação na Internet estão desatualizados, portanto, não perca a seção args
necessária para o Traefik funcionar:
args: - --logLevel=INFO - --configfile=/config/traefik.toml
Não passe sinalizadores e argumentos adicionais, como -api, -ping ou -kubernetes, porque isso substituirá as configurações especificadas no arquivo de configuração.
Serviço
O primeiro dos serviços define um Loadbalancer para entryPoints http
e https
. Se você olhar para o Grupo de Segurança (Ingress) para o LoadBalancer, verá as portas 80 e 443 abertas lá.O K8s criará um LoadBalancer e o conectará aos nós nos quais o Traefik é executado. Se você deseja criar um ELB interno, como eu, precisa definir anotações:
--- kind: Service apiVersion: v1 metadata: name: traefik namespace: traefik annotations: # service.beta.kubernetes.io/aws-load-balancer-internal: 0.0.0.0/0 spec: selector: k8s-app: traefik-ingress ports: - protocol: TCP port: 80 name: http - protocol: TCP port: 443 name: https type: LoadBalancer
Serviço (para Painel)
Agora a parte divertida! Como o Dashboard usa autenticação básica, eu precisava de https
. Para usar o SSL, precisamos redirecionar o tráfego para a porta :8080
, na qual o Dashboard funciona. Como você pode ver, é muito simples. Toda mágica acontece no Ingress.
--- kind: Service apiVersion: v1 metadata: name: traefik-dashboard namespace: traefik spec: selector: k8s-app: traefik-ingress ports: - port: 8080 name: dashboard
Ingress (para painel)
A mágica é que o proxy do tráfego seguro para o Dashboard é feito através do próprio Traefik. O gerenciamento do Traefik no Ingress é feito usando as anotações do Traefik :
--- apiVersion: extensions/v1beta1 kind: Ingress metadata: name: traefik-dashboard-ingress namespace: traefik annotations: kubernetes.io/ingress.class: traefik traefik.ingress.kubernetes.io/frontend-entry-points: http,https traefik.ingress.kubernetes.io/redirect-entry-point: https traefik.ingress.kubernetes.io/redirect-permanent: "true" spec: rules: - host: traefik-ui.example.com http: paths: - path: / backend: serviceName: traefik-dashboard servicePort: 8080
Foram necessárias apenas quatro anotações simples e claras.
Obviamente, para garantir a funcionalidade completa, você precisa criar um registro DNS traefik-ui.example.com
, que apontará para o seu ELB.
Seria bom se isso fosse feito automaticamente? Não há problema, vou escrever sobre a criação automática de registros DNS no próximo artigo.
Referências
O arquivo deployment.yaml finalizado pode ser baixado do meu repositório Github . Se você tiver alguma dificuldade durante o processo de instalação, não hesite em perguntar.
Separando palavras do tradutor
Leia outros artigos em nosso blog:
Backups com estado em Kubernetes
Fazendo backup de um grande número de projetos da web heterogêneos
Bot de telegrama para Redmine. Como simplificar a vida para si e para as pessoas