Перейти к содержанию

Установка своего сертификата на ingress

Как заменить дефолтный сертификат в ранчере на свой.

Предварительная подготовка

Вам понадобится:

  • Админский kubeconfig инфраструктурного кластера (не из ранчера, а именно админский)
  • Админский kubeconfig всех подчинённых кластеров (не из ранчера, а именно админский)
  • Предварительно сгенерированные сертификат, ключ, CA сертификат
  • Настроенный kubectl
  • Утилита jq
  • При выписывании сертификата указать доменное имя ранчера в CN и SAN.

Заметка

Все действия выполняйте, используя админский kubeconfig, так как в момент обновления ранчер может быть недоступен.

Обновление сертификатов rancher

Перейдите в директорию с сертификатами и переименуйте файлы:

  • Сертификат - tls.crt

  • Закрытый ключ - tls.key

  • CA - cacerts.pem

Обновите секрет с сертификатом

kubectl -n cattle-system create secret tls tls-rancher-ingress \
  --cert=tls.crt \
  --key=tls.key \
  --dry-run --save-config -o yaml | kubectl apply -f -

Обновите секрет с CA

kubectl -n cattle-system create secret generic tls-ca \
  --from-file=cacerts.pem \
  --dry-run --save-config -o yaml | kubectl apply -f -

После этого остановите rancher

kubectl -n cattle-system scale deployment --replicas 0 rancher

Обновите HCP

kubectl edit hcp rancher

Нас интересует блок .spec.valuesTemplate

apiVersion: addons.cluster.x-k8s.io/v1alpha1
kind: HelmChartProxy
metadata:
  creationTimestamp: '2023-10-15T17:07:27Z'
  finalizers:
    - helmchartproxy.addons.cluster.x-k8s.io
  generation: 2
  name: rancher
  namespace: default
  resourceVersion: '15078092'
  uid: 84592d05-af4b-46bc-a28c-7eb08bc2f707
spec:
  chartName: rancher
  clusterSelector:
    matchLabels:
      cluster.x-k8s.io/cluster-name: test
  namespace: cattle-system
  options:
    install:
      createNamespace: true
    timeout: 5m0s
    wait: true
  releaseName: rancher
  repoURL: http://museum.default.svc.cluster.local:8080
  valuesTemplate: |
    rancherImage: harbor.bootsman.host/bootsman-nimbus/common-artifacts/rancher
    rancherImageTag: v2.7.5-bootsman-11
    bootstrapPassword: demo
    hostname: rancher.kobik.dev.stsoft.lan
    auditLog:
      image:
        repository: harbor.bootsman.host/bootsman-nimbus/common-artifacts/mirrored-bci-micro
    postDelete:
      image:
        repository: harbor.bootsman.host/bootsman-nimbus/common-artifacts/shell
    ingress:
      tls:
        source: rancher
    replicas: 1
    extraEnv:
    - name: CATTLE_FEATURES
      value: embedded-cluster-api=false
    - name: CATTLE_AGENT_IMAGE
      value: harbor.bootsman.host/bootsman-nimbus/common-artifacts/rancher-agent:v2.7.5-bootsman-11
    - name: CATTLE_SHELL_IMAGE
      value: "harbor.bootsman.host/bootsman-nimbus/common-artifacts/shell:v0.1.21.1-bootsman"
    - name: CATTLE_FLEET_REPO
      value: "harbor.bootsman.host/bootsman-nimbus/common-artifacts/fleet"
    - name: CATTLE_FLEET_AGENT_REPO
      value: "harbor.bootsman.host/bootsman-nimbus/common-artifacts/fleet-agent"
    - name: CATTLE_GITJOB_REPO
      value: "harbor.bootsman.host/bootsman-nimbus/common-artifacts/gitjob"
    - name: CATTLE_WEBHOOK_REPO
      value: "harbor.bootsman.host/bootsman-nimbus/common-artifacts/rancher-webhook"
  version: 2.7.5

