#ssl #kubernetes #ssl-certificate #x509
#ssl #kubernetes #ssl-сертификат #x509
Вопрос:
Я пытаюсь отсортировать сертификаты для приложений, развернутых в кластере k8s (работает на docker-for-win, WSL2 в Windows 10 20H2).
Я хотел бы использовать DNS для подключения к службам, например registry.default.svc.cluster.local
, которые, как я проверил, доступны. Я создал сертификат, выполнив следующие действия:
- Создайте
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
- Создайте csr и ключевой файл с
openssl req -new -config openssl.conf -out wildcard.csr -keyout wildcard.key
- Создан запрос на подпись сертификата с помощью
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
- Запрос утвержден:
kubectl certificate approve wildcard_csr
- Извлек файл crt:
kubectl get csr wildcard_csr -o jsonpath='{.status.certificate}' | base64 -d > wildcard.crt
- Удалил запрос
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"