AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / server / Perguntas / 1159948
Accepted
Lasse Michael Mølgaard
Lasse Michael Mølgaard
Asked: 2024-05-26 11:27:05 +0800 CST2024-05-26 11:27:05 +0800 CST 2024-05-26 11:27:05 +0800 CST

Como fazer o ingress-nginx usar o certificado fornecido ao usuário?

  • 772

Estou instalando Home Assistantem meu cluster K3S Kubernetes por meio do Ansible e quero usar um certificado Let's Encrypt para minha entrada que foi gerada pela Cert-Managerexecução em meu cluster.

Estou usando o seguinte manual ao instalar o Home Assistant:

---
- name: Create HomeAssistant namespace
  kubernetes.core.k8s:
    state: present
    definition:
      apiVersion: v1
      kind: Namespace
      metadata:
        name: home-system

- name: Generate certificate for HomeAssistant
  kubernetes.core.k8s:
    state: present
    definition:
      apiVersion: cert-manager.io/v1
      kind: Certificate
      metadata:
        name: homeassistant-tls
        namespace: home-system
      spec:
        secretName: homeassistant-tls-secret
        commonName: "homeassistant.example.com" 
        dnsNames:
        - "homeassistant.example.com"
        issuerRef:
          name: letsencrypt-staging
          kind: ClusterIssuer

- name: Get TLS certificate secret
  kubernetes.core.k8s_info:
    api_version: v1
    name: homeassistant-tls-secret
    kind: Secret
    namespace: home-system
  register: tls_secret
  
- name: Create ConfigMap for HomeAssistant
  kubernetes.core.k8s:
    state: present
    definition:
      apiVersion: v1
      kind: ConfigMap
      metadata:
        name: home-config
        namespace: home-system

      data:
        fullchain.pem: "{{ tls_secret.resources[0].data['tls.crt'] | b64decode }}"

        privkey.pem: "{{ tls_secret.resources[0].data['tls.key'] | b64decode }}"

        groups.yaml: |-

        scripts.yaml: |-

        scenes.yaml: |-

        known_devices.yaml: |- 
    
        automations.yaml: |-

        configuration.yaml: |-

          # Loads Default configuration - DO NOT REMOVE
          default_config:

          # Load frontend themes from the themes folder
          frontend:
            themes: !include_dir_merge_named themes
          
          # Text-to-speech
          tts:
            - platform: google_translate
          
          group: !include groups.yaml
          automation: !include automations.yaml
          script: !include scripts.yaml
          scene: !include scenes.yaml

          http:
            use_x_forwarded_for: true

            trusted_proxies:
            - 127.0.0.1
            - 10.42.0.0/16
            - 10.43.0.0/16
            - 192.168.0.0/24

            ssl_certificate: /ssl/fullchain.pem
            ssl_key: /ssl/privkey.pem

- name: Define storage space for HomeAssistant
  kubernetes.core.k8s:
    state: present
    definition:
      apiVersion: v1
      kind: PersistentVolumeClaim
      metadata:
        name: homeassist-pvc
        namespace: home-system
      spec:
        accessModes:
          - ReadWriteOnce
        storageClassName: small-longhorn # Store data on only 2 nodes instead of 3
        resources:
          requests:
            storage: 5Gi

- name: Add HomeAssistant StatefulSet
  kubernetes.core.k8s:
    state: present
    definition:
      apiVersion: apps/v1
      kind: StatefulSet
      metadata:
        name: homeassistant
        namespace: home-system
        labels:
          app: homeassistant
      spec:
        serviceName: home-svc
        replicas: 1
        selector:
          matchLabels:
            app: homeassistant
        template:
          metadata:
            labels:
              app: homeassistant
          spec:
            volumes:
            - name: home-config-vol
              persistentVolumeClaim:
                claimName: homeassist-pvc

            - name: home-config-file
              configMap:
                name: home-config

            containers:
            - name: homeassistant
              image: lscr.io/linuxserver/homeassistant:latest
              ports:
                - containerPort: 8123
              volumeMounts:
              - name: home-config-vol
                mountPath: /config

              - name: home-config-file
                mountPath: /config/configuration.yaml
                subPath: configuration.yaml
                
              - name: home-config-file
                mountPath: /config/automations.yaml
                subPath: automations.yaml

              - name: home-config-file
                mountPath: /config/scripts.yaml
                subPath: scripts.yaml

              - name: home-config-file
                mountPath: /config/scenes.yaml
                subPath: scenes.yaml

              - name: home-config-file
                mountPath: /config/groups.yaml
                subPath: groups.yaml

              - name: home-config-file
                mountPath: /ssl/fullchain.pem
                subPath: fullchain.pem

              - name: home-config-file
                mountPath: /ssl/privkey.pem
                subPath: privkey.pem

              env:
                - name: PUID
                  value: "1000"
                - name: PGID
                  value: "1000"
                - name: TZ
                  value: "Etc/UTC"

            securityContext:
              capabilities:
                add:
                - NET_ADMIN
                - NET_RAW
                - SYS_ADMIN

              priviledged: true

