内容概要
- 一、ETCD集群
- 1、先将etcd-cert三个文本拖入指定目录
- 2、上传etcd-cert.sh和 etcd.sh到/opt/k8s目录下(这里的脚本我直接写好了)
- 3、创建启动脚本 etcd.sh
- 4、创建证书目录,复制k8s目录下的证书创建脚本
- 5、将压缩包放入/opt/k8s目录下进行解压
- 6、创建用于存放 etcd 配置文件,命令文件,证书的目录
- 7、将刚刚解压出来的etcd文件中的 etcd 和 etcdctl移动到 /opt/etcd/bin目录下
- 8、将刚刚解压出来的etcd文件中的 私钥和公钥还有证书 移动到 /opt/etcd/ssl目录下
- 9、执行etcd.sh脚本文件
- 10、将Master中的两个配置文件远程复制给另外两台节点服务器
- 11、更改Node节点服务器的配置文件
- 12、检查一下etcd状态
- 13、此时etcd服务部署完成
- 二、部署Docker引擎
- 三、配置flannel网络
实验环境
主机 | 系统 | IP |
---|---|---|
Master01 | Centos7 | 192.168.73.188 |
Node01 | Centos7 | 192.168.73.88 |
Node02 | Centos7 | 192.168.73.166 |
首选需要关闭防火墙和安全功能,修改主机名
一、ETCD集群
1、先将etcd-cert三个文本拖入指定目录
2、上传etcd-cert.sh和 etcd.sh到/opt/k8s目录下(这里的脚本我直接写好了)
mkdir /opt/k8s
cd /opt/k8s
chmod 777 *
也可以自己去写脚本 etcd-cert.sh
vim etcd-cert.sh
cat > ca-config.json <<EOF #CA证书配置文件
{
"signing": { #键名称
"default": {
"expiry": "87600h" #证书有效期(10年)
},
"profiles": { #简介
"www": { #名称
"expiry": "87600h",
"usages": [ #使用方法
"signing", #键
"key encipherment", #密钥验证(密钥验证要设置在CA证书中)
"server auth", #服务器端验证
"client auth" #客户端验证
]
}
}
}
}
EOF
cat > ca-csr.json <<EOF #CA签名
{
"CN": "etcd CA", #CA签名为etcd指定(三个节点均需要)
"key": {
"algo": "rsa", #使用rsa非对称密钥的形式
"size": 2048 #密钥长度为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": [ #定义三个节点的IP地址
"192.168.73.188",
"192.168.184.88",
"192.168.184.166"
],
"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 #cfssl 为证书制作工具
3、创建启动脚本 etcd.sh
cat etcd.sh
#!/bin/bash
#以下为使用格式:etcd名称 当前etcd的IP地址+完整的集群名称和地址
# example: ./etcd.sh etcd01 192.168.73.188 etcd02=https://192.168.73.88:2380,etcd03=https://192.168.73.166:2380
ETCD_NAME=$1 #位置变量1:etcd节点名称
ETCD_IP=$2 #位置变量2:节点地址
ETCD_CLUSTER=$3 #位置变量3:集群
WORK_DIR=/opt/etcd #指定工作目录
cat <<EOF >$WORK_DIR/cfg/etcd #在指定工作目录创建ETCD的配置文件
#[Member]
ETCD_NAME="${ETCD_NAME}" #etcd名称
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
ETCD_LISTEN_PEER_URLS="https://${ETCD_IP}:2380" #etcd IP地址:2380端口。用于集群之间通讯
ETCD_LISTEN_CLIENT_URLS="https://${ETCD_IP}:2379" #etcd IP地址:2379端口,用于开放给外部客户端通讯
#[Clustering]
ETCD_INITIAL_ADVERTISE_PEER_URLS="https://${ETCD_IP}:2380"
ETCD_ADVERTISE_CLIENT_URLS="https://${ETCD_IP}:2379" #对外提供的url使用https的协议进行访问
ETCD_INITIAL_CLUSTER="etcd01=https://${ETCD_IP}:2380,${ETCD_CLUSTER}" #多路访问
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster" #tokens 令牌环名称:etcd-cluster
ETCD_INITIAL_CLUSTER_STATE="new" #状态,重新创建
EOF
cat <<EOF >/usr/lib/systemd/system/etcd.service #定义ectd的启动脚本
[Unit] #基本项
Description=Etcd Server #类似为 etcd 服务
After=network.target #vu癌症
After=network-online.target
Wants=network-online.target
[Service] #服务项
Type=notify
EnvironmentFile=${WORK_DIR}/cfg/etcd #etcd文件位置
ExecStart=${WORK_DIR}/bin/etcd \ #准启动状态及以下的参数
--name=\${ETCD_NAME} \
--data-dir=\${ETCD_DATA_DIR} \
--listen-peer-urls=\${ETCD_LISTEN_PEER_URLS} \
--listen-client-urls=\${ETCD_LISTEN_CLIENT_URLS},http://127.0.0.1:2379 \
--advertise-client-urls=\${ETCD_ADVERTISE_CLIENT_URLS} \ #以下为群集内部的设定
--initial-advertise-peer-urls=\${ETCD_INITIAL_ADVERTISE_PEER_URLS} \
--initial-cluster=\${ETCD_INITIAL_CLUSTER} \
--initial-cluster-token=\${ETCD_INITIAL_CLUSTER_TOKEN} \ #群集内部通信,也是使用的令牌,为了保证安全(防范中间人窃取)
--initial-cluster-state=new \
--cert-file=${WORK_DIR}/ssl/server.pem \ #证书相关参数
--key-file=${WORK_DIR}/ssl/server-key.pem \
--peer-cert-file=${WORK_DIR}/ssl/server.pem \
--peer-key-file=${WORK_DIR}/ssl/server-key.pem \
--trusted-ca-file=${WORK_DIR}/ssl/ca.pem \
--peer-trusted-ca-file=${WORK_DIR}/ssl/ca.pem
Restart=on-failure
LimitNOFILE=65536 #开放最多的端口号
[Install]
WantedBy=multi-user.target #进行启动
EOF
systemctl daemon-reload #参数重载
systemctl enable etcd
systemctl restart etcd
4、创建证书目录,复制k8s目录下的证书创建脚本
mkdir etcd-cert
cd etcd-cert/
mv ../etcd-cert.sh ./
#从官网源中下载制作证书的工具
curl -L https://pkg.cfssl.org/R1.2/cfssl_linux-amd64 -o /usr/local/bin/cfssl
curl -L https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64 -o /usr/local/bin/cfssljson
curl -L https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64 -o /usr/local/bin/cfssl-certinfo
5、将压缩包放入/opt/k8s目录下进行解压
tar -zxvf etcd-v3.3.10-linux-amd64.tar.gz
6、创建用于存放 etcd 配置文件,命令文件,证书的目录
mkdir -p /opt/etcd/{cfg,bin,ssl}
7、将刚刚解压出来的etcd文件中的 etcd 和 etcdctl移动到 /opt/etcd/bin目录下
cd /opt/k8s/
cd etcd-v3.3.10-linux-amd64/
mv etcd etcdctl /opt/etcd/bin/
8、将刚刚解压出来的etcd文件中的 私钥和公钥还有证书 移动到 /opt/etcd/ssl目录下
cd ..
cd etcd-cert/
cp *.pem /opt/etcd/ssl/
9、执行etcd.sh脚本文件
cd /opt/k8s/
./etcd.sh etcd01 192.168.73.188 etcd02=https://192.168.73.88:2380,etcd03=https://192.168.73.166:2380
10、将Master中的两个配置文件远程复制给另外两台节点服务器
scp -r /opt/etcd/ root@192.168.73.88:/opt
scp -r /opt/etcd/ root@192.168.73.166:/opt
Master01服务器
cd /usr/lib/systemd/system
scp etcd.service root@192.168.73.88:/usr/lib/systemd/system
scp etcd.service root@192.168.73.166:/usr/lib/systemd/system
11、更改Node节点服务器的配置文件
两台Node服务器
vim cfg/etcd
#[Member]
ETCD_NAME="etcd02"
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
ETCD_LISTEN_PEER_URLS="https://192.168.73.88:2380"
ETCD_LISTEN_CLIENT_URLS="https://192.168.73.88:2379"
#[Clustering]
ETCD_INITIAL_ADVERTISE_PEER_URLS="https://192.168.73.88:2380"
ETCD_ADVERTISE_CLIENT_URLS="https://192.168.73.88:2379"
ETCD_INITIAL_CLUSTER="etcd01=https://192.168.73.188:2380,etcd02=https://192.168.73.88:2380,etcd03=https://192.168.73.166:2380"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_INITIAL_CLUSTER_STATE="new"
systemctl start etcd.service
systemctl status etcd.service
另一台Node也是一样的操作
12、检查一下etcd状态
Master服务器
cd /opt/etcd/bin/
ln -s /opt/etcd/bin/etcdctl /usr/local/bin/
cd /opt/etcd/ssl/
etcdctl --ca-file=ca.pem --cert-file=server.pem --key-file=server-key.pem --endpoints="https://192.168.73.188:2379,https://192.168.73.88:2379,https://192.168.73.166:2379" cluster-health
13、此时etcd服务部署完成
二、部署Docker引擎
在所有Node节点上面部署
安装依赖包
yum install -y yum-utils device-mapper-persistent-data lvm2
设置阿里云镜像源
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum install -y docker-ce ##这里我只安装docker-ce了
systemctl start docker
systemctl status docker
三、配置flannel网络
- flannel是实现不同node中Pod相互通信用的。
flannel的工作流程
flannel 会把内部的pod iP 封装到udp中,再根据在etcd 保存的路由表通过物理网卡发送给目的node,目的node在接受到转发来的数据后由flanneld解封装暴露出udp里的内部 Pod ip ,再根据目的IP由 flannel0 --> dockerO转发到目的pod 中
1、写入分配的子网段到ETCD中,供flannel使用
Master01上操作
etcdctl --ca-file=ca.pem --cert-file=server.pem --key-file=server-key.pem --endpoints="https://192.168.73.188:2379,https://192.168.73.88:2379,https://192.168.73.166:2379" set /coreos.com/network/config '{ "Network": "172.17.0.0/16", "Backend": {"Type": "vxlan"}}'
2、上传 flannel.sh 和 flannel-v0.10.0-linux-amnd64.tar.gz到/opt目录中,解压flannel压缩包
所有node节点上操作
tar -zxvf flannel-v0.10.0-linux-amd64.tar.gz
3、创建工作目录
mkdir -p /opt/kubernetes/{cfg,bin,ssl}
将 flanneld 和 mk-docker-opts.sh 放入工作目录中的bin目录下
mv flanneld mk-docker-opts.sh /opt/kubernetes/bin/
4、编写启动脚本
vim flannel.sh
#!/bin/bash
#定义etcd集群的端点IP地址和对外提供服务的2379端口
#${var:-string}:若变量var为空,则用在命令行中用string来替换;否则变量var不为空时,则用变量var的值来替换,这里的1代表的是位置变量$1
ETCD_ENDPOINTS=${1:-"http://127.0.0.1:2379"}
#创建flanneld配置文件
cat > /opt/kubernetes/cfg/flanneld <<EOF
FLANNEL_OPTIONS="--etcd-endpoints=${ETCD_ENDPOINTS} \\
-etcd-cafile=/opt/etcd/ssl/ca.pem \\
-etcd-certfile=/opt/etcd/ssl/server.pem \\
-etcd-keyfile=/opt/etcd/ssl/server-key.pem"
EOF
#flanneld 本应使用 etcd 客户端TLS相关证书(client 证书),这里全部都使用同一套证书认证。
#创建flanneld.service服务管理文件
cat > /usr/lib/systemd/system/flanneld.service <<EOF
[Unit]
Description=Flanneld overlay address etcd agent
After=network-online.target network.target
Before=docker.service
[Service]
Type=notify
EnvironmentFile=/opt/kubernetes/cfg/flanneld
ExecStart=/opt/kubernetes/bin/flanneld --ip-masq \$FLANNEL_OPTIONS
ExecStartPost=/opt/kubernetes/bin/mk-docker-opts.sh -k DOCKER_NETWORK_OPTIONS -d /run/flannel/subnet.env
Restart=on-failure
[Install]
WantedBy=multi-user.target
EOF
#flanneld启动后会使用 mk-docker-opts.sh 脚本生成 docker 网络相关配置信息
#mk-docker-opts.sh -k DOCKER_NETWORK_OPTIONS:将组合选项键设置为环境变量DOCKER_NETWORK_OPTIONS,docker启动时将使用此变量
#mk-docker-opts.sh -d /run/flannel/subnet.env:指定要生成的docker网络相关信息配置文件的路径,docker启动时候引用此配置
systemctl daemon-reload
systemctl enable flanneld
systemctl restart flanneld
chmod +x flannel.sh
./flannel.sh https://192.168.73.188:2379,https://192.168.73.88:2379,https://192.168.73.166:2379
systemctl status flanneld.service
cat /run/flannel/subnet.env
5、配置docker连接flannel
vim /usr/lib/systemd/system/docker.service
----------------13行和14行添加------------------
13 EnvironmentFile=/run/flannel/subnet.env
14 ExecStart=/usr/bin/dockerd $DOCKER_NETWORK_OPTIONS -H fd:// --containerd=/run/containerd/containerd.sock
6、重载和重启docker服务
systemctl daemon-reload
systemctl restart docker
ifconfig
这个时候docker0网卡已经和flannel同步过来了,同步成同一网段
node2和node1一样配置
7、验证flannel
node1和node2
方法一:
ping -I 172.17.36.1 172.17.56.1
方法二:
node1和node2
两台node都需要这样操作
docker run -it centos:7 /bin/bash
yum install net-tools -y