Kubernetes + CoreOS 集群 - 替换证书

5

我有一个CoreOS Kubernetes集群,我是按照这篇文章开始的:

在AWS上搭建CoreOS Kubernetes集群

简而言之:

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

一切都很顺利,我在AWS上拥有了一个Kubernetes CoreOS集群。文章中有一个警告:

生产注意事项:kube-aws生成的TLS密钥和证书不应用于部署生产Kubernetes集群。每个组件证书仅有效期为90天,而CA有效期为365天。如果要部署生产Kubernetes集群,请首先考虑独立建立PKI。

因此,我想替换默认证书,所以我按照以下文章进行操作:

CoreOS 证书

TLDR;

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

我在kubectl和集群之间出现通信错误,指责证书:

无法连接到服务器:x509:由未知机构签名的证书

我还尝试使用指向集群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>

编辑:

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


你的 kubeconfig 是什么样子的?你是否将新的 CA 证书设置为 clusters.cluster.certificate-authority?(参见 http://kubernetes.io/docs/user-guide/kubeconfig-file/) - svenwltr
是的,我已经在配置文件中设置了证书颁发机构。我编辑了问题并添加了我的配置文件。 - Yariv Katz
kubectl 命令中的 --insecure-skip-tls-verify 标记是否可用? - svenwltr
服务器返回错误:服务器要求客户端提供凭据。控制器仅公开端口443,我不想为端口80打开它。同时,我更愿意使用证书来完成这个任务。 - Yariv Katz
3个回答

3

我找到了一个适合我的替代方案,即启动一个新的集群,并最初使用自定义证书,而不是依赖于默认的临时凭据。

按照你所使用的教程,我进行了以下更改:

> 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

希望这可以帮助您起步。


有没有可能解释一下教程中的“所有工作节点使用相同的工作证书”?他们说要为每个节点创建一个带有节点IP的证书,这是如何工作的? - Gleeb
没错,这正是我的观点,那一步是不必要的。你可以为所有节点使用同一个证书。只需在教程中省略设置节点IP的行即可。这样也能正常工作。 - ygesher
当我只删除那一行时,出现了一个错误,我需要同时删除subjectAltName = @alt_names [alt_names]吗?有可能您能在您的答案中添加一个例子吗? - Gleeb
你在哪个阶段遇到了错误?你看到了什么错误?你尝试过在所有的 openssl 命令中排除 -subj 标志吗? - ygesher

1

0

这个错误信息基本上意味着,服务器证书是由一个根CA签名的,而HTTP客户端不知道它。这可能是由以下原因引起的:

  • 服务器证书(apiserver.pem)没有由在kubeconfig.yml 中获取的ca证书(在您的情况下为ca2.pem)签名。您可以通过以下方式进行验证:openssl verify -CAfile ca2.pem apiserver.pem。文件apiserver.pem 是通过--tls-cert-file 传递给api服务器的证书(请参见http://kubernetes.io/docs/admin/kube-apiserver/)。
  • 服务器证书是自签名的。这在如何操作时已完成,但当未在apiserver中设置 --tls-cert-file --tls-private-key-file 标志时,它将创建自签名证书。
  • apiserver.pem 不包含ca证书(请参见http://kubernetes.io/docs/admin/kube-apiserver/--tls-cert-file 标志的说明)。我不完全确定HTTPS服务器是否需要了解根CA,但这也可能导致问题。

此外,这个错误信息并没有明确表明是客户端证书还是服务器证书的问题。这意味着客户端证书也必须由根CA签名。

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

非常感谢您的回复... 我的所有证书都由ca2.pem签名 'openssl verify -CAfile ca2.pem apiserver.pem' 响应为OK - Yariv Katz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接