一、预先准备
1.1 服务器角色
环境信息:
- k8s版本:v1.25.12
- Debian12(bookworm):内核6.1.0-9-amd64
角色 | IP | 组件列表 |
---|
master | 172.19.82.157 | kube-apiserver、kube-controller-manage、kube-scheduler、kubelet、kube-proxy、etcd、containerd |
node01 | 172.19.82.158 | kubelet、kube-proxy、containerd、etcd |
node02 | 172.19.82.159 | kubelet、kube-proxy、containerd、etcd |
ℹ由于手上资源有限,所以搭建一个一主两从的集群,如果后续想要扩展的话,仅需要再添加master或者node节点即可,此外etcd可以部署到集群之外并做高可用。
1.2 系统初始化
1.3 hosts设置
1.3.1 通过hosts文件配置
1.3.2 使用bind9 DNS工具
ℹ仅在一台机器上安装bind9即可,我这里选择master节点,如果有高可用需求的话可以安装多个bind做集群。
修改配置:
配置解析域以及模板文件:
重启服务及测试:
1.4 (可选)安装supervisor
安装supervisor简单实现服务“高可用”.
ℹ非必须,使用systemd来管理也可以.
二、安装CRI容器运行时及harbor私有仓
2.1 安装containerd
安装方式有好几种,二进制安装,仓库安装以及编译安装。
这里我使用二进制进行安装,仓库安装参考:https://github.com/containerd/containerd/blob/main/docs/getting-started.md#option-2-from-apt-get-or-dnf
😄 let’s go~
2.1.1 步骤一安装containerd
2.1.2 步骤二安装runC
2.1.3 步骤三安装CNI插件
2.1.4 配置containerd使用systemd cgroup驱动
大概第125行,修改 SystemdCgroup
为true
.
大概第61行。
修改完保存之后,重启systemctl restart containerd
.
检查运行状态:
2.1.5 安装crictl客户端工具
检查是否安装成功crictl ps
2.2 安装harbor私有仓
harbor建议部署在其他主机上,比如说主控机,与k8s集群分割开来,这个随便,看你自己。
后续步骤略.
三、使用cfssl生成证书
3.1 安装cfssl
ℹ在master节点或者主控机(如果有的话)上安装cfssl即可,其他主机不需要。
检查安装:
3.2 初始化及说明
创建k8s集群及etcd所需要的证书目录:
说明:一共创建了三个CA,分别用于:
- etcd集群
- apiserver、controller manager、kubelet、kube-scheduler等
- front-proxy
四、部署master节点
4.1 部署etcd集群
4.1.1 下载安装etcd和etcdctl二进制文件
我们需要在157,158和159三台机器中都装上etcd,以组成etcd集群,保证etcd的高可用。
检查etcd安装结果:
4.1.2 为etcd制作证书
配置文件字段解释:
- CN:Common Name,浏览器使用该字段验证网址是否合法,一般写域名,非常重要
- ST:State,省
- L:Locality,地区
- O:Organization Name,组织名称
- OU:Organization Unit Name,组织单位名称
检查CA生成结果:
expiry:有效期为200年
profiles-server:启动server的时候需要配置证书
profiles-client:client去连接server的时候需要证书
profiles-peer:双向证书,服务端找客户端需要证书,客户端找服务端需要证书
etcd-peer-csr解析:
hosts:etcd有可能部署到哪些组件的IP都要填进来
cfssl gencert:生成证书
4.1.3 配置及启动etcd集群
复制证书文件:
编写启动脚本:
⚠注意以下脚本中,node01(158),node02(159)主机上都要修改对应的监听地址,不能照搬.
需要修改的地方有以下五处:
--name
--advertise-client-urls
--initial-advertise-peer-urls
--listen-peer-urls
--listen-client-urls
修改脚本及目录权限:
创建supervisor配置文件:
三个主机都得执行,不同主机只需要修改下[program:etcd-server-157]
这个即可,换成158和159.
重载supervisor配置文件:
使用以下命令可以查看集群状态(leader是谁?)
4.2 部署API server
API server我就不做集群了(单节点),方法其实和etcd大差不差.
4.2.1 使用cfssl生成证书
4.2.2 部署api-server
仓库地址:https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.25.md#v12512
启动脚本:
配置supervisor:
4.3 部署controller-manager
4.4 部署kube-scheduler
至此,master节点的核心组件基本安装完成了,使用ss命令查看服务监听状态:
4.5 配置kubectl所需要的kubeconfig
步骤大体和上面都是一致的。
4.6 部署node相关组件kube-proxy、kubelet
4.6.1 bootstrap自动认证kubelet
4.6.2 部署kubelet
⚠ 由于master节点同样要运行一些pod,比如flannel、calico网络组件等,所以在master节点也需要安装Kubelet和Kube-proxy组件。
4.6.3 将master节点作为node加入到集群内部
⚠ 注意:这个步骤如果做了bootstrap kubelet,则不需要手动授权,可直接忽略改步骤。
以下来源于网络:
当kubelet组件启动成功后,就会想apiserver发送一个请求加入集群的信息,只有当master节点授权同意后,才可以正常加入,虽然是master节点部署的node组件,> 但是也会发生一个加入集群的信息,需要master同意。
当kubelet启动之后,首先会在证书目录生成一个kubelet-client.key.tmp这个文件,当使用kubectl certificate approve命令授权成功node的请求之后,kubele> t-client.key.tmp小时,随之会生成一个kubelet-client-current.pem的证书文件,用于与apiserver建立连接,此时再使用kubectl get > node就会看到节点信息了。
扩展:如果后期想要修改node的名称,那么就把生成的kubelet证书文件全部删除,然后使用kubectl delete > node删除该节点,在修改kubelet配置文件中该节点的名称,然后使用kubectl delete > csr删除授权信息,再重启kubelet生成新的授权信息,然后授权通过即可看到新的名字的node节点。
只有当授权通过后,kubelet生成了证书文件,kubelet的端口才会被启动
注意:当kubelet的授权被master请求通后,kube-proxy启动成功后,节点才会正真的加入集群,即使kubectl get > node看到的节点是Ready,该节点也是不可用的,必须当kube-proxy启动完毕后,这个节点才算正真的启动完毕.
节点加入结果kubectl get nodes
:
4.6.3 部署kube-proxy
4.6.4 授权apiserver访问kubelet
如果不做该授权的话,会导致kubectl无法获取到集群的一些信息,比如logs.
创建一个RBAC资源使得apiserver能够访问kubelet:
4.6.5 部署flannel网络组件
部署完以上组件之后,使用kubectl get nodes
发现新加进来的master节点处于NotReady
状态,原因是没有网络组件,一旦安装好网络组件会立即变为Ready
状态。
配置containerd使用代理和私有仓(不然镜像拉不下来喔):
检查flannel运行状态kubectl get po -n kube-flannel
4.7 检查master节点部署结果
4.7.1 检查服务运行状态
- 服务运行状态(
supervisorctl status
):
- 组件状态(
kubectl get cs
):
- master节点状态(
kubectl get node -owide
)
如果以上有报错,就回头检查或者重新部署一下有问题的服务即可。
4.7.2 附:文件列表及简介
五、部署node节点
其实完全可以合并成一个,但是为了条理清晰,所以拆开单独弄。
在master上将kubelet和kube-proxy二进制文件分发下去:
5.1 部署kubelet
在master节点上分发认证文件及kubelet配置文件:
配置supervisor(和master节点类似,所以直接复制过去好了):
改完之后在node01和node02分别执行:
启动完成之后在master节点上可以看到:
5.2 部署kube-proxy
5.3 检查node节点部署结果
5.3.1 检查服务运行状态
- supervisor服务运行状态(
sueprvisorctl status
):
- 网络组件以及节点状态:(
kubectl get node -owide/kubectl get po -A -owide
):
5.3.2 附:文件列表及简介
以node01节点为例,其他node节点都一样。
六、其他可选组件安装
6.1 coredns
6.1.1 部署coredns
检查coredns运行状态:
测试coredns
6.2 nginx ingress
参考链接:https://kubernetes.github.io/ingress-nginx/
6.3 面板
6.3.1 dashboard
安装完成之后,使用一下命令获取自动分配的nodeport:
访问任一节点的IP加上面的nodeport即可,比如:https://172.19.82.157:36046/#/login
创建sa使用token登录dashboard:
使用上面输出的token即可登录dashboard.
6.3.2 rancher
略,参考:使用helm快速安装rancher
七、未完待续
To Be Continued…