上一篇已经为大家简单介绍了kubernetes集群的架构和做了基本的系统初始化,这一篇我们继续,这篇主要进行证书制作和etcd集群的部署。kubernetes集群的安全严,整个集群的交互都需要很多的证书相互认证,这里通过手动制作证书来完成。etcd作为kubernetes集群的数据存储方式,是基础依赖,需要先部署。
ps: 为了更好的让大家理解集群的整个结构,整个系列部署都是采用二进制包手动部署方式。
整个系列具体会出多少篇博客,也不一定,每有更新,便会在每篇博客的开头,进行导航:
《centos7 kubernetes(k8s)1.12集群部署与使用(一):基础知识介绍和系统初始化》
《centos7 kubernetes(k8s)1.12集群部署与使用(二):证书制作和etcd集群部署》
《centos7 kubernetes(k8s)1.12集群部署与使用(三):master节点部署》
《centos7 kubernetes(k8s)1.12集群部署与使用(四):Node节点部署》
《centos7 kubernetes(k8s)1.12集群部署与使用(五):Flannel网络部署》
整个系列环境:
centos7 服务器3台 1master + 2node
master ip: 192.168.1.1
node1 ip: 192.168.1.2
node2 ip: 192.168.1.3
首先,需要进行ca证书制作,制作证书有很多工具,这里使用比较简单方便的cfssl工具
1. 下载 cfssl 证书制作工具
官方下载地址: https://pkg.cfssl.org/ 。需要下载三个文件,分别是 cfssl_linux-amd64,cfssljson_linux-amd64,cfssl-certinfo_linux-amd64
# 在master上操作, 192.168.1.1 上进行操作
# 下载到cfssl相关工具 到 /usr/local/src 下
cd /usr/local/src
wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64
wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64
wget https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64
# 授权
chmod +x cfssl*
# 将cfssl 移动到 /opt/kubernetes/bin 下面并更名方便使用
mv cfssl_linux-amd64 /opt/kubernetes/bin/cfssl
mv cfssljson_linux-amd64 /opt/kubernetes/bin/cfssljson_linux-amd64
mv cfssl-certinfo_linux-amd64 /opt/kubernetes/bin/cfssl-certinfo
# 将cfssl 文件同步到所有node节点上
scp /opt/kubernetes/bin/cfssl* 192.168.1.2:/opt/kubernetes/bin/
scp /opt/kubernetes/bin/cfssl* 192.168.1.3:/opt/kubernetes/bin/
2. 初始化cfssl
# 在master上 /usr/local/src/ssl 目录下操作
mkdir ssl && cd ssl
cfssl print-defaults config > config.json
cfssl print-defaults csr > csr.json
3. 创建用来生成 CA 文件的 JSON 配置文件
# 在master上 /usr/local/src/ssl 目录下操作
vim ca-config.json
----------------------------------
{
"signing": {
"default": {
"expiry": "23780h" # 过期时间,自定义
},
"profiles": {
"kubernetes": {
"usages": [
"signing",
"key encipherment",
"server auth",
"client auth"
],
"expiry": "23780h" # 同上
}
}
}
}
----------------------------------
4. 创建用来生成 CA 证书签名请求(CSR)的 JSON 配置文件
# 在master上 /usr/local/src/ssl 目录下操作
vim ca-csr.json
----------------------------------
{
"CN": "kubernetes",
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN", # 都可以自定义,国家
"ST": "ShenZhen", # 地区
"L": "ShenZhen", # 城市
"O": "k8s", # 组织名
"OU": "system" # 组织单位
}
]
}
----------------------------------
5. 生成CA证书(ca.pem)和密钥(ca-key.pem)
# 在master上 /usr/local/src/ssl 目录下操作
cfssl gencert -initca ca-csr.json | cfssljson -bare ca
ll ca*
-rw-r--r-- 1 root root 292 Jan 8 12:02 ca-config.json
-rw-r--r-- 1 root root 1009 Jan 8 12:05 ca.csr
-rw-r--r-- 1 root root 215 Jan 8 12:03 ca-csr.json
-rw------- 1 root root 1675 Jan 8 12:05 ca-key.pem
-rw-r--r-- 1 root root 1379 Jan 8 12:05 ca.pem
6. 分发证书
# 在master上 /usr/local/src/ssl 目录下操作
cp ca.csr ca.pem ca-key.pem ca-config.json /opt/kubernetes/ssl/
# 将证书分发到所有node节点上
scp ca.csr ca.pem ca-key.pem ca-config.json 192.168.1.2:/opt/kubernetes/ssl/
scp ca.csr ca.pem ca-key.pem ca-config.json 192.168.1.3:/opt/kubernetes/ssl/
ok,到此,CA证书已经制作完成。下面进行etcd集群的部署
1. 准备etcd软件包
etcd 官方github地址: https://github.com/etcd-io/etcd 。 etcd是独立于kubernetes集群的,但是又是kubernetes集群不可或缺的依赖,部署etcd集群,最少需要三台服务器,这里我们直接将etcd集群和kubernetes集群都部署在相同的三台服务器上,也就是192.168.1.1,192.168.1.2,192.168.1.3 。当然也可以部署在别的服务器上,并不影响,增加节点时,也不需要增加etcd集群的节点。这样部署,主要是节约资源而已,因为我这里的etcd集群只用于kubernetes集群,数据量有限,为了方便节省资源,则部署在一起。当然,实际上随便你,视具体情况而定。
# 在master上 /usr/local/src 目录下操作
wget https://github.com/etcd-io/etcd/releases/download/v3.2.25/etcd-v3.2.25-linux-amd64.tar.gz
tar -zxvf etcd-v3.2.25-linux-amd64.tar.gz
cd etcd-v3.2.25-linux-amd64
# 将二进制文件复制到 /opt/kubernetes/bin ,并分发到其他节点
cp etcd etcdctl /opt/kubernetes/bin/
scp scp etcd etcdctl 192.168.1.2:/opt/kubernetes/bin/
scp scp etcd etcdctl 192.168.1.3:/opt/kubernetes/bin/
2. 创建 etcd 证书签名请求
# 在master上 /usr/local/src/ssl 目录下操作
vim etcd-csr.json
--------------------------------------
{
"CN": "etcd",
"hosts": [
"127.0.0.1",
"192.168.1.1", # 这里需要将集群所有节点的ip写进去
"192.168.1.2",
"192.168.1.3"
],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN", # 同样,都可以自定义,下同
"ST": "ShenZhen",
"L": "ShenZhen",
"O": "k8s",
"OU": "system"
}
]
}
---------------------------------------
3. 生成 etcd 证书和私钥
# 在master上 /usr/local/src/ssl 目录下操作
cfssl gencert -ca=/opt/kubernetes/ssl/ca.pem \
-ca-key=/opt/kubernetes/ssl/ca-key.pem \
-config=/opt/kubernetes/ssl/ca-config.json \
-profile=kubernetes etcd-csr.json | cfssljson -bare etcd
ll etcd*
-rw-r--r-- 1 root root 1074 Jan 8 14:09 etcd.csr
-rw-r--r-- 1 root root 295 Jan 8 14:09 etcd-csr.json
-rw------- 1 root root 1679 Jan 8 14:09 etcd-key.pem
-rw-r--r-- 1 root root 1452 Jan 8 14:09 etcd.pem
4.将证书移动到/opt/kubernetes/ssl目录下
# 在master上 /usr/local/src/ssl 目录下操作
# 复制并分发到所有 etcd 集群节点上(因为我这里etcd集群节点跟k8s集群节点一致所以如下)
cp etcd*.pem /opt/kubernetes/ssl/
scp etcd*.pem 192.168.1.2:/opt/kubernetes/ssl/
scp etcd*.pem 192.168.1.3:/opt/kubernetes/ssl/
5. 设置ETCD配置文件
# 在master上操作
# 分发到每个etcd集群节点上,需要手动修改
vim /opt/kubernetes/cfg/etcd.conf
----------------------------------------------------------------------------
#[member]
ETCD_NAME="etcd-node1" # 节点名称,每个节点都不同,节点名称和ip一一对应
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
#ETCD_SNAPSHOT_COUNTER="10000"
#ETCD_HEARTBEAT_INTERVAL="100"
#ETCD_ELECTION_TIMEOUT="1000"
ETCD_LISTEN_PEER_URLS="https://192.168.1.1:2380" # 每个node都要改成自身本机ip,在192.168.1.2上就要改成192.168.1.2,下面类似
ETCD_LISTEN_CLIENT_URLS="https://192.168.1.1:2379,https://127.0.0.1:2379" # 每个node都要改成自身本机ip
#ETCD_MAX_SNAPSHOTS="5"
#ETCD_MAX_WALS="5"
#ETCD_CORS=""
#[cluster]
ETCD_INITIAL_ADVERTISE_PEER_URLS="https://192.168.1.1:2380" 每个node都要改成自身本机ip
# if you use different ETCD_NAME (e.g. test),
# set ETCD_INITIAL_CLUSTER value for this name, i.e. "test=http://..."
ETCD_INITIAL_CLUSTER="etcd-node1=https://192.168.1.1:2380,etcd-node2=https://192.168.1.2:2380,etcd-node3=https://192.168.1.3:2380" # 这里要写完整个集群的节点名称和和ip,一一对应
ETCD_INITIAL_CLUSTER_STATE="new"
ETCD_INITIAL_CLUSTER_TOKEN="k8s-etcd-cluster"
ETCD_ADVERTISE_CLIENT_URLS="https://192.168.1.1:2379" # 每个node都要改成自身本机ip
#[security]
CLIENT_CERT_AUTH="true"
ETCD_CA_FILE="/opt/kubernetes/ssl/ca.pem"
ETCD_CERT_FILE="/opt/kubernetes/ssl/etcd.pem"
ETCD_KEY_FILE="/opt/kubernetes/ssl/etcd-key.pem"
PEER_CLIENT_CERT_AUTH="true"
ETCD_PEER_CA_FILE="/opt/kubernetes/ssl/ca.pem"
ETCD_PEER_CERT_FILE="/opt/kubernetes/ssl/etcd.pem"
ETCD_PEER_KEY_FILE="/opt/kubernetes/ssl/etcd-key.pem"
----------------------------------------------------------------------------
6.创建ETCD系统服务
# 在master上操作
# 什么都不用改,分发到别的节点上可直接使用
vim /etc/systemd/system/etcd.service
----------------------------------------------------------
[Unit]
Description=Etcd Server
After=network.target
[Service]
Type=simple
WorkingDirectory=/var/lib/etcd
EnvironmentFile=-/opt/kubernetes/cfg/etcd.conf
# set GOMAXPROCS to number of processors
ExecStart=/bin/bash -c "GOMAXPROCS=$(nproc) /opt/kubernetes/bin/etcd"
Type=notify
[Install]
WantedBy=multi-user.target
----------------------------------------------------------
7. 所有etcd集群节点上重载启动etcd集群
# 在master上操作
# 分发etcd配置文件和系统服务文件到所有 etcd节点上。
scp /opt/kubernetes/cfg/etcd.conf 192.168.1.2:/opt/kubernetes/cfg/ # 配置文件分发到别的节点,需要手动改一下,怎么修改见上面第5步
scp /opt/kubernetes/cfg/etcd.conf 192.168.1.3:/opt/kubernetes/cfg/
scp /etc/systemd/system/etcd.service 192.168.1.2:/etc/systemd/system/
scp /etc/systemd/system/etcd.service 192.168.1.3:/etc/systemd/system/
# 在所有 etcd 节点上启动etcd服务
mkdir /var/lib/etcd # 配置文件中数据存放为止,需要手动创建文件夹
systemctl daemon-reload
systemctl enable etcd
systemctl start etcd
# 查看状态
systemctl status etcd
8. 验证集群
# 在master上操作
etcdctl --endpoints=https://192.168.1.1:2379 \
--ca-file=/opt/kubernetes/ssl/ca.pem \
--cert-file=/opt/kubernetes/ssl/etcd.pem \
--key-file=/opt/kubernetes/ssl/etcd-key.pem cluster-health
输出如下:
member 4c62005dec42cd23 is healthy: got healthy result from https://192.168.1.1:2379
member 7a0dacac4b10af69 is healthy: got healthy result from https://192.168.1.2:2379
member 9b1a4796c252096d is healthy: got healthy result from https://192.168.1.3:2379
cluster is healthy
ok,到此,CA证书制作和etcd集群部署就完成了,下一篇,我们进行master节点的部署。 有什么问题或建议欢迎大家留言反馈