Установка своего сертификата на 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
Обновление сертификатов в подчинённых кластерах
Nota bene
Действия из этого раздела повторите для всех подчинённых кластеров
После обновления сертификатов rancher подчинённые кластеры отключатся от него.
Поправьте параметр, отвечающий за CA в каждом кластере вручную.
Для начала получите нужное значение:
curl -k -s -fL <RANCHER_SERVER_URL>/v3/settings/cacerts | jq -r .value | sha256sum | awk '{print $1}'
Сохраните полученную строку.
Дальнейшие инструкции повторите для каждого подчинённого кластера.
Проверьте, что kubectl смотрит на правильный кластер
kubectl cluster-info
kubectl edit -n cattle-system deployment/cattle-cluster-agent
Подставьте ему в 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.