首先
要知道etcd是干什么的,他是用来保存 状态信息 的。并且是一键值对的形式来保存。
我们说kubernetes是无状态的,就是因为其中把数据都存放在etcd中。
然后
etcd、kubernetes、flannel等组件之间的通信,他们都基于一种凭证来互相信任。CA证书。
准备好要用的包
Client Binaries
https://dl.k8s.io/v1.13.1/kubernetes-client-linux-amd64.tar.gz
Server Binaries
https://dl.k8s.io/v1.13.1/kubernetes-server-linux-amd64.tar.gz
Node Binaries
https://dl.k8s.io/v1.13.1/kubernetes-node-linux-amd64.tar.gz
etcd
https://github.com/etcd-io/etcd/releases/download/v3.3.20/etcd-v3.3.20-linux-amd64.tar.gz
flannel
https://github.com/coreos/flannel/releases/download/v0.11.0/flannel-v0.11.0-linux-amd64.tar.gz
操作过程如下:
一、找个地方存文件
例如
mkdir /k8s/etcd/{bin,cfg,ssl} -p
mkdir /k8s/kubernetes/{bin,cfg,ssl} -p
mkdir /usr/lib/systemd/system -p
mkdir /data/etcd -p
这一步完成的时候我们应该可以看到这样的目录结构,先别急着告诉我,你的SSL下面没有东西,现在就来告诉你SSL里面的东西都有哪些,他们是怎么来的,用来干什么。
CA根证书是用签发其他证书的。
换句话说,集群中每个角色,都需要一个属于自己的证书来证明自己的“身份”,那么这么些不同的证书需要有一个“人”来颁发给不同的角色。这个“人”就是CA根证书。
现在,我们来生成CA根证书
一共需要两样东西,一个是CA密钥,一个是csr证书的签发申请。
生成CA根证书的过程可以想象成是这样一个过程:
1、csr申请文件就是一张纸,上面记录了 证书由谁颁发,颁发给谁,有效期限等信息
2、CA根密钥就是一个公章,这个公章由世界公认的机构持有,并且依靠加密技术保证了它没办法被假冒。
3、当一张记录了信息的纸,被盖上了公章,他就成了一张有效的证书了。
该怎么做呢?
有一个工具叫做cfssl,写好配置文件,直接运行命令就能生成你要的文件了。
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
ca配置文件如下
vim /k8s/etcd/ssl/etcd-ca-config.json
或者
cat << EOF | tee etcd-ca-config.json
{
"signing": {
"default": {
"expiry": "87600h"
},
"profiles": {
"etcd": {
"expiry": "87600h",
"usages": [
"signing",
"key encipherment",
"server auth",
"client auth"
]
}
}
}
}
EOF
接下来是ca的csr申请文件的配置文件
cat << EOF | tee etcd-ca-csr.json
{
"CN": "etcd CA",
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"L": "Shenzhen",
"ST": "Guangdong"
}
]
}
EOF
‘CN’:etcd 会从证书中提取该字段作为请求的用户名 (User Name);浏览器使用该字段验证网站是否合法;
该"names"值实际上是名称对象的列表。每个名称对象应至少包含一个“C”,“L”,“O”,“OU”或“ST”值(或这些的任意组合)。
注意!!此处我们还是在配置CA根证书的csr申请,所以用到的选项比较简单,照着图中的做就能满足需要了。
但是后面再配置kubernetes的时候,这些选项会很重要,所以要记清楚了
这些值是:
“C”:国家
“L”:地区或城市(如城市或城镇名称)
“O”:组织 Organization,kube-apiserver从证书中提取该字段作为请求用户所属的组 (Group);
“OU”:组织单位,如负责拥有密钥的部门; 它也可以用于“做生意”(DBS)的名称
“ST”:州或省
有了这两个json文件(ca-config.json和ca-csr.json),我们可以开始执行如下命令
cfssl gencert -initca etcd-ca-csr.json | cfssljson -bare etcd-ca
来生成三个我们需要的文件,如图
因为我的-bare 后面写的是capwd,生成的东西都是capwd系列,其实我本来想写ca
这里的pwd是手误,恰巧顺便解释了-bare 选项的用法。
恭喜你获得了ca根密钥,ca根证书申请签发文件,ca根证书!
我们现在继续利用上面三件“神器”,生成etcd的server证书,同样的思路,我们需要
etcd-server的密钥,签发申请,证书本身。
可以试试换成主机名,写到证书csr里面,有待验证
cat << EOF | tee etcd-server-csr.json
{
"CN": "etcd",
"hosts": [
"172.31.17.128",
"172.31.22.133",
"172.31.26.180"
],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"L": "ShenZhen",
"ST": "GuangDong"
}
]
}
EOF
然后执行
cfssl gencert -ca=etcd-ca.pem -ca-key=etcd-ca-key.pem -config=etcd-ca-config.json -profile=etcd etcd-server-csr.json | cfssljson -bare etcd-server
命令解释和运行结果如图
到了这一步,准备工作暂告一段落。
安装etcd
绝大多数情况下etcd要高可用,也就是这里的三台etcd。
搭建澳邮生产环境的时候,由于一共给了4台服务器,
我因为对架构理解不够透彻,所以纠结要不要每一台node都安装etcd
最后查阅资料得到答案,etcd应该做独立的高可用集群,就是说我有四台node装3个etcd,5台可以选择5个etcd也可以3个etcd。
1、解压etcd,进入解压后的etcd目录,将“etcd”和“etcdctl”两个文件移动到k8s/etcd/bin下
tar -xvf etcd-v3.3.20-linux-amd64.tar.gz
cd etcd-v3.3.20-linux-amd64/
cp etcd etcdctl /k8s/etcd/bin/
2、接下来是etcd的配置文件,如图
vim /k8s/etcd/cfg/etcd.conf
文本范例
#[Member]
ETCD_NAME="etcd01"
ETCD_DATA_DIR="/data/etcd"
ETCD_LISTEN_PEER_URLS="https://172.31.16.198:2380"#本机ip
ETCD_LISTEN_CLIENT_URLS="https://172.31.16.198:2379"#本机ip
#[Clustering]
ETCD_INITIAL_ADVERTISE_PEER_URLS="https://172.31.16.198:2380"#本机ip
ETCD_ADVERTISE_CLIENT_URLS="https://172.31.16.198:2379"#本机ip
ETCD_INITIAL_CLUSTER="etcd01=https://172.31.16.198:2380,etcd02=https://172.31.30.129:2380,etcd03=https://172.31.26.6:2380"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_INITIAL_CLUSTER_STATE="new"
#[Security]
ETCD_CERT_FILE="/k8s/etcd/ssl/etcd-server.pem"
ETCD_KEY_FILE="/k8s/etcd/ssl/etcd-server-key.pem"
ETCD_TRUSTED_CA_FILE="/k8s/etcd/ssl/etcd-ca.pem"
ETCD_CLIENT_CERT_AUTH="true"
ETCD_PEER_CERT_FILE="/k8s/etcd/ssl/etcd-server.pem"
ETCD_PEER_KEY_FILE="/k8s/etcd/ssl/etcd-server-key.pem"
ETCD_PEER_TRUSTED_CA_FILE="/k8s/etcd/ssl/etcd-ca.pem"
ETCD_PEER_CLIENT_CERT_AUTH="true"
写完保存,然后开始写etcd的启动文件
mkdir /usr/lib/systemd/system -p
vim /usr/lib/systemd/system/etcd.service
文本范例:
[Unit]
Description=Etcd Server
After=network.target
After=network-online.target
Wants=network-online.target
[Service]
Type=notify
WorkingDirectory=/data/etcd/
EnvironmentFile=/k8s/etcd/cfg/etcd.conf
# set GOMAXPROCS to number of processors
ExecStart=/bin/bash -c "GOMAXPROCS=$(nproc) /k8s/etcd/bin/etcd --name=\"${ETCD_NAME}\" --data-dir=\"${ETCD_DATA_DIR}\" --listen-client-urls=\"${ETCD_LISTEN_CLIENT_URLS}\" --listen-peer-urls=\"${ETCD_LISTEN_PEER_URLS}\" --advertise-client-urls=\"${ETCD_ADVERTISE_CLIENT_URLS}\" --initial-cluster-token=\"${ETCD_INITIAL_CLUSTER_TOKEN}\" --initial-cluster=\"${ETCD_INITIAL_CLUSTER}\" --initial-cluster-state=\"${ETCD_INITIAL_CLUSTER_STATE}\" --cert-file=\"${ETCD_CERT_FILE}\" --key-file=\"${ETCD_KEY_FILE}\" --trusted-ca-file=\"${ETCD_TRUSTED_CA_FILE}\" --client-cert-auth=\"${ETCD_CLIENT_CERT_AUTH}\" --peer-cert-file=\"${ETCD_PEER_CERT_FILE}\" --peer-key-file=\"${ETCD_PEER_KEY_FILE}\" --peer-trusted-ca-file=\"${ETCD_PEER_TRUSTED_CA_FILE}\" --peer-client-cert-auth=\"${ETCD_PEER_CLIENT_CERT_AUTH}\""
Restart=on-failure
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
部署etcd02节点(etcd03.etcd04…也是一样)
我们之前生成的证书现在派上用场了,把他们全部都复制到etcd02上
此处我们的实际情况是这样,因为我的所有相关文件都在k8s目录下
所以我是整个的打包然后复制给etcd,然后在etcd02上建立所需的目录,修改对应的配置文件即可。
比较简单,我就不放图了,记一下关键命令就好(证书,启动文件,配置文件,目录结构)
------------在etcd01上----------------------
scp /usr/lib/systemd/system/etcd.service 192.168.1.1:/xx/xx
etcd.service没事不用改,基本就只要改etcd.conf就好了
-------------在etcd02上---------------------
mkdir data/etcd #这个是数据目录,配置文件有定义过,如果我们没有自己创建,他不会自己生成
tar -xvf k8s.tar.gz
cd k8s/etcd/cfg
vi etcd.conf
---要改的地方-----
ETCD_NAME=跟etcd01不一样
ETCD_LISTEN_PEER_URLS=本节点的ip+2380端口
ETCD_LISTEN_CLIENT_URLS=本节点的ip+2379端口
ETCD_INITIAL_ADVERTISE_PEER_URLS=本节点的ip+2380端口
ETCD_ADVERTISE_CLIENT_URLS=本节点的ip+2379端口
----------------所有节点都要做的-----------
systemctl daemon-reload
systemctl enable etcd
systemctl start etcd
etcd集群部署的最后一步,检查集群健康状态
/k8s/etcd/bin/etcdctl --ca-file=/k8s/etcd/ssl/etcd-ca.pem --cert-file=/k8s/etcd/ssl/etcd-server.pem --key-file=/k8s/etcd/ssl/etcd-server-key.pem --endpoints="https://172.31.16.198:2379,https://172.31.30.129:2379,https://172.31.26.6:2379" cluster-health
结果这样就ok了