- name: Define HomeAssistant service ports
  kubernetes.core.k8s:
    state: present
    definition:
      apiVersion: v1
      kind: Service
      metadata:
        name: home-svc
        namespace: home-system
        annotations: 
          metallb.universe.tf/address-pool: default-pool
      spec:
        type: LoadBalancer
        externalTrafficPolicy: Local
        selector:
          app: homeassistant
        ports:
          - name: "8123"
            port: 8123
            targetPort: 8123

- name: Add HomeAssistant ingress
  kubernetes.core.k8s:
    state: present
    definition:
      apiVersion: networking.k8s.io/v1
      kind: Ingress
      metadata:
        name: homeassistant
        namespace: home-system

        annotations:
          kubernetes.io/ingress.class: nginx
          cert-manager.io/cluster-issuer: letsencrypt-staging
          nginx.ingress.kubernetes.io/backend-protocol: HTTPS
          nginx.ingress.kubernetes.io/ssl-redirect: "true"
          nginx.ingress.kubernetes.io/force-ssl-redirect: "true"

      spec:
        ingressClassName: nginx
        tls:
        - hosts:
          - homeassistant.example.com
          secretName: homeassistant-tls

        rules:
        - host: 'homeassistant.example.com'
          http:
            paths:
            -  path: /
               pathType: Prefix
               backend:
                service:
                  name: home-svc
                  port:
                    number: 8123

Substituí o real FQDNpor um nome pertencente a example.com. :-)

Alguns pontos-chave:

O Home Assistant suporta criptografia TLS.

Meu primeiro trabalho é, portanto, criar um certificado Let's Encrypt, que estou nomeando homeassistant-tls. Possui o segredo associado homeassistant-tls-secret.

O próximo passo é extrair o certificado e a chave do segredo homeassistant-tls-secrete usá-los para criar os arquivos fullchain.peme privkey.pemno ConfigMap home-config.

Os arquivos contêm o certificado e a chave decodificados em base64.

Os arquivos de certificado e chave são então armazenados na /sslpasta dentro do contêiner, o que leva de volta ao último arquivo importante definido no ConfigMap: configuration.yaml.

Para habilitar a criptografia TLS, precisamos adicionar as seguintes linhas à httpseção de configuration.yaml:

  ssl_certificate: /ssl/fullchain.pem
  ssl_key: /ssl/privkey.pem

Tentei chamar os arquivos tls.crte tls.key, mas aparentemente o Home Assistant não gostou. :-)

Tudo o que sei com certeza é que os arquivos devem ser codificados em PEM.

Depois de executar o manual, recebo a seguinte saída:

root@central:~# kubectl get svc -n home-system
NAME       TYPE           CLUSTER-IP     EXTERNAL-IP     PORT(S)          AGE
home-svc   LoadBalancer   10.43.23.186   192.168.0.203   8123:30630/TCP   81m

root@central:~# kubectl get ingress -n home-system
NAME            CLASS   HOSTS                       ADDRESS         PORTS     AGE
homeassistant   nginx   homeassistant.example.com   192.168.0.200   80, 443   85m

O site está funcionando quando digito o endereço: https://192.168.0.203:8123/ou https://homeassistant.example.comno navegador.

No entanto, quando inspeciono os certificados associados, recebo o seguinte:

  • https://192.168.0.203:803(LoadBalancer) aponta para o certificado Let's Encrypt, que pelo que sei é porque defini os certificados na /sslpasta.
  • https://homeassistant.example.com(Ingress) aponta para um certificado de cluster Kubernetes genérico.

Então, como faço para Ingressusar o certificado correto? :-)

Alterar secretNamepara homeassist-tls-secret não funciona com certeza. :-)

kubernetes
  • 2 2 respostas
  • 42 Views

