我正在基于TykTechnologies/tyk-kubernetes存储库配置Tyk网关和仪表板:
我现在希望使用TLS证书来保护Gateway和Dashboard K8s服务。
我已经购买了如下证书来保护外部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"
}
]
},
...
我正在通过K8s TLS秘密(以及对于仪表板类似)将证书安装在tyk吊舱中:
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
答案 0 :(得分:1)
我正在考虑的一种可能的解决方案是使用certificates.k8s.io
API为由K8s群集的CA签名的服务的内部DNS名称(tyk-gateway.tyk.svc.cluster.local
)生成有效证书,如Kubernetes documentation here。
然后可以将此证书添加到http_server_options
配置中并绑定到服务主机名。
但是,该示例似乎表明我需要在CSR中将服务和Pod IP作为SAN包括在内。我认为,如果使用其他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是pod的IP,my-pod.my-namespace.pod。 cluster.local是容器的DNS名称。