Замените .ingres.tls.source на secret

и добавьте новый элемент .privateCA с значением true.

Пример исправленного блока valuesTemplate

  valuesTemplate: |
    rancherImage: harbor.bootsman.host/bootsman-nimbus/common-artifacts/rancher
    rancherImageTag: v2.7.5-bootsman-11
    bootstrapPassword: demo
    hostname: rancher.kobik.dev.stsoft.lan
    auditLog:
      image:
        repository: harbor.bootsman.host/bootsman-nimbus/common-artifacts/mirrored-bci-micro
    postDelete:
      image:
        repository: harbor.bootsman.host/bootsman-nimbus/common-artifacts/shell
    ingress:
      tls:
        source: secret 
    replicas: 1
    privateCA: true
    extraEnv:
    - name: CATTLE_FEATURES
      value: embedded-cluster-api=false
    - name: CATTLE_AGENT_IMAGE
      value: harbor.bootsman.host/bootsman-nimbus/common-artifacts/rancher-agent:v2.7.5-bootsman-11
    - name: CATTLE_SHELL_IMAGE
      value: "harbor.bootsman.host/bootsman-nimbus/common-artifacts/shell:v0.1.21.1-bootsman"
    - name: CATTLE_FLEET_REPO
      value: "harbor.bootsman.host/bootsman-nimbus/common-artifacts/fleet"
    - name: CATTLE_FLEET_AGENT_REPO
      value: "harbor.bootsman.host/bootsman-nimbus/common-artifacts/fleet-agent"
    - name: CATTLE_GITJOB_REPO
      value: "harbor.bootsman.host/bootsman-nimbus/common-artifacts/gitjob"
    - name: CATTLE_WEBHOOK_REPO
      value: "harbor.bootsman.host/bootsman-nimbus/common-artifacts/rancher-webhook"

После этого запустите rancher

kubectl -n cattle-system scale deployment --replicas 1 rancher
Далее ждите запуска, процесс может занять до 5 минут.

Обновление сертификатов в подчинённых кластерах

Nota bene

Действия из этого раздела повторите для всех подчинённых кластеров

После обновления сертификатов rancher подчинённые кластеры отключатся от него.

Поправьте параметр, отвечающий за CA в каждом кластере вручную.

Выполните команду для получения нужного значения:

curl -k -s -fL <RANCHER_SERVER_URL>/v3/settings/cacerts | jq -r .value | sha256sum | awk '{print $1}'
Где RANCHER_SERVER_URL замените на ваш адрес rancher.

Сохраните полученную строку.

Дальнейшие инструкции повторите для каждого подчинённого кластера.

Выполните команду проверки, чтобы проверить, что kubectl смотрит на правильный кластер

kubectl cluster-info

Выполните команду после того, как убедитесь в результате команды выше

kubectl edit -n cattle-system deployment/cattle-cluster-agent
Поменяйте параметр CATTLE_CA_CHECKSUM

Подставьте ему в value строку, полученную ранее с помощью curl.

Немного подождите, и кластер вновь станет доступным в web-панели rancher.

Обновление сертификата в Nginx Ingress

Распространение сертификата

Создайте секрет, содержащий в себе сертификат и ключ. Например, с помощью kubectl

kubectl create secret tls default-cert --key /home/nulled06/tls/key.key --cert /home/nulled06/tls/cert.crt -n nginx-ingress
где

default-cert - имя секрета

--key - путь до закрытого ключа

--cert - путь до сертификата

nginx-ingress - имя NS

Эти действия повторите для всех кластеров - как инфраструктурных, так и подчинённых.

Замена сертификата в конфигурации

Замену конфигурации можно выполнить как с помощью kubectl, так и через web.

Все действия производите в инфраструктурном (мастер) кластере.

Замена стандартного секрета kubectl edit hcp ingress-nginx Откроется текстовый редактор с содержанием:

