Skip to content

Commit

Permalink
k8s 证书
Browse files Browse the repository at this point in the history
  • Loading branch information
isno committed Jan 1, 2024
1 parent 45b0ef6 commit ef3cb10
Show file tree
Hide file tree
Showing 2 changed files with 39 additions and 1 deletion.
1 change: 1 addition & 0 deletions assets/k8s-ca.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
39 changes: 38 additions & 1 deletion container/k8s-deploy-tls.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ Kubernetes 控制平面中 etcd、kube-api-server、kube-scheduler 等组件会
- 客户端根据本地根证书校验服务端的证书
- 客户端拿到证书的内公钥,加密之后传递服务端,服务端用本地的私钥进行解密获取正文。

上面的流程中,实际是一个单向验证的过程(客户端验证了服务端的合法性,但服务端未验证客户端的合法性),而在 Kubernetes 中,**各个组件既是调用方也是被调用方,组件之间的通信就需要采用 mTLS(Mutual TLS,双向 TLS)认证的方式**。mTLS 中,客户端和服务器都有一个证书,并且双方都使用它们的公钥/私钥对进行身份验证。与常规 TLS 相比,mTLS 中有一些额外步骤来验证双方(额外的步骤加粗显示)。
上面的流程中,实际是一个单向验证的过程(客户端验证了服务端的合法性,但服务端未验证客户端的合法性),而在 Kubernetes 中,**各个组件既是客户端也是服务端,组件之间的通信就需要采用 mTLS(Mutual TLS,双向 TLS)认证的方式**。mTLS 中,客户端和服务器都有一个证书,并且双方都使用它们的公钥/私钥对进行身份验证。与常规 TLS 相比,mTLS 中有一些额外步骤来验证双方(额外的步骤加粗显示)。

- 客户端连接到服务器
- 服务器出示其 TLS 证书
Expand All @@ -42,6 +42,43 @@ Kubernetes 控制平面中 etcd、kube-api-server、kube-scheduler 等组件会
- **服务器端 CA 根证书**:签发服务器端证书的 CA 根证书,客户端使用该 CA 根证书来验证服务器端证书的合法性。一般参数名为 ca-file。
- **客户端端 CA 根证书**:签发客户端证书的 CA 根证书,服务器端使用该 CA 根证书来验证客户端证书的合法性。


Kubernetes 中使用了大量的证书

```
/usr/local/bin/kube-apiserver \\
--tls-cert-file=/var/lib/kubernetes/kube-apiserver.pem \\ # 用于对外提供服务的服务器证书
--tls-private-key-file=/var/lib/kubernetes/kube-apiserver-key.pem \\ # 服务器证书对应的私钥
--etcd-certfile=/var/lib/kubernetes/kube-apiserver-etcd-client.pem \\ # 用于访问 etcd 的客户端证书
--etcd-keyfile=/var/lib/kubernetes/kube-apiserver-etcd-client-key.pem \\ # 用于访问 etcd 的客户端证书的私钥
--kubelet-client-certificate=/var/lib/kubernetes/kube-apiserver-kubelet-client.pem \\ # 用于访问 kubelet 的客户端证书
--kubelet-client-key=/var/lib/kubernetes/kube-apiserver-kubelet-client-key.pem \\ # 用于访问 kubelet 的客户端证书的私钥
--client-ca-file=/var/lib/kubernetes/cluster-root-ca.pem \\ # 用于验证访问 kube-apiserver 的客户端的证书的 CA 根证书
--etcd-cafile=/var/lib/kubernetes/cluster-root-ca.pem \\ # 用于验证 etcd 服务器证书的 CA 根证书
--kubelet-certificate-authority=/var/lib/kubernetes/cluster-root-ca.pem \\ # 用于验证 kubelet 服务器证书的 CA 根证书
--service-account-key-file=/var/lib/kubernetes/service-account.pem \\ # 用于验证 service account token 的公钥
...
```

<div align="center">
<img src="../assets/k8s-ca.svg" width = "600" align=center />
<p>HTTPS 通信流程</p>
</div>

- etcd 集群证书
- 1. 由于一个 etctd 节点既为其他节点提供服务,又需要作为客户端访问其他节点,因此该证书同时用作服务器证书和客户端证书。
- 2. etcd 集群向外提供服务使用的证书。该证书是服务器证书。
- kube-apiserver 作为客户端访问 etcd 使用的证书
- kube-apiserver 对外提供服务使用的证书
- kube-controller-manager 作为客户端访问 kube-apiserver 使用的证书
- kube-scheduler 作为客户端访问 kube-apiserver 使用的证书
- kube-proxy 作为客户端访问 kube-apiserver 使用的证书
- kubelet 作为客户端访问 kube-apiserver 使用的证书
- 管理员用户通过 kubectl 访问 kube-apiserver 使用的证书
- kubelet 对外提供服务使用的证书
- kube-apiserver 作为客户端访问 kubelet 采用的证书
- kube-controller-manager 用于生成和验证 service-account token 的证书

## 安装 cfssl

:::tip cfssl
Expand Down

0 comments on commit ef3cb10

Please sign in to comment.