- kubernets 安装管理与维护
- 高可用集群安装
- K8S 环境实现CI/CD
- K8S 包管理工具 Helm
1.0 高可用集群安装
1.1 基本原理
1.1.1 集群架构与组件
- Master 组件:
- kube-apiserver: Kubernetes API,集群的统一入口,各组件协调者,所有对象资源的增删改查和监听操作都交给 APIServer处理后再提交给Etcd存储。
- kube-controller-manager: 处理集群中常规后台任务,一个资源对应一个控制器,而 ControllerManager就是负责管理这些控制器的。
- kube-scheduler: 根据调度算法为新创建的Pod选择一个Node节点,可以任意部署, 可以部署在同一个节点上,也可以部署在不同的节点上。
- etcd: 分布式键值存储系统。用于保存集群状态数据,比如Pod、Service 等对象信息。
- Node 组件:
- kubelet: kubelet是Master在Node节点上的Agent,管理本机运行容器的生命周期,比如创建容器、Pod挂载数据卷、下载secret、获取容器和节点状态等工作。
- kube-proxy: 在Node节点上实现Pod网络代理,维护网络规则和四层负载均衡工作。
- 第三方容器引擎: 例如 docker、containerd、podman 容器引擎,运行容器。
1.1.2 部署k8s的 2种方式
kubeadm:
- Kubeadm是一个K8s部署工具,提供kubeadm init和kubeadm join,用于快速部署Kubernetes集群。
二进制包:
- 从 github 下载发行版的二进制包,手动部署每个组件,组成 Kubernetes 集群。
- kubeadm init:初始化一个Master节点
- kubeadm join:将工作节点加入集群
- kubeadm upgrade: 升级K8s版本
- kubeadm token:管理 kubeadm join 使用的令牌
- kubeadm reset:清空 kubeadm init 或者 kubeadm join 对主机所做的任何更改
- kubeadm version: 打印 kubeadm 版本
- kubeadm alpha:预览可用的新功能
1.2 安装环境
1.2.1 高可用架构规划
- kubernetes_version: 1.28.0
IP地址 | 主机名 | 配置 | 系统 | 服务 |
---|---|---|---|---|
10.16.41.24 | k8s-master01 | 8C/16G/100G | Centos7.9 | kubelet、kube-proxy、kube-apiserver、kube-controller-manager、kube-scheduler、etcd、containerd |
10.16.41.194 | k8s-master02 | 8C/16G/100G | Centos7.9 | kubelet、kube-proxy、kube-apiserver、kube-controller-manager、kube-scheduler、etcd、containerd |
10.16.41.123 | k8s-master03 | 8C/16G/100G | Centos7.9 | kubelet、kube-proxy、kube-apiserver、kube-controller-manager、kube-scheduler、etcd、containerd |
10.16.41.125 | k8s-node01 | 8C/16G/100G | Centos7.9 | kubelet、kube-proxy、containerd、keepalived+haproxy |
10.16.41.66 | k8s-node02 | 8C/16G/100G | Centos7.9 | kubelet、kube-proxy、containerd、keepalived+haproxy |
10.16.41.196 | k8s-node03 | 8C/16G/100G | Centos7.9 | kubelet、kube-proxy、containerd |
vip: 10.16.41.25 |
1.2.2 环境准备
- k8s 集群部署前的环境准备。以下 6 台服务器的操作均一样。
1.2.2.1 主机名解析
- 添加主机名称解析记录,在所有节点执行(暂时先将 k8s-vip.inadm.com 解析到 k8s-master01 节点上,后期扩展高可用 master 时在修改对应的解析)
1 | # cat /etc/hosts |
1.2.2.2 关闭防火墙
1 | // 关闭防火墙 |
1.2.2.3 关闭 swap
1 | // 删除 fstab 文件中的 swap 分区 |
1.2.2.4 配置内核参数
- 开启内核 ipv4 转发需要执行如下命令加载 overlay、br_netfileter 模块
1 | # cat /etc/modules-load.d/k8s.conf |
1.2.2.5 ipvs 安装
1 | 1. 为了便于查看 ipvs 的代理规则,需要安装管理工具 ipvsadm,在所有节点执行 |
1.2.2.6 时间同步
1 | # timedatectl set-timezone Asia/Shanghai |
1.3 集群单 Master 部署
- 在所有节点上安装 containerd、kubelet、kubeadm、kubectl
1.3.1 安装 containerd
1.3.1.1 安装 containerd
1 | 1. 通过 yum 安装 Containerd,版本在 1.6 以上。如果需要二进制安装则自行下载 cri-containerd-cni-${VERSION}.${OS}-${ARCH}.tar.gz |
1.3.1.2 安装 nerdctl
1 | 1. 下载 nerdctl |
1.3.1.3 安装 buildkitd
1 | 1. 拷贝 buildctl、buildkitd 命令,以及 buildkit.service 服务启动程序 |
1.3.2 安装集群工具
1 | 1. 配置 kubernetes 镜像源为阿里云 |
1.3.3 集群初始化
1.3.3.1 下载容器镜像
- k8s-master01 节点执行
1 | 1. 通过命令获取对应集群需要使用的容器镜像 |
1.3.3.2 初始化 Master
1 | 1. 执行 kubeadm init 初始化集群,然后设置对应的参数 |
1.3.3.3 初始化 Node
- 所有 Node 节点执行
1 | 1. 加入 node 节点 (containerd 方式) |
1.3.4 calico 网络插件安装
- 可将 calico.yaml 文件中涉及到的镜像保存到 harbor 仓库并修改 calico.yaml 配置文件后再执行,否则会无法拉取到镜像!
1 | [root@k8s-master01 ~]# wget https://docs.projectcalico.org/manifests/calico.yaml --no-check-certificate |
1.3.5 优化
1.3.5.1 命令补全
1 | 3. 添加 nerdctl 自动补全 |
1.3.5.2 ipvs 模式修改
- 设置集群为 IPVS 模式
1 | // 注: |
1.4 集群单 Master 扩展
- 高可用架构:在 k8s 高可用中,我们会运行多个 Master 节点,而多个 Master 节点都会运行 API 服务器,控制器管理器和调度器等控制平面组件。这样,即使某个 Master 节点出现故障,其它的 Master 节点任然可以继续提供服务,整个集群的管理和控制能力不会受到影响。
- 为了实现这一点,我们需要一些额外的技术和组件:
- 负载均衡:负责将请求调度到多个 Master 节点上的 APIServer。确保所有发往 APIServer 的请求都能被成功的路由到一个可用的 Master 节点。
- ETCD 集群:k8s 使用 etcd 作为集群的数据存储。在实现 k8s 的高可用时,etcd 同样需要部署在多个节点上,以避免单点故障。若某个节点崩溃,数据可以从其它节点进行恢复。
- 领导者选举:Controller Manager 和 Scheduler 在多个节点上运行,但不采用负载均衡模式。而这些组件是通过领导者选举机制,只有一个副本(领导者)处于活动状态。若当前领导者崩溃,另外一个副本会被选举为新的领导者,以此保持高可用性。
1.4.1 apiserver 创建负载均衡
- 为 apiserver 创建负载均衡,并配置对应的域名解析
- 负载均衡将流量调度给多个控制平面节点的 apiserver
1.4.1.1 haproxy 配置
- haproxy 源码安装
- k8s-node01、k8s-node02 两台主机的 haproxy 安装配置均一样!
1.4.1.1.1 主配置文件
1 | # cat /data/apps/haproxy/haproxy.cfg |
1.4.1.1.2 状态配置文件
1 | # cat /data/apps/haproxy/conf.d/k8s-stats.cfg |
1.4.1.1.3 apiserver 子配置文件
1 | # cat /data/apps/haproxy/conf.d/k8s-master-ha.cfg |
1.4.1.1.4 启动 haproxy
1 | # cat /usr/lib/systemd/system/haproxy.service |
1.4.1.2 keepalived 配置
- version: keepalived-2.0.10
1.4.1.2.1 proxy01 配置
- k8s-node01 主机
1 | [root@k8s-node01 ~]# cat /data/apps/keepalived/etc/keepalived/keepalived.conf |
1 | [root@k8s-node01 ~]# cat /data/apps/keepalived/keepalived_stop.sh |
1.4.1.2.2 proxy02 配置
- k8s-node02 主机
1 | [root@k8s-node02 ~]# cat /data/apps/keepalived/etc/keepalived/keepalived.conf |
1 | [root@k8s-node02 ~]# cat /data/apps/keepalived/keepalived_stop.sh |
1.4.1.3 haproxy 状态页访问
- http://10.16.41.25:9999/kube?stats
admin:ink8s.com
1.4.2 master 节点环境准备
1.4.2.1 配置主机解析
- 在 2台新增的 Master 主机上修改 /etc/hosts 文件。其它节点暂时不能修改!
- 相关组件及软件安装已在 “1.2 环境安装” 里面已经完成。
1 | # cat /etc/hosts |
1.4.2.2 下载控制平面镜像
1 | [root@k8s-master02 ~]# kubeadm config images pull --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.28.0 |
1.4.3 将节点加入控制平面
1.4.3.1 颁发证书
- 如果在此前使用 kubeadm init 初始化集群,没有添加 –upload-certs 参数,则需要手动将证书从主控制节点复制到将要加入的控制节点上,当然也可以通过如下方式,在现有的主节点上使用 –upload-certs 重新上传证书,并共享给其他控制节点使用
1 | [root@k8s-master01 ~]# kubeadm init phase upload-certs --upload-certs |
1.4.3.2 加入集群
1 | 1. 在现有主节点上,运行以下命令,然后获取其它节点加入到集群的指令 |
1.4.3.3 检查集群状态
1 | [root@k8s-master01 ~]# kubectl get nodes |
1.4.3.4 检查集群可用性
- APIServer 的高可用性主要依赖 keepalived 能否正常切换 vip 地址。但要验证 controllerManager 和 Schduler 的可用性,则可以通过如下步骤
- 首先,确定 kube-controllerManager 和 Schedulered 的 leader 节点是哪一个
- 然后,我们需要模拟 leader 节点故障,然后观察 leader 节点能否正常的切换到另外一个节点
1 | 1. 检查 controllerManager 目前的 leader 是那个节点,过滤 became leader (领导者) 关键字 |
1 | 2. 检查 Scheduler 目前的 leader 是哪个节点,过滤 successfully 关键字 |
1 | 3. 删除 leader 节点的 controllManager,验证能否正常切换 |
1 | 4. 删除 leader 节点上的 scheduler,验证是否正常切换 |
1 | 5. 还原 kube-controller-manager.yaml、kube-scheduler.yaml |
1.4.4 修改 hosts 解析
- 在此前单 master 多 node 配置中,我们将 k8s-vip.inadm.com 临时指向到了 k8s-master01 节点。现在可以将其重新指向负载均衡的地址。以实现 master 节点的负载均衡
- 修改节点(包括 master 和 node 节点)上的 /etc/hosts 文件
- 找到原先将 k8s-vip.inadm.com 指向 k8s-master01 节点的记录,更改为指向负载均衡的地址
1 | // 修改 k8s-master01、k8s-node01、k8s-node02、k8s-node03 的 hosts |
1.5 集群资源监控
- Metrics Server是一个集群范围的资源使用情况的数据聚合器。作为一个应用部署在集群中。Metric server从每个节点上Kubelet API收集指标,通过Kubernetes聚合器注册在Master APIServer中。为集群提供Node、Pods资源利用率指标
- 先部署 Metrics Server 高可用,再调整每个 Master 节点上的 “kube-apiserver.yaml” 文件
1.5.1 metrics server 高可用性
1 |
|
1.5.1 metrics server 负载平衡
- kube-apiserver是以静态Pod的形式运行的,所以我们需要修改该Pod的清单文件
- 在所有 Master 节点上重复此操作、逐节点操作以避免服务中断
- 对于Metrics Server,确保你已经部署了多个副本(例如两个),并且它们都正常运行!!!
1 | // 在`kube-apiserver`容器的`command`部分,添加`--enable-aggregator-routing=true |
1.5.2 验证
1 | // 修改后,可以通过以下命令检查kube-apiserver的启动参数 |
1.6 ingress 安装
- 将Ingress Controller暴露,一般使用NodePort或者宿主机网络(hostNetwork: true)
- NodePort: 管理方便
- hostNetwork: 性能更好
- 使用 DaemonSet 方式部署,但需要通过 nodeSelector 来选择几个节点安装,并非所有节点都需要安装
- 将 Pod 的端口与节点共享网络名称空间;设定 Hostnetwork
- kubernetes_1.28.0 <=> ingress_1.12.2
1 | # wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.13.0/deploy/static/provider/baremetal/deploy.yaml |
- 本文作者: [email protected]
- 本文链接: https://www.ink8s.com/2025/07/14/kubernets-集群搭建/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!