目录
1.1.3、创建存放etcd配置文件,命令文件,证书的目录,并启动etcd服务
1.1.4、把 etcd 相关证书文件、命令文件和服务管理文件全部拷贝到另外两个etcd集群节点
1.4、安装并启动 controller-manager 服务
2.2 在master01节点上操作,再拷贝相关文件到node节点
2.3 在 node 节点上操作,启动 kubelet 服务
一、环境部署
(1)所有设备关闭防火墙,清空iptables规则
systemctl disable --now firewalld
iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X
(2)所有设备关闭selinux
setenforce 0 #临时关闭
sed -i 's/enforcing/disabled/' /etc/selinux/config #永久关闭
(3)所有设备关闭swap
swapoff -a #临时关闭
sed -ri 's/.*swap.*/#&/' /etc/fstab #永久关闭
(4)修改所有设备的主机名
[root@localhost ~]#hostnamectl set-hostname master01
[root@localhost ~]#bash
[root@localhost ~]#hostnamectl set-hostname node01
[root@localhost ~]#bash
[root@localhost ~]#hostnamectl set-hostname node02
[root@localhost ~]#bash
(5)所有设备修改本地的hosts文件
cat >> /etc/hosts << EOF
172.16.88.77 master01
172.16.88.88 node01
172.16.88.99 node02
EOF
(6)所有设备调整内核参数
cat > /etc/sysctl.d/k8s.conf << EOF
#开启网桥模式,可将网桥的流量传递给iptables链
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
#关闭ipv6协议
net.ipv6.conf.all.disable_ipv6=1
net.ipv4.ip_forward=1
EOF
sysctl --system #重新加载系统的配置参数
(7)所有设备实现时间同步
yum install ntpdate -y
ntpdate time.windows.com
二、部署 docker引擎
在所有k8s集群的 node 节点中部署 docker引擎
yum install -y yum-utils device-mapper-persistent-data lvm2
#需要在安装docker前,安装好这些依赖包
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
#添加 Docker CE 的软件源,这个软件源位于阿里云镜像站点。这样做是为了从阿里云镜像站点下载 Docker CE 软件包,加快下载速度
yum install -y docker-ce docker-ce-cli containerd.io
#用于安装 Docker CE 及其相关组件,包括 Docker CE、Docker CE CLI 和 containerd.io
systemctl enable --now docker.service
#开启docker,并设置开机自启动
systemctl status docker.service
#查看当前docker是否启动成功
三、部署etcd集群
- etcd是CoreOS团队于2013年6月发起的开源项目,它的目标是构建一个高可用的分布式键值(key-value)数据库。etcd内部采用raft协议作为一致性算法,etcd是go语言编写的。
- etcd 作为服务发现系统,有以下的特点:
① 简单:安装配置简单,而且提供了HTTP API进行交互,使用也很简单
② 安全:支持SSL证书验证
③ 快速:单实例支持每秒2k+读操作
④ 可靠:采用raft算法,实现分布式系统数据的可用性和一致性
- etcd 目前默认使用2379端口提供HTTP API服务, 2380端口和peer通信(这两个端口已经被IANA(互联网数字分配机构)官方预留给etcd)。 即etcd默认使用2379端口对外为客户端提供通讯,使用端口2380来进行服务器间内部通讯
- etcd 在生产环境中一般推荐集群方式部署。由于etcd 的leader选举机制,要求至少为3台或以上的奇数台
1、准备签发证书环境
CFSSL 是 CloudFlare 公司开源的一款 PKI/TLS 工具。 CFSSL 包含一个命令行工具和一个用于签名、验证和捆绑 TLS 证书的 HTTP API 服务。使用Go语言编写。
CFSSL 使用配置文件生成证书,因此自签之前,需要生成它识别的 json 格式的配置文件,CFSSL 提供了方便的命令行生成配置文件。
CFSSL 用来为 etcd 提供 TLS 证书,它支持签三种类型的证书:
① client 证书,服务端连接客户端时携带的证书,用于客户端验证服务端身份,如 kube-apiserver 访问 etcd;
② server 证书,客户端连接服务端时携带的证书,用于服务端验证客户端身份,如 etcd 对外提供服务;
③ peer 证书,相互之间连接时使用的证书,如 etcd 节点之间进行验证和通信。
方便起见,这里本次全部都使用同一套证书认证。
1.1、master01服务器配置
1.1.1、准备cfssl证书生成工具
#准备cfssl证书生成工具
[root@master01 ~]#wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64 -O /usr/local/bin/cfssl
#cfssl:证书签发的工具命令
[root@master01 ~]#wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64 -O /usr/local/bin/cfssljson
#cfssljson:将 cfssl 生成的证书(json格式)变为文件承载式证书
[root@master01 ~]#wget https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64 -O /usr/local/bin/cfssl-certinfo
[root@master01 ~]#chmod +x /usr/local/bin/cfssl* #给所有证书签发工具,添加执行权限
#cfssl-certinfo:验证证书的信息
cfssl-certinfo -cert <证书名称> #可查看证书的信息
1.1.2、生成Etcd证书
(1)执行 etcd-cert.sh 脚本,生成 Etcd 证书
[root@master01 ~]#mkdir /opt/k8s
[root@master01 k8s]#cd /opt/k8s/
#上传 etcd-cert.sh 和 etcd.sh 到 /opt/k8s/ 目录中
#添加执行权限
[root@master01 k8s]#chmod +x etcd-cert.sh etcd.sh
#创建用于生成CA证书、etcd 服务器证书以及私钥的目录
[root@master01 k8s]#mkdir /opt/k8s/etcd-cert
[root@master01 k8s]#mv etcd-cert.sh etcd-cert/
[root@master01 k8s]#cd /opt/k8s/etcd-cert/
[root@master01 etcd-cert]# egrep -v "^#|^$" etcd-cert.sh
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",
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"L": "Beijing",
"ST": "Beijing"
}
]
}
EOF
cfssl gencert -initca ca-csr.json | cfssljson -bare ca
cat > server-csr.json <<EOF
{
"CN": "etcd",
"hosts": [
"172.16.88.77",
"172.16.88.88",
"172.16.88.99"
],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"L": "BeiJing",
"ST": "BeiJing"
}
]
}
EOF
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=www server-csr.json | cfssljson -bare server
[root@master01 etcd-cert]#./etcd-cert.sh
#执行脚本,生成CA证书、etcd 服务器证书以及私钥
[root@master01 etcd-cert]#ls
ca-config.json ca-csr.json ca.pem server.csr server-key.pem
ca.csr ca-key.pem etcd-cert.sh server-csr.json server.pem
1.1.3、创建存放etcd配置文件,命令文件,证书的目录,并启动etcd服务
(1)上传或下载 etcd-v3.4.9-linux-amd64.tar.gz 到 /opt/k8s 目录中
#上传或下载 etcd-v3.4.9-linux-amd64.tar.gz 到 /opt/k8s 目录中,启动etcd服务
[root@master01 etcd-cert]#cd /opt/k8s/
[root@master01 k8s]#https://github.com/etcd-io/etcd/releases/download/v3.4.9/etcd-v3.4.9-linux-amd64.tar.gz
[root@master01 k8s]#tar xf etcd-v3.4.9-linux-amd64.tar.gz #解压
[root@master01 k8s]#ls etcd-v3.4.9-linux-amd64
Documentation etcd etcdctl README-etcdctl.md README.md READMEv2-etcdctl.md
#etcd就是 etcd 服务的启动命令,后面可跟各种启动参数
#etcdctl主要为etcd 服务提供了命令行操作
(2)创建存放 etcd 配置文件,命令文件,证书的目录
#创建存放 etcd 配置文件,命令文件,证书的目录
[root@master01 k8s]#mkdir -p /opt/etcd/{cfg,bin,ssl}
[root@master01 k8s]#cd /opt/k8s/etcd-v3.4.9-linux-amd64/
[root@master01 etcd-v3.4.9-linux-amd64]#mv etcd etcdctl /opt/etcd/bin/
[root@master01 etcd-v3.4.9-linux-amd64]#cp /opt/k8s/etcd-cert/*.pem /opt/etcd/ssl/
#查看 etcd.sh 脚本生效的配置
[root@master01 etcd-v3.4.9-linux-amd64]#cd /opt/k8s/
[root@master01 k8s]#egrep -v "^#|^$" etcd.sh
ETCD_NAME=$1
ETCD_IP=$2
ETCD_CLUSTER=$3
WORK_DIR=/opt/etcd
cat > $WORK_DIR/cfg/etcd <<EOF
ETCD_NAME="${ETCD_NAME}"
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
ETCD_LISTEN_PEER_URLS="https://${ETCD_IP}:2380"
ETCD_LISTEN_CLIENT_URLS="https://${ETCD_IP}:2379"
ETCD_INITIAL_ADVERTISE_PEER_URLS="https://${ETCD_IP}:2380"
ETCD_ADVERTISE_CLIENT_URLS="https://${ETCD_IP}:2379"
ETCD_INITIAL_CLUSTER="etcd01=https://${ETCD_IP}:2380,${ETCD_CLUSTER}"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_INITIAL_CLUSTER_STATE="new"
EOF
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=${WORK_DIR}/cfg/etcd
ExecStart=${WORK_DIR}/bin/etcd \
--cert-file=${WORK_DIR}/ssl/server.pem \
--key-file=${WORK_DIR}/ssl/server-key.pem \
--trusted-ca-file=${WORK_DIR}/ssl/ca.pem \
--peer-cert-file=${WORK_DIR}/ssl/server.pem \
--peer-key-file=${WORK_DIR}/ssl/server-key.pem \
--peer-trusted-ca-file=${WORK_DIR}/ssl/ca.pem \
--logger=