前一篇: k8s 二进制部署之系统初始化配置
后一篇:k8s 二进制部署之 node 安装 docker
Etcd 是一个分布式键值存储系统,Kubernetes 使用 Etcd 进行集群资源数据的存储,所以先准备一个 Etcd 数据库。
为解决 Etcd 单点故障,应采用集群方式部署,一般使用 3 台组建集群,可容忍 1 台机器故障。生产环境一般使用 5 台组建集群,可容忍 2 台机器故障。
Etcd部署可以与 k8s 节点机器复用。也可以独立于 k8s 集群之外部署,只要能与 k8s master 连接到就行。
生产环境一般都会将 Etcd 单独部署,不与 k8s 服务器复用,或者上云。
k8s 部署前必须部署 etcd ,部署 k8s 时会连接 etcd,是一种依赖。
节点名称 | IP |
---|---|
etcd-1 | 192.168.91.130 |
etcd-2 | 192.168.91.131 |
etcd-3 | 192.168.91.132 |
因为 Etcd 集群直接通讯使用 https 方式,Etcd 对于 k8s apiserver 也需要进行加密访问使用 https。
在任意一台服务器操作即可,应为证书生成后需要 cp 到 Etcd 集群中的每台服务器于 k8s master 服务器。
cfssl 是一个开源的证书管理工具,使用 json 文件生成证书,相比 openssl 更方便使用。
首先,下载工具,再赋予操作权限,最后移动到 bin 目录方便使用。
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_linux-amd64 cfssljson_linux-amd64 cfssl-certinfo_linux-amd64
mv cfssl_linux-amd64 /usr/local/bin/cfssl
mv cfssljson_linux-amd64 /usr/local/bin/cfssljson
mv cfssl-certinfo_linux-amd64 /usr/bin/cfssl-certinfo
注意:没有 wget 的同学使用命令先安装 wget, yum -y install wget
创建工作目录,进入工作目录。这个目录作用存放证书,并将证书 copy 到集群服务器
mkdir -p ~/TLS/etcd
cd ~/TLS/etcd
1 . CA 机构的一些属性,这几设置 10 年,当然也可以设置 100 年 200 年
cat > ca-config.json << EOF
{
"signing": {
"default": {
"expiry": "87600h"
},
"profiles": {
"www": {
"expiry": "87600h",
"usages": [
"signing",
"key encipherment",
"server auth",
"client auth"
]
}
}
}
}
EOF
cat > ca-csr.json << EOF
{
"CN": "etcd CA",
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"L": "Beijing",
"ST": "Beijing"
}
]
}
EOF
注意:检查一下服务器之间的时间是否同步,否则生成的证书会有问题
2 . 生成 CA 证书
根据 CA 信息生成证书,执行命令后会生成 ca.pem 和 ca-key.pem 文件,即根证书。
cfssl gencert -initca ca-csr.json | cfssljson -bare ca -
1 . 创建证书申请文件,hosts 字段中 IP 为所有 Etcd 节点的集群内部通信 IP,一个都不能少!为了方便后期扩容可以多写几个预留的 IP 。
cat > server-csr.json << EOF
{
"CN": "etcd",
"hosts": [
"192.168.91.130",
"192.168.91.131",
"192.168.91.132"
],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"L": "BeiJing",
"ST": "BeiJing"
}
]
}
EOF
hosts:这一项是最关键的,一定要包含每个节点的 IP。
key:证书的加密算法
names:证书的一些属性
2 . 生成证书
执行下面命令,会生成 server.pem 和 server-key.pem 文件。
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=www server-csr.json | cfssljson -bare server
首先下载 Etcd 软件包,然后进行解压,这里使用的是 3.4.9 版本。下载地址
tar zxvf etcd-v3.4.9-linux-amd64.tar.gz
1 . 创建 Etcd 工作目录(存放证书、etcd 配置、etcd 可执行文件)
mkdir /opt/etcd/{bin,cfg,ssl} -p
2 . 将生成的 etcd 证书 cp 到 etcd 工作目录下的 ssl 目录(包括 ca 应为 自签)
cp ~/TLS/etcd/ca*pem ~/TLS/etcd/server*pem /opt/etcd/ssl/
3 . 将 etcd etcdctl 可执行文件移动到 etcd 的 bin 工作目录下
mv etcd-v3.4.9-linux-amd64/{etcd,etcdctl} /opt/etcd/bin/
4 . 创建 etcd 配置文件,存放到 etcd 工作目录
cat > /opt/etcd/cfg/etcd.conf << EOF
#[Member]
ETCD_NAME="etcd-1"
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
ETCD_LISTEN_PEER_URLS="https://192.168.91.130:2380"
ETCD_LISTEN_CLIENT_URLS="https://192.168.91.130:2379"
#[Clustering]
ETCD_INITIAL_ADVERTISE_PEER_URLS="https://192.168.91.130:2380"
ETCD_ADVERTISE_CLIENT_URLS="https://192.168.91.130:2379"
ETCD_INITIAL_CLUSTER="etcd-1=https://192.168.91.130:2380,etcd-2=https://192.168.91.131:2380,etcd-3=https://192.168.91.132:2380"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_INITIAL_CLUSTER_STATE="new"
ETCD_ENABLE_V2="true"
EOF
ETCD_NAME:节点名称,集群中唯一(当前节点 etcd 名称)
ETCD_DATA_DIR:数据目录
ETCD_LISTEN_PEER_URLS:集群通信监听地址(当前节点地址)
ETCD_LISTEN_CLIENT_URLS:客户端访问监听地址(当前节点地址)
ETCD_INITIAL_ADVERTISE_PEERURLS:集群通告地址(当前节点地址)
ETCD_ADVERTISE_CLIENT_URLS:客户端通告地址(当前节点地址)
ETCD_INITIAL_CLUSTER:集群节点地址
ETCD_INITIALCLUSTER_TOKEN:集群Token
ETCD_INITIALCLUSTER_STATE:加入集群的当前状态,new是新集群,existing表示加入已有集群
ETCD_ENABLE_V2=“true”:V3中开启V2 API
1 . 创建服务文件
cat > /usr/lib/systemd/system/etcd.service << EOF
[Unit]
Description=Etcd Server
After=network.target
After=network-online.target
Wants=network-online.target
[Service]
Type=notify
EnvironmentFile=/opt/etcd/cfg/etcd.conf
ExecStart=/opt/etcd/bin/etcd \
--cert-file=/opt/etcd/ssl/server.pem \
--key-file=/opt/etcd/ssl/server-key.pem \
--peer-cert-file=/opt/etcd/ssl/server.pem \
--peer-key-file=/opt/etcd/ssl/server-key.pem \
--trusted-ca-file=/opt/etcd/ssl/ca.pem \
--peer-trusted-ca-file=/opt/etcd/ssl/ca.pem \
--logger=zap
Restart=on-failure
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
EOF
2 . 启动并设置开机启动
systemctl daemon-reload
systemctl start etcd
systemctl enable etcd
此时启动会报异常,因为集群中只有一台,其他节点部署成功后,即可正常
此时 etcd 集群中的单个节点已经部署成功,接下来处理剩余节点
scp -r /opt/etcd/ [email protected]:/opt/
scp -r /opt/etcd/ [email protected]:/opt/
/opt/etcd/ : etcd 配置、证书、可执行文件
scp /usr/lib/systemd/system/etcd.service [email protected]:/usr/lib/systemd/system/
scp /usr/lib/systemd/system/etcd.service [email protected]:/usr/lib/systemd/system/
/usr/lib/systemd/system/etcd.service : etcd systemd
1 . 修改配置文件(部分配置修改为当前服务器),集群中的每个节点,都需要根据自己服务器信息进行修改
vi /opt/etcd/cfg/etcd.conf
#[Member]
ETCD_NAME="etcd-1" # 修改此处,节点2改为etcd-2,节点3改为etcd-3
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
ETCD_LISTEN_PEER_URLS="https://192.168.31.71:2380" # 修改此处为当前服务器IP
ETCD_LISTEN_CLIENT_URLS="https://192.168.31.71:2379" # 修改此处为当前服务器IP
#[Clustering]
ETCD_INITIAL_ADVERTISE_PEER_URLS="https://192.168.31.71:2380" # 修改此处为当前服务器IP
ETCD_ADVERTISE_CLIENT_URLS="https://192.168.31.71:2379" # 修改此处为当前服务器IP
ETCD_INITIAL_CLUSTER="etcd-1=https://192.168.31.71:2380,etcd-2=https://192.168.31.72:2380,etcd-3=https://192.168.31.73:2380"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_INITIAL_CLUSTER_STATE="new"
2 . 启动并设置开机启动
systemctl daemon-reload
systemctl start etcd
systemctl enable etcd
1 . 所有节点部署完成后,需检查集群状态是否正常,在 etcd 集群中任意节点执行即可。
ETCDCTL_API=3 /opt/etcd/bin/etcdctl --cacert=/opt/etcd/ssl/ca.pem --cert=/opt/etcd/ssl/server.pem --key=/opt/etcd/ssl/server-key.pem --endpoints="https://192.168.91.130:2379,https://192.168.91.131:2379,https://192.168.91.132:2379" endpoint health --write-out=table
当部署出现错误时,可根据下面一些命令,进行调试排查解决
tail /var/log/messages -f
ps -ef|grep etcd