目录

一 证书简介

二 证书类型分类

三  证书说明

四 TLS bootstrapping 简化kubelet证书制作

五 证书制作步骤

1  创建CA证书

2 创建K8S证书

2.1. 创建kubernetes证书

2.2 创建kube-controller-manager证书

2.3 创建kube-scheduler证书

3 创建ADMIN证书

4 创建ETCD证书

6 查看证书信息:


一 证书简介

服务端保留公钥和私钥,客户端使用root CA认证服务端的公钥

一共有多少证书:

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,一样可以上生产,但是理清这些证书的关系,在遇到因为证书错误,请求被拒绝的现象的时候,不至于无从下手,而且如果没有搞清证书之间的关系,在维护或者解决问题的时候,贸然更换了证书,弄不好会把整个系统搞瘫。

kubelet证书为何不同

这样做是一个为了审计,另一个为了安全。 每个kubelet既是服务端(kube-apiserver需要访问kubelet),也是客户端(kubelet需要访问kube-apiserver),所以要有服务端和客户端两组证书。

服务端证书需要与服务器地址绑定,每个kubelet的地址都不相同,即使绑定域名也是绑定不同的域名,故服务端地址不同

客户端证书也不应相同,每个kubelet的认证证书与所在机器的IP绑定后,可以防止一个kubelet的认证证书泄露以后,使从另外的机器上伪造的请求通过验证。

安全方面,如果每个node上保留了用于签署证书的bootstrap token,那么bootstrap token泄漏以后,是不是可以随意签署证书了?安全隐患非常大。所以,kubelet启动成功以后,本地的bootstrap token需要被删除。

二 证书类型分类

kubernetes的证书类型主要分为3类:

  • serving CA: 用于签署serving证书,该证书用于加密https通信。用于签署kubernetes API serving证书的CA也可以用于签署API server插件的serving证书,可能会用到不同的CA
  • client CA: 用于签署客户端证书,同时也被API server插件用来对客户端发来的证书进行认证。用于签署kubernetes API serving证书的client CA也可以用于签署API server插件的serving证书,可能会用到不同的CA
  • RequestHeader client CA: 该CA用于签署API server代理客户端证书,拥有代理证书的客户端可以有效地伪装成任何身份。当运行在aggregator之后时,该CA必须与前述aggregator代理客户端证书的CA一致

三  证书说明

serving 证书:
--tls-cert-file和--tls-private-key-file,API server用这两个选项来认证连接到自己的TLS。这两个证书也是CA(可以是自签CA)签署的。由于客户端节点可能会拒绝自签CA,因此需要将该CA分发给客户端节点,并在客户端指定该CA。如下kubelet的kubeconfig中的certificate-authority就指定了用于认证tls证书的CA。--tls-cert-file中需要有server字段的名称。API server和kubelet(当需要认证到kubelet的请求时)都有这两个选项,工作原理一样。

current-context: my-context
apiVersion: v1
clusters:
- cluster:
certificate-authority: /path/to/my/ca.crt # CERTIFICATE AUTHORITY THAT ISSUED YOUR TLS CERT
server: https://horse.org:4443 # this name needs to be on the certificate in --tls-cert-file
name: my-cluster
kind: Config
users:
- name: green-user
user:
client-certificate: path/to/my/client/cert
client-key: path/to/my/client/key

client 证书

--client-ca-file:任何带有 client-ca-file 签名的客户端证书的请求,都将通过客户端证书中 Common Name 对应的标识进行身份认证,证书中的 Common Name 会作为用户名,Organization作为组来使用。默认情况下,API Server使用该选项会自动创建一个名为extension-apiserver-authentication,位于kube-system命名空间的ConfigMap ,该ConfigMap 中包含了--client-ca-file指定的CA。
API server的--kubelet-certificate-authority、--kubelet-client-certificate、--kubelet-client-key 和kubelet的--client-ca-file为一组选项,用于对kubelet进行认证(kubelet 组件在工作时,采用主动的查询机制,即定期请求 apiserver 获取自己所应当处理的任务)

