Kubernetes节点服务搭建————二进制部署|单master节点配置(一)(etcd和flannel)
Posted 他和晚风一样温柔
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Kubernetes节点服务搭建————二进制部署|单master节点配置(一)(etcd和flannel)相关的知识,希望对你有一定的参考价值。
文章目录
常见的K8s按照部署方式
Mini kube
Minikube是一个工具,可以在本地快速运行一个单节点微型K8S,仅用于学习、预览K8S的一些特性使用
部署地址: https://kubernetes.io/decs/setup/minikube
Kubeadmin
Kubeadmin也是一个工具,提供kubeadm init 和kubeadm join, 用于快速部署K8S集群,相对简单
https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm/
二进制安装部署
生产首选,从官方下载发行版的二进制包,手动部署每个组件和自签TLS证书,组成K8S集群,新手推荐
https://github.com/kubernetes/kubernetes/releases
Kubernetes二进制部署
环境准备
服务器 | IP地址 | 部署服务 |
---|---|---|
k8s集群master01 | 192.168.111.80 | kube-apiserver kube- controller-manager kube- scheduler etcd |
k8s集群master02 | 192.168.111.70 | kube-apiserver kube- controller-manager kube- scheduler etcd |
k8s集群node01 | 192.168.111.90 | kubelet kube-proxy docker flannel |
k8s集群node02 | 192.168.111.100 | kubelet kube-proxy docker flannel |
etcd集群节点1 | 192.168.111.80 | etcd |
etcd集群节点2 | 192.168.111.90 | etcd |
etcd集群节点3 | 192.168.111.100 | etcd |
ps:etcd集群可以用3台服务器单独做,但我我们这里有限,就使用单master节点做,做一个master,两个node节点
部署etcd集群
- etcd是Coreos团队于2013年6月发起的开源项目,它的目标是构建一-个高可用的分布式键值( key-value) 数据库。etdd内部采用raft协议作为一致性算法,etcd是go语言编写的。
- etcd作为服务发现系统,有以下的特点:
- 简单:安装配置简单,而且提供了HTTP API进行交互,使用也很简单
- 安全:支持SSL证书验证
- 快速:单实例支持每秒2k+读操作
- 可靠:采用raft算法,实现分布式系统数据的可用性和一致性
etcd目前默认使用2379端口提供HTTP
API服务,2380端 口和peer通信(这两个端口已经被IANA (互联网数字分配机构)官方预留给etcd)。
即etcd默认使用2379端口对外为客户端提供通讯,使用端口2380来进行服务器间内部通讯
etcd在生产环境中一般推荐 集群方式部署。由于etcd的leader选举机制,要求至少为3台或以上的奇数台
准备签发证书环境
- CFSSL是CloudFlare 公司开源的一 款PKI/TLS 工具。CFSSL包含- -个命令行工具和-一个用于签名、验证和捆绑TLS 证书的HTTP,API服务。使用Go语言编写。
- CESSL 使用配置文件生成证书,因此自签之前,需要生成它识别的json格式的配置文件,CFSSL 提供了方便的命令行生成配置文件。
- CFSSL用来为etcd提供TLS证书,它支持签三种类型的证书:
- client证书,服务端连接客户端时携带的证书,用于客户端验证服务端身份,如kube-apiserver 访问etcd
- server证书,客户端连接服务端时携带的证书,用于服务端验证客户端身份,如etcd 对外提供服务
- peer证书,相互之间连接时使用的证书,如etcd节点之间进行验证和通信。
- 这里全部都使用同一套证书认证
master01上操作部署
关闭防火墙,修改主机名
systemctl stop firewalld
setenforce 0
hostnamectl set-hostname master01
su
将证书工具文件传入opt目录下
cd /usr/local/bin
//下载证书制作工具
wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64 -o /usr/local/bin/cfssl
wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64 -o /usr/local/bin/cfssljson
wget https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64 -o /usr/local/bin/cfssl-certinfo
或
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
chmod +x /usr/local/bin/cfssl* #给文件添加一个可执行文件
工具 | 说明 |
---|---|
cfssl | 证书签发的工具命令 |
cfssljson | 将cfssl 生成的证书( json格式)变为文件承载式证书 |
cfssl-certinfo | 验证证书的信息 |
cfssl-certinfo -cert <证书名称> #查看证书的信息
上传etcd-cert.sh和 etcd.sh到/opt/k8s目录下
//创建k8s工作目录
mkdir /opt/k8s
cd /opt/k8s/
//上传etcd-cert.sh和etcd.sh到/opt/k8s/目录中
chmod +x etcd-cert.sh etcd.sh
创建证书目录,复制k8s目录下的证书创建脚本
//创建用于生成CA证书、etcd 服务器证书以及私钥的目录
mkdir /opt/k8s/etcd-cert
mv etcd-cert.sh etcd-cert/
cd /opt/k8s/etcd-cert/
//修改脚本配置文件
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.111.80",
"192.168.111.90",
"192.168.111.100"
],
"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 为证书制作工具
./etcd-cert.sh
#生成CA证书、etcd服务器证书以及私钥
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
启动etcd服务
//etcd 二进制包地址:https://github.com/etcd-io/etcd/releases
上传etcd-v3.3.10-1inux-amd64.tar.gz 到/opt/k8s/目录中,解压etcd压缩包
cd /opt/k8s/
tar zxvf etcd-v3.3.10-linux-amd64.tar.gz
ls etcd-v3.3.10-linux-amd64
etcd就是etcd服务的启动命令,后而可跟各种启动参数
etcdctl主要为etcd服务提供了命令行操作
创建用于存放etcd配置文件,命令文件,证书的目录
mkdir -p /opt/etcd/cfg,bin,ssl
将刚刚解压出来的etcd文件中的 etcd 和 etcdctl移动到 /opt/etcd/bin目录下
mv /opt/k8s/etcd-v3.3.10-linuk-amd64/etcd /opt/k8s/etcd-v3.3.10-linux-amd64/etcdctl /opt/etcd/bin/
将刚刚解压出来的etcd文件中的 私钥和公钥还有证书 移动到 /opt/etcd/ssl目录下
cp /opt/k8s/etcd-cert/*.pem /opt/etcd/ssl/
执行etcd.sh脚本文件
./etcd.sh etcd01 192.168.111.80 etcd02=https://192.168.111.90:2380,etcd03=https://192.168.111.100:2380
//进入卡住状态等待其他节点加入,这里需要三台etcd服务同时启动,如果只启动其中一台后,服务会卡在那里,直到集群中所有etcd节点都已启动,可忽略这个情况
//另外打开一个窗口查看etcd进程是否正常
ps -ef | grep etcd
将Master中的两个配置文件远程复制给另外两台节点服务器
//把etcd相关证书文件和命令文件全部拷贝到另外两个etcd集群节点
scp -r /opt/etcd/ root@192.168.111.90:/opt/
scp -r /opt/etcd/ root@192.168.111.100:/opt/
//把etcd服务管理文件拷贝到另外两个etcd集群节点
scp /usr/lib/systemd/system/etcd.service root@192.168.111.90:/usr/lib/systemd/system/
scp /usr/lib/systemd/system/etcd.service root@192.168.111.100:/usr/lib/systemd/system/
在node节点上修改配置
node01
systemctl stop firewalld
setenforce 0
hostnamectl set-hostname node01
su
更改Node节点服务器的配置文件
修改配置文件
vim /opt/etcd/cfg/etcd
启动服务
systemctl start etcd.service
systemctl status etcd.service
node02节点一样配置
检查一下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.111.80:2379,https://192.168.111.90:2379,https://192.168.111.100:2379" cluster-health
这样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相互通信用的。
常见的通信方式
Overlay Network
- 叠加网络,在二层或者三层基础网络上叠加的一种虚拟网络技术模式,该网络中的主机通过虚拟链路隧道连接起来(类似于VPN)。
VXLAN
- 将源数据包封装到UDP中,并使用基础网络的IP/MAC作为外层报文头进行封装,然后在以太网上传输,到达目的地后由隧道端点解封装并将数据发送给目标地址
Flannel
- Flannel的功能是让集群中的不同节点主机创建的Docker 容器都具有全集群唯一的虚拟 IP地址。
- Flannel是Overlay网络的一种,也是将TCP源数据包封装在另一种网络包里而进行路由转发和通信,目前己经支持UDP、VXLAN、AWS VPC 等数据转发方式。
flannel的工作流程
flannel 会把内部的pod iP 封装到udp中,再根据在etcd 保存的路由表通过物理网卡发送给目的node,目的node在接受到转发来的数据后由flanneld解封装暴露出udp里的内部 Pod ip ,再根据目的IP由 flannel0 --> dockerO转发到目的pod中
ETCD之Flannel 提供说明:
- 存储管理Flannel可分配的IP地址段资源
- 监控ETCD中每个Pod的实际地址,并在内存中建立维护Pod节点路由表
flannel的搭建部署
master节点操作
写入分配的子网段到ETCD中,供flannel使用
cd /opt/etcd/ssl/
etcdctl --ca-file=ca.pem --cert-file=server.pem --key-file=server-key.pem --endpoints="https://192.168.111.80:2379,https://192.168.111.90:2379,https://192.168.111.100: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目录中,解压flannel压缩包
cd /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/
执行脚本文件
chmod +x flannel.sh
./flannel.sh https://192.168.111.80:2379,https://192.168.111.90:2379,https://192.168.111.100:2379
systemctl status flanneld.service
//查看flannel用的网段和docker使用的参数
cat /run/flannel/subnet.env
配置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
重载和重启docker服务
systemctl daemon-reload
systemctl restart docker
ifconfig
node02节点和node01节点一样操作部署
方法一:
ping -I 172.17.44.1 172.17.55.1
方法二:
//两台node都需要这样操作
docker run -itd centos:7
docker exec -it ed4265c2ee8d bash
yum install net-tools -y
ifconfig
总结
etcd集群部署:
准备cfssl证书生成工具
生成证书
准备etcd二进制包
生成etcd的配置文件和服务管理文件
启动etcd
把etcd01的配置文件,可执行文件,证书,etcd服务管理文件 复制到 etcd02 etcd03 节点上
etcd02 etcd03 修改 配置文件
启动etcd 加入集群
验证etcd集群状态
flannel网络部署:
flannel 实现 不同 node 上的 pod 相互通信用的
flannel 会把内部的pod iP 封装到 upd 中 根据 在 etcd 保存的路由表 通过物理网卡发送给目的 node 目的 node 在接受到转发来的数据后 由 flanneld 解封装 暴露出 udp 里的 内部 Pod ip ,再根据 目的Ip 由 flannel0 --> docker0 转发到目的 pod 中
使用etcdctl 在etcd 中添加 flannel 的网段和转发模式 upd、vxlan
准备 flannel 安装包
生成 docker 网络配置参数 并启动 flannel服务
修改 docker 启动参数,使docker0 网卡和 flannel网卡保持在一个网段里
验证 node 之间的容器通信是否正常
以上是关于Kubernetes节点服务搭建————二进制部署|单master节点配置(一)(etcd和flannel)的主要内容,如果未能解决你的问题,请参考以下文章
Kubernetes节点服务搭建————二进制部署多节点服务搭建Dashboard UI部署
Kubernetes节点服务搭建————二进制部署多节点服务搭建Dashboard UI部署
Kubernetes节点服务搭建————二进制部署|单master节点配置(master组件部署|node组件部署)
Kubernetes节点服务搭建————二进制部署|单master节点配置(master组件部署|node组件部署)