一、部署单节点master集群
1、环境准备
k8s集群master01:192.168.22.100
k8s集群node01:192.168.22.110
k8s集群node02:12.168.22.119
etcd集群节点1:192.168.22.100
etcd集群节点2:192.168.22.110
etcd集群节点3:192.168.22.119
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
2、部署etcd集群
在master节点上操作
#创建/k8s目录
mkdir k8s
cd k8s
#创建证书制作的脚本
vim etcd-cert.sh
#!/bin/bash
cat > ca-config.json <<EOF #可以定义多个 profiles,分别指定不同的过期时间、使用场景等参数
{
"signing": {
"default": {
"expiry": "87600h" #指定了证书的有效期,87600h 为10年
},
"profiles": {
"www": {
"expiry": "87600h",
"usages": [
"signing", #表示该证书可用于签名其它证书;生成的 ca.pem 证书中 CA=TRUE
"key encipherment", #表示使用非对称密钥加密,如 RSA 加密
"server auth", #表示client可以用该 CA 对 server 提供的证书进行验证
"client auth" #表示server可以用该 CA 对 client 提供的证书进行验证
]
}
}
}
}
EOF
cat > ca-csr.json <<EOF
{
"CN": "etcd",
"key": {
"algo": "rsa", #指定了加密算法,一般使用rsa(size:2048)
"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": [
"192.168.22.100",
"192.168.22.110", #定义三个节点的IP地址
"192.168.22.119"
],
"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
#创建启动脚本
vim etcd.sh
#!/bin/bash
#example: ./etcd.sh etcd01 192.168.22.100 etcd02=https:
#使用格式:etcd名称 当前etcd的IP地址+完整的集群名称和地址
ETCD_NAME=$1 #节点名称,集群中唯一
ETCD_IP=$2
ETCD_CLUSTER=$3
WORK_DIR=/opt/etcd #数据目录。指定节点的数据存储目录
cat > $WORK_DIR/cfg/etcd <<EOF
#[Member]
ETCD_NAME="${ETCD_NAME}"
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
ETCD_LISTEN_PEER_URLS="https://${ETCD_IP}:2380" #集群通信监听地址,用于监听其他member发送信息的地址
ETCD_LISTEN_CLIENT_URLS="https://${ETCD_IP}:2379" #客户端访问监听地址,用于监听etcd客户发送信息的地址
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 \
--name=\${ETCD_NAME} \
--data-dir=\${ETCD_DATA_DIR} \
--listen-peer-urls=\${ETCD_LISTEN_PEER_URLS} \
--listen-client-urls=\${ETCD_LISTEN_CLIENT_URLS},http:
Restart=on-failure
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable etcd
systemctl restart etcd
-
生成证书 -
安装etcd
cd /opt/k8s
#上传 etcd-v3.3.10-linux-amd64.tar 到 k8s中
tar zxvf etcd-v3.3.10-linux-amd64.tar.gz
#创建存放 etcd 配置文件,命令,证书目录
mkdir -p /opt/etcd/{cfg,bin,ssl}
mv etcd-v3.3.10-linux-amd64/etcd etcd-v3.3.10-linux-amd64/etcdctl /opt/etcd/bin #拷贝命令文件
cp etcd-cert/*.pem /opt/etcd/ssl #拷贝证书文件
./etcd.sh etcd01 192.168.22.100 etcd02=https://192.168.22.110:2380,etcd03=https://192.168.22.119:2380 #进入卡住状态等待其他节点加入
ps -ef | grep etcd #另开一个窗口查看进程是否正常
#将证书和启动脚本推送/复制到两台node节点中
scp -r /opt/etcd/ root@192.168.22.110:/opt
scp -r /opt/etcd/ root@192.168.22.119:/opt
scp -r /usr/lib/systemd/system/etcd.service root@192.168.22.110:/usr/lib/systemd/system/
scp -r /usr/lib/systemd/system/etcd.service root@192.168.22.119:/usr/lib/systemd/system/
检查集群状态(master上执行)
/opt/etcd/bin/
etcdctl\
--ca-file=ca.pem \
--cert-file=server.pem \
--key-file=server-key.pem \
--endpoints="https://192.168.22.100:2379,https://192.168.22.110:2379,https://192.168.22.119:2379"\
cluster-health
在node节点查看
注意这里我们需要将配置文件中的 ETCD_NAME=“etcd01” 名称修改为节点名称, ip地址也改成自己的
- 修改节点 cfg/etcd 文件
二、Flannel网络部署
1、部署docker
所有node节点部署docker
安装依赖包
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
systemctl start docker
systemctl status docker
2、k8s中Pod网络通信
flannel是实现不同node中Pod相互通信用的
flannel 会把内部的pod iP 封装到udp中,再根据在etcd 保存的路由表通过物理网卡发送给目的node,目的node在接受到转发来的数据后由flanneld解封装暴露出udp里的内部 Pod ip ,再根据目的IP由 flannel0 --> dockerO转发到目的pod 中
在master节点上
- 添加flannel 网络配置信息,写入分配的子网段到etcd中,让flannel使用
etcdctl --ca-file=ca.pem --cert-file=server.pem --key-file=server-key.pem --endpoints="https://192.168.22.100:2379,https://192.168.22.110:2379,https://192.168.22.119:2379" set /coreos.com/network/config '{ "Network": "172.17.0.0/16", "Backend": {"Type": "vxlan"}}'
在所有node节点上
- 上传 flannel.sh 和 flannel-v0.10.0-linux-amnd64.tar.gz 到opt目录中 并解压
tar -zxvf flannel-v0.10.0-linux-amd64.tar.gz
mkdir -p /opt/kubernetes/{cfg,bin,ssl}
将 flanneld 和 mk-docker-opts.sh 放入工作目录中的bin目录下
mv flanneld mk-docker-opts.sh /opt/kubernetes/bin/
vim flannel.sh
#!/bin/bash
ETCD_ENDPOINTS=${1:-"http://127.0.0.1:2379"}
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
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
cd /opt
chmod +x flannel.sh
./flannel.sh https://192.168.22.100:2379,https://192.168.22.110:2379,https://192.168.22.119:2379
vim /usr/lib/systemd/system/docker.service
-----12行添加
EnvironmentFile=/run/flannel/subnet.env
-----13行修改(添加参数$DOCKER_NETWORK_OPTIONS)
ExecStart=/usr/bin/dockerd $DOCKER_NETWORK_OPTIONS -H fd:// --containerd=/run/containerd/containerd.sock
cat /run/flannel/subnet.env
systemctl daemon-reload
systemctl restart docker
3、测试
|