RequestHeader client CA 证书
主要涉及3个选项--requestheader-client-ca-file、--proxy-client-cert-file、--proxy-client-key-file。代理(如aggregator)使用--proxy-client-cert-file、--proxy-client-key-file来请求API Server,API Server使用--requestheader-client-ca-file指定的证书来认证代理的证书。这三个选项都设置在API server的flag中,即aggregator一方面作为API server认证来自client的证书,一方面作为client,使用自身的代理证书向API server请求认证。
当kubernetes对应的客户端证书中的usernames和group与自己需求不符合时(无法认证或权限不足等),可以使用认证代理(代理使用另一套证书请求API server)

可以看到serving证书是通过TLS来进行认证,client证书通过用户名(Common Name)和组(Organization)进行认证;RequestHeader client证书认证方式与client证书认证方式类似

证书的验证:

显示插件API server支持的证书:openssl s_client -connect <service-cluster-ip>:443更多

验证证书是否由CA签署:openssl verify -CAfile ca.crt   the-certificate.crt

更多参见Certificate Issues

TLS bootstrapping 简化kubelet证书制作

Kubernetes1.4版本引入了一组签署证书用的API。这组API的引入,使我们可以不用提前准备kubelet用到的证书。

官网地址:https://kubernetes.io/docs/tasks/tls/certificate-rotation/

每个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的证书还可以自动轮替更新

参考文档:

Kubernetes TLS bootstrapping 那点事

证书制作步骤

1  创建CA证书

创建证书配置文件 mkdir ca; cd ca;

vim ca-config.json

{"signing": {"default": {"expiry": "87600h"},"profiles": {"etcd": {"expiry": "87600h","usages": ["signing","key encipherment","server auth","client auth"]},"kubernetes": {"expiry": "87600h","usages": ["signing","key encipherment","server auth","client auth"]}}}
}

字段说明:

ca-config.json:可以定义多个 profiles,分别指定不同的过期时间、使用场景等参数;后续在签名证书时使用某个 profile;

signing:表示该证书可以签名其他证书;生成的ca.pem证书中 CA=TRUE;

server auth:表示client可以用该 CA 对server提供的证书进行验证;

client auth:表示server可以用该CA对client提供的证书进行验证;

expiry:过期时间

创建CA证书签名请求文件

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证书和私钥

cfssl gencert -initca ca-csr.json | cfssljson -bare ca

ls -al | grep ca

-rw-r--r-- 1 root root  487 Jun 26 11:20 ca-config.json
-rw-r--r-- 1 root root 1001 Jun 26 11:20 ca.csr
-rw-r--r-- 1 root root  264 Jun 26 11:20 ca-csr.json
-rw------- 1 root root 1675 Jun 26 11:20 ca-key.pem
-rw-r--r-- 1 root root 1359 Jun 26 11:20 ca.pem

其中ca-key.pem是ca的私钥,ca.csr是一个签署请求,ca.pem是CA证书,是后面kubernetes组件会用到的RootCA。

2 创建K8S证书

在创建这个证书之前,先规划一下架构

k8s-master1  10.211.55.11

etcd01          10.211.55.11

2.1. 创建kubernetes证书

创建kubernetes证书签名请求文件  mkdir kubernetes; cd kubernetes;

vim kubernetes-csr.json

