在我知道 public 和私有 IP 之前创建 Kubernetes TLS 资产

Creating Kubernetes TLS assets before i know public and private IP

https://coreos.com/kubernetes/docs/latest/getting-started.html 之后,我想为我的 kubernetes 集群生成我的 TLS 资产。 我通过 cloud-config 将这些密钥推送到 aws-api 以创建 EC2 实例的计划行不通,因为我不会提前知道这些实例的 public 和私有 IP。

我想通过云配置将 ca 证书移动到实例,然后我通过 systemd 单元文件从脚本 运行 生成这些资产。这里最大的问题是我不想将 ca root 证书放入云配置中。

有人有办法解决这种情况吗?

根据 kube-aws 的工作方式,我可以像这样设置我的 api-server conf

[req]
req_extensions = v3_req
distinguished_name = req_distinguished_name
[req_distinguished_name]
[ v3_req ]
basicConstraints = CA:FALSE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names
[alt_names]
DNS.1 = kubernetes
DNS.2 = kubernetes.default
DNS.3 = kubernetes.default.svc
DNS.4 = kubernetes.default.svc.cluster.local
DNS.5 = kubernetes.mydomain.de
IP.1 = 10.3.0.1

我在 "minimal config file" 添加了

  • 我的 public DNS DNS.5 = kubernetes.mydomain.de
  • 我省略了 MASTER_HOST IP 地址,因为我可以使用 FQDN (kubernetes.mydomain.de) 来访问该 IP
  • "K8S_SERVICE_IP",应该是我内部IP范围(10.3.0.0/24)的第一个IP:IP.2 = 10.3.0.1

worker conf 看起来像这样:

[req]
req_extensions = v3_req
distinguished_name = req_distinguished_name
[req_distinguished_name]
[ v3_req ]
basicConstraints = CA:FALSE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
subjectAltName = @alt_names
[alt_names]
DNS.1 = *.*.cluster.internal

这里的技巧是将 SAN 设置为通配符 *.*.cluster.internal。这样所有工作人员都可以在内部网络上使用该证书进行验证,而我不必设置特定的 IP 地址。