5

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

AWS 上的 kubernetes coreos 集群

TLDR;

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

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

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

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

核心证书

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 以适应我的更改?

4

3 回答 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.

我希望这可以帮助您起步

于 2016-07-27T09:09:49.477 回答
1

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

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

于 2016-07-18T19:39:15.753 回答
0

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

  • 服务器证书(apiserver.pem)未由kubeconfig.ymlca2.pem在您的情况下)中获得的 ca 签名。您可以通过以下方式验证这一点:openssl verify -CAfile ca2.pem apiserver.pem。该文件apiserver.pem是通过--tls-cert-fileapiserver 传递的证书(请参阅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 由--client-ca-fileapiserver 中的标志设置。假设此文件也命名为ca2.pem,则可以使用以下方式验证客户端证书:openssl verify -CAfile ca2.pem admin2.pem
于 2016-07-17T11:51:46.907 回答