创建 TLS 证书和秘钥
前言
执行下列步骤前建议你先阅读以下内容:
管理集群中的TLS:教您如何创建TLS证书
kubelet的认证授权:向您描述如何通过认证授权来访问 kubelet 的 HTTPS 端点。
TLS bootstrap:介绍如何为 kubelet 设置 TLS 客户端证书引导(bootstrap)。
注意:这一步是在安装配置kubernetes的所有步骤中最容易出错也最难于排查问题的一步,而这却刚好是第一步,万事开头难,不要因为这点困难就望而却步。
如果您足够有信心在完全不了解自己在做什么的情况下能够成功地完成了这一步的配置,那么您可以尽管跳过上面的几篇文章直接进行下面的操作。
kubernetes 系统的各组件需要使用 TLS 证书对通信进行加密,本文档使用 CloudFlare 的 PKI 工具集 cfssl 来生成 Certificate Authority (CA) 和其它证书;
生成的 CA 证书和秘钥文件如下:
ca-key.pem
ca.pem
kubernetes-key.pem
kubernetes.pem
kube-proxy.pem
kube-proxy-key.pem
admin.pem
admin-key.pem
使用证书的组件如下:
etcd:使用 ca.pem、kubernetes-key.pem、kubernetes.pem;
kube-apiserver:使用 ca.pem、kubernetes-key.pem、kubernetes.pem;
kubelet:使用 ca.pem;
kube-proxy:使用 ca.pem、kube-proxy-key.pem、kube-proxy.pem;
kubectl:使用 ca.pem、admin-key.pem、admin.pem;
kube-controller-manager:使用 ca-key.pem、ca.pem
注意:以下操作都在 master 节点即 172.20.0.113 这台主机上执行,证书只需要创建一次即可,以后在向集群中添加新节点时只要将 /etc/kubernetes/ 目录下的证书拷贝到新节点上即可。
安装 CFSSL
CFSSL方式一:直接使用二进制源码包安装
方式二:使用go命令安装
我们的系统中安装了Go1.7.5,使用以下命令安装更快捷:
在$GOPATH/bin目录下得到以cfssl开头的几个命令。
注意:以下文章中出现的cat的文件名如果不存在需要手工创建。
创建 CA (Certificate Authority)
创建 CA 配置文件
字段说明
ca-config.json:可以定义多个 profiles,分别指定不同的过期时间、使用场景等参数;后续在签名证书时使用某个 profile;signing:表示该证书可用于签名其它证书;生成的 ca.pem 证书中CA=TRUE;server auth:表示client可以用该 CA 对server提供的证书进行验证;client auth:表示server可以用该CA对client提供的证书进行验证;
创建 CA 证书签名请求
创建 ca-csr.json 文件,内容如下:
"CN":
Common Name,kube-apiserver 从证书中提取该字段作为请求的用户名 (User Name);浏览器使用该字段验证网站是否合法;"O":
Organization,kube-apiserver 从证书中提取该字段作为请求用户所属的组 (Group);
生成 CA 证书和私钥
创建 kubernetes 证书
创建 kubernetes 证书签名请求文件 kubernetes-csr.json:
如果 hosts 字段不为空则需要指定授权使用该证书的 IP 或域名列表,由于该证书后续被
etcd集群和kubernetes master集群使用,所以上面分别指定了etcd集群、kubernetes master集群的主机 IP 和kubernetes服务的服务 IP(一般是kube-apiserver指定的service-cluster-ip-range网段的第一个IP,如 10.254.0.1)。这是最小化安装的kubernetes集群,包括一个私有镜像仓库,三个节点的kubernetes集群,以上物理节点的IP也可以更换为主机名。
生成 kubernetes 证书和私钥
或者直接在命令行上指定相关参数:
创建 admin 证书
创建 admin 证书签名请求文件 admin-csr.json:
后续
kube-apiserver使用RBAC对客户端(如kubelet、kube-proxy、Pod)请求进行授权;kube-apiserver预定义了一些RBAC使用的RoleBindings,如cluster-admin将 Groupsystem:masters与 Rolecluster-admin绑定,该 Role 授予了调用kube-apiserver的所有 API的权限;O 指定该证书的 Group 为
system:masters,kubelet使用该证书访问kube-apiserver时 ,由于证书被 CA 签名,所以认证通过,同时由于证书用户组为经过预授权的system:masters,所以被授予访问所有 API 的权限;
注意:这个admin 证书,是将来生成管理员用的kube config 配置文件用的,现在我们一般建议使用RBAC 来对kubernetes 进行角色权限控制, kubernetes 将证书中的CN 字段 作为User, O 字段作为 Group(具体参考 Kubernetes中的用户与身份认证授权中 X509 Client Certs 一段)。
在搭建完 kubernetes 集群后,我们可以通过命令: kubectl get clusterrolebinding cluster-admin -o yaml ,查看到 clusterrolebinding cluster-admin 的 subjects 的 kind 是 Group,name 是 system:masters。 roleRef 对象是 ClusterRole cluster-admin。 意思是凡是 system:masters Group 的 user 或者 serviceAccount 都拥有 cluster-admin 的角色。 因此我们在使用 kubectl 命令时候,才拥有整个集群的管理权限。
生成 admin 证书和私钥:
创建 kube-proxy 证书
创建 kube-proxy 证书签名请求文件 kube-proxy-csr.json:
CN 指定该证书的 User 为
system:kube-proxy;kube-apiserver预定义的 RoleBindingsystem:node-proxier将Usersystem:kube-proxy与 Rolesystem:node-proxier绑定,该 Role 授予了调用kube-apiserverProxy 相关 API 的权限;
生成 kube-proxy 客户端证书和私钥
校验证书
以 Kubernetes 证书为例。
使用 openssl 命令
openssl 命令确认
Issuer字段的内容和ca-csr.json一致;确认
Subject字段的内容和kubernetes-csr.json一致;确认
X509v3 Subject Alternative Name字段的内容和kubernetes-csr.json一致;确认
X509v3 Key Usage、Extended Key Usage字段的内容和ca-config.json中kubernetesprofile 一致;
使用 cfssl-certinfo 命令
cfssl-certinfo 命令分发证书
将生成的证书和秘钥文件(后缀名为.pem)拷贝到所有机器的 /etc/kubernetes/ssl 目录下备用;
参考
最后更新于