Traefik como um controlador de ingresso para K8S

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.


imagem


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

Source: https://habr.com/ru/post/pt427655/


All Articles