当前位置:网站首页>kubernetes 证书合集
kubernetes 证书合集
2022-06-11 12:53:00 【看、未来】
文章目录
PKI 证书
Kubernetes需要PKI证书才能通过TLS进行身份验证。如果使用kubeadm安装Kubernetes,则会自动生成集群所需的证书。还可以生成自己的证书,例如,通过不将私钥存储在API服务器上来保持私钥更安全。 当然,我们目前是在手动安装嘛。
安装出了点故障,说证书不合法,所以想了想,还是先整理一遍证书吧,不然后面还可能再出这种问题,排查又不好排查。
一共有多少证书?
先从Etcd算起:
1、Etcd对外提供服务,要有一套etcd server证书
2、Etcd各节点之间进行通信,要有一套etcd peer证书
3、Kube-APIserver访问Etcd,要有一套etcd client证书再算kubernetes:
4、Kube-APIserver对外提供服务,要有一套kube-apiserver server证书
5、kube-scheduler、kube-controller-manager、kube-proxy、kubelet和其他可能用到的组件,
需要访问kube-APIserver,要有一套kube-APIserver client证书
6、kube-controller-manager要生成服务的service account,
要有一对用来签署service account的证书(CA证书)
7、kubelet对外提供服务,要有一套kubelet server证书
8、kube-APIserver需要访问kubelet,要有一套kubelet client证书加起来共8套。
同一个套内的证书必须是用同一个CA签署的,签署不同套里的证书的CA可以相同,也可以不同。例如,所有etcd server证书需要是同一个CA签署的,所有的etcd peer证书也需要是同一个CA签署的,而一个etcd server证书和一个etcd peer证书,完全可以是两个CA机构签署的,彼此没有任何关系。这算两套证书。
为什么同一个“套”内的证书必须是同一个CA签署的?
原因在验证这些证书的一端。因为在要验证这些证书的一端,通常只能指定一个Root CA。这样一来,被验证的证书自然都需要是被这同一个Root CA对应的私钥签署,不然不能通过认证。
其实实际上,使用一套证书(都使用一套CA来签署)一样可以搭建出K8S,一样可以上生产,但是理清这些证书的关系,在遇到因为证书错误,请求被拒绝的现象的时候,不至于无从下手,而且如果没有搞清证书之间的关系,在维护或者解决问题的时候,贸然更换了证书,弄不好会把整个系统搞瘫。
TLS bootstrapping
Kubernetes1.4版本引入了一组签署证书用的API。这组API的引入,使我们可以不用提前准备kubelet用到的证书。
每个kubelet用到的证书都是独一无二的,因为它要绑定各自的IP地址,于是需要给每个kubelet单独制作证书,如果业务量很大的情况下,node节点会很多,这样一来kubelet的数量也随之增加,而且还会经常变动(增减Node)kubelet的证书制作就成为一件很麻烦的事情。使用TLS bootstrapping就可以省事儿很多。
工作原理:Kubelet第一次启动的时候,先用同一个bootstrap token作为凭证。这个token已经被提前设置为隶属于用户组system:bootstrappers,并且这个用户组的权限也被限定为只能用来申请证书。 用这个bootstrap token通过认证后,kubelet申请到属于自己的两套证书(kubelet server、kube-apiserver client for kubelet),申请成功后,再用属于自己的证书做认证,从而拥有了kubelet应有的权限。这样一来,就去掉了手动为每个kubelet准备证书的过程,并且kubelet的证书还可以自动轮替更新
官方文档参考:https://kubernetes.io/docs/tasks/tls/certificate-rotation/
kubelet证书为何不同
这样做是一个为了审计,另一个为了安全。 每个kubelet既是服务端(kube-apiserver需要访问kubelet),也是客户端(kubelet需要访问kube-apiserver),所以要有服务端和客户端两组证书。
服务端证书需要与服务器地址绑定,每个kubelet的地址都不相同,即使绑定域名也是绑定不同的域名,故服务端地址不同
客户端证书也不应相同,每个kubelet的认证证书与所在机器的IP绑定后,可以防止一个kubelet的认证证书泄露以后,使从另外的机器上伪造的请求通过验证。
安全方面,如果每个node上保留了用于签署证书的bootstrap token,那么bootstrap token泄漏以后,是不是可以随意签署证书了?安全隐患非常大。所以,kubelet启动成功以后,本地的bootstrap token需要被删除。
正式制作证书
虽然可以用多套证书,但是维护多套CA实在过于繁杂,这里还是用一个CA签署所有证书。
需要准备的证书
admin-key.pem
admin.pem
ca-key.pem
ca.pem
kube-proxy-key.pem
kube-proxy.pem
kubernetes-key.pem
kubernetes.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有这一块儿,后面证书出问题的时候排查也好有个方向嘛。
CFSSL
我们使用CFSSL来制作证书,它是cloudflare开发的一个开源的PKI工具,是一个完备的CA服务系统,可以签署、撤销证书等,覆盖了一个证书的整个生命周期,后面只用到了它的命令行工具。
注:一般情况下,K8S中证书只需要创建一次,以后在向集群中添加新节点时只要将/etc/kubernetes/ssl目录下的证书拷贝到新节点上即可。
下载安装cfssl命令行工具
#以下操作只在master上进行
#进入到下载目录
cd /opt/TLS/download
#下载并解压cfssl
wget https://github.com/cloudflare/cfssl/releases/download/v1.6.1/cfssl_1.6.1_linux_amd64
wget https://github.com/cloudflare/cfssl/releases/download/v1.6.1/cfssljson_1.6.1_linux_amd64
wget https://github.com/cloudflare/cfssl/releases/download/v1.6.1/cfssl-certinfo_1.6.1_linux_amd64
chmod +x cfssl*
[[email protected] download]# ll
total 40232
-rwxr-xr-x 1 root root 16659824 Dec 7 15:36 cfssl_1.6.1_linux_amd64
-rwxr-xr-x 1 root root 13502544 Dec 7 15:35 cfssl-certinfo_1.6.1_linux_amd64
-rwxr-xr-x 1 root root 11029744 Dec 7 15:35 cfssljson_1.6.1_linux_amd64#只在master上操作
cd /opt/TLS/download
cp cfssl_1.6.1_linux_amd64 /usr/local/bin/cfssl
cp cfssljson_1.6.1_linux_amd64 /usr/local/bin/cfssljson
cp cfssl-certinfo_1.6.1_linux_amd64 /usr/local/bin/cfssl-certinfo
[[email protected] download]# ll /usr/local/bin/cfssl*
-rwxr-xr-x 1 root root 16659824 Apr 4 08:46 /usr/local/bin/cfssl
-rwxr-xr-x 1 root root 13502544 Apr 4 08:46 /usr/local/bin/cfssl-certinfo
-rwxr-xr-x 1 root root 11029744 Apr 4 08:46 /usr/local/bin/cfssljson创建CA证书
创建存放证书目录
[[email protected] bin]# mkdir -p /opt/kubernetes/ssl/
[[email protected] bin]# cd /opt/kubernetes/ssl/创建证书配置文件
[[email protected] ssl]# vim ca-config.json
{
"signing": {
"default": {
"expiry": "87600h"
},
"profiles": {
"kubernetes": {
"usages": [
"signing",
"key encipherment",
"server auth",
"client auth"
],
"expiry": "87600h"
}
}
}
}字段说明:
ca-config.json:可以定义多个 profiles,分别指定不同的过期时间、使用场景等参数;后续在签名证书时使用某个 profile;
signing:表示该证书可以签名其他证书;生成的ca.pem证书中 CA=TRUE;
server auth:表示client可以用该 CA 对server提供的证书进行验证;
client auth:表示server可以用该CA对client提供的证书进行验证;
expiry:过期时间创建CA证书签名请求文件
[[email protected] ssl]# vim ca-csr.json
{
"CN": "kubernetes",
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"ST": "BeiJing",
"L": "BeiJing",
"O": "k8s",
"OU": "System"
}
],
"ca": {
"expiry": "87600h"
}
}字段说明:
“CN”:Common Name,kube-apiserver 从证书中提取该字段作为请求的用户名 (User Name);浏览器使用该字段验证网站是否合法;
“O”:Organization,kube-apiserver 从证书中提取该字段作为请求用户所属的组 (Group);生成CA证书和私钥
[[email protected] ssl]# cfssl gencert -initca ca-csr.json | cfssljson -bare ca
[[email protected] ssl]# ls | grep ca
ca-config.json
ca.csr
ca-csr.json
ca-key.pem
ca.pem其中ca-key.pem是ca的私钥,ca.csr是一个签署请求,ca.pem是CA证书,是后面kubernetes组件会用到的RootCA。
创建kubernetes证书
创建kubernetes证书签名请求文件 kubernetes-csr.json
[[email protected] ssl]# vim kubernetes-csr.json
{
"CN": "kubernetes",
"hosts": [
"127.0.0.1",
"192.168.214.88",
"192.168.214.89",
"192.168.214.90",
"192.168.214.200",
"192.168.214.201",
"192.168.214.202",
"10.254.0.1",
"192.168.214.210",
"192.168.214.1/24",
"kubernetes",
"kube-api.wangk8s-master.com",
"kubernetes.default",
"kubernetes.default.svc",
"kubernetes.default.svc.cluster",
"kubernetes.default.svc.cluster.local"
],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"ST": "BeiJing",
"L": "BeiJing",
"O": "k8s",
"OU": "System"
}
]
}如果 hosts 字段不为空则需要指定授权使用该证书的 IP 或域名列表。
由于该证书后续被 etcd 集群和 kubernetes master使用,将etcd、master节点的IP都填上,同时还有service网络的首IP。(一般是 kube-apiserver 指定的 service-cluster-ip-range 网段的第一个IP,如 10.254.0.1)
我这里的设置包括一个私有镜像仓库,三个etcd,三个master,以上物理节点的IP也可以更换为主机名。
生成kubernetes证书和私钥
[[email protected] ssl]# cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes kubernetes-csr.json | cfssljson -bare kubernetes
[[email protected] ssl]# ls |grep kubernetes
kubernetes.csr
kubernetes-csr.json
kubernetes-key.pem
kubernetes.pem创建admin证书签名请求文件admin-csr.json
[[email protected] ssl]# admin-csr.json
{
"CN": "admin",
"hosts": [],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"ST": "BeiJing",
"L": "BeiJing",
"O": "system:masters",
"OU": "System"
}
]
}说明:
后续 kube-apiserver 使用 RBAC 对客户端(如 kubelet、kube-proxy、Pod)请求进行授权;
kube-apiserver 预定义了一些 RBAC 使用的 RoleBindings,如 cluster-admin 将 Group system:masters 与 Role cluster-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
生成admin证书和私钥
[[email protected] ssl]# cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes admin-csr.json | cfssljson -bare admin
[[email protected] ssl]# ls | grep admin
admin.csr
admin-csr.json
admin-key.pem
admin.pem创建kube-proxy证书
创建 kube-proxy 证书签名请求文件 kube-proxy-csr.json
[[email protected] ssl]# vim kube-proxy-csr.json
{
"CN": "system:kube-proxy",
"hosts": [],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"ST": "BeiJing",
"L": "BeiJing",
"O": "k8s",
"OU": "System"
}
]
}CN 指定该证书的 User 为 system:kube-proxy;
kube-apiserver 预定义的 RoleBinding system:node-proxier 将User system:kube-proxy 与 Role system:node-proxier 绑定,该 Role 授予了调用 kube-apiserver Proxy 相关 API 的权限;
生成kube-proxy证书和私钥
[[email protected] ssl]# cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes kube-proxy-csr.json | cfssljson -bare kube-proxy
[[email protected] ssl]# ls |grep kube-proxy
kube-proxy.csr
kube-proxy-csr.json
kube-proxy-key.pem
kube-proxy.pem经过上述操作,我们会用到如下文件:
[[email protected] ssl]# ls | grep pem
admin-key.pem
admin.pem
ca-key.pem
ca.pem
kube-proxy-key.pem
kube-proxy.pem
kubernetes-key.pem
kubernetes.pem查看证书信息
[[email protected] ssl]# cfssl-certinfo -cert kubernetes.pem
{
"subject": {
"common_name": "kubernetes",
"country": "CN",
"organization": "k8s",
"organizational_unit": "System",
"locality": "BeiJing",
"province": "BeiJing",
"names": [
"CN",
"BeiJing",
"BeiJing",
"k8s",
"System",
"kubernetes"
]
},
"issuer": {
"common_name": "kubernetes",
"country": "CN",
"organization": "k8s",
"organizational_unit": "System",
"locality": "BeiJing",
"province": "BeiJing",
"names": [
"CN",
"BeiJing",
"BeiJing",
"k8s",
"System",
"kubernetes"
]
},
"serial_number": "321233745860282370502438768971300435157761820875",
"sans": [
"192.168.214.1/24",
"kubernetes",
"kube-api.wangk8s-master.com",
"kubernetes.default",
"kubernetes.default.svc",
"kubernetes.default.svc.cluster",
"kubernetes.default.svc.cluster.local",
"127.0.0.1",
"192.168.214.88",
"192.168.214.89",
"192.168.214.90",
"192.168.214.200",
"192.168.214.201",
"192.168.214.202",
"10.254.0.1",
"192.168.214.210"
],
"not_before": "2019-03-12T11:26:00Z",
"not_after": "2029-03-09T11:26:00Z",
"sigalg": "SHA256WithRSA",
"authority_key_id": "CB:34:54:33:1F:F4:37:E:E5:94:B7:F5:8A:3D:F4:A4:43:43:E2:7F",
"subject_key_id": "EC:31:D8:5F:4:E3:6F:C2:7F:DA:A8:F0:BD:A:B9:1F:56:7B:9A:DF",
"pem": "-----BEGIN CERTIFICATE-----\nM(此处省略)=\n-----END CERTIFICATE-----\n"
}在搭建k8s集群的时候,将这些文件分发到至此集群中其他节点机器中即可。至此,TLS证书创建完毕。
k8s文档
边栏推荐
- QUIC的阻力
- How can mechanical equipment manufacturing enterprises manage outsourcing with the help of ERP system?
- 深度学习与CV教程(14) | 图像分割 (FCN,SegNet,U-Net,PSPNet,DeepLab,RefineNet)
- 经营体育馆有哪些要素?
- 场馆坪效这么低?关键在这两方面
- Which brand of bone conduction Bluetooth headset is good? Five most popular bone conduction Bluetooth headsets
- 馆客多游泳馆会员管理系统可以实现哪些场景?
- Adobe Premiere基础-批量素材导入序列-变速和倒放(回忆)-连续动作镜头切换-字幕要求(十三)
- What are the elements of running a gymnasium?
- Venue floor efficiency is so low? The key lies in these two aspects
猜你喜欢

