前一篇: k8s 二进制部署之系统初始化配置 后一篇:k8s 二进制部署之 node 安装 docker

Etcd 介绍

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 服务器。

2.1 证书生成工具

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

2.2 证书工作目录

创建工作目录,进入工作目录。这个目录作用存放证书,并将证书 copy 到集群服务器

mkdir -p ~/TLS/etcd
cd ~/TLS/etcd

2.3 自签证书颁发机构(CA)

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 -

2.4 签发 Etcd https 证书

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.1 下载

首先下载 Etcd 软件包,然后进行解压,这里使用的是 3.4.9 版本。下载地址

tar zxvf etcd-v3.4.9-linux-amd64.tar.gz

3.2 工作目录

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

3.3 systemd 管理 etcd

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 集群中的单个节点已经部署成功,接下来处理剩余节点

4.1 cp 工作目录

scp -r /opt/etcd/ root@192.168.91.131:/opt/
scp -r /opt/etcd/ root@192.168.91.132:/opt/

/opt/etcd/ : etcd 配置、证书、可执行文件

4.2 cp etcd systemd

scp /usr/lib/systemd/system/etcd.service root@192.168.91.131:/usr/lib/systemd/system/
scp /usr/lib/systemd/system/etcd.service root@192.168.91.132:/usr/lib/systemd/system/

/usr/lib/systemd/system/etcd.service : etcd systemd

4.3 修改 etcd 配置

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

4.4 检测集群

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

2 . 看到如下输出,说明 etcd 集群部署成功。

k8s etcd属于哪个namespace k8s部署etcd_k8s

调试

当部署出现错误时,可根据下面一些命令,进行调试排查解决

tail /var/log/messages -f
ps -ef|grep etcd