k8s从1.8版本开始,集群中各个组件需要使用TLS证书对通信进行加密,每个k8s集群都需要有独立的CA证书体系,这里我们采用比较常用的CloudFlare 的 PKI 工具集 cfssl 来生成 Certificate Authority (CA) 证书和秘钥文件,CA 是自签名的证书,用来签名后续创建的其它 TLS 证书。
使用证书的组件如下:
  • etcd:使用 ca.pem、etcd-key.pem、etcd.pem;(etcd对外提供服务、节点间通信(etcd peer)使用同一套证书)
  • kube-apiserver:使用 ca.pem、ca-key.pem、kube-apiserver-key.pem、kube-apiserver.pem;
  • kubelet:使用 ca.pem ca-key.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、kube-controller-manager.pem、kube-controller-manager-key.pem;
  • kube-scheduler:使用ca-key.pem、ca.pem、kube-scheduler-key.pem、kube-scheduler.pem;

1)安装cfssl

生成证书时可在任一节点完成,这里在k8s-master01主机执行,证书只需要创建一次即可,以后在向集群中添加新节点时只要将 /etc/kubernetes/ssl 目录下的证书拷贝到新节点上即可。
[root@k8s-master01 ~]# mkdir k8s/cfssl -p
[root@k8s-master01 ~]# cd k8s/cfssl/
[root@k8s-master01 cfssl]# wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64
[root@k8s-master01 cfssl]# chmod +x cfssl_linux-amd64
[root@k8s-master01 cfssl]# cp cfssl_linux-amd64 /usr/local/bin/cfssl
[root@k8s-master01 cfssl]# wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64
[root@k8s-master01 cfssl]# chmod +x cfssljson_linux-amd64
[root@k8s-master01 cfssl]# cp cfssljson_linux-amd64 /usr/local/bin/cfssljson
[root@k8s-master01 cfssl]# wget https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64
[root@k8s-master01 cfssl]# chmod +x cfssl-certinfo_linux-amd64
[root@k8s-master01 cfssl]# cp cfssl-certinfo_linux-amd64 /usr/local/bin/cfssl-certinfo
2)创建CA根证书

由于维护多套CA实在过于繁杂,这里CA证书用来签署集群其它组件的证书
这个文件中包含后面签署etcd、kubernetes等其它证书的时候用到的配置
[root@k8s-master01 ~]# vim /opt/k8s/certs/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: 表示证书过期时间,我们设置10年,当然你如果比较在意安全性,可以适当减少
3) 创建 CA 证书签名请求模板

[root@k8s-master01 ~]# vim /opt/k8s/certs/ca-csr.json
{
"CN": "kubernetes",
"key": {
"algo": "rsa",
"size":
},
"names": [
{
"C": "CN",
"ST": "ShangHai",
"L": "ShangHai",
"O": "k8s",
"OU": "System"
}
]
}
4)生成CA证书、私钥和csr证书签名请求
该命令会生成运行CA所必需的文件ca-key.pem(私钥)和ca.pem(证书),还会生成ca.csr(证书签名请求),用于交叉签名或重新签名。

[root@k8s-master01 ~]# cd /opt/k8s/certs/
[root@k8s-master01 certs]# cfssl gencert -initca /opt/k8s/certs/ca-csr.json | cfssljson -bare ca
// :: [INFO] generating a new CA key and certificate from CSR
// :: [INFO] generate received request
// :: [INFO] received CSR
// :: [INFO] generating key: rsa-
// :: [INFO] encoded CSR
// :: [INFO] signed certificate with serial number 546879892516414984619692113039590478695154941398

5)分发证书

可采用scp直接传输到所有节点,我这里还是采用ansible

[root@k8s-master01 certs]# ansible k8s-all -m copy -a 'src=/opt/k8s/certs/ca.csr dest=/etc/kubernetes/ssl/'
[root@k8s-master01 certs]# ansible k8s-all -m copy -a 'src=/opt/k8s/certs/ca-key.pem dest=/etc/kubernetes/ssl/'
[root@k8s-master01 certs]# ansible k8s-all -m copy -a 'src=/opt/k8s/certs/ca.pem dest=/etc/kubernetes/ssl/'

最新文章

  1. Entity Framework 6 Recipes 2nd Edition(10-1)译->非Code Frist方式返回一个实体集合
  2. wex5 实战 框架拓展之2 事件派发与data刷新
  3. Google公布了禁用Chrome插件后的新解决方案
  4. struct 理解 (需要经常理解)
  5. mysqldump使用
  6. 生产者-消费者模型的3种Java实现:synchronized,signal/notifyAll及BlockingQueue
  7. 8、Khala的设备间管理+通信
  8. nodejs教程:安装express及配置app.js文件
  9. shiro.ini 配置详解
  10. 常用的user32说明
  11. vue 学习
  12. CMDB资产管理系统开发【day26】:admin action
  13. 9.12 翻译系列:数据注解特性之ConcurrencyCheck【EF 6 Code-First系列】
  14. 解决winfrom下TextBox不支持透明背景色
  15. Android Netty Client
  16. Virus
  17. box2d 易错
  18. Socket-IO 系列(三)基于 NIO 的同步非阻塞式编程
  19. jmeter进行https协议的测试
  20. Delphi TFileStream 打开模式与共享模式

热门文章

  1. 03_Elastic部署
  2. Gluon学习03-基础数据类型Ndarray
  3. yii2.0场景的简单使用
  4. python eval的用法
  5. tab切换里面做轮播图
  6. JAVA RDD 介绍
  7. 【分类算法】朴素贝叶斯(Naive Bayes)
  8. win10安装RabbitMQ
  9. 阶段5 3.微服务项目【学成在线】_day17 用户认证 Zuul_12-用户退出-服务端
  10. python中os.popen, os.system()区别