常见的K8s按照部署方式
Minikube是一个工具,可以在本地快速运行一个单节点微型K8s,仅用于学习、预览K8s的一些特性使用。
部署地址: https ://kubernetes.ioldocs/setup/minikube
Kubeadmin也是一个工具,提供kubeadm init和kubeadm join,用于快速部署K8s集群,相对简单。
https://kubernetes.io/docs/referencelsetup-tools/kubeadm/kubeadm/
生产首选,从官方下载发行版的二进制包,手动部署每个组件和自签TLS证书,组成K8s集群,新手推荐。
https://github.com/kubernetes/kubernetes/releases
准备环境
k8s集群master01:192.168.121.20 kube-apiserver kube-controller-manager kube-scheduler etcd
k8s集群node01:192.168.121.19 kubelet kube-proxy docker flannel
k8s集群node02:192.168.121.18
etcd集群节点1:192.168.121.17 etcd
etcd集群节点2:192.168.121.16
etcd集群节点3:192.168.121.15
负载均衡nginx+keeplive01(master):192.168.121.14
负载均衡nginx+keeplive01(backup):192.168.121.13
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
etcd概念
etcd是CoreOS团队于2013年6月发起的开源项目,它的目标是构建一个高可用的分布式键值对数据库。etcd内部采用raft协议作为一致性算法,etcd是go语言编写的。
etcd作为服务发现系统,有以下特点
- 简单:安装配置简单,提供HTTP API进行交互
- 安全:支持SSL证书验证
- 快速:单实例支持每秒2k+读写操作
- 可靠:采用raft算法,实现分布式系统数据的可用性和一致性
etcd目前默认使用2379端口对外提供HTTP服务,使用2380端口进行内部通讯。 etcd在生产环境中一般推荐集群方式部署。由于etcd的leader选举机制,要求至少3台或以上的奇数台。
准备签发证书环境
CFSSL使用配置文件生成证书,因此自签之前,需要生成它识别的json格式的配置文件,CFSSL提供了方便的命令行生成配置文件。CFSSL用来为etcd提供TLS证书,它支持签三种类型的证书:
- 1、client证书:服务端连接客户端携带的证书,用于客户端验证服务端身份
- 2、server证书:客户端连接服务端时携带的证书,用于服务端验证客户端身份
- 3、peer证书:互相之间连接时使用的证书,如etcd节点之间验证和通信
一、搭建etcd集群
(一)在master01节点上操作
1、下载证书制作工具
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 -0 /usr/local/bin/cfssljson
wget https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64 -0 /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<证书名称> #查看证书的信息
2、创建k8s工作目录
mkdir /opt/k8s
cd /opt/k8s/
3、上传etcd-cert.sh和etcd.sh到/opt/k8s/目录中
mkdir /opt/k8s/etcd-cert
cd /opt/k8s/etcd-cert
rz -E
chmod +x etcd-cert.sh etcd.sh
4、开始制作证书
mkdir /opt/k8s/etcd-cert
mv etcd-cert.sh etcd-cert
vim /opt/k8s/etcd-cert/etcd-cert.sh
cd /opt/k8s/etcd-cert
./etcd-cert.sh
5、上传并解压etcd压缩包到/opt/k8s目录中
//把etcd解压包上传到/k8s目录中并解压
rz -E
tar zxvf etcd-v3.3.10-linux-amd64.tar.gz
6、创建用于存放etcd配置文件、命令文件、证书的目录
mkdir -p /opt/etcd/{cfg,bin,ssl}
mv /opt/k8s/etcd-v3.3.10-linux-amd64/etcd /opt/etcd-v3.3.10-linux-amd64/etcdctl /opt/k8s/etcd/bin/
cp /opt/k8s/etcd-cert/*.pem /opt/k8s/etcd/ssl/
7、启动etcd服务,进入卡住状态等待其他节点加入
//进入卡住状态等待其他节点加入,这里需要三台etcd服务同时启动,如果只启动其中一台后,服务会卡在那里,直到集群中所有etcd节点都已启动,可忽略这个情况
./etcd.sh etcd01 192.168.121.17 etcd02=https://192.168.121.16:2380,etcd03=http://192.168.121.15:2380
使用另外一个会话打开,会发现etcd进程已经开启
ps -ef | grep etcd
8、拷贝证书到其他节点
scp -r /opt/k8s/etcd/ 192.168.121.16:/opt/k8s/etcd/
scp -r /opt/k8s/etcd/ 192.168.121.15:/opt/k8s/etcd/
9、将启动脚本(服务管理脚本)拷贝到其他节点
scp /usr/lib/systemd/system/etcd.service 192.168.121.15:/usr/lib/systemd/system
scp /usr/lib/systemd/system/etcd.service 192.168.121.16:/usr/lib/systemd/system
(二)在node01节点修改
1、修改etcd配置文件
vim /opt/etcd/cfg/etcd
##将配置文件中的IP地址改成该节点的IP地址
2、开启etcd服务
systemctl start etcd.service
systemctl status etcd.service
3、在Master节点上查看etcd集群的状态
ln -s /opt/etcd/bin/etcdctl /usr/local/bin/ 做一个软连接让系统可以识别
/opt/etcd/bin/etcdctl --ca-file=ca.pem --cert-file=server.pem --key-file=server-key.pem --endpoints="https://192.168.121.17:2379,https://192.168.121.15:2379,https://192.168.121.16:2379" cluster-health
##通过这条命令检查etcd集群的健康状态
/opt/etcd/bin/etcdctl --ca-file=ca.pem --cert-file=server.pem --key-file=server-key.pem --endpoints="https://192.168.121.17:2379,https://192.168.121.15:2379,https://192.168.121.16:2379" set /coreos.com/network/config '{ "Network": "172.17.0.0/16", "Backend": {"Type": "vxlan"}}'
##通过这条命令查看etcd集群的状态
##切换到etcd3版本查看集群系欸但状态和成员列表
export ETCDCTL_API=3
##显示etcd的版本和当前的状态
etcdctl --write-out=table endpoint status
##显示etcd集群的成员状态
etcdctl --write-out=table member list
搭建etcd集群的总结
第一个Master节点 1、准备cfss证书生成工具 2、生成证书 3、准备etcd二进制包 4、生成etcd的服务管理文件 5、启动etcd 后面Node节点 1、在Master节点上把etcd01的配置文件、可执行文件、证书,etcd服务管理文件都复制发送到etcd后面的Node节点中 2、在Node节点上修改收到的etcd配置文件,将IP地址改成自己主机的IP 3、启动etcd服务,会自动加入集群 最后可以在Master节点上查看集群状态
二、部署docker引擎
//所有node节点部署docker引擎
yum -y install yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo ##注意用阿里云安装
yum -y install docker-ce docker-ce-cli containerd.io
systemctl start docker #启动docker
systemctl enable docker #设置开机自启动
三、flannel网络配置
K8S中Pod网络通信
- Pod 内容器与容器之间的通信
在同一个 Pod 内的容器(Pod 内的容器是不会跨宿主机的)共享同一个网络命令空间,相当于它们在同一台机器上一样,可以用localhost地址访问彼此的端口。 - 同一个Node内Pod 之间的通信
每个Pod都有一个真实的全局IP地址,同一个 Node内的不同Pod之间可以直接采用对方 Pod的IP地址进行通信,Podl与Pod2都是通过Veth连接到同一个 docker0 网桥,网段相同,所以它们之间可以直接通信。 - 不同Node 上 Pod 之间的通信
Pod地址与 docker0在同一网段,docker0网段与宿主机网卡是两个不同的网段,且不同Node之间的通信只能通过宿主机的物理网卡进行。 要想实现不同NMode 上. Pod之间的通信,就必须想办法通过主机的物理网卡TP地址进行寻址和通信。因此要满足两个条件: Pod 的IP不能冲突;将Pod的IP和所在的 Node的Te 关联起来,通过这个关联让不同Node 上 Pod之间直接通过内网IP 地址通信。
Overlay Network
叠加网络是在二层或者三层基础网络上叠加的一种虚拟网络技术模式,该网络中的主机通过虚拟链路隧道连接起来(类似于VPN)。
VXLAN
将源数据包封装到UDP中,并使用基础网络的IP/NAc作为外层报文头进行封装,然后在以太网上传输,到达目的地后由隧道端点解封装并将数据发送给目标地址。
Flannel
- Flannel 的功能是让集群中的不同节点主机创建的 Docker容器都具有全集群唯一的虚拟IP地址。
- Flannel是Overlay网络的一种,也是将TCP 源数据包封装在另一种网络包里面进行路由转发和通信,目前已经支持 加DP、VXLAE,AWS VPC等数据转发方式。
???Flannel的工作原理
同一个节点中的Pod之间是通过docker0来通信的,不同节点的Pod之间要通信的话可以通过Flannel网络插件来完成。node1首先把数据包通过docker0发送给flannel0,flannel部署在各个节点中会将本节点的IP和MAC地址都保存在etcd中,flannel0收到pod发送来的消息之后会进行封装成UDP,UDP中有源数据的IP和MAC地址,然后根据路由表通过物理网卡转发给node2,部署在node2上的flannel收到后会进行解封装,暴露出里面目的Pod的IP由flannel0转发给docker0,最终转发给对应的Pod。
etcd之Flannel提供说明
存储管理Flannel可分配的IP地址段资源 监控etcd中每个Pod的实际地址,并在内存中简历维护Pod节点路由器
部署Flannel
在Master01节点上操作
//添加flannel网络配置信息,写入分配的子网段到etcd中,供flannel使用
cd /opt/etcd/ssl
/opt/etcd/bin/etcdctl --ca-file=ca.pem --cert-file=server.pem --key-file=server-key.pem --endpoints="https://192.168.121.17:2379,https://192.168.121.16:2379,https://192.168.121.15:2379" set /coreos.com/network/config '{ "Network": "172.17.0.0/16", "Backend": {"Type": "vxlan"}}'
##这里Flannel的转发类型是vxlan,vxlan的性能更好一点;系统默认是udp
//查看写入的信息
/opt/etcd/bin/etcdctl --ca-file=ca.pem --cert-file=server.pem --key-file=server-key.pem --endpoints="https://192.168.121.17:2379,https://192.168.121.16:2379,https://192.168.121.15:2379" get /coreos.com/network/config
在所有node节点上操作
上传并解压flannel压缩包
//上传flannel.sh和flannel-v0.10.0-linux-amd64.tar.gz到/opt目录中,解压flannel压缩包
cd /opt
tar zxvf flannel-v0.10.0-linux-amd64.tar.gz
flanneld ##flanneld为主要的执行文件
mk-docker-opts.sh ##mk-docker-opts.sh脚本用于生成Docker启动参数
README.md
创建kubernetes工作目录
mkdir /opt/kubernetes/{cfg,bin,ssl} -p
mv mk-docker-opts.sh flanneld /opt/kubernetes/bin/
启动flannel服务,开启flannel网络功能
cd /opt
chmod +x flannel.sh
./flannel.sh https://192.168.121.15:2379,https://192.168.121.16:2379,https://192.168.121.17:2379
##查看flannel是否启动成功
systemctl status flannel (其实执行脚本会自动帮我们启动flannel)
ifconfig
#查看网卡信息,发现多了一个flannel的网卡,可以看到flannel分配的网段
但是这是发现docker0网卡的网段没有和flannel的网段同步
##更改docker的启动项
vim /usr/lib/systemd/system/docker.service
#在12行下添加
EnvironmentFile=/run/flannel/subnet.env ##指定docker网络的配置文件
ExecStart=/usr/bin/dockerd $DOCKER_NETWORK_OPTIONS -H fd:// --containerd=/run/containerd/containerd.sock![在这里插入图片描述](https://img-blog.csdnimg.cn/cdd184d1de4641519340fe33735e7ce7.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L20wXzU0NTg1NzY4,size_16,color_FFFFFF,t_70)
这时候再ifconfig,发现docker0的网段和flannel的网段一致了
docker0:*.*.*.1
flannel:*.*.*.0
测试ping通对方docker0网卡 证明flannel起到路由作用
ping -I 172.17.81.1 172.17.18.1
也可以进入容器里面进行ping测试
docker run -it centos:7 /bin/bash
yum install net-tools -y ##安装网络服务插件
|