2 respostas

  • Voted
  1. Best Answer
    Sai Chandini Routhu
    2024-05-26T15:21:42+08:002024-05-26T15:21:42+08:00

    O problema que você está enfrentando é que o controlador de ingresso nem sempre capta o nome do jogo que contém seus certificados Let's Encrypt para homeassistant.example.com .

    Para resolver seu problema:

    Em vez de especificar o secretName para sua entrada aparecer, utilize anotações para fazer referência ao segredo TLS e ao emissor do cluster;

    annotations:
    
    
                  certmanager.K8s.Io/provider: letsencrypt-staging
                  nginx.Ingress.Kubernetes.Io/ssl-secret:homeassistant-tls-secret
    

    Depois de atualizar o ingresso com anotações, é recomendável reiniciar o pod do controlador nginx-ingress para selecionar as alterações

    Ao usar anotações, você fornece maior contexto ao controlador de entrada. Ele pode aproveitar o emissor do cluster para validar os certificados e usar o segredo referenciado homeassistant-tls-secret para atender visitantes seguros em homeassistant.example.Com

    Os padrões e etapas de configuração associados ao uso de ingress-nginx com certificados Lets Encrypt por meio de anotações são normalmente os mesmos para k8s e k3s.

    Para mais informações, consulte este blog Medium de Ivan Khramov

    • 1
  2. Lasse Michael Mølgaard
    2024-05-26T17:26:58+08:002024-05-26T17:26:58+08:00

    Uma rápida reformatação e explicação do meu comentário à resposta de Sai Chandini Routhu:

    O Medium Blog de Ivan Khramov estava quase certo sobre o que estava acontecendo, embora sua implementação não fosse compatível com meu cluster, mas considerando que sua postagem no blog tem 6 anos , atribuirei isso ao Kubernetes que fez algumas renomeações enquanto isso.

    Como afirmado no meu comentário, não há nenhuma anotação nomeada nginx.ingress.kubernetes.io/ssl-secret.

    A correspondência mais próxima é nginx.ingress.kubernetes.io/proxy-ssl-secret: secretName , mas mesmo isso não funcionou durante os experimentos.

    O que descobri que funcionou é que, se eu renomear secretNameminha configuração de entrada de homeassistant-tlsaté homeassistant-ingress-tlsentão, obterei o resultado que desejo.

    Para referência, consulte a configuração abaixo que está funcionando conforme o esperado:

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: homeassistant
      namespace: home-system
    
      annotations:
        kubernetes.io/ingress.class: nginx
        kubernetes.io/tls-acme: "true"
        cert-manager.io/cluster-issuer: letsencrypt-staging
        nginx.ingress.kubernetes.io/ssl-redirect: "true"
        nginx.ingress.kubernetes.io/backend-protocol: HTTPS
        nginx.ingress.kubernetes.io/force-ssl-redirect: "true"
    
    spec:
      ingressClassName: nginx
      tls:
      - hosts:
        - homeassistant.example.com
        secretName: homeassistant-ingress-tls
      rules:
      - host: 'homeassistant.example.com'
        http:
          paths:
          -  path: /
              pathType: Prefix
              backend:
              service:
                name: home-svc
                port:
                  number: 8123
    

    A razão pela qual está funcionando é porque o ingresso está chamando cert-managerpara criar um novo certificado que é essencialmente uma cópia do certificado instalado no contêiner.

    (Não verifiquei se o código hash em ambos os certificados é o mesmo).

    Depois fico com dois certificados como pode ser visto aqui:

    root@central:~# kubectl get certs -n home-system
    NAME                        READY   SECRET                      AGE
    homeassistant-tls           True    homeassistant-tls-secret    10h
    homeassistant-ingress-tls   True    homeassistant-ingress-tls   42m
    

    (Acho que deveria renomear minha definição de homeassistant-tls). :-)

    Isso faz com que meu navegador sempre veja o certificado Let's Encrypt, não importa se eu chamo o site através do endereço IP e, assim, acessando meu Load Balancerou via DNS e acessando o arquivo Ingress.

    Eu estou feliz agora. :-)

    • 0

relate perguntas

  • Containerd falhou ao iniciar após Nvidia Config

  • Como posso modificar o configmap CoreDNS antes de inicializar o cluster usando o kubeadm?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Você pode passar usuário/passar para autenticação básica HTTP em parâmetros de URL?

    • 5 respostas
  • Marko Smith

    Ping uma porta específica

    • 18 respostas
  • Marko Smith

    Verifique se a porta está aberta ou fechada em um servidor Linux?

    • 7 respostas
  • Marko Smith

    Como automatizar o login SSH com senha?

    • 10 respostas
  • Marko Smith

    Como posso dizer ao Git para Windows onde encontrar minha chave RSA privada?

    • 30 respostas
  • Marko Smith

    Qual é o nome de usuário/senha de superusuário padrão para postgres após uma nova instalação?

    • 5 respostas
  • Marko Smith

    Qual porta o SFTP usa?

    • 6 respostas
  • Marko Smith

    Linha de comando para listar usuários em um grupo do Windows Active Directory?

    • 9 respostas
  • Marko Smith

    O que é um arquivo Pem e como ele difere de outros formatos de arquivo de chave gerada pelo OpenSSL?

    • 3 respostas
  • Marko Smith

    Como determinar se uma variável bash está vazia?

    • 15 respostas
  • Martin Hope
    Davie Ping uma porta específica 2009-10-09 01:57:50 +0800 CST
  • Martin Hope
    kernel O scp pode copiar diretórios recursivamente? 2011-04-29 20:24:45 +0800 CST
  • Martin Hope
    Robert ssh retorna "Proprietário incorreto ou permissões em ~/.ssh/config" 2011-03-30 10:15:48 +0800 CST
  • Martin Hope
    Eonil Como automatizar o login SSH com senha? 2011-03-02 03:07:12 +0800 CST
  • Martin Hope
    gunwin Como lidar com um servidor comprometido? 2011-01-03 13:31:27 +0800 CST
  • Martin Hope
    Tom Feiner Como posso classificar a saída du -h por tamanho 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich O que é um arquivo Pem e como ele difere de outros formatos de arquivo de chave gerada pelo OpenSSL? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent Como determinar se uma variável bash está vazia? 2009-05-13 09:54:48 +0800 CST

Hot tag

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve