k8s(Kubernetes)实战(一)之部署etcd与flannel
k8s的结构想必大家已经了解过了,节点、pod、容器,使用controller来控制pod的实例数量。今天我来实战部署k8s的集群,不过受限于环境,只准备了2台服务器,即2个节点。这个章节安装etcd与flannel。etcd是一个分布式键值数据库,主要用来同步各个节点的各种信息;flannel用来使各个节点内的各pod的ip处于同一网段,并能够相互通信。节点分为master节点与node节点,理
k8s合集:(前两章为k8s二进制安装方法,十分复杂,推荐从第三章开始)
k8s(Kubernetes)实战(一)之部署etcd与flannel
k8s(Kubernetes)实战(二)之部署api-server、controller-manager、scheduler、kubelet
k8s(Kubernetes)实战(三)之 通过kubespray-2.15.0 部署k8s
正文:
k8s的结构想必大家已经了解过了,节点、pod、容器,使用controller来控制pod的实例数量。
今天我来实战部署k8s的集群,不过受限于环境,只准备了2台服务器,即2个节点。
这个章节安装etcd与flannel。etcd是一个分布式键值数据库,主要用来同步各个节点的各种信息;flannel用来使各个节点内的各pod的ip处于同一网段,并能够相互通信。
服务器 | 角色 |
192.168.3.218 | master |
192.168.3.220 | node |
192.168.3.248 | master |
192.168.3.251 | node |
192.168.3.207 | 虚拟IP |
注意,etcd和flannel的各版本间可能不兼容。我安装的时候都使用了当前的最新版本,不过不要担心,我目前碰到的一些版本兼容问题,都通过配置解决了。
一、初始化环境(master、node)
设置关闭防火墙、SELinux、swap
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config
swapoff -a
yes | cp /etc/fstab /etc/fstab_bak
cat /etc/fstab_bak |grep -v swap > /etc/fstab
修改 /etc/sysctl.conf
vim /etc/sysctl.conf
在最下方添加
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
文件保存后,执行
sysctl -p
#如果遇到问题,No such file or directory,先执行
modprobe br_netfilter
ls /proc/sys/net/bridge
#最后再执行
sysctl -p
创建安装目录
mkdir /data/soft/etcd/{bin,cfg,ssl} -p
mkdir /data/soft/kubernetes/{bin,cfg,ssl} -p
安装及配置CFSSL,证书生成工具(只要master01就行)
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
二、安装docker(node)
docker只需要再node节点上安装,因为只有node需要担负pod及docker容器的创建,不过我们的两台服务器都有node的角色,有所以都安装。
使用的的docker-ce版本是19.03.14
卸载旧版本
sudo yum remove -y docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-selinux \
docker-engine-selinux \
docker-engine
设置 yum源
sudo yum install -y yum-utils \
device-mapper-persistent-data \
lvm2
sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
也可以换用阿里的镜像,更快些
sudo yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
安装并启动 docker(去掉版本号,就可以安装最新版了)
sudo yum install -y docker-ce-19.03.14 docker-ce-cli-19.03.14 containerd.io
sudo systemctl enable docker
sudo systemctl start docker
三、部署ETCD(master)
etcd是一个分布式的键值对数据库,一般而言只要部署在master节点就好了,但是我们的master节点只有一个,而etcd最少要有2个节点才能部署成功。
我们先在master上安装,之后复制到node上。
1.创建etcd集群认证证书
首先创建一个etcd-cert证书存储目录目录,命令如下
mkdir /data/www/etcd-cert
cd /data/www/etcd-cert
创建 ETCD 证书生成策略配置文件
cat << EOF | tee etcd-ca-config.json
{
"signing": {
"default": {
"expiry": "87600h"
},
"profiles": {
"www": {
"expiry": "87600h",
"usages": [
"signing",
"key encipherment",
"server auth",
"client auth"
]
}
}
}
}
EOF
# 参数详解
ca-config.json:可以定义多个 profiles,分别指定不同的过期时间、使用场景等参数;后续在签名证书时使用某个 profile;
signing: 表示该证书可用于签名其它证书;生成的 ca.pem 证书中 CA=TRUE;
server auth: 表示client可以用该 CA 对server提供的证书进行验证;
client auth: 表示server可以用该CA对client提供的证书进行验证;
创建 ETCD CA 证书签名请求
cat << EOF | tee etcd-ca-csr.json
{
"CN": "etcd CA",
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"L": "Hangzhou",
"ST": "Zhejiang"
}
]
}
EOF
参数详解:
CN:Common Name,kube-apiserver 从证书中提取该字段作为请求的用户名 (User Name);浏览器使用该字段验证网站是否合法;
names中的字段:
C : country,国家
ST: state,州或省份
L:location,城市
O:organization,组织,kube-apiserver 从证书中提取该字段作为请求用户所属的组 (Group)
OU:organization unit,组织单位
创建 ETCD SERVER 证书签名请求
cat << EOF | tee etcd-server-csr.json
{
"CN": "etcd",
"hosts": [
"192.168.3.218",
"192.168.3.248"
],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"L": "Hangzhou",
"ST": "Zhejiang"
}
]
}
EOF
hosts:指定授权使用该证书的 etcd 节点 IP 列表,需要将 etcd 集群所有节点 IP 都列在其中;
生成 ETCD CA 证书和私钥
cfssl gencert -initca etcd-ca-csr.json | cfssljson -bare etcd-ca
cfssl gencert -ca=etcd-ca.pem -ca-key=etcd-ca-key.pem -config=etcd-ca-config.json -profile=www etcd-server-csr.json | cfssljson -bare etcd-server
# cfssl参数详解
gencert: 生成新的key(密钥)和签名证书
-initca:初始化一个新ca
-ca:指明ca的证书
-ca-key:指明ca的私钥文件
-config:指明请求证书的json文件
-profile:与-config中的profile对应,是指根据config中的profile段来生成证书的相关信息
查看生成的证书
查看cert(证书信息):
cfssl certinfo -cert ca.pem
查看CSR(证书签名请求)信息:
cfssl certinfo -csr ca.csr
# cfssljson
-bare 来自CFSSL的返回值,使用cert,csr和key字段拆分成JSON格式以生成文件。
ssh-key认证
期间要求输入密码,我们不设置密码,直接按回车
#控制台输入
ssh-keygen
拷贝到所有节点
ssh-copy-id 192.168.3.220
ssh-copy-id 192.168.3.248
ssh-copy-id 192.168.3.251
2.安装ETCD
(先在master01节点安装、配置,之后使用scp复制到其他节点)
下载etcd,etcd的release page是https://github.com/etcd-io/etcd/releases
cd /data/download
wget https://github.com/etcd-io/etcd/releases/download/v3.4.14/etcd-v3.4.14-linux-amd64.tar.gz
解压并移动文件
tar -xvf etcd-v3.4.14-linux-amd64.tar.gz
cd etcd-v3.4.14-linux-amd64/
\cp etcd etcdctl /data/soft/etcd/bin/
etcd的环境变量
cat << EOF | tee /data/soft/etcd/cfg/etcd
#[Member]
ETCD_NAME="etcd01"
ETCD_DATA_DIR="/data/www/etcd/default.etcd"
ETCD_LISTEN_PEER_URLS="https://192.168.3.218:2380"
ETCD_LISTEN_CLIENT_URLS="https://192.168.3.218:2379"
#[Clustering]
ETCD_INITIAL_ADVERTISE_PEER_URLS="https://192.168.3.218:2380"
ETCD_ADVERTISE_CLIENT_URLS="https://192.168.3.218:2379"
ETCD_INITIAL_CLUSTER="etcd01=https://192.168.3.218:2380,etcd02=https://192.168.3.248:2380"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_INITIAL_CLUSTER_STATE="new"
EOF
创建 etcd的 etcd.service文件
vim /usr/lib/systemd/system/etcd.service
文件的内容
[Unit]
Description=Etcd Server
After=network.target
After=network-online.target
Wants=network-online.target
[Service]
User=root
Group=root
Type=notify
EnvironmentFile=/data/soft/etcd/cfg/etcd
ExecStart=/data/soft/etcd/bin/etcd \
--cert-file=/data/soft/etcd/ssl/etcd-server.pem \
--key-file=/data/soft/etcd/ssl/etcd-server-key.pem \
--peer-cert-file=/data/soft/etcd/ssl/etcd-server.pem \
--peer-key-file=/data/soft/etcd/ssl/etcd-server-key.pem \
--trusted-ca-file=/data/soft/etcd/ssl/etcd-ca.pem \
--peer-trusted-ca-file=/data/soft/etcd/ssl/etcd-ca.pem \
--enable-v2=true
Restart=on-failure
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
拷贝证书文件
cd /data/www/etcd-cert
cp etcd-ca.pem etcd-server.pem etcd-server-key.pem /data/soft/etcd/ssl/
scp -P 22 etcd-ca.pem etcd-server.pem etcd-server-key.pem root@192.168.3.248:/data/soft/etcd/ssl/
scp -P 22 etcd-ca.pem etcd-server.pem etcd-server-key.pem root@192.168.3.251:/data/soft/etcd/ssl/
scp -P 22 etcd-ca.pem etcd-server.pem etcd-server-key.pem root@192.168.3.220:/data/soft/etcd/ssl/
将etcd的启动文件、配置文件拷贝到maser02节点
cd /data/soft/
scp -P 22 -r etcd root@192.168.3.248:/data/soft
scp -P 22 -r /usr/lib/systemd/system/etcd.service root@192.168.3.248:/usr/lib/systemd/system/etcd.service
注意修改其它节点中/data/soft/etcd/cfg/etcd文件的内容,ETCD_NAME和各个IP地址
启动ETCD服务
systemctl daemon-reload
systemctl enable etcd
systemctl restart etcd
#etcd 进程首次启动时会等待其它节点的 etcd 加入集群,命令 systemctl start etcd 会卡住一段时间,为正常现象;
验证集群是否成功启动
ETCDCTL_API=2 /data/soft/etcd/bin/etcdctl \
--ca-file=/data/soft/etcd/ssl/etcd-ca.pem \
--cert-file=/data/soft/etcd/ssl/etcd-server.pem \
--key-file=/data/soft/etcd/ssl/etcd-server-key.pem \
--endpoints="https://192.168.3.218:2379,\
https://192.168.3.248:2379" cluster-health
结果
注意:启动ETCD集群同时最少启动二个节点,启动一个节点集群是无法正常启动的;
三、部署Flannel网络(node)
每一个pod都会有一个IP,这个pod的IP的网段是物理节点的子网段,这意味着不同node间的pod无法直接交流,
而使用flannel则能使所有node的pod处于同一网段,并相互交流。
1.向 master写入集群 Pod 网段信息(etcd主节点,192.168.3.218)
cd /data/soft/etcd/ssl/
ETCDCTL_API=2 /data/soft/etcd/bin/etcdctl \
--ca-file=/data/soft/etcd/ssl/etcd-ca.pem \
--cert-file=/data/soft/etcd/ssl/etcd-server.pem \
--key-file=/data/soft/etcd/ssl/etcd-server-key.pem \
--endpoints="https://192.168.3.218:2379,https://192.168.3.248:2379" \
set /coreos.com/network/config '{ "Network": "172.18.0.0/16", "Backend": {"Type": "vxlan"}}'
返回写入结果:
{ "Network": "172.18.0.0/16", "Backend": {"Type": "vxlan"}}
2.安装Flannel(node节点)
release page: https://github.com/coreos/flannel/releases
下载,我这里使用的最新版本v0.13.1-rc1
cd /data/download
wget https://github.com/coreos/flannel/releases/download/v0.13.1-rc1/flannel-v0.13.1-rc1-linux-amd64.tar.gz
解压安装
tar -xvf flannel-v0.13.1-rc1-linux-amd64.tar.gz
mv flanneld mk-docker-opts.sh /data/soft/kubernetes/bin/
3.配置Flannel
指定证书
cat << EOF | tee /data/soft/kubernetes/cfg/flanneld
FLANNEL_OPTIONS="--etcd-endpoints=https://192.168.3.218:2379,https://192.168.3.248:2379 -etcd-cafile=/data/soft/etcd/ssl/etcd-ca.pem -etcd-certfile=/data/soft/etcd/ssl/etcd-server.pem -etcd-keyfile=/data/soft/etcd/ssl/etcd-server-key.pem"
EOF
创建 flanneld 的 flanneld.service 文件
vim /usr/lib/systemd/system/flanneld.service
[Unit]
Description=Flanneld overlay address etcd agent
After=network-online.target network.target
Before=docker.service
[Service]
Type=notify
EnvironmentFile=/data/soft/kubernetes/cfg/flanneld
ExecStart=/data/soft/kubernetes/bin/flanneld --ip-masq $FLANNEL_OPTIONS
ExecStartPost=/data/soft/kubernetes/bin/mk-docker-opts.sh -k DOCKER_NETWORK_OPTIONS -d /run/flannel/subnet.env
Restart=on-failure
[Install]
WantedBy=multi-user.target
4.配置docker的网段
设置/run/flannel/subnet.env
mkdir /run/flannel
vim /run/flannel/subnet.env
DOCKER_OPT_BIP="--bip=172.18.38.1/24"
DOCKER_OPT_IPMASQ="--ip-masq=false"
DOCKER_OPT_MTU="--mtu=1450"
DOCKER_NETWORK_OPTIONS=" --bip=172.18.38.1/24 --ip-masq=false --mtu=1450"
编辑docker.service
vim /usr/lib/systemd/system/docker.service
注意下面,增加的是 添加环境变量文件 EnvironmentFile=/run/flannel/subnet.env
以及,docker启动配置后面,添加环境变量 ExecStart=/usr/bin/dockerd $DOCKER_NETWORK_OPTIONS
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service
Wants=network-online.target
[Service]
Type=notify
EnvironmentFile=/run/flannel/subnet.env
ExecStart=/usr/bin/dockerd $DOCKER_NETWORK_OPTIONS
ExecReload=/bin/kill -s HUP $MAINPID
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
TimeoutStartSec=0
Delegate=yes
KillMode=process
Restart=on-failure
StartLimitBurst=3
StartLimitInterval=60s
[Install]
WantedBy=multi-user.target
5.将软件和配置推到所有节点
cd /data/soft/
scp -P 22 -r kubernetes root@192.168.3.220:/data/soft/
scp -P 22 /data/soft/kubernetes/cfg/flanneld root@192.168.3.220:/data/soft/kubernetes/cfg/flanneld
scp /usr/lib/systemd/system/docker.service 192.168.3.220:/usr/lib/systemd/system/docker.service
scp /usr/lib/systemd/system/flanneld.service 192.168.3.220:/usr/lib/systemd/system/flanneld.service
scp /run/flannel/subnet.env 192.168.3.220:/run/flannel/subnet.env
6.启动服务(node节点)
systemctl daemon-reload
systemctl start flanneld
systemctl enable flanneld
systemctl restart docker
检查是否成功,输入指令
ip add
251的网卡信息 ,docker0和flannel的网段都是172.18.*.*了
220的网卡信息
然后在其中一个节点上,ping另一个节点的docker0的IP,能通就成功了。
未完待续。。。
更多推荐
所有评论(0)