Kubernetes部署信息
kubernetes部署版本信息
- OS: CentOS Linux release 7.5.1804 (Core)
- Linux Kernel:4.14.15-1.el7.elrepo.x86_64
- kubernetes: v1.12.2
- etcd: v3.2.22
- docker: docker-ce-18.09.0-3.el7.x86_64
- NetPlugin: Calico
- DNS: CoreDNS
- Proxy-Mode: IPVS
节点信息
- Kube-node1: Master/Node 192.168.5.251
- Kube-node2: Master/Node 192.168.5.252
- Kube-node3: Master/Node 192.168.5.253
- VIP: 192.168.5.250
安装前准备
所有节点互通,可连接互联网,kube-node1可无密码连接kube-node2和kube-node3
- 三台加增加/etc/hosts
- 192.168.5.251 kube-node1
- 192.168.5.252 kube-node2
- 192.168.5.253 kube-node3
关闭Selinux、防火墙和交换分区
1
2
3
4
5
6
7
8
9
10
11
12#禁用selinux
setenforce 0
vim /etc/selinux/config
SELINUX=disabled
#关闭防火墙
systemctl stop firewalld && systemctl disbale firewalld
#关闭交换分区
swapoff -a
yes | cp /etc/fstab /etc/fstab_bak
cat /etc/fstab_bak |grep -v swap > /etc/fstab增加kernel设置
1 | vi /etc/sysctl.conf |
- 如内核版本低于4的先升级内核。参考
同步系统时间
1
2
3yum install ntpdate -y
ntpdate cn.pool.ntp.org设置kube-node1和kube-node2,kube-node3免密码连接
1
2
3
4
5
6#三台机生成密钥对
ssh-keygen -t rsa
#把本地主机的公钥复制到远程主机的authorized_keys文件上
ssh-copy-id -i .ssh/id_rsa.pub kube-node1
ssh-copy-id -i .ssh/id_rsa.pub kube-node2
ssh-copy-id -i .ssh/id_rsa.pub kube-node3
所有节点安装docker-ce
1 | yum install -y yum-utils device-mapper-persistent-data lvm2 |
*注意新版本( docker-ce-18.09)的Docker在CentOS上官方不建议使用Overylay
Linux发行版 | 建议的存储驱动 |
---|---|
Docker CE on Ubuntu | aufs, devicemapper, overlay2 (Ubuntu 14.04.4 or later, 16.04 or later), overlay, zfs, vfs |
Docker CE on Debian | aufs, devicemapper, overlay2 (Debian Stretch), overlay, vfs |
Docker CE on CentOS | devicemapper, vfs |
Docker CE on Fedora | devicemapper, overlay2 (Fedora 26 or later, experimental), overlay (experimental), vfs |
创建Kubernetes集群证书
- kubernetes各组件之间用证书进行加密通讯,所以在创建集群前需要生成证书。本文用cfss来生成证书 https://github.com/cloudflare/cfssl
- 生成的证书及密钥如下:
- 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.kem、admin.pem
Kube-controller、kube-scheduler需要和kube-api部署在同一台服务器上且使用非安全端口通信,不需要证书;kube-proxy可以以daemonset的方式部署到node节点,本次版本以systemd方式部署,下篇文章用Kubeadmin自动部署时使用daemonset方式部署。
安装CFSSL(二进制方式)
1 | wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64 |
创建CA证书
1 | mkdir /root/ssl && cd /root/ssl |
字段说明:
- ca-config.json: 可以定义多个profiles,分别指定不同的使用场景和过期时间;后续在签名证书时用到。
- signing: 表示该证书可以用来签名其它证书;生成的ca.pem证书中 CA=TRUE
- server auth: 表示client可以用该CA对server提供的证书进行验证
- client auth: 表示server可以用该CA对client提供的证书进行验证
创建CA证书签名请求
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18cfssl print-defaults csr > ca-csr.json
#编辑ca-csr.json如下:
{
"CN": "kubernetes",
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"L": "Zhuhai",
"ST": "Guandong",
"O": "k8s",
"OU": "System"
}
]
}
字段说明:
- “CN”: Common Name,kube-apiserver从证书中提取该字段作为请求的用户名(User Name);浏览器使用该字段验证网站是否合法:
- “O”: oranization,kube-apiserver从证书中提取该字段作为请求用户所属的组(Group);
生成CA证书和私钥1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40cfssl gencert -initca ca-csr.json | cfssljson -bare ca
ls
ca-config.json ca.csr ca-csr.json ca-key.pem ca.pem
```bash
#### 创建kubernetes证书
- 创建kubernetes证书签名证求
```bash
cfssl print-defaults csr > kubernetes-csr.json
#编辑 kubernetes-csr.json如下:
{
"CN": "kubernetes",
"hosts": [
"127.0.0.1",
"192.168.5.250",
"192.168.5.251",
"192.168.5.252",
"192.168.5.253",
"10.254.0.1",
"kubernetes",
"kubernetes.default",
"kubernetes.default.svc",
"kubernetes.default.svc.cluster",
"kubernetes.default.svc.cluster.local"
],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"L": "Zhuhai",
"ST": "Guangdong",
"O": "k8s",
"OU": "System"
}
]
}
- 如果hosts字段不为空则需要指定授权使用该证书的IP或域名列表,该证书后续会被kubernetes master和etcd集群使用,所以指定了它们的IP。kubernetes服务IP段为10.254.0.0/24,批定了它的第一个IP(kube-apiserver指定的service-cluster-ip-range)
生成kubernetes证书和私钥
1 | cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes kubernetes-csr.json | cfssljson -bare kubernetes |
创建 admin证书
- 创建admin证书签名请求
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24cfssl print-defaults csr > admin-csr.json
#编辑admin-csr.json文件如下:
{
"CN": "admin",
"hosts": [
],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"L": "Zhuhai",
"ST": "Guangdong",
"O": "system:masters",
"OU": "System"
}
]
}
#生成admin证书和私钥
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes admin-csr.json | cfssljson -bare admin
ls admin*
admin.csr admin-csr.json admin-key.pem admin.pem
创建kube-proxy证书
创建kube-proxy证书签名请求
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23cfssl print-defaults csr > kube-proxy-csr.json
#编辑文件如下:
{
"CN": "system:kube-proxy",
"hosts": [],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"L": "Zhuhai",
"ST": "Guangdong",
"O": "k8s",
"OU": "System"
}
]
}
#生成kube-proxy客户端证书和私钥
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes kube-proxy-csr.json | cfssljson -bare kube-proxy
ls kube-proxy*
kube-proxy.csr kube-proxy-csr.json kube-proxy-key.pem kube-proxy.pemCN指定该证书的User为system:kube-proxy
- kube-apiserver预定义的RoleBinding cluster-admin将User system:kube-proxy与Role system:node-proxier绑定,该Role授予了调用 Proxy相关API的权限
使用cfssl-certinfo命令校验证书
1 | cfssl-certinfo -cert kubernetes.pem |
- 检查subject字段的内容是否和ca-csr.json中的一致
和issuer字段的内容是否和ca-csr.json中的一致
分发证书
1
2
3
4
5
6
7for NODE in kube-node1 kube-node2 kube-node3; do
echo "--- $NODE ---"
ssh ${NODE} "mkdir -p /etc/kubernetes/ssl"
for FILE in ca.pem ca-key.pem kubernetes.pem kubernetes-key.pem kube-proxy.pem kube-proxy-key.pem; do
scp /root/ssl/${FILE} ${NODE}:/etc/kubernetes/ssl
done
done
创建kubeconfig文件
- kubelet kube-proxy等节点进程和kube-apiserver进程通信时需要认证和授权。kubeconfig文件提供认证凭据来访问kube-apiserver
创建 TLS Bootstrapping Token
最后更新: 2023年08月27日 03:06
原始链接: https://blog.icanwen.com/2018/11/14/kubernetes_install_v1/