Как следует настроить Tyk и Kubernetes для внутреннего TLS K8s?
Эта проблема:
Я настраиваю Tyk Gateway и Dashboard на основе https://github.com/TykTechnologies/tyk-kubernetes:
Теперь я хочу защитить службы Gateway и Dashboard K8s сертификатами TLS.
Я купил сертификат для защиты внешних URL (https://api.example.com
а также https://dashboard.example.com
), как показано ниже, но сертификат недействителен для внутренних конечных точек службы k8s, и поэтому приборная панель и шлюз больше не могут разговаривать внутри:
$ kubectl logs deployment/tyk-dashboard
...
time="Jan 01 00:00:00" level=error msg="Request failed with error Get https://tyk-dashboard.tyk.svc.cluster.local:443/register/node: x509: certificate is valid for *.example.com, not tyk-dashboard.tyk.svc.cluster.local; retrying in 5s"
Что я сделал до сих пор:
Модифицированный tyk.conf
а также tyk_analytics.conf
изменить порт прослушивания и ссылаться на сертификаты:
{
"listen_port": 443,
"notifications_listen_port": 5000,
"tyk_api_config": {
"Host": "https://tyk-gateway.tyk.svc.cluster.local",
"Port": "443",
...
"http_server_options": {
"use_ssl": true,
"server_name": "api.example.com",
"min_version": 771,
"certificates": [
{
"domain_name": "*.example.com",
"cert_file": "/etc/ssl/gateway-tls/tls.crt",
"key_file": "/etc/ssl/gateway-tls/tls.key"
}
]
},
...
Я монтирую сертификаты в модулях tyk через секреты TLS K8s (и аналогично для панели инструментов):
kubectl create secret tls tyk-gateway --cert=example.com.crt --key=example.com.key
И соответствующее обновление развертывания K8s:
...
ports:
- containerPort: 443
- containerPort: 5000
volumeMounts:
...
- name: tyk-gateway-tls
readOnly: true
mountPath: "/etc/ssl/gateway-tls"
volumes:
...
- name: tyk-gateway-tls
secret:
secretName: tyk-gateway
1 ответ
Возможное решение, которое я рассматриваю, состоит в том, чтобы использовать certificates.k8s.io
API для создания действительного сертификата для внутреннего DNS-имени службы (tyk-gateway.tyk.svc.cluster.local
) который подписан центром сертификации кластера K8s, как указано в документации по Kubernetes здесь.
Этот сертификат может быть добавлен к http_server_options
Конфиг и привязан к имени хоста сервиса.
Тем не менее, этот пример, по-видимому, предполагает, что мне нужно включить IP-адреса службы и модуля в качестве SAN в CSR. Я не думаю, что тогда будет действительно, когда модуль перенесен с другого IP-адреса.
Создайте закрытый ключ и запрос на подпись сертификата (или CSR), выполнив следующую команду:
cat <<EOF | cfssl genkey - | cfssljson -bare server { "hosts": [ "my-svc.my-namespace.svc.cluster.local", "my-pod.my-namespace.pod.cluster.local", "172.168.0.24", "10.0.34.2" ], "CN": "my-pod.my-namespace.pod.cluster.local", "key": { "algo": "ecdsa", "size": 256 } } EOF
Где 172.168.0.24 - это IP-адрес кластера службы, my-svc.my-namespace.svc.cluster.local - это DNS-имя службы, 10.0.34.2 - это IP-адрес модуля, а my-pod.my-namespace.pod.cluster.local. DNS-имя модуля