сертификат с подписью k8s, которому не доверяют в pod

#ssl #kubernetes #ssl-certificate #x509

#ssl #kubernetes #ssl-сертификат #x509

Вопрос:

Я пытаюсь отсортировать сертификаты для приложений, развернутых в кластере k8s (работает на docker-for-win, WSL2 в Windows 10 20H2).

Я хотел бы использовать DNS для подключения к службам, например registry.default.svc.cluster.local , которые, как я проверил, доступны. Я создал сертификат, выполнив следующие действия:

  1. Создайте openssl.conf с содержимым
 [ req ]
default_bits = 2048
prompt = no
encrypt_key = no
distinguished_name = req_dn
req_extensions = req_ext

[ req_dn ]
CN = *.default.svc.cluster.local

[ req_ext ]
subjectAltName = @alt_names

[ alt_names ]
DNS.1 = *.default.svc.cluster.local
  
  1. Создайте csr и ключевой файл с openssl req -new -config openssl.conf -out wildcard.csr -keyout wildcard.key
  2. Создан запрос на подпись сертификата с помощью
 cat <<EOF | kubectl create -f -
apiVersion: certificates.k8s.io/v1beta1
kind: CertificateSigningRequest
metadata:
  name: wildcard_csr
spec:
  groups:
  - system:authenticated
  request: $(cat wildcard.csr | base64 | tr -d 'n')
  usages:
  - digital signature
  - key encipherment
  - server auth
EOF
  
  1. Запрос утвержден: kubectl certificate approve wildcard_csr
  2. Извлек файл crt: kubectl get csr wildcard_csr -o jsonpath='{.status.certificate}' | base64 -d > wildcard.crt
  3. Удалил запрос kubectl delete csr wildcard_csr .

Затем я запустил pod с registry:2 изображением и настроил его на использование файлов wildcard.crt and wildcard.key .

Затем в другом модуле я попытался перейти к этому реестру, но получил сообщение об ошибке

 Error response from daemon: Get https://registry.default.svc.cluster.local:2100/v2/: x509: certificate signed by unknown authority
  

Таким образом, кажется, что в pod центр сертификации k8s не является доверенным. Я прав с этим наблюдением? Если да, то как я могу заставить k8s доверять самому себе (в конце концов, это был компонент k8s, который подписал сертификат)?

Комментарии:

1. Предположение, что k8s передает свои собственные сертификаты контейнерам, верно лишь частично. Сертификат CA, который вы ищете, является /var/run/secrets/kubernetes.io/serviceaccount/ca.crt . Попробуйте использовать его для проверки реестра и дайте мне знать, работает ли он.

2. Похоже, этот сертификат мне нужен. Как я могу сделать его доверенным?

3. Вы можете скопировать его /etc/ssl/certs/ и запустить update-ca-certificates .

4. Это действительно способ сделать это для каждого модуля?

5. @Matt разве не должен быть способ настроить это в yaml?

Ответ №1:

Я нашел способ добиться этого, изменив только yaml: на моей машине (не уверен, насколько это универсально) сертификат CA доступен в секрете service-account-token default-token-7g75m ( kubectl describe secrets чтобы узнать имя, найдите секрет типа kubernetes.io/service-account-token , который содержит запись ca.crt ).

Поэтому, чтобы доверять этому сертификату, добавьте volume

 name: "kube-certificate"
secret:
  secretName: "default-token-7g75m"
  

и в модуль, для которого требуется сертификат, добавьте volumeMount

 name: "kube-certificate"
mountPath: "/etc/ssl/certs/kube-ca.crt",
subPath: "ca.crt"