kubernetes + coreos集群 - 替换证书

时间:2016-07-17 08:36:45

标签: amazon-web-services kubernetes pki coreos kubectl

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

kubernetes coreos cluster on AWS

TLDR;

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

一切都很顺利,我在AWS上有一个kubernetes coreos集群。 在文章中有一个警告说:

  

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

所以我想替换默认证书,所以我遵循了以下文章:

coreos certificates

TLDR;

  1. 创建了以下自签名证书:ca.pem,ca-key.pem
  2. 为控制器创建了证书:apiserver.pem,apiserver-key.pem
  3. 使用上面创建的证书替换控制器中的证书,然后重新启动控制器
  4. 创建了一个工作者证书并替换了工作者中的证书并重新启动它们
  5. 配置kubectl以使用我创建的新证书,并配置上下文和用户
  6. 我在kubectl和群集之间收到通信错误,抱怨证书

      

    无法连接到服务器:x509:由unknown签名的证书   权威

    我还尝试使用kubectl的签名证书指向群集DNS,我为群集设置了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以适应我的更改?

3 个答案:

答案 0 :(得分:3)

对我有用的替代解决方案是启动新群集,并最初使用自定义证书,而不依赖于默认的临时凭证。

遵循您使用的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

我希望这可以帮助你实现目标

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

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

  • 服务器证书(apiserver.pem)未经kubeconfig.yml(在您的情况下为ca2.pem)中获得的ca签名。您可以使用以下代码进行验证:openssl verify -CAfile ca2.pem apiserver.pem。文件apiserver.pem是通过--tls-cert-file传递给apiserver的证书(请参阅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服务器是否需要知道root ca,但这也可能导致问题。

此错误消息也不清楚,无论这是客户端证书还是服务器证书的问题。这意味着客户端证书也必须由root ca。

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