如何部署etcd为高可用步骤和命令及配置
部署etcd为高可用的大致步骤和命令及配置如下:
1.在三个master节点上安装etcd二进制文件,并创建etcd用户和组。具体命令如下:
下载etcd二进制文件并解压:
wget https://github.com/etcd-io/etcd/releases/download/v3.5.0/etcd-v3.5.0-linux-amd64.tar.gz && tar -xvf etcd-v3.5.0-linux-amd64.tar.gz
将etcd和etcdctl拷贝到/usr/local/bin目录下:
cp etcd-v3.5.0-linux-amd64/etcd /usr/local/bin && cp etcd-v3.5.0-linux-amd64/etcdctl /usr/local/bin
创建etcd用户和组:
useradd -r -M -s /sbin/nologin etcd && chown etcd:etcd /usr/local/bin/{etcd,etcdctl}
创建数据目录和证书目录:
mkdir -p /var/lib/etcd && mkdir -p /etc/etcd/pki && chown etcd:etcd /var/lib/etcd
2.在每个master节点上生成etcd证书和密钥,并拷贝到/etc/etcd/pki目录下。具体命令如下:
安装cfssl工具:
curl -L https://pkg.cfssl.org/R1.2/cfssl_linux-amd64 > cfssl && chmod +x cfssl && mv cfssl /usr/local/bin
安装cfssljson工具:
curl -L https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64 > cfssljson && chmod +x cfssljson && mv cfssljson /usr/local/bin
创建ca-config.json文件,指定CA证书的策略
{ "signing": { "default": { "expiry": "87600h" }, "profiles": { "server": { "expiry": "87600h", "usages": [ "signing", "key encipherment", "server auth" ] }, "client": { "expiry": "87600h", "usages": [ "signing", "key encipherment", "client auth" ] }, "peer": { "expiry": "87600h", "usages": [ "signing", "key encipherment", "server auth", "client auth" ] } } } }
创建ca-csr.json文件,指定CA证书的请求信息:
{ "CN": "etcd-ca", "key": { "algo": "rsa", "size": 2048 }, "names": [ { "C": "CN", "L": "Beijing", "O": "etcd", "OU": "etcd Security", "ST": "Beijing" } ] }
生成CA证书和密钥:
cfssl gencert --initca=true ca-csr.json | cfssljson --bare ca
创建etcd-csr.json文件,指定服务器端证书的请求信息,其中需要替换IP地址为每个节点的实际IP地址:
{ "CN": "etcd", "key": { "algo": "rsa", "size": 2048 }, "hosts": [ "127.0.0.1", "192.168.3.165", "192.168.3.166", "192.168.3.167" ], "names": [ { "C": "CN", "L": "Beijing", "O": "etcd", "OU": "etcd Security", "ST": "Beijing" } ] }
生成服务器端证书和密钥:
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=peer etcd-csr.json | cfssljson -bare server
拷贝证书和密钥到/etc/etcd/pki目录下:
cp ca.pem server.pem server-key.pem /etc/etcd/pki
3.在每个master节点上创建etcd配置文件/etc/etcd/etcd.conf,指定集群成员、监听地址、证书路径等参数。
创建etcd配置文件/etc/etcd/etcd.conf
######################################################### ########### 请根据各节点服务器实际情况修改配置 ############ ######################################################### #[Member] #1.节点名称,必须唯一 ETCD_NAME="etcd01" #2.设置数据保存的目录 ETCD_DATA_DIR="/var/lib/etcd" #3.本节点机器用于监听其他节点的url,url是本机上的2380 #ETCD_LISTEN_PEER_URLS="http://192.168.3.165:2380" #4.建议本节点用于和其他节点之间通信的url,且会通告集群的其余成员节点 #ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.3.165:2380" #5.本节点机器用于和客户端通信的url,url是本机上的 2379 #ETCD_LISTEN_CLIENT_URLS="http://192.168.3.165:2379,http://127.0.0.1:2379" #[Clustering] #6.建议本节点和客户端通信使用的url #ETCD_ADVERTISE_CLIENT_URLS="http://192.168.3.165:2379" #7.集群中所有节点的信息 ETCD_INITIAL_CLUSTER="etcd01=https://192.168.3.165:2380,etcd02=https://192.168.3.166:2380,etcd03=https://192.168.3.167:2380" #8.创建集群的token,这个值每个集群均相同 ETCD_INITIAL_CLUSTER_TOKEN="148e7b13-51fc-4cc8-965b-a7c9d58c18f5" #9.初始集群状态,新建集群的时候,这个值为new,后续再启动时需要将“new”更改为“existing” #ETCD_INITIAL_CLUSTER_STATE="existing" #10.flannel操作etcd使用的是v2的API,而kubernetes操作etcd使用的v3的API # 为了兼容flannel,将默认开启v2版本,故配置文件中设置 #ETCD_ENABLE_V2="true" # [Security] ETCD_TRUSTED_CA_FILE="/etc/etcd/pki/ca.pem" ETCD_CERT_FILE="/etc/etcd/pki/server.pem" ETCD_KEY_FILE="/etc/etcd/pki/server-key.pem" ETCD_PEER_TRUSTED_CA_FILE="/etc/etcd/pki/ca.pem" ETCD_PEER_CERT_FILE="/etc/etcd/pki/server.pem" ETCD_PEER_KEY_FILE="/etc/etcd/pki/server-key.pem" ETCD_CLIENT_CERT_AUTH="true" ETCD_AUTO_TLS="true" ETCD_PEER_CLIENT_CERT_AUTH="true" ETCD_PEER_AUTO_TLS="true"
4.在每个master节点上创建etcd服务文件/usr/lib/systemd/system/etcd.service,并启动并检查服务状态。
创建etcd服务文件/usr/lib/systemd/system/etcd.service
[Service] Type=notify WorkingDirectory=/var/lib/etcd/ EnvironmentFile=/etc/etcd/etcd.conf ExecStart=/usr/local/bin/etcd \ --listen-peer-urls https://192.168.3.165:2380 \ --listen-client-urls https://192.168.3.165:2379,http://127.0.0.1:2379 \ --advertise-client-urls https://192.168.3.165:2379 \ --initial-advertise-peer-urls https://192.168.3.165:2380 \ --initial-cluster-state new Restart=on-failure RestartSec=5 [Install] WantedBy=multi-user.target
5.在每个master节点上验证etcd集群是否正常工作,参见 etcd集群由3台服务器组成,分别是192.168.3.165-167,如何验证etcd集群已经可以工作了
6.在每个master节点上安装kubeadm、kubelet和kubectl,并初始化kubernetes集群,使用kubeadm init --control-plane-endpoint "master.k8s.io:6443" --upload-certs --pod-network-cidr=10.x.x.x/x --service-cidr=10.x.x.x/x --apiserver-cert-extra-sans="192.xxx.xxx.xxx"
-v=5 --ignore-preflight-errors=all -v=5 > kubeadm.log命令,其中指定外部的VIP地址和端口作为控制平面端点,以及外部的etcd集群地址作为–external-etcd-endpoints参数。
7.在其他两个master节点上加入kubernetes集群,使用kubeadm join master.k8s.io:6443 -v=5 > kubeadm.log 命令,其中指定–control-plane参数以及之前生成的token和证书密钥。
在node节点上加入kubernetes集群,使用kubeadm join master.k8s.io:6443 -v=5 > kubeadm.log 命令,其中指定之前生成的token。
在任意一个master节点上安装网络插件flannel或calico,并验证集群是否正常工作。