KubeSphere实战:借助kubekey从零到一构建高可用K8s集群与管理平台
1. 为什么选择KubeSphere和kubekey搭建K8s集群
在云原生时代,Kubernetes已经成为容器编排的事实标准。但对于很多刚接触K8s的开发者来说,原生的Kubernetes部署和管理仍然存在较高的门槛。这正是KubeSphere的价值所在 - 它是一款开源的分布式多租户容器管理平台,在Kubernetes之上提供了直观易用的操作界面和向导式操作方式。
我最初接触KubeSphere时,最吸引我的是它的一站式解决方案。传统搭建K8s集群需要手动配置各个组件,而KubeSphere提供的kubekey工具,可以自动化完成从K8s集群部署到KubeSphere平台安装的全过程。这让我从一个需要花费数天时间搭建环境的运维工程师,变成了只需要几小时就能完成生产级部署的技术专家。
kubekey作为KubeSphere的官方部署工具,用Go语言开发,具有以下优势:
- 全自动化:一条命令完成K8s集群和KubeSphere的安装
- 灵活配置:支持自定义K8s版本、网络插件等参数
- 高可用支持:内置负载均衡方案,轻松构建生产级集群
- 跨平台:支持物理机、虚拟机、公有云等多种环境
2. 环境准备与初始化配置
2.1 服务器规划建议
在实际部署前,合理的服务器规划至关重要。根据我的经验,一个生产可用的最小集群需要至少3个节点:
- 控制节点:建议2核CPU/4GB内存/50GB磁盘起步
- 工作节点:建议4核CPU/8GB内存/100GB磁盘起步
- 存储节点:如果需要持久化存储,建议单独配置
我最近为一个中型项目部署的集群配置如下:
192.168.1.101 master1 (控制平面) 192.168.1.102 master2 (控制平面) 192.168.1.103 master3 (控制平面) 192.168.1.111 worker1 (工作节点) 192.168.1.112 worker2 (工作节点)2.2 系统初始化配置
在所有节点上执行以下配置,这是确保K8s稳定运行的基础:
# 关闭防火墙 systemctl stop firewalld && systemctl disable firewalld # 关闭SELinux setenforce 0 sed -i 's/enforcing/disabled/' /etc/selinux/config # 关闭swap swapoff -a sed -ri 's/.*swap.*/#&/' /etc/fstab # 配置内核参数 cat > /etc/sysctl.d/k8s.conf << EOF net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 EOF sysctl --system # 时间同步 yum install -y ntpdate ntpdate time.windows.com注意:这些配置修改后有些需要重启才能生效,建议在开始安装前先完成系统重启。
3. 使用kubekey部署K8s集群
3.1 安装kubekey工具
在master节点上执行以下命令安装kubekey:
# 国内用户推荐使用以下命令加速下载 export KKZONE=cn curl -sfL https://get-kk.kubesphere.io | VERSION=v1.2.1 sh - # 将kk移动到PATH目录 mv kk /usr/local/bin/ # 验证安装 kk version如果遇到网络问题,可以尝试手动下载并解压:
wget https://github.com/kubesphere/kubekey/releases/download/v1.2.1/kubekey-v1.2.1-linux-amd64.tar.gz tar -zxvf kubekey-v1.2.1-linux-amd64.tar.gz mv kk /usr/local/bin/3.2 创建集群配置文件
kubekey使用YAML文件定义集群配置,生成模板:
kk create config --with-kubernetes v1.22.10 --with-kubesphere v3.3.0这会生成一个config-sample.yaml文件,需要根据实际情况修改。以下是我的常用配置示例:
apiVersion: kubekey.kubesphere.io/v1alpha2 kind: Cluster metadata: name: production spec: hosts: - {name: master1, address: 192.168.1.101, internalAddress: 192.168.1.101, user: root, password: "your_password"} - {name: worker1, address: 192.168.1.111, internalAddress: 192.168.1.111, user: root, password: "your_password"} roleGroups: etcd: - master1 control-plane: - master1 worker: - worker1 kubernetes: version: v1.22.10 clusterName: cluster.local autoRenewCerts: true containerManager: docker network: plugin: calico kubePodsCIDR: 10.233.64.0/18 kubeServiceCIDR: 10.233.0.0/18 registry: registryMirrors: - "https://docker.mirrors.ustc.edu.cn" addons: - name: kubesphere namespace: kubesphere-system sources: chart: name: ks-installer repo: https://charts.kubesphere.io/main valuesFile: /etc/kubesphere.yaml3.3 启动集群部署
配置完成后,使用以下命令开始部署:
export KKZONE=cn kk create cluster -f config-sample.yaml | tee kk-install.log部署过程会显示详细的日志,包括:
- 系统依赖检查
- 容器运行时安装
- Kubernetes组件部署
- KubeSphere安装
整个过程根据网络情况可能需要30-60分钟。我建议使用tee命令将日志保存到文件,方便后续排查问题。
4. KubeSphere平台初始化与使用
4.1 访问KubeSphere控制台
部署完成后,kubekey会输出访问信息:
##################################################### ### Welcome to KubeSphere! ### ##################################################### Console: http://192.168.1.101:30880 Account: admin Password: P@88w0rd首次登录需要修改默认密码。登录后你会看到直观的仪表盘,展示了集群的资源使用情况。
4.2 基本功能探索
KubeSphere提供了丰富的功能模块:
- 应用管理:通过应用模板快速部署常见应用
- 监控告警:内置Prometheus和Grafana,提供多维监控
- 日志查询:集中查看所有容器的日志
- 存储管理:支持多种存储方案动态供给
- 多租户管理:基于RBAC的细粒度权限控制
我最常使用的是"应用商店"功能,里面预置了MySQL、Redis、Nginx等常见应用的部署模板,点击几下就能完成部署,比手动写YAML方便多了。
4.3 开启可插拔组件
KubeSphere采用模块化设计,很多高级功能需要手动开启:
- 以admin身份登录
- 进入"平台管理" → "集群管理"
- 选择"CRD",搜索"ClusterConfiguration"
- 编辑ks-installer配置,启用所需组件
例如要开启DevOps功能:
devops: enabled: true保存后,KubeSphere会自动安装相关组件,可以通过以下命令查看进度:
kubectl logs -n kubesphere-system $(kubectl get pod -n kubesphere-system -l app=ks-installer -o jsonpath='{.items[0].metadata.name}') -f5. 生产环境最佳实践
5.1 高可用架构设计
对于生产环境,我建议采用多控制平面设计:
hosts: - {name: master1, address: 192.168.1.101, internalAddress: 192.168.1.101, user: root, password: "your_password"} - {name: master2, address: 192.168.1.102, internalAddress: 192.168.1.102, user: root, password: "your_password"} - {name: master3, address: 192.168.1.103, internalAddress: 192.168.1.103, user: root, password: "your_password"} roleGroups: etcd: - master1 - master2 - master3 control-plane: - master1 - master2 - master35.2 集群维护操作
添加新节点:
- 修改config-sample.yaml添加新主机
- 执行:
kk add nodes -f config-sample.yaml
升级集群:
kk upgrade --with-kubernetes v1.23.8 --with-kubesphere v3.3.1 -f config-sample.yaml备份ETCD数据:
kk create etcd-backup --cluster production --backup-path /opt/etcd-backup5.3 常见问题排查
问题1:Pod一直处于Pending状态
- 检查节点资源是否充足:
kubectl describe pod <pod-name> - 检查存储配置是否正确
问题2:节点NotReady
- 检查kubelet服务状态:
systemctl status kubelet - 检查网络插件是否正常运行:
kubectl get pods -n kube-system
问题3:KubeSphere组件安装失败
- 查看安装器日志:
kubectl logs -n kubesphere-system ks-installer-xxxx - 检查网络连接和资源配额
在实际项目中,我遇到最多的问题是网络插件配置不当导致的跨节点通信问题。Calico是KubeSphere的默认网络插件,如果遇到网络问题,可以尝试重新配置Calico:
kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml