Kubernetes介绍之ETCD集群搭建
这篇开始介绍Kubernetes的相关内容,从搭建etcd集群入手。etcd 是 Kubernetes 集群的数据核心,因此围绕 etcd 相关的运维知识就比较重要。etcd 可以容器化部署,也可以在宿主机自行搭建。
注意:集群所用机器最好在同一个内网。本人最初使用不在一个区域的阿里云ECS,只能用外网ip进行配置,会导致节点无法通信。改为使用三台在同一交换机下的机器,则顺利完成部署。
一、ETCD单节点安装
1.1 CentOS下的安装
CentOS安装过程比较简单,直接使用yum命令安装即可:
$ yum install etcd -y
1.2 Ubuntu下的安装
安装过程参考的是etcd官网,链接:https://github.com/etcd-io/etcd/releases
安装路径可以在命令中设置,建议集群内的节点统一路径,方便后期进行各种配置,提高部署效率,执行的命令如下:
$ ETCD_VER=v3.3.11
$ GOOGLE_URL=https://storage.googleapis.com/etcd
$ GITHUB_URL=https://github.com/etcd-io/etcd/releases/download
$ DOWNLOAD_URL=${GOOGLE_URL}
$ rm -f /tmp/etcd-${ETCD_VER}-linux-amd64.tar.gz
$ rm -rf /tmp/etcd-download-test && mkdir -p /tmp/etcd-download-test
$ curl -L ${DOWNLOAD_URL}/${ETCD_VER}/etcd-${ETCD_VER}-linux-amd64.tar.gz -o /tmp/etcd-${ETCD_VER}-linux-amd64.tar.gz
$ tar xzvf /tmp/etcd-${ETCD_VER}-linux-amd64.tar.gz -C /tmp/etcd-download-test --strip-components=1
$ rm -f /tmp/etcd-${ETCD_VER}-linux-amd64.tar.gz
$ /tmp/etcd-download-test/etcd --version
$ ETCDCTL_API=3 /tmp/etcd-download-test/etcdctl version
如果可以正确显示etcd的版本信息,说明安装成功。
1.3 单节点运行
使用下面的命令行即可。运行后,可以通过"cat /var/log/etcd.log"查看运行日志。
$ etcd --name etcd --data-dir /var/lib/etcd/default.etcd --listen-client-urls http://0.0.0.0:2389 --advertise-client-urls http://0.0.0.0:2389 >> /var/log/etcd.log 2>&1 &
二、http连接方式的集群部署
为了避免不必要的问题,建议部署etcd时宿主机采用统一的系统,下文中的所有集群节点均基于CentOS系统。
节点信息如下:
主机名 | 节点名 | 主机ip |
---|---|---|
k8s-master | etcd-1 | 172.24.211.217 |
k8s-node-1 | etcd-2 | 172.24.211.218 |
k8s-node-2 | etcd-3 | 172.24.211.219 |
2.1 各节点添加hosts
首先,分别设置固定主机名称,然后重新登录:
hostnamectl set-hostname k8s-master
hostnamectl set-hostname k8s-node-1
hostnamectl set-hostname k8s-node-2
然后,如果 DNS 不支持解析主机名称,则需要修改每台机器的 /etc/hosts 文件,添加主机名和 IP 的对应关系:
cat >> /etc/hosts <<EOF
172.24.211.217 k8s-master
172.24.211.218 k8s-node-1
172.24.211.219 k8s-node-2
EOF
2.2 添加信任关系
无特殊说明,本文的所有操作均在 k8s-master 节点上执行,然后远程分发文件和执行命令,所以需要添加该节点到其它节点的 ssh 信任关系。
设置 k8s-master 的 root 账户可以无密码登录所有节点(此过程需要进行输入密码等操作):
$ ssh-keygen -t rsa
$ ssh-copy-id root@k8s-master
$ ssh-copy-id root@k8s-node-1
$ ssh-copy-id root@k8s-node-1
2.4 单机安装ETCD
完成上述准备工作后,参照本文第一部分,在三台机器上分别安装好单机版的ETCD即可。
2.5 集群配置及启动
1)修改etcd.conf: vim /etc/etcd/etcd.conf
完成2.4的工作后,每台机器上都会有/etc/etcd文件夹,下面有一个etcd.conf文件,此文件里面有默认的配置(很多配置未开放,被默认注释了),需要对该文件进行一定的修改,具体配置项如下:
#[Member]
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
ETCD_LISTEN_PEER_URLS="http://172.24.211.217:2380"
ETCD_LISTEN_CLIENT_URLS="http://172.24.211.217:2379,http://127.0.0.1:2379"
ETCD_NAME="etcd-1"
#[Clustering]
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://172.24.211.217:2380"
ETCD_ADVERTISE_CLIENT_URLS="http://172.24.211.217:2379"
ETCD_INITIAL_CLUSTER="etcd-1=http://172.24.211.217:2380,etcd-2=http://172.24.211.218:2380,etcd-3=http://172.24.211.219:2380"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
#注意:最先启动的那台机器STATE设置为new,其他设置为existing
ETCD_INITIAL_CLUSTER_STATE="new"
2)修改etcd.service:vim /usr/lib/systemd/system/etcd.service
为了可以使用systemd命令启动etcd,需要进一步配置etcd.service文件,具体配置如下:
[Unit]
Description=Etcd Server
After=network.target
After=network-online.target
Wants=network-online.target
[Service]
Type=notify
WorkingDirectory=/var/lib/etcd/
EnvironmentFile=-/etc/etcd/etcd.conf
#set GOMAXPROCS to number of processors
ExecStart=/usr/bin/etcd
Restart=on-failure
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
3)启动集群
$systemctl daemon-reload
$systemctl start etcd
$etcdctl member list
如果集群启动成功,可以看到如下的集群信息:
三、https连接方式的集群部署(根据需求选择性执行,非生产环境可忽略)
如果已经成功完成http连接方式的部署,进一步进行https连接方式的集群部署时并不复杂,主要工作是制作各种证书以及修改配置加载证书。
这部分的内容主要参考自:https://github.com/opsnull/follow-me-install-kubernetes-cluster
3.1 准备工作
- 创建几个将会用到的文件夹:
mkdir -p /opt/k8s/{bin,work} /etc/{kubernetes,etcd}/cert
- 安装依赖包(包含用于软件包签名的 gpg 密钥和软件源的信息):
yum install -y epel-release
- 安装其他依赖包,有些包不是必须安装[其中,ntp保证集群时间同步,ipvs 依赖 ipset]:
yum install -y conntrack ntpdate ntp ipvsadm ipset jq iptables curl sysstat libseccomp wget
- 关闭防火墙:
systemctl stop firewalld && systemctl disable firewalld
- 加载内核模块:
modprobe ip_vs_rr && modprobe br_netfilter
- 设置系统时区:
timedatectl set-timezone Asia/Shanghai && timedatectl set-local-rtc 0 && systemctl restart rsyslog && systemctl restart crond
3.2 创建证书、编辑配置文件
生成证书等操作可以在主节点进行,然后将相关文件拷贝到其他服务器,使用scp命令即可。本人进行ETCD安装是为了kubernetes安装做准备,所以文件夹以及某些参数都有明显的K8S痕迹,可根据个人喜好修改。
1)安装cfssl 工具集(用来创建ca证书):
sudo mkdir -p /opt/k8s/cert && cd /opt/k8s
wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64
mv cfssl_linux-amd64 /opt/k8s/bin/cfssl
wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64
mv cfssljson_linux-amd64 /opt/k8s/bin/cfssljson
wget https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64
mv cfssl-certinfo_linux-amd64 /opt/k8s/bin/cfssl-certinfo
chmod +x /opt/k8s/bin/*
export PATH=/opt/k8s/bin:$PATH
2)创建ca配置文件和ca证书签名请求文件:
cd /opt/k8s/work
#创建ca-config.json文件
cat > ca-config.json <<EOF
{
"signing": {
"default": {
"expiry": "87600h"
},
"profiles": {
"kubernetes": {
"usages": [
"signing",
"key encipherment",
"server auth",
"client auth"
],
"expiry": "87600h"
}
}
}
}
EOF
#创建ca-csr.json文件
cat > ca-csr.json <<EOF
{"CN": "kubernetes",
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"ST": "BeiJing",
"L": "BeiJing",
"O": "k8s",
"OU": "System"
}
],
"ca": {
"expiry": "876000h"
}
}
EOF
- CN:Common Name,kube-apiserver 从证书中提取该字段作为请求的用户名 (User
Name),浏览器使用该字段验证网站是否合法; - O:Organization,kube-apiserver从证书中提取该字段作为请求用户所属的组 (Group);
- kube-apiserver 将提取的 User、Group 作为 RBAC授权的用户标识。
3)生成 CA 证书和私钥,并统一拷贝到对应目录下
cfssl gencert -initca ca-csr.json | cfssljson -bare ca
cp ca*.pem ca-config.json /etc/kubernetes/cert
scp ca*.pem ca-config.json root@k8s-node-1:/etc/kubernetes/cert
scp ca*.pem ca-config.json root@k8s-node-2:/etc/kubernetes/cert
4)创建 etcd 证书和私钥的配置文件
cd /opt/k8s/work
cat > etcd-csr.json <<EOF
{
"CN": "etcd",
"hosts": [
"127.0.0.1",
"172.24.211.217",
"172.24.211.218",
"172.24.211.219"
],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"ST": "BeiJing",
"L": "BeiJing",
"O": "etcd",
"OU": "System"
}
]
}
EOF
hosts 字段:配置的是授权使用该证书的 etcd 节点 IP 或域名列表,需要将 etcd 集群的三个节点 IP 都列在其中。
5)利用ca证书和私钥,生成ETCD的证书和私钥,并分发到各机器:
#注意:profile参数需要与上面ca-config.json的配置一致
cfssl gencert -ca=/opt/k8s/work/ca.pem \
-ca-key=/opt/k8s/work/ca-key.pem \
-config=/opt/k8s/work/ca-config.json \
-profile=kubernetes etcd-csr.json | cfssljson -bare etcd
#分发
cp etcd*.pem /etc/etcd/cert
scp etcd*.pem root@k8s-node-1:/etc/etcd/cert
scp etcd*.pem root@k8s-node-2:/etc/etcd/cert
6)修改etcd.conf配置文件,开放与证书相关的配置,具体如下:
#[Member]
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
ETCD_LISTEN_PEER_URLS="https://172.24.211.217:2380"
ETCD_LISTEN_CLIENT_URLS="https://172.24.211.217:2379,http://127.0.0.1:2379"
ETCD_NAME="etcd-1"
#[Clustering]
ETCD_INITIAL_ADVERTISE_PEER_URLS="https://172.24.211.217:2380"
ETCD_ADVERTISE_CLIENT_URLS="https://172.24.211.217:2379"
ETCD_INITIAL_CLUSTER="etcd-1=https://172.24.211.217:2380,etcd-2=https://172.24.211.218:2380,etcd-3=https://172.24.211.219:2380"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
#注意:最先启动的那台机器STATE设置为new,其他设置为existing
ETCD_INITIAL_CLUSTER_STATE="new"
#[Security]
ETCD_CERT_FILE="/etc/etcd/cert/etcd.pem"
ETCD_KEY_FILE="/etc/etcd/cert/etcd-key.pem"
ETCD_TRUSTED_CA_FILE="/etc/kubernetes/cert/ca.pem"
ETCD_PEER_CERT_FILE="/etc/etcd/cert/etcd.pem"
ETCD_PEER_KEY_FILE="/etc/etcd/cert/etcd-key.pem"
ETCD_PEER_TRUSTED_CA_FILE="/etc/kubernetes/cert/ca.pem"
3.3 启动集群及验证
启动命令:
systemctl daemon-reload && systemctl enable etcd && systemctl restart etcd
检测命令:
systemctl status etcd|grep Active
如果集群正常启动,会显示如下信息:
3.4 小扩展
添加证书后,节点间的请求都以https形式进行,故每次请求需要带上证书信息,比较麻烦,可以为每台机器的etcdctl配置好环境变量,简化请求参数。
vim /etc/profile.d/etcd.sh
export ETCDCTL_CA_FILE=/etc/kubernetes/cert/ca.pem
export ETCDCTL_KEY_FILE=/etc/etcd/cert/etcd-key.pem
export ETCDCTL_CERT_FILE=/etc/etcd/cert/etcd.pem
source /etc/profile.d/etcd.sh
完成上面的操作,就可以直接使用下面的命令查看健康状态:
etcdctl cluster-health
参考资料:
[1]. https://github.com/opsnull/follow-me-install-kubernetes-cluster, 和我一步步部署kubernetes集群.
[2]. https://www.jianshu.com/p/33b5f47ababc, etcd多台部署,启用https以及ca自签名.
[3]. https://www.jianshu.com/p/7d1fb03b8925, 利用K8S技术栈打造个人私有云.
[4]. Docker容器与容器云-Docker and kubernetes under the Hood(第二版),浙江大学SEL实验室著.