{"CN": "kubernetes","hosts": ["127.0.0.1","10.254.0.1""10.211.55.11","kubernetes","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 或域名列表。

由于该证书后续被 kubernetes master 集群使用,将master节点的IP都填上(如有多个),同时还有service网络的首IP。(一般是 kube-apiserver 指定的 service-cluster-ip-range 网段的第一个IP,如 10.254.0.1)

生成kubernetes证书和私钥

cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes kubernetes-csr.json | cfssljson -bare kubernetes

ls |grep kubernetes

kubernetes.csr
kubernetes-csr.json
kubernetes-key.pem
kubernetes.pem

2.2 创建kube-controller-manager证书

创建 kube-controller-manager 证书签名请求文件 

vim kube-controller-manager-csr.json

{"CN": "system:kube-controller-manager","key": {"algo": "rsa","size": 2048},"hosts": ["127.0.0.1","10.211.55.11"],"names": [{"C": "CN","ST": "BeiJing","L": "BeiJing","O": "system:kube-controller-manager","OU": "system"}]
} 

说明:

hosts 列表包含所有 kube-controller-manager 节点 IP;

CN 为 system:kube-controller-manager、O 为 system:kube-controller-manager,kubernetes 内置的 ClusterRoleBindings system:kube-controller-manager 赋予 kube-controller-manager 工作所需的权限

生成kube-controoller-manager证书和私钥

cfssl gencert -ca=../ca/ca.pem -ca-key=../ca/ca-key.pem -config=../ca/ca-config.json -profile=kubernetes kube-controller-manager-csr.json | cfssljson -bare kube-controller-manager

ls |grep kube-controller-manager

kube-controller-manager.csr
kube-controller-manager-csr.json
kube-controller-manager-key.pem
kube-controller-manager.pem

2.3 创建kube-scheduler证书 

创建 kube-scheduler 证书签名请求文件

vim kube-scheduler-csr.json

{"CN": "system:kube-scheduler","hosts": ["127.0.0.1","10.211.55.11"],"key": {"algo": "rsa","size": 2048},"names": [{"C": "CN","ST": "BeiJing","L": "BeiJing","O": "system:kube-scheduler","OU": "System"}]
}

说明:

hosts 列表包含所有 kube-scheduler 节点 IP;

CN 为 system:kube-scheduler、O 为 system:kube-scheduler,kubernetes 内置的 ClusterRoleBindings system:kube-scheduler 将赋予 kube-scheduler 工作所需的权限。

经过上述操作,我们会用到如下文件

cfssl gencert -ca=../ca/ca.pem -ca-key=../ca/ca-key.pem -config=../ca/ca-config.json -profile=kubernetes kube-scheduler-csr.json| cfssljson -bare kube-scheduler

ls | grep kube-scheduler

kube-scheduler.csr
kube-scheduler-csr.json
kube-scheduler-key.pem
kube-scheduler.pem

3 创建ADMIN证书

创建admin证书签名请求文件  mkdir admin ; cd admin

vim 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

相关权限认证可以参考下面文章

https://mp.weixin.qq.com/s/XIkQdh5gnr-KJhuFHboNag

生成admin证书和私钥

cfssl gencert -ca=../ca/ca.pem -ca-key=../ca/ca-key.pem -config=../ca/ca-config.json -profile=kubernetes admin-csr.json | cfssljson -bare admin

ls | grep admin

admin.csr
admin-csr.json
admin-key.pem
admin.pem

4 创建ETCD证书

创建etcd证书签名请求文件 

vim etcd-csr.json

{"CN": "etcd","hosts": ["127.0.0.1","10.211.55.11"],"key": {"algo": "rsa","size": 2048},"names": [{"C": "CN","ST": "BeiJing","L": "BeiJing"    }]
}

字段说明:

如果 hosts 字段不为空则需要指定授权使用该证书的 IP 或域名列表。该证书后续被 etcd 集群使用

生成kubernetes证书和私钥

cfssl gencert -ca=../ca/ca.pem -ca-key=../ca/ca-key.pem -config=../ca/ca-config.json -profile=etcd etcd-csr.json | cfssljson -bare etcd

ls |grep etcd

etcd.csr
etcd-csr.json
etcd-key.pem
etcd.pem

6 查看证书信息:

cfssl-certinfo -cert kubernetes.pem

在搭建k8s集群的时候,将这些文件分发到至此集群中其他节点机器中即可。至此,TLS证书创建完毕

admin:
total 24
drwxr-xr-x 2 root root 4096 Sep 24 12:44 .
drwxr-xr-x 6 root root 4096 Sep 24 12:44 ..
-rw-r--r-- 1 root root 1009 Sep 24 12:15 admin.csr
-rw-r--r-- 1 root root  229 Sep 24 12:14 admin-csr.json
-rw------- 1 root root 1679 Sep 24 12:15 admin-key.pem
-rw-r--r-- 1 root root 1399 Sep 24 12:15 admin.pemca:
total 28
drwxr-xr-x 2 root root 4096 Sep 24 12:01 .
drwxr-xr-x 6 root root 4096 Sep 24 12:44 ..
-rw-r--r-- 1 root root  487 Sep 24 12:01 ca-config.json
-rw-r--r-- 1 root root 1001 Sep 24 12:01 ca.csr
-rw-r--r-- 1 root root  309 Sep 24 11:58 ca-csr.json
-rw------- 1 root root 1679 Sep 24 12:01 ca-key.pem
-rw-r--r-- 1 root root 1359 Sep 24 12:01 ca.pemetcd:
total 24
drwxr-xr-x 2 root root 4096 Sep 24 12:24 .
drwxr-xr-x 6 root root 4096 Sep 24 12:44 ..
-rw-r--r-- 1 root root 1005 Sep 24 12:24 etcd.csr
-rw-r--r-- 1 root root  272 Sep 24 12:23 etcd-csr.json
-rw------- 1 root root 1675 Sep 24 12:24 etcd-key.pem
-rw-r--r-- 1 root root 1375 Sep 24 12:24 etcd.pemkubernetes:
total 56
drwxr-xr-x 2 root root 4096 Sep 24 12:44 .
drwxr-xr-x 6 root root 4096 Sep 24 12:44 ..
-rw-r--r-- 1 root root 1119 Sep 24 12:11 kube-controller-manager.csr
-rw-r--r-- 1 root root  350 Sep 24 12:11 kube-controller-manager-csr.json
-rw------- 1 root root 1675 Sep 24 12:11 kube-controller-manager-key.pem
-rw-r--r-- 1 root root 1493 Sep 24 12:11 kube-controller-manager.pem
-rw-r--r-- 1 root root 1245 Sep 24 12:02 kubernetes.csr
-rw-r--r-- 1 root root  512 Sep 24 12:02 kubernetes-csr.json
-rw------- 1 root root 1679 Sep 24 12:02 kubernetes-key.pem
-rw-r--r-- 1 root root 1610 Sep 24 12:02 kubernetes.pem
-rw-r--r-- 1 root root 1094 Sep 24 12:13 kube-scheduler.csr
-rw-r--r-- 1 root root  331 Sep 24 12:12 kube-scheduler-csr.json
-rw------- 1 root root 1675 Sep 24 12:13 kube-scheduler-key.pem
-rw-r--r-- 1 root root 1468 Sep 24 12:13 kube-scheduler.pem

参考

Kubernetes 的证书认证

k8s学习笔记-证书详解

[kubernetes] 证书详细总结相关推荐

  1. Kubernetes 证书详解

    K8S 证书介绍 在 Kube-apiserver 中提供了很多认证方式,其中最常用的就是 TLS 认证,当然也有 BootstrapToken,BasicAuth 认证等,只要有一个认证通过,那么 ...

  2. 阿里云免费ssh证书的免费购买,创建、下载,部署证书详细步骤

    阿里云免费ssh证书的免费购买,创建.下载.部署证书详细步骤 1.登陆阿里云账号 在自己域名对应的阿里云账号申请免费的ssh证书,注意:假定你有好几个阿里云账号,一定在自己的域名对应的阿里云账号申请: ...

  3. HTTPS 简介及使用官方工具 Certbot 配置 SSL 安全证书详细教程

    Homepage » 教程 » HTTPS 简介及使用官方工具 Certbot 配置 Let's Encrypt SSL 安全证书详细教程 HTTPS 简介及使用官方工具 Certbot 配置 Let ...

  4. [.crt 证书] openssl 查看.crt 证书详细信息

    openssl 查看.crt 证书详细信息 // 查看证书信息 openssl x509 -in /Users/xiaxveliang/Downloads/getssl.crt -noout -tex ...

  5. kubernetes 证书到期续期

    kubernetes 证书续期 好久没用过以前搭建的集群了,今天想用的时候发现证书到期了 kubeadm 管理集群证书 通过命令kubeadm alpha certs check-expiration ...

  6. 《Kubernetes证书篇:使用TLS bootstrapping简化kubelet证书制作》

    一.背景 Master apiserver启用TLS认证后,Node节点kubelet和kube-proxy要与kube-apiserver进行通信,必须使用CA签发的有效证书才可以,当Node节点很 ...

  7. ansible 建 kubernetes 证书签名请求_最简单的 kubernetes 高可用安装方式!(文末送书)...

    福利 文末留言送 3 本由马哥教育 CEO 马哥(马永亮)撰写的<Kubernetes 进阶实战>,希望大家点击文末的留言小程序积极留言,每个人都有机会. 前言 本文教你如何用一条命令构建 ...

  8. Kubernetes 证书过期

    问题描述: Unable to connect to the server: x509: certificate has expired or is not yet valid 状况如图所示: 解决方 ...

  9. 使用Hbuilder封装APP(含配置证书)详细图文教程

    网站封装成 APP 所需软件 工具:Hbuilder(用于封装) 环境:Java(用于签名) 本机环境:Windows10,.Jdk1.8,Hbuilder1.5.4 网站封装成 APP详细步骤 1. ...

最新文章

  1. CentOS7x64 防火墙配置
  2. SSO模型及单点登录SSO技术选型
  3. 图像数据流识别圆形_人工智能大赛视觉处理(一)图形识别
  4. 实用工具篇(三):Free Mybatis plugin
  5. CoreMail/pku的邮箱如何禁止某个后缀的所有邮箱
  6. java使用itext将图片放到pdf模板的指定位置
  7. linux版微信 能发表情包的,仿微信在对话框文字中插入Emoji表情包
  8. 跨域共享session (实现http跳转https 共享session)
  9. Hibernate多对多映射 - 连接表
  10. bochs2.3.7 调试版本在ubuntu9.10上的编译安装
  11. javax.comm的API
  12. 二、2.4版本之前的apache的安装
  13. 月薪11.5K 土木人零基础转行软件测试工程师,他都经历了什么?
  14. lol2月26日更新后一直提示服务器维护,《lol》2月26日更新了什么 2月26日更新内容一览...
  15. R文本分类之RTextTools
  16. 【优化调度】基于matlab粒子群算法求解梯级水电站调度优化问题【含Matlab源码 065期】
  17. dlna 斐讯r1怎么用_挽救智障——斐讯R1:固件升级、安装DLNA和Soundwire
  18. python参考手册下载_Python中文手册【Word版 】
  19. C#调用系统打印机(XP-58小票打印)
  20. 实现圣杯布局的三种方式

热门文章

  1. mac上安装MySQL
  2. list python 访问 键值对_基础|Python常用知识点汇总(中)
  3. (二)流--递归算法
  4. App-V 4.6中文版首测体验
  5. Charles基本使用
  6. HR数据抽取:通过 Read Master Data 转换规则读取时间相关主属性数据
  7. linux fedora下实现锐捷认证
  8. 战双帕弥什显示服务器满员,战双帕弥什星火和信标服务器有何区别
  9. 惠普打印机怎么无线连接电脑_惠普SPECTRE X360 13笔记本电脑怎么样,值得买吗
  10. 嵌套函数中的this指向的对象