一、写作目的
很久之前写了一篇[基于kubeadm搭建k8s的文章] ,但是在复杂的实际生产环境中,从二进制构建k8s环境更容易配置符合实际需求。另一方面,kubeadm的过度自动化,并不利于我们理解k8s组件之间的关系以及交互过程。本文旨在基于k8s二进制文件,搭建一个k8s集群。
由于需要执行的操作较多,本文借用了大量的自动化脚本,但并非十分难以阅读,读者应尽量读一下。某些位置需要根据实际网络情况,修改部分对应参数。另外由于写文章时,笔者集群已经搭建完毕,如内容有缺失,欢迎在评论区留言!
二、环境及最终目标
本文在windows 10上基于VMware虚拟机,创建6个centos虚拟机开始工作。以下为虚拟机配置:
操作系统 | ip | 带安装组件 | 类型 | 主机名 |
---|---|---|---|---|
centos 7.9.2,基础设施服务器 | 192.168.154.20 | kube-apiserver、kube-scheduler、kube-controller | k8s-Master节点 | masterbin |
centos 7.9.2,基础设施服务器 | 192.168.154.21 | Docker、Flannel、kubelet、kube-proxy | k8s-Node节点1 | nodebin1 |
centos 7.9.2,基础设施服务器 | 192.168.154.22 | Docker、Flannel、kubelet、kube-proxy | k8s-Node节点2 | nodebin2 |
centos 7.9.2,基础设施服务器 | 192.168.154.90 | ETCD | ETCD节点1 | nodeh |
centos 7.9.2,基础设施服务器 | 192.168.154.91 | ETCD | ETCD节点2 | nodeh1 |
centos 7.9.2,基础设施服务器 | 192.168.154.92 | ETCD | ETCD节点3 | nodeh2 |
集群结构图:
三、Centos环境构建
1. 系统安装过程,可参考[基于kubeadm搭建k8s的文章]的第3-4、6章。
2. 提示:可以先安装一台,然后采用复制虚拟机磁盘文件夹的方式,构建6台虚拟机,但这种方式会导致虚拟机的名称、ip一样。如果你是六台虚拟机分别安装,可以跳过本章2-4节的内容
3. 修改虚拟机静态ip
1 | vim /etc/sysconfig/network-scripts/ifcfg-ens33 |
4. 修改主机名:
1 | 假定修改主机名为"abcdef",注意,主机名的命名存在一定规范,慎用"-"、"_"。(不想麻烦尽量26个小写字母+数字组合,否则后面可能配置k8s出错) |
5. 配置hosts表
1 | vim /etc/hosts |
6. 关闭防火墙(从此节开始的内容,masterbin
、nodebin1
、nodebin2
都要执行)
1 | systemctl stop firewalld |
7. 设置网络时间同步
1 | yum install -y ntpdate |
8. 关闭selinux(重启后才会生效,这步暂不重启)
1 | # 终端键入 |
9. 关闭swap分区(重启后才会生效,这步暂不重启)
1 | # 终端键入 |
10. 将桥接的IPv4流量传递到iptables的链
1 | # 在每个节点上将桥接的IPv4流量传递到iptables的链 |
11. 开启ipvs
1 | # 安装 |
12. 重启三台机器
1 | $ reboot |
13. 验证selinux是否关闭,swap分区是否关闭
1 | # 验证selinux |
四、安装证书生成工具
在本次集群搭建中,证书(X.509证书)使用群体总共分为两类:
- ETCD集群之间的通信证书,本次实验在”nodeh节点”生成
- K8S集群之间的通信证书,本次实验在”masterbin节点”生成
在masterbin
和nodeh
节点分别安装CFSSL工具,用于生成证书:
1 | 下载 |
五、搭建ETCD集群
生成CA证书、ETCD服务器证书以及私钥,以下工作非特殊指定,均在
nodeh
上操作注:ETCD集群内部默认通过2380通信,通过2379对外提供服务。
1. 创建目录结构
1 | mkdir -p /opt/k8s/etcd-cert |
2. 创建 /opt/k8s/etcd.sh
,通过chmod +x /opt/k8s/etcd.sh
添加执行权限
1 | !/bin/bash |
3. 创建/opt/k8s/etcd-cert/etcd-cert.sh
,通过chmod +x /opt/k8s/etcd-cert/etcd-cert.sh
添加执行权限
1 | !/bin/bash |
4. 生成证书
1 | cd /opt/k8s/etcd-cert/etcd-cert.sh |
5. 下载并解压ETCD二进制包
1 | cd /opt/k8s |
etcd
就是etcd服务的启动命令etcdctl
类似kubectl之于K8S,为ETCD提供命令行操作。
6. 安装ETCD
1 | mkdir -p /opt/etcd/{cfg,bin,ssl} |
7. 在nodeh
启动ETCD
1 | cd /opt/k8s/ |
8. 配置nodeh1
和nodeh2
(两个节点的操作除非特殊指定,否则保持一致即可)
从
nodeh
拷贝证书及执行文件1
scp -r root@nodeh:/opt/etcd /opt/
拷贝服务启动脚本
1 | scp root@nodeh:/usr/lib/systemd/system/etcd.service /usr/lib/systemd/system/ |
- 修改ETCD配置文件(如果复制粘贴记得删掉注释,后面的工作不再提醒)
1 | vim /opt/cfg/etcd |
- 在节点启动
ETCD
1 | systemctl start etcd |
9. 在masterh
配置全局ETCD程序软链
1 | ln -s /opt/etcd/bin/etcd* /usr/local/bin |
10. 检查ETCD集群状态
1 | cd /opt/etcd/ssl |
六、部署Docker
引擎
此部分仅需在
nodebin1
和nodebin2
上操作
1 | yum install -y yum-utils device-mapper-persistent-data lvm2 |
七、配置Flannel网络
1. 在nodeh
节点上添加flannel 网络配置信息,写入分配的子网段到etcd中,供flannel 使用
1 | cd /opt/etcd/ssl |
2. 在nodebin1
和nodebin2
分别安装flannel服务
- 下载并解压flannel二进制文件
1 | cd /opt |
- 构建目录结构
1 | mkdir -p /opt/kubernetes/{cfg,bin,ssl} |
- 创建
/opt/flannel.sh
,并通过chmod +x /opt/flannel.sh
添加执行权限
1 | !/bin/bash |
- flanneld 应使用 etcd 客户端TLS相关证书(client 证书),这里全部都使用同一套证书认证。从
nodeh
拷贝证书文件
1 | mkdir -p /opt/etcd/ssl/ |
- 执行脚本
1 | ./flannel.sh https://192.168.154.90:2379,https://192.168.154.91:2379,https://192.168.154.92:2379 |
- flannel启动后会生成一个docker网络相关信息配置文件/run/flannel/subnet.env,包含了docker要使用flannel通讯的相关参数,验证查看:
1 | cat /run/flannel/subnet.env |
3. 为Docker
连接flannel
1 | vim /usr/lib/systemd/system/docker.service |
4. 重启Docker
服务
1 | systemctl daemon-reload |
5. 查看网络
1 | ifconfig |
6. 测试网络
- 节点之间互相测试
1 | nodebin1: ping <nodebin2主机上Docker0网卡对应的ip> |
节点内容器互相测试(两个节点都执行以下操作)
启动容器
1 | docker run -it centos:7 /bin/bash |
- 安装
net-tools
包(容器内),并查看容器ip
1 | yum install net-tools -y |
- 容器之间互相ping,能ping通说明flannel网络与Docker配置成功
八、部署K8s-master组件
以下操作未特殊说明,均在
masterbin
节点上操作
1. 创建路径
1 | mkdir -p /opt/k8s |
2. 创建/opt/k8s/apiserver.sh
1 | !/bin/bash |
3. 创建/opt/k8s/controller-manager.sh
1 | !/bin/bash |
4. 创建/opt/k8s/scheduler.sh
1 | !/bin/bash |
5. 为以上三个脚本添加执行权限
1 | chmod +x /opt/k8s/*.sh |
6. 创建k8s工作目录,证书生成目录
1 | mkdir -p /opt/kubernetes/{cfg,bin,ssl,log} |
7. 创建/opt/k8s/k8s-cert/k8s-cert.sh
,并通过chmox +x /opt/k8s/k8s-cert/k8s-cert.sh
添加执行权限
1 | !/bin/bash |
8. 生成证书
1 | cd /opt/k8s/k8s-cert/ |
9. 复制相关证书以及私钥到kubernetes 工作目录的ssl目录中
1 | cd /opt/k8s/k8s-cert/ |
10. 安装K8S-master组件
1 | cd /opt/k8s/kubernetes/server/bin |
11. 创建bootstrap token认证文件,api-server启动时会调用,然后就相当于在集群内创建了一个用户,接下来就可以用RBAC
给他授权
1 | cd /opt/k8s/ |
12. 开启Apiserver服务
- 启动
1 | cd /opt/k8s/ |
- 查看是否成功
1 | systemctl status kube-apiserver.service -l |
13. 配置kubectl
- 创建配置信息
1 | mkdir -p /opt/k8s/k8s-module-config |
- 执行脚本
1 | cd /opt/k8s/k8s-module-config/ |
- 查看配置文件
1 | cat $HOME/.kube/config |
14. 验证API-server是否搭建好
1 | kubectl version |
15. 部署kube-schedule组件
- 创建配置信息脚本
1 | mkdir -p /opt/k8s/k8s-module-config |
- 生成配置信息
1 | cd /opt/k8s/k8s-module-config/ |
- 启动
kube-scheduler
1 | cd /opt/k8s/ |
- 查看是否启动成功
1 | systemctl status kube-scheduler.service -l |
16. 部署kube-controller-manager组件
- 创建配置信息脚本
1 | mkdir -p /opt/k8s/k8s-module-config |
- 生成配置信息
1 | cd /opt/k8s/k8s-module-config/ |
- 启动
kube-controller-manager
1 | cd /opt/k8s/ |
- 查看是否启动成功
1 | systemctl status kube-controller-manager.service -l |
17. 查看节点状态
1 | kubectl get cs |
九、部署Node节点
无特殊指定,
nodebin1
和nodebin2
操作一致无特殊指定,以下操作均在node节点
1. 从masterbin
节点拷贝node组件以及CA证书
1 | mkdir -p /opt/kubernetes/{cfg,bin,ssl} |
2. 创建/opt/kubelet.sh
,并通过chmod +x /opt/kubelet.sh
添加执行权限
1 | !/bin/bash |
3. 创建/opt/proxy.sh
,并通过chmod +x /opt/proxy.sh
添加执行权限
1 | !/bin/bash |
4. 在masterbin
节点上为kubelet
和kube-proxy
创建参数配置文件
- 创建配置脚本
1 | mkdir -p /opt/k8s/kubeconfig |
- 生成配置文件
1 | ./kubeconfig.sh 192.168.154.20 /opt/k8s/k8s-cert/ |
- RBAC授权,将预设用户kubelet-bootstrap 与内置的ClusterRole system: node -bootstrapper绑定到一起, 使其能够发起CSR请求
1 | kubectl create clusterrolebinding kubelet-bootstrap --clusterrole=system:node-bootstrapper --user=kubelet-bootstrap |
5. 在node节点上拷贝masterbin
节点生成的kubeconfig
文件
1 | scp root@masterbin:/opt/k8s/kubeconfig/*.kubeconfig /opt/kubernetes/cfg/ |
6. 启动kubelet组件
- 执行脚本(此时kubelet会发起证书请求)
1 | cd /opt/ |
- 在
masterbin
节点上同意节点申请(笔者这里已经没有记录了,所以手动写出参考)
1 | 查看CSR请求 |
7. 在masterbin
节点上查看集群nodes
1 | kubectl get nodes |
8. 在node节点上,可以看到自动生成了证书文件和kubelet.kubeconfig
文件
1 | ls /opt/kubernetes/ssl/ |
9. 启动kube-proxy组件
- 加载ipvs模块
1 | //加载ipvs模块 |
- 启动组件
1 | cd /opt/ |
- 在
masterbin
上验证kube-proxy
成功
1 | 真实部署nginx服务,查看外界是否能访问 |
- 在windows浏览器上,访问http://192.168.154.21:47959或者http://192.168.154.22:47959
请先确认windows与nodebin1、nodebin2之间网络互通
- 至此,K8S集群搭建完毕
十、参考链接:
注:以下参考链接部分内容对于高版本K8S已经不再适用,请以本文内容为准