Which brand of bone conduction Bluetooth headset is good? Five most popular bone conduction Bluetooth headsets

What are the profit sources of mother and baby stores?

逆向学习入门-优秀的汇编调试工具OllyDbg

模态框关闭后清空模态框里选择的数据

苹果将造搜索引擎?

PADS使用之繪制原理圖

火山引擎云数据库 veDB 在字节内部的业务实践

母婴店的利润来源有哪些?

Kehai Rongsheng & zhenghang will jointly welcome the future of digital intelligence with informatization driven management upgrading

Is Zhima Z1 projector really easy to use? How about the actual effect?
随机推荐
Seckill multi-level cache ----- product details page
Audio adaptation of openharmony Standard System Porting
中国 SaaS 发展落后美国 10 年,仍需借助创新、开源、并购等策略发力 | ArchSummit
游泳馆暑期业绩翻倍的方法
如何同步openstack RDO源至本地进行离线安装
Add environment path
Which brand of bone conduction Bluetooth headset is good? Five most popular bone conduction Bluetooth headsets
苹果将造搜索引擎?
. 4 literal and variable
What scenarios can the member management system of the multi guest swimming pool achieve?
Number selection (greed)
深度学习与CV教程(14) | 图像分割 (FCN,SegNet,U-Net,PSPNet,DeepLab,RefineNet)
. 5 string
【增加功能】select下拉多选 显示选中的人员
Tawang food industry insight | China's dairy market analysis, competition pattern, development trend and thinking
工作总结之因为笛卡尔积问题写SQL搞了半天[害](附笛卡尔积总结)
1. Thread Basics
Usage of instr function in Oracle Database
PKI/TLS瑞士军刀之cfssl
馆客多游泳馆会员管理系统可以实现哪些场景?