kubernetes + coreos 集群 - 替换证书

kubernetes + coreos cluster - replacing certificates

我有一个 coreos kubernetes 集群,我是从这篇文章开始的:

kubernetes coreos cluster on AWS

TLDR;

> kube-aws init
> kube-aws render
> kube-aws up

一切正常,我在 AWS 上有一个 kubernetes coreos 集群。 文章中有一条警告说:

PRODUCTION NOTE: the TLS keys and certificates generated by kube-aws should not be used to deploy a production Kubernetes cluster. Each component certificate is only valid for 90 days, while the CA is valid for 365 days. If deploying a production Kubernetes cluster, consider establishing PKI independently of this tool first.

所以我想替换默认证书,所以我按照以下文章:

coreos certificates

TLDR;

  1. 创建了以下自签名证书:ca.pem、ca-key.pem
  2. 为控制器创建了证书:apiserver.pem、apiserver-key.pem
  3. 用上面创建的证书替换控制器中的证书,并重新启动控制器
  4. 创建了工作人员证书并替换了工作人员中的证书并重新启动了它们
  5. 配置 kubectl 以使用我创建的新证书并配置上下文和用户

我在 kubectl 和集群之间遇到通信错误,抱怨证书问题

Unable to connect to the server: x509: certificate signed by unknown authority

我还尝试使用指向集群 DNS 的 kubectl 签名证书,我为集群设置了一个 DNS。

如何让 kubectl 与我的集群通信?

提前致谢

编辑:

我的 ~/.kube/config 看起来像这样:

apiVersion: v1
clusters:
- cluster:
    certificate-authority: /Users/Yariv/Development/workspace/bugeez/bugeez-kubernetes/credentials/ca2.pem
    server: https://kubernetes.bugeez.io
  name: bugeez
contexts:
- context:
    cluster: bugeez
    user: bugeez-admin
  name: bugeez-system
current-context: bugeez-system
kind: Config
preferences: {}
users:
- name: bugeez-admin
  user:
    client-certificate: /Users/Yariv/Development/workspace/bugeez/bugeez-kubernetes/credentials/admin2.pem
    client-key: /Users/Yariv/Development/workspace/bugeez/bugeez-kubernetes/credentials/admin-key2.pem

编辑:

我所有的证书都是由 ca2.pem 签署的,我还通过 运行 验证了这一事实:

openssl verify -CAfile ca2.pem <certificate-name>

编辑:

我认为错误的原因是这样的: 当我在控制器和工作人员中切换密钥时,似乎云配置正在用旧密钥覆盖我的新密钥。如何替换密钥并更改云配置以适应我的更改?

此错误消息基本上意味着,服务器证书是由 HTTP 客户端不知道的根 ca 签名的。这可能是由于:

  • 服务器证书 (apiserver.pem) 未由在 kubeconfig.yml 中获得的 CA 签名(在您的情况下为 ca2.pem)。您可以通过以下方式验证这一点:openssl verify -CAfile ca2.pem apiserver.pem。文件 apiserver.pem 是通过 --tls-cert-file 传递给 apiserver 的证书(参见 http://kubernetes.io/docs/admin/kube-apiserver/)。
  • 服务器证书是自签名的。这是在 how-to 中完成的,但是当 --tls-cert-file--tls-private-key-file 标志没有在 apiserver 中设置时,它会创建自签名的。
  • apiserver.pem 不包含 ca 证书(参见 http://kubernetes.io/docs/admin/kube-apiserver/--tls-cert-file 标志的描述)。我不完全确定 HTTPS 服务器是否需要知道根 ca,但这也可能导致问题。

而且这个错误消息也没有说清楚,这是客户端证书还是服务器证书的问题。这意味着客户端证书也必须由根证书签署。

  • 客户端证书ca由apiserver中的--client-ca-file标志设置。假设此文件也被命名为 ca2.pem,则可以使用以下方式验证客户端证书:openssl verify -CAfile ca2.pem admin2.pem

如果密钥确实被旧密钥覆盖,您将需要更新 CloudFormation 模板以使用包含新密钥的新用户数据。

https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-updating-stacks.html

另一种对我有用的解决方案是启动一个新集群,并在最初使用自定义证书,而无需依赖默认的临时凭证。

按照您使用的相同 tutorial,我进行了以下更改:

> kube-aws init
> kube-aws render

kube-aws up之前,我按照教程创建了证书。本教程的唯一问题是它适用于为现有集群创建新证书。因此,需要进行以下更改:

  • 这一行:$ openssl req -x509 -new -nodes -key ca-key.pem -days 10000 -out ca.pem -subj "/CN=kube-ca"需要替换为:$ openssl req -x509 -new -nodes -key ca-key.pem -days 10000 -out ca.pem

  • 在 openssl.cnf 文件中,删除为主控主机和负载均衡器定义 IP 的行,因为我们还不知道它们是什么。最后的 openssl.cnf 应该是这样的:

openssl.cnf

[req]
...
[req_distinguished_name]
[ v3_req ]
...
[alt_names]
DNS.1 = kubernetes
DNS.2 = kubernetes.default
DNS.3 = kubernetes.default.svc
DNS.4 = kubernetes.default.svc.cluster.local
DNS.5 = mydomain.net
IP.1 = ${K8S_SERVICE_IP} # 10.3.0.1
IP.2 = ${MASTER_IP} # 10.0.0.50

我还为所有工作节点使用了相同的工作证书。

证书就位后,输入kube-aws up

我希望这能帮助你起步