请选择 进入手机版 | 继续访问电脑版
 找回密码
 立即注册
搜索

本文来自

边缘计算专区

边缘计算专区

人已关注

请添加对本版块的简短描述

精选帖子

k8s apiserver --v  日志级别
k8s apiserver --v 日志级别
0阅读|223人阅读
阿里云CDN计费
阿里云CDN计费
0阅读|500人阅读
信用卡空当接龙
信用卡空当接龙
0阅读|530人阅读
HTTP/1.0和HTTP/1.1、HTTP/2请求对比
HTTP/1.0和HTTP/1.1、HTTP/2请求对比
3阅读|920人阅读

Kubernetes 之 二进制安装(二) 证书详解

[复制链接]
280 abc 发表于 2019-9-20 18:58:52


  1. 前言

  2. 在进行二进制搭建K8S集群前,我们需要梳理通最磨人的一个点,就是各种各样的证书机制。这一步是在安装配置kubernetes的所有步骤中最容易出错也是最难排查问题的一步,而这却刚好是第一步,万事开头难,不要因为这点困难就望而却步。

  3. 一共有多少证书?

  4. 官方文档参考:https://kubernetes.io/docs/setup/certificates/

  5. 先从Etcd算起:

  6. 1、Etcd对外提供服务,要有一套etcd server证书

  7. 2、Etcd各节点之间进行通信,要有一套etcd peer证书

  8. 3、Kube-APIserver访问Etcd,要有一套etcd client证书

  9. 再算kubernetes:

  10. 4、Kube-APIserver对外提供服务,要有一套kube-apiserver server证书

  11. 5、kube-scheduler、kube-controller-manager、kube-proxy、kubelet和其他可能用到的组件,需要访问kube-APIserver,要有一套kube-APIserver client证书

  12. 6、kube-controller-manager要生成服务的service account,要有一对用来签署service account的证书(CA证书)

  13. 7、kubelet对外提供服务,要有一套kubelet server证书

  14. 8、kube-APIserver需要访问kubelet,要有一套kubelet client证书

  15. 加起来共8套,但是这里的“套”的含义我们需要理解。

  16. 同一个套内的证书必须是用同一个CA签署的,签署不同套里的证书的CA可以相同,也可以不同。例如,所有etcd server证书需要是同一个CA签署的,所有的etcd peer证书也需要是同一个CA签署的,而一个etcd server证书和一个etcd peer证书,完全可以是两个CA机构签署的,彼此没有任何关系。这算两套证书。

  17. 为什么同一个“套”内的证书必须是同一个CA签署的

  18. 原因在验证这些证书的一端。因为在要验证这些证书的一端,通常只能指定一个Root CA。这样一来,被验证的证书自然都需要是被这同一个Root CA对应的私钥签署,不然不能通过认证。

  19. 其实实际上,使用一套证书(都使用一套CA来签署)一样可以搭建出K8S,一样可以上生产,但是理清这些证书的关系,在遇到因为证书错误,请求被拒绝的现象的时候,不至于无从下手,而且如果没有搞清证书之间的关系,在维护或者解决问题的时候,贸然更换了证书,弄不好会把整个系统搞瘫。

  20. TLS bootstrapping 简化kubelet证书制作

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

  22. 每个kubelet用到的证书都是独一无二的,因为它要绑定各自的IP地址,于是需要给每个kubelet单独制作证书,如果业务量很大的情况下,node节点会很多,这样一来kubelet的数量也随之增加,而且还会经常变动(增减Node)kubelet的证书制作就成为一件很麻烦的事情。使用TLS bootstrapping就可以省事儿很多。

  23. 工作原理:Kubelet第一次启动的时候,先用同一个bootstrap token作为凭证。这个token已经被提前设置为隶属于用户组system:bootstrappers,并且这个用户组的权限也被限定为只能用来申请证书。 用这个bootstrap token通过认证后,kubelet申请到属于自己的两套证书(kubelet server、kube-apiserver client for kubelet),申请成功后,再用属于自己的证书做认证,从而拥有了kubelet应有的权限。这样一来,就去掉了手动为每个kubelet准备证书的过程,并且kubelet的证书还可以自动轮替更新

  24. 官方文档参考:https://kubernetes.io/docs/tasks/tls/certificate-rotation/

  25. kubelet证书为何不同

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

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

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

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

  30. 正式制作证书

  31. 虽然可以用多套证书,但是维护多套CA实在过于繁杂,这里还是用一个CA签署所有证书。

  32. 需要准备的证书:

  33.     admin-key.pem

  34.     admin.pem

  35.     ca-key.pem

  36.     ca.pem

  37.     kube-proxy-key.pem

  38.     kube-proxy.pem

  39.     kubernetes-key.pem

  40.     kubernetes.pem

  41. 使用证书的组件如下:

  42.     etcd:使用 ca.pem、kubernetes-key.pem、kubernetes.pem

  43.     kube-apiserver:使用 ca.pem、kubernetes-key.pem、kubernetes.pem

  44.     kubelet:使用 ca.pem

  45.     kube-proxy:使用 ca.pem、kube-proxy-key.pem、kube-proxy.pem

  46.     kubectl:使用 ca.pem、admin-key.pem、admin.pem

  47.     kube-controller-manager:使用 ca-key.pem、ca.pem

  48. 我们使用CFSSL来制作证书,它是cloudflare开发的一个开源的PKI工具,是一个完备的CA服务系统,可以签署、撤销证书等,覆盖了一个证书的整个生命周期,后面只用到了它的命令行工具。

  49. 注:一般情况下,K8S中证书只需要创建一次,以后在向集群中添加新节点时只要将/etc/kubernetes/ssl目录下的证书拷贝到新节点上即可。

  50. 下载安装cfssl命令行工具

  51. [root@dong bin]# mkdir -p /usr/local/bin/cfssl
  52. [root@dong bin]# wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64
  53. [root@dong bin]# wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64
  54. [root@dong bin]# wget https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64
  55. [root@dong bin]# chmod +x cfssl*
  56. [root@dong bin]# mv cfssl_linux-amd64 /usr/local/bin/cfssl
  57. [root@dong bin]# mv cfssljson_linux-amd64 /usr/local/bin/cfssljson
  58. [root@dong bin]# mv cfssl-certinfo_linux-amd64 /usr/local/bin/cfssl-certinfo
  59. [root@dong bin]# export PATH=/usr/local/bin:$PATH

  60. 创建CA证书

  61. 创建存放证书目录

  62. [root@dong bin]# mkdir -p /opt/kubernetes/ssl/
  63. [root@dong bin]# cd /opt/kubernetes/ssl/

  64. 创建证书配置文件

  65. [root@dong ssl]# vim ca-config.json
  66. {
  67.   "signing": {
  68.     "default": {
  69.       "expiry": "87600h"
  70.     },
  71.     "profiles": {
  72.       "kubernetes": {
  73.         "usages": [
  74.             "signing",
  75.             "key encipherment",
  76.             "server auth",
  77.             "client auth"
  78.         ],
  79.         "expiry": "87600h"
  80.       }
  81.     }
  82.   }
  83. }

  84. 字段说明:

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

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

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

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

  89. expiry:过期时间

  90. 创建CA证书签名请求文件

  91. [root@dong ssl]# vim ca-csr.json
  92. {
  93.   "CN": "kubernetes",
  94.   "key": {
  95.     "algo": "rsa",
  96.     "size": 2048
  97.   },
  98.   "names": [
  99.     {
  100.       "C": "CN",
  101.       "ST": "BeiJing",
  102.       "L": "BeiJing",
  103.       "O": "k8s",
  104.       "OU": "System"
  105.     }
  106.   ],
  107.     "ca": {
  108.        "expiry": "87600h"
  109.     }
  110. }

  111. 字段说明:

  112. “CN”:Common Name,kube-apiserver 从证书中提取该字段作为请求的用户名 (User Name);浏览器使用该字段验证网站是否合法;

  113. “O”:Organization,kube-apiserver 从证书中提取该字段作为请求用户所属的组 (Group);

  114. 生成CA证书和私钥

  115. [root@dong ssl]# cfssl gencert -initca ca-csr.json | cfssljson -bare ca
  116. [root@dong ssl]# ls | grep ca
  117. ca-config.json
  118. ca.csr
  119. ca-csr.json
  120. ca-key.pem
  121. ca.pem

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

  123. 创建kubernetes证书

  124. 创建kubernetes证书签名请求文件 kubernetes-csr.json

  125. [root@dong ssl]# vim kubernetes-csr.json
  126. {
  127.     "CN": "kubernetes",
  128.     "hosts": [
  129.       "127.0.0.1",
  130.       "192.168.214.88",
  131.       "192.168.214.89",
  132.       "192.168.214.90",
  133.       "192.168.214.200",
  134.       "192.168.214.201",
  135.       "192.168.214.202",
  136.       "10.254.0.1",
  137.       "192.168.214.210",
  138.       "192.168.214.1/24",
  139.       "kubernetes",
  140.       "kube-api.wangdong.com",
  141.       "kubernetes.default",
  142.       "kubernetes.default.svc",
  143.       "kubernetes.default.svc.cluster",
  144.       "kubernetes.default.svc.cluster.local"
  145.     ],
  146.     "key": {
  147.         "algo": "rsa",
  148.         "size": 2048
  149.     },
  150.     "names": [
  151.         {
  152.             "C": "CN",
  153.             "ST": "BeiJing",
  154.             "L": "BeiJing",
  155.             "O": "k8s",
  156.             "OU": "System"
  157.         }
  158.     ]
  159. }

  160. 字段说明:

  161. 如果 hosts 字段不为空则需要指定授权使用该证书的 IP 或域名列表。

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

  163. 我这里的设置包括一个私有镜像仓库,三个etcd,三个master,以上物理节点的IP也可以更换为主机名。

  164. 生成kubernetes证书和私钥

  165. [root@dong ssl]# cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes kubernetes-csr.json | cfssljson -bare kubernetes
  166. [root@dong ssl]# ls |grep kubernetes
  167. kubernetes.csr
  168. kubernetes-csr.json
  169. kubernetes-key.pem
  170. kubernetes.pem

  171. 创建admin证书

  172. 创建admin证书签名请求文件admin-csr.json

  173. [root@dong ssl]# admin-csr.json
  174. {
  175.   "CN": "admin",
  176.   "hosts": [],
  177.   "key": {
  178.     "algo": "rsa",
  179.     "size": 2048
  180.   },
  181.   "names": [
  182.     {
  183.       "C": "CN",
  184.       "ST": "BeiJing",
  185.       "L": "BeiJing",
  186.       "O": "system:masters",
  187.       "OU": "System"
  188.     }
  189.   ]
  190. }

  191. 说明:

  192. 后续 kube-apiserver 使用 RBAC 对客户端(如 kubelet、kube-proxy、Pod)请求进行授权;

  193. kube-apiserver 预定义了一些 RBAC 使用的 RoleBindings,如 cluster-admin 将 Group system:masters 与 Role cluster-admin 绑定,该 Role 授予了调用kube-apiserver 的所有 API的权限;

  194. O指定该证书的 Group 为 system:masters,kubelet 使用该证书访问 kube-apiserver 时 ,由于证书被 CA 签名,所以认证通过,同时由于证书用户组为经过预授权的 system:masters,所以被授予访问所有 API 的权限;

  195. 注:这个admin 证书,是将来生成管理员用的kube config 配置文件用的,现在我们一般建议使用RBAC 来对kubernetes 进行角色权限控制, kubernetes 将证书中的CN 字段 作为User, O 字段作为 Group

  196. 生成admin证书和私钥

  197. [root@dong ssl]# cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes admin-csr.json | cfssljson -bare admin
  198. [root@dong ssl]# ls | grep admin
  199. admin.csr
  200. admin-csr.json
  201. admin-key.pem
  202. admin.pem

  203. 创建kube-proxy证书

  204. 创建 kube-proxy 证书签名请求文件 kube-proxy-csr.json

  205. [root@dong ssl]# vim kube-proxy-csr.json
  206. {
  207.   "CN": "system:kube-proxy",
  208.   "hosts": [],
  209.   "key": {
  210.     "algo": "rsa",
  211.     "size": 2048
  212.   },
  213.   "names": [
  214.     {
  215.       "C": "CN",
  216.       "ST": "BeiJing",
  217.       "L": "BeiJing",
  218.       "O": "k8s",
  219.       "OU": "System"
  220.     }
  221.   ]
  222. }

  223. 说明:

  224. CN 指定该证书的 User 为 system:kube-proxy;

  225. kube-apiserver 预定义的 RoleBinding system:node-proxier 将User system:kube-proxy 与 Role system:node-proxier 绑定,该 Role 授予了调用 kube-apiserver Proxy 相关 API 的权限;

  226. 生成kube-proxy证书和私钥

  227. [root@dong 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
  228. [root@dong ssl]# ls |grep kube-proxy
  229. kube-proxy.csr
  230. kube-proxy-csr.json
  231. kube-proxy-key.pem
  232. kube-proxy.pem

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

  234. [root@dong ssl]# ls | grep pem
  235. admin-key.pem
  236. admin.pem
  237. ca-key.pem
  238. ca.pem
  239. kube-proxy-key.pem
  240. kube-proxy.pem
  241. kubernetes-key.pem
  242. kubernetes.pem

  243. 查看证书信息

  244. [root@master1 ssl]# cfssl-certinfo -cert kubernetes.pem
  245. {
  246.   "subject": {
  247.     "common_name": "kubernetes",
  248.     "country": "CN",
  249.     "organization": "k8s",
  250.     "organizational_unit": "System",
  251.     "locality": "BeiJing",
  252.     "province": "BeiJing",
  253.     "names": [
  254.       "CN",
  255.       "BeiJing",
  256.       "BeiJing",
  257.       "k8s",
  258.       "System",
  259.       "kubernetes"
  260.     ]
  261.   },
  262.   "issuer": {
  263.     "common_name": "kubernetes",
  264.     "country": "CN",
  265.     "organization": "k8s",
  266.     "organizational_unit": "System",
  267.     "locality": "BeiJing",
  268.     "province": "BeiJing",
  269.     "names": [
  270.       "CN",
  271.       "BeiJing",
  272.       "BeiJing",
  273.       "k8s",
  274.       "System",
  275.       "kubernetes"
  276.     ]
  277.   },
  278.   "serial_number": "321233745860282370502438768971300435157761820875",
  279.   "sans": [
  280.     "192.168.214.1/24",
  281.     "kubernetes",
  282.     "kube-api.wangdong.com",
  283.     "kubernetes.default",
  284.     "kubernetes.default.svc",
  285.     "kubernetes.default.svc.cluster",
  286.     "kubernetes.default.svc.cluster.local",
  287.     "127.0.0.1",
  288.     "192.168.214.88",
  289.     "192.168.214.89",
  290.     "192.168.214.90",
  291.     "192.168.214.200",
  292.     "192.168.214.201",
  293.     "192.168.214.202",
  294.     "10.254.0.1",
  295.     "192.168.214.210"
  296.   ],
  297.   "not_before": "2019-03-12T11:26:00Z",
  298.   "not_after": "2029-03-09T11:26:00Z",
  299.   "sigalg": "SHA256WithRSA",
  300.   "authority_key_id": "CB:34:54:33:1F:F4:37:E:E5:94:B7:F5:8A:3D:F4:A4:43:43:E2:7F",
  301.   "subject_key_id": "EC:31:D8:5F:4:E3:6F:C2:7F:DA:A8:F0:BD:A:B9:1F:56:7B:9A:DF",
  302.   "pem": "-----BEGIN CERTIFICATE-----\nMIIExjCCA66gAwIBAgIUOESejeFvtUe1qwPcXOQdC9a6iMswDQYJKoZIhvcNAQEL\nBQAwZTELMAkGA1UEBhMCQ04xEDAOBgNVBAgTB0JlaUppbmcxEDAOBgNVBAcTB0Jl\naUppbmcxDDAKBgNVBAoTA2s4czEPMA0GA1UECxMGU3lzdGVtMRMwEQYDVQQDEwpr\ndWJlcm5ldGVzMB4XDTE5MDMxMjExMjYwMFoXDTI5MDMwOTExMjYwMFowZTELMAkG\nA1UEBhMCQ04xEDAOBgNVBAgTB0JlaUppbmcxEDAOBgNVBAcTB0JlaUppbmcxDDAK\nBgNVBAoTA2s4czEPMA0GA1UECxMGU3lzdGVtMRMwEQYDVQQDEwprdWJlcm5ldGVz\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAteZIJbL5G2ZHEKajyVe7\nv4E1F9K9RzLTxghStRo808QOpVclOkFRHCi2qplrFrQmW4d/5AhJmofdoBuwIe/T\n3UgrhlPj1rWC5DhaG8J7+wOIp62yURslnXE+A+EsXQLXxeKxrbrodNwTmGJHXdGl\nv2pi0lyAgewdnhJHcYTvQbrDvbxpqYOHqKzJ3sqm1TSjnWSI9C1Hk/iF9xmjA4CG\nLDHocnxzNv+T/qSofv0yyGgA/HovlNxP+jSIwaWJu3QHhOxV3k2Bj7i0jSJoq3n9\nDl4co22Ge4SLiI2zPZayt9whzSyUoc5eloYJ1w7INcmfz2gOYl7L3godLg/gI5Eh\nNQIDAQABo4IBbDCCAWgwDgYDVR0PAQH/BAQDAgWgMB0GA1UdJQQWMBQGCCsGAQUF\nBwMBBggrBgEFBQcDAjAMBgNVHRMBAf8EAjAAMB0GA1UdDgQWBBTsMdhfBONvwn/a\nqPC9CrkfVnua3zAfBgNVHSMEGDAWgBTLNFQzH/Q3DuWUt/WKPfSkQ0PifzCB6AYD\nVR0RBIHgMIHdghAxOTIuMTY4LjIxNC4xLzI0ggprdWJlcm5ldGVzghVrdWJlLWFw\naS53YW5nZG9uZy5jb22CEmt1YmVybmV0ZXMuZGVmYXVsdIIWa3ViZXJuZXRlcy5k\nZWZhdWx0LnN2Y4Iea3ViZXJuZXRlcy5kZWZhdWx0LnN2Yy5jbHVzdGVygiRrdWJl\ncm5ldGVzLmRlZmF1bHQuc3ZjLmNsdXN0ZXIubG9jYWyHBH8AAAGHBMCo1liHBMCo\n1lmHBMCo1lqHBMCo1siHBMCo1smHBMCo1sqHBAr+AAGHBMCo1tIwDQYJKoZIhvcN\nAQELBQADggEBADtxejgpSQy913K9YyVLcS2k9bs41mZZbuokyrZiJeJ/CKZKzCo+\ngnF7P9/35IjkNlnYhlpUTTIJbnlQY8mDyKx1AaZOkzr+2djYRpg2vL3E7+CdRldQ\nUpNANSITolInKqboXev8SlLF9Mc/dWqgZzoifezuEkZ+c5KM6MY6MpMDVjVKNBxy\nJTd3bZNaPopop8IWxLAel5IQbzUhooswtzUxUslwKnYYC9tsKc5AgiXdehCnbGNf\nIr6wkK2OJBJStNPqarnpH6FZ6JxJ+qt59SdNhLixOT84HBR7ews/ZCYhQuPaJTy2\nwIb0XOtxILF3JMBNW/n21IyhF0vXsMdLg+o=\n-----END CERTIFICATE-----\n"
  303. }

  304. 在搭建k8s集群的时候,将这些文件分发到至此集群中其他节点机器中即可。至此,TLS证书创建完毕。
复制代码
https://blog.51cto.com/13210651/2361208
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表