apiVersion: addons.cluster.x-k8s.io/v1alpha1
kind: HelmChartProxy
metadata:
  creationTimestamp: "2023-10-15T17:06:17Z"
  finalizers:
  - helmchartproxy.addons.cluster.x-k8s.io
  generation: 2
  name: ingress-nginx
  namespace: default
  resourceVersion: "17626209"
  uid: a8ed7eae-d05a-4f69-a042-0cc2de8b195d
spec:
  chartName: ingress-nginx
  clusterSelector:
    matchLabels:
      cluster.x-k8s.io/cluster-name: test
  namespace: nginx-ingress
  options:
    install:
      createNamespace: true
    timeout: 5m0s
    wait: true
  releaseName: ingress-nginx
  repoURL: http://museum.default.svc.cluster.local:8080
  valuesTemplate: |
    controller:
      opentelemetry:
        image: harbor.bootsman.host/bootsman-nimbus/common-artifacts/ingress-nginx-opentelemetry:v20230527
      image:
        registry: harbor.bootsman.host/bootsman-nimbus/common-artifacts
        image: ingress-nginx-controller
        digest: ""
      admissionWebhooks:
        patch:
          image:
            registry: harbor.bootsman.host/bootsman-nimbus/common-artifacts
            image: kube-webhook-certgen
            digest: ""
      kind: DaemonSet
      hostPort:
        enabled: true
        ports:
          http: 80
          https: 443
      ingressClassResource:
        default: true
      publishService:
        enabled: true
      service:
        type: ClusterIP
      watchIngressWithoutClass: true
    defaultBackend:
      image:
        registry: harbor.bootsman.host/bootsman-nimbus/common-artifacts
      enabled: true
    rbac:
      create: true
  version: 4.7.1

Нас интересует поле controller, приведите его к следующему виду:

apiVersion: addons.cluster.x-k8s.io/v1alpha1
kind: HelmChartProxy
metadata:
  creationTimestamp: "2023-10-15T17:06:17Z"
  finalizers:
  - helmchartproxy.addons.cluster.x-k8s.io
  generation: 2
  name: ingress-nginx
  namespace: default
  resourceVersion: "17626209"
  uid: a8ed7eae-d05a-4f69-a042-0cc2de8b195d
spec:
  chartName: ingress-nginx
  clusterSelector:
    matchLabels:
      cluster.x-k8s.io/cluster-name: test
  namespace: nginx-ingress
  options:
    install:
      createNamespace: true
    timeout: 5m0s
    wait: true
  releaseName: ingress-nginx
  repoURL: http://museum.default.svc.cluster.local:8080
  valuesTemplate: |
    controller:
      extraArgs:
        default-ssl-certificate: nginx-ingress/default-cert
      opentelemetry:
        image: harbor.bootsman.host/bootsman-nimbus/common-artifacts/ingress-nginx-opentelemetry:v20230527
      image:
        registry: harbor.bootsman.host/bootsman-nimbus/common-artifacts
        image: ingress-nginx-controller
        digest: ""
      admissionWebhooks:
        patch:
          image:
            registry: harbor.bootsman.host/bootsman-nimbus/common-artifacts
            image: kube-webhook-certgen
            digest: ""
      kind: DaemonSet
      hostPort:
        enabled: true
        ports:
          http: 80
          https: 443
      ingressClassResource:
        default: true
      publishService:
        enabled: true
      service:
        type: ClusterIP
      watchIngressWithoutClass: true
    defaultBackend:
      image:
        registry: harbor.bootsman.host/bootsman-nimbus/common-artifacts
      enabled: true
    rbac:
      create: true
  version: 4.7.1

В блок controller добавьте extraArgs, и в него добавьте default-ssl-certificate: nginx-ingress/default-cert

После успешного изменения ресурса Ingress контроллер перезапустится. На небольшой промежуток времени вы потеряете доступ к rancher.