Всем привет!
Введение:
У меня есть 2 приложения (клиент и сервер gRPC, хотя, впрочем не важно что именно) и им нужно общаться через TLS. Без Kubernets все делается довольно просто. Я создаю свой CA через cfssl в отдельном контейнере, получаю корневой сертификат и кладу его в trust для 2 моих grpc приложений (в Dockerfile), чтобы любой сертификат подписанный моим CA проходил проверку.
Дальше в игру включается Kubernetes. Играюсь пока локально с помощью minikube. Запускаю minikube start на mac (возможно это важно, не знаю...)
Проблема:
Как этот флоу будет работать с кубером? Как я понимаю, внутри кубера уже есть свой CA (поправьте, если это не так) .Перечитал много статей, но так особо ничего и не понял. Пробовал примеры из данной статьи
https://kubernetes.io/docs/tasks/tls/managing-tls-...
Прохожусь по шагам
1) Создания запроса на подпись
cat <<EOF | cfssl genkey - | cfssljson -bare server
{
"hosts": [
"my-svc.my-namespace.svc.cluster.local",
"my-pod.my-namespace.pod.cluster.local",
"192.0.2.24",
"10.0.34.2"
],
"CN": "my-pod.my-namespace.pod.cluster.local",
"key": {
"algo": "ecdsa",
"size": 256
}
}
EOF
Первое, что не понял, это хосты. Например my-svc.my-namespace.svc.cluster.local - это полное название моего сервиса? (я имею ввиду сервиса в кубере kind: Service). У меня он находится в namespace "dev" и его название user-app-sesrvice. Должен ли я указать тогда так user-app-sesrvice.dev.svc.cluster.local? или же просто user-app-sesrvice. Или есть какая-та команда, чтобы получить полное имя сервиса? 192.0.2.24 - как, я понимаю это ип сервиса, тоже непонятно, обязательно ли его указывать или можно только имя сервиса? Что если у меня установлено clusterIP: None, тогда ип не будет. my-pod.my-namespace.pod.cluster.local - обязательно ли указывать это? Ведь, если у меня несколько подов, я должен их все перечислить? Тогда проблема в динамике, ведь поды пересоздаются, удаляются и добавляться и мне нужно каждый раз отправлять новый запрос на подпись. И те же самые вопросы, что были к сервису к часям my-pod и namespace? Плюс, можно ли как-то увидеть также фул name пода со всеми этими данными. 10.0.34.2 - ип пода, те же самые вопросы, что и были по ип сервиса.
Что я попробовал, я попробовал просто указать в хосте и CN имя моего сервиса user-app-service (как будто работаю без кубера). У меня создалась подпись и ключ. Дальше все по шагам, создал объект запроса на подпись в кубере
cat <<EOF | kubectl apply -f -
apiVersion: certificates.k8s.io/v1beta1
kind: CertificateSigningRequest
metadata:
name: my-svc.my-namespace
spec:
request: $(cat server.csr | base64 | tr -d '\n')
usages:
- digital signature
- key encipherment
- server auth
EOF
потом сделал его апрув и получил сертификат
Дальше, исходя из безопасности, мне нужно ключ и сертификат, как я понимаю в секреты закинуть и получить в контейнере (я в целях теста я просто их поместил в контейнер в докерфайле, захардкодил так сказать), это в gRPC сервер. Развернул деплоймент и создал клиента, на го, указав в коде config := &tls.Config{}, чтобы он тянул доверенные сертификаты из системы сам, я думал, что раз у кубера есть CA, но в доке не нашел как получить его сертификат, то сам кубер как-то на все контейнеры добавляет его сам. Похоже это не так и естественно получил ошибку Unavailable desc = connection error: desc = "transport: authentication handshake failed: x509: certificate signed by unknown authority". Как все это должно работать? Где я могу получить сертификат CA из кубера? И потом, мне нужно его, также, руками в каждый контейнер добавлять в dockerfile? или это не верная тактика и есть какая-та автоматизация от кубера?
Нашел еще способ, это попытаться развернуть cfssl
https://hub.docker.com/r/cfssl/cfssl/ на под кубера и уже работать с ним, словно кубера и нет (не пробовал еще данный метод, так как, мне кажется, раз уже есть CA, зачем еще что-то костылить)
В общем, как все это собрать в работающую систему, какие варианты использовать и почему, а также вопросы важны по поводу подписи, которые указал выше. Может есть какие-то полноценные статьи. Написал много, может немного сумбурно, но, надеюсь, понятно. Очень нужна помощь знающих людей.
Заранее спасибо