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.
所以我想替换默认证书,所以我按照以下文章:
TLDR;
- 创建了以下自签名证书:ca.pem、ca-key.pem
- 为控制器创建了证书:apiserver.pem、apiserver-key.pem
- 用上面创建的证书替换控制器中的证书,并重新启动控制器
- 创建了工作人员证书并替换了工作人员中的证书并重新启动了它们
- 配置 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
。
我希望这能帮助你起步
我有一个 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.
所以我想替换默认证书,所以我按照以下文章:
TLDR;
- 创建了以下自签名证书:ca.pem、ca-key.pem
- 为控制器创建了证书:apiserver.pem、apiserver-key.pem
- 用上面创建的证书替换控制器中的证书,并重新启动控制器
- 创建了工作人员证书并替换了工作人员中的证书并重新启动了它们
- 配置 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
。
我希望这能帮助你起步