概述
本指南详细介绍了如何使用 KubeKey 工具在本地环境快速部署 Kubernetes 集群和 KubeSphere 平台。KubeKey 是一个轻量级的集群部署工具,支持一键部署 Kubernetes、KubeSphere 以及相关的云原生生态系统。
架构说明
┌──────────────────────────────────────────────────────────────┐
│ Master Node (192.168.188.138) │
│ ┌─────────────┐ ┌─────────────┐ ┌──────────────┐ │
│ │ API Server │ │ Controller │ │ Scheduler │ │
│ └─────────────┘ │ Manager │ └──────────────┘ │
│ └─────────────┘ │
│ ┌─────────────┐ ┌─────────────┐ ┌──────────────┐ │
│ │ etcd │ │ kubelet │ │ kube-proxy │ │
│ └─────────────┘ └─────────────┘ └──────────────┘ │
│ │
│ ┌──────────────────────────────────────────────┐ │
│ │ KubeSphere Console │ │
│ └──────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────┘
│
┌──────────────┴──────────────┐
│ │
┌────────────────▼─────────────┐ ┌──────────────▼──────────────┐
│ Worker Node1 (192.168.188.143) │ Worker Node2 (192.168.188.144) │
│ ┌─────────────┐ │ │ ┌─────────────┐ │
│ │ kubelet │ │ │ │ kubelet │ │
│ └─────────────┘ │ │ └─────────────┘ │
│ ┌─────────────┐ │ │ ┌─────────────┐ │
│ │ kube-proxy │ │ │ │ kube-proxy │ │
│ └─────────────┘ │ │ └─────────────┘ │
│ ┌─────────────┐ │ │ ┌─────────────┐ │
│ │ Container │ │ │ │ Container │ │
│ │ Runtime │ │ │ │ Runtime │ │
│ └─────────────┘ │ │ └─────────────┘ │
└──────────────────────────┘ └─────────────────────────────────┘
网络拓扑
默认网络配置:
- Pod 网络 CIDR: 10.244.0.0/16
- Service 网络 CIDR: 10.96.0.0/12
- CNI 插件: Calico (默认)
- DNS: CoreDNS
- 负载均衡: kube-proxy (iptables 模式)
组件说明
核心组件:
- kube-apiserver: Kubernetes API 服务器,提供 REST API 接口
- kube-controller-manager: 控制器管理器,负责集群状态管理
- kube-scheduler: 调度器,负责 Pod 调度
- etcd: 分布式键值存储,保存集群状态数据
- kubelet: 节点代理,管理 Pod 生命周期
- kube-proxy: 网络代理,实现 Service 负载均衡
KubeSphere 组件:
- ks-console: Web 控制台
- ks-apiserver: KubeSphere API 服务器
- ks-controller-manager: KubeSphere 控制器
环境准备
系统要求
| Ubuntu 16.04,18.04,20.04 | CPU:2 核,内存:4 G,硬盘:40 G |
|---|---|
| Debian Buster,Stretch | CPU:2 核,内存:4 G,硬盘:40 G |
| CentOS 7.x | CPU:2 核,内存:4 G,硬盘:40 G |
| Red Hat Enterprise Linux 7 | CPU:2 核,内存:4 G,硬盘:40 G |
| SUSE Linux Enterprise Server 15 /openSUSE Leap 15.2 | CPU:2 核,内存:4 G,硬盘:40 G |
- CPU 必须为 x86_64,暂时不支持 Arm 架构的 CPU。
- 系统应该为纯净镜像不包含其他服务
节点要求
- 所有节点必须都能通过
SSH访问。 - 所有节点时间同步。
- 所有节点都应使用
sudo/curl/openssl/tar。
容器要求(可以不安装容器)
| 支持的容器运行时 | 版本 |
|---|---|
| Docker | 19.3.8+ |
| containerd | 最新版 |
| CRI-O(试验版,未经充分测试) | 最新版 |
| iSula(试验版,未经充分测试) | 最新版 |
依赖项要求
| 依赖项 | Kubernetes 版本 ≥ 1.18 | Kubernetes 版本 < 1.18 |
|---|---|---|
socat | 必须 | 可选,但建议安装 |
conntrack | 必须 | 可选,但建议安装 |
ebtables | 可选,但建议安装 | 可选,但建议安装 |
ipset | 可选,但建议安装 | 可选,但建议安装 |
网络和 DNS 要求
- 请确保
/etc/resolv.conf中的 DNS 地址可用,否则,可能会导致集群中的 DNS 出现问题。 - 网络配置使用防火墙规则或安全组,请务必确保基础设施组件可以通过特定端口相互通信。建议您关闭防火墙。
演示机器准备
本示例使用三台 CentOS 7.9 虚拟机搭建集群:
| 主机 IP | 主机名 | 角色 | 配置 |
|---|---|---|---|
| 192.168.188.138 | master | control plane, etcd | CPU:4 核,内存:8 G,硬盘:40 G |
| 192.168.188.143 | node1 | worker | CPU:4 核,内存:8 G,硬盘:40 G |
| 192.168.188.144 | node2 | worker | CPU:4 核,内存:8 G,硬盘:40 G |
初始化系统环境
⚠️ 注意: 以下所有初始化操作需要在所有节点上执行
更新yum源
yum -y update
配置主机名
#查看主机名称
hostname
#更改名称 hostnamectl --static set-hostname 服务器名称
hostnamectl --static set-hostname master
#查看主机名称核验
hostnamectl status
#可以重启一下服务器
#reboot
防火墙配置
方式一:关闭防火墙(推荐测试环境)
systemctl disable firewalld
systemctl stop firewalld
方式二:配置防火墙规则(推荐生产环境)
如果需要保持防火墙开启,则需要开放以下端口:
Master 节点需要开放的端口:
| 端口 | 协议 | 描述 |
|---|---|---|
| 6443 | TCP | Kubernetes API Server |
| 2379-2380 | TCP | etcd server client API |
| 10250 | TCP | Kubelet API |
| 10251 | TCP | kube-scheduler |
| 10252 | TCP | kube-controller-manager |
| 30000-32767 | TCP | NodePort Services |
Worker 节点需要开放的端口:
| 端口 | 协议 | 描述 |
|---|---|---|
| 10250 | TCP | Kubelet API |
| 30000-32767 | TCP | NodePort Services |
端口转发配置
firewall-cmd --add-masquerade --permanent # 端口转发
firewall-cmd --reload
firewall-cmd --list-all
firewall-cmd --list-all --zone=trusted
开放全部端口
firewall-cmd --zone=public --add-port=1-65535/udp --permanent
firewall-cmd --zone=public --add-port=1-65535/tcp --permanent
firewall-cmd --reload
禁用 SELinux
# 使用 sed 修改配置文件,实现彻底的禁用
sed -i 's/^SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
# 使用命令,实现临时禁用,这一步其实不做也行,KubeKey 会自动配置
setenforce 0
系统参数优化
关闭 swap 分区
Kubernetes 要求关闭 swap 以保证 Pod 的性能和稳定性:
swapoff -a
echo "vm.swappiness=0" >> /etc/sysctl.conf
sysctl -p /etc/sysctl.conf
配置epel源(国内服务器)
rpm -ivh http://mirrors.aliyun.com/epel/epel-release-latest-7.noarch.rpm
时间同步配置
配置服务器时区
#配置服务器时区为 Asia/Shanghai
timedatectl set-timezone Asia/Shanghai
#验证
timedatectl
配置时间同步
ntpdate time.windows.com
#安装 chrony 作为时间同步软件
yum install chrony -y
#修改配置文件 /etc/chrony.conf,修改 ntp 服务器配置。
vi /etc/chrony.conf
# 删除所有的 server 配置
# server 0.centos.pool.ntp.org iburst
# server 1.centos.pool.ntp.org iburst
# server 2.centos.pool.ntp.org iburst
# server 3.centos.pool.ntp.org iburst
# 增加国内的 ntp 服务器,或是指定其他常用的时间服务器
pool cn.pool.ntp.org iburst
#重启并设置 chrony 服务开机自启动。
systemctl enable chronyd --now
#验证 chrony 同步状态。
chronyc sourcestats -v
# 正常的输出结果如下
[root@master ~]# chronyc sourcestats -v
210 Number of sources = 4
.- Number of sample points in measurement set.
/ .- Number of residual runs with same sign.
| / .- Length of measurement set (time).
| | / .- Est. clock freq error (ppm).
| | | / .- Est. error in freq.
| | | | / .- Est. offset.
| | | | | | On the -.
| | | | | | samples. \
| | | | | | |
Name/IP Address NP NR Span Frequency Freq Skew Offset Std Dev
==============================================================================
tock.ntp.infomaniak.ch 41 22 297m -0.227 0.504 -12ms 4011us
makaki.miuku.net 26 10 312m -0.014 0.497 +27ms 4083us
electrode.felixc.at 22 15 241m -0.399 1.350 -49ms 6966us
ntp5.flashdance.cx 38 14 315m +0.363 0.600 +27ms 4865us
关闭系统防火墙
安装依赖组件
yum install -y ebtables socat ipset conntrack
SSH密钥配置
💡 提示: SSH 密钥配置可以简化后续的集群管理操作,推荐在生产环境中使用
仅需在 master 主节点运行:
#使用 ssh-keygen 命令生成一个新的 SSH 密钥对,一直按回车直到生密钥对
ssh-keygen -t ed25519
#将 SSH 公钥从 master 节点发送到其他节点。命令执行时输入 yes,以接受服务器的 SSH 指纹,然后在出现提示时输入 root 用户的密码。
ssh-copy-id root@192.168.188.143
ssh-copy-id root@192.168.188.144
#验证登录
ssh root@192.168.188.143
ssh root@192.168.188.144
#输出结果如下
[root@master ~]# ssh root@192.168.188.143
Last login: Tue Oct 24 00:29:36 2023 from 192.168.188.138
[root@node1 ~]#
内核升级
💡 提示: 升级内核可以获得更好的性能和稳定性,特别是对于容器和网络性能
仅需主master 主节点运行
CentOS 7.9 的默认内核版本为 3.10.0-1160.102.1,与其他操作系统内核版本动辄 5.x、6.x 相比
查看当前系统内核版本
uname -r
# 3.10.0-1160.102.1.el7.x86_64
查询当前系统与 Kernel 相关的软件包
#查询当前系统安装了哪些跟 Kernel 有关的软件包,升级内核的时候,一定要把已安装的相关 kernel 包一起升级。
rpm -qa | grep kernel
#kernel-3.10.0-1160.102.1.el7.x86_64
#kernel-tools-3.10.0-1160.102.1.el7.x86_64
#kernel-tools-libs-3.10.0-1160.102.1.el7.x86_64
增加 ELRepo 软件源
#导入 RPM GPG public key
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
#安装 ELRepo
yum install https://www.elrepo.org/elrepo-release-7.el7.elrepo.noarch.rpm
查询可用的内核软件包
#启用新增加的 ELRepo 软件仓库,查询可用的内核软件包。
yum --disablerepo="*" --enablerepo="elrepo-kernel" list available
[root@master ~]# yum --disablerepo="*" --enablerepo="elrepo-kernel" list available
已加载插件:fastestmirror
Loading mirror speeds from cached hostfile
* elrepo-kernel: mirrors.tuna.tsinghua.edu.cn
可安装的软件包
kernel-lt-devel.x86_64 5.4.258-1.el7.elrepo elrepo-kernelkernel-lt-doc.noarch 5.4.258-1.el7.elrepo elrepo-kernelkernel-lt-headers.x86_64 5.4.258-1.el7.elrepo elrepo-kernelkernel-lt-tools-libs-devel.x86_64 5.4.258-1.el7.elrepo elrepo-kernelkernel-ml.x86_64 6.5.8-1.el7.elrepo elrepo-kernelkernel-ml-devel.x86_64 6.5.8-1.el7.elrepo elrepo-kernelkernel-ml-doc.noarch 6.5.8-1.el7.elrepo elrepo-kernelkernel-ml-headers.x86_64 6.5.8-1.el7.elrepo elrepo-kernelkernel-ml-tools.x86_64 6.5.8-1.el7.elrepo elrepo-kernelkernel-ml-tools-libs.x86_64 6.5.8-1.el7.elrepo elrepo-kernelkernel-ml-tools-libs-devel.x86_64 6.5.8-1.el7.elrepo elrepo-kernelperf.x86_64 5.4.258-1.el7.elrepo elrepo-kernelpython-perf.x86_64 5.4.258-1.el7.elrepo elrepo-kernel[root@master ~]#
#当前最新 lt 版内核为 5.4.258-1 a信用最新版本内核
安装新版本内核
#只安装内核,同时安装其他包会报错
yum --enablerepo=elrepo-kernel install kernel-lt
#安装成功会提示
#Complete!
配置新内核引导系统
#查看已经安装的 kernel 信息
grubby --info=ALL | grep ^kernel
#kernel=/boot/vmlinuz-5.4.258-1.el7.elrepo.x86_64
#kernel=/boot/vmlinuz-3.10.0-1160.102.1.el7.x86_64
#kernel=/boot/vmlinuz-3.10.0-1062.el7.x86_64
#kernel=/boot/vmlinuz-0-rescue-fc61eb831f5b4eda852bfd7c596c8c87
#查看当前系统默认内核
grubby --default-kernel
#/boot/vmlinuz-3.10.0-1160.102.1.el7.x86_64
#修改系统默认内核为新内核
grubby --set-default "/boot/vmlinuz-5.4.268-1.el7.elrepo.x86_64"
#查看系统默认内核
grubby --default-kernel
/boot/vmlinuz-5.4.258-1.el7.elrepo.x86_64
#重启
reboot
进入引导画面后选中最新的内核默认启动

重启系统并查看系统内核
#查看内核版本信息
uname -rs
#Linux 5.4.258-1.el7.elrepo.x86_64
#查看已经安装的内核相关软件
rpm -qa | grep kernel
#kernel-lt-5.4.258-1.el7.elrepo.x86_64
#kernel-lt-tools-3.10.0-1160.102.1.el7.elrepo.x86_64
#kernel-3.10.0-1160.102.1.el7.x86_64
#kernel-3.10.0-1062.el7.x86_64
#kernel-lt-tools-libs-3.10.0-1160.102.1.el7.elrepo.x86_64
# 卸载旧版本的 kernel-tools 相关软件包
yum remove kernel-tools-3.10.0-1160.102.1.el7.x86_64 kernel-tools-libs-3.10.0-1160.102.1.el7.x86_64
# 安装新版本的 kernel-tools 相关软件包
yum --enablerepo=elrepo-kernel install kernel-lt-tools kernel-lt-tools-libs
使用KubeKey部署
下载KubeKey
💡 提示: 以下操作仅需在
master主节点执行
先执行以下命令以确保您从正确的区域下载 KubeKey。
export KKZONE=cn
执行以下命令下载 KubeKey:
curl -sfL https://get-kk.kubesphere.io | VERSION=v3.0.7 sh -
为 kk 添加可执行权限:
chmod +x kk
查看 KubeKey 支持的 Kubernetes 版本列表
./kk version --show-supported-k8s
创建配置文件
命令如下:
./kk create config [--with-kubernetes version] [--with-kubesphere version] [(-f | --file) path]
- 安装 KubeSphere 3.3 的建议 Kubernetes 版本:v1.20.x、v1.21.x、* v1.22.x、* v1.23.x 和 * v1.24.x。带星号的版本可能出现边缘节点部分功能不可用的情况。因此,如需使用边缘节点,推荐安装 v1.21.x。如果不指定 Kubernetes 版本,KubeKey 将默认安装 Kubernetes v1.23.10。
- 如果您在此步骤的命令中不添加标志
--with-kubesphere,则不会部署 KubeSphere,只能使用配置文件中的addons字段安装,或者在您后续使用./kk create cluster命令时再次添加这个标志。 - 如果您添加标志
--with-kubesphere时不指定 KubeSphere 版本,则会安装最新版本的 KubeSphere。
示例:(默认K8s版本1.23.10,KubeSphere3.3.2)
./kk create config --with-kubesphere 3.3.2
编辑配置文件
如果不改名称,那么将创建默认文件 config-sample.yaml。
vim config-sample.yaml
主机
请参照上方示例在 hosts 下列出您的所有机器并添加详细信息。
name:实例的主机名。
address:任务机和其他实例通过 SSH 相互连接所使用的 IP 地址。根据您的环境,可以是公有 IP 地址或私有 IP
地址。例如,一些云平台为每个实例提供一个公有 IP 地址,用于通过 SSH 访问。在这种情况下,您可以在该字段填入这个公有 IP 地址。
internalAddress:实例的私有 IP 地址。
roleGroups
etcd:etcd 节点名称control-plane:主节点名称worker:工作节点名称
提示
-
在安装 KubeSphere 之前,您可以使用
hosts下提供的信息(例如 IP 地址和密码)通过 SSH 的方式测试任务机和其他实例之间的网络连接。 -
在安装前,请确保端口
6443没有被其他服务占用,否则在安装时会产生冲突(6443为 API 服务器的默认端口)。
示例:
apiVersion: kubekey.kubesphere.io/v1alpha2
kind: Cluster
metadata:
name: sample
spec:
hosts:
- {name: master, address: 192.168.188.138, internalAddress: 192.168.188.138, user: root, password: root}
#上面配置ssh密钥对以后可以使用秘钥直接访问,如没有配置,请使用下面注释内容通过远程访问
- {name: node1, address: 192.168.188.143, internalAddress: 192.168.188.143, privateKeyPath: "~/.ssh/id_ed25519"}
- {name: node2, address: 192.168.188.144, internalAddress: 192.168.188.144, privateKeyPath: "~/.ssh/id_ed25519"}
#- {name: node1, address: 192.168.188.143, internalAddress: 192.168.188.143, user: root, password: root}
#- {name: node2, address: 192.168.188.144, internalAddress: 192.168.188.144, user: root, password: root}
roleGroups:
etcd:
- master
control-plane:
- master
worker:
- node1
- node2
部署集群
使用配置文件创建集群:
./kk create cluster -f config-sample.yaml
如果使用其他名称,则需要将上面的 config-sample.yaml 更改为您自己的文件。
整个安装过程可能需要 10 到 20 分钟,具体取决于您的计算机和网络环境。
验证安装
安装完成后,您会看到如下内容:
#####################################################
### Welcome to KubeSphere! ###
#####################################################
Console: http://192.168.188.138:30880
Account: admin
Password: P@88w0rd
NOTES:
1. After you log into the console, please check the
monitoring status of service components in
"Cluster Management". If any service is not
ready, please wait patiently until all components
are up and running.
2. Please change the default password after login.
#####################################################
https://kubesphere.io 2023-10-24 00:37:49
#####################################################
KubeSphere插件管理
安装DevOps插件
KubeSphere DevOps 提供了基于 Jenkins 的 CI/CD 流水线功能。
以 admin 用户登录控制台,点击左上角的平台管理,选择集群管理。
点击定制资源定义,在搜索栏中输入 clusterconfiguration,点击搜索结果查看其详细页面。
定制资源定义(CRD)允许用户在不新增 API 服务器的情况下创建一种新的资源类型,用户可以像使用其他 Kubernetes 原生对象一样使用这些定制资源。
在自定义资源中,点击 ks-installer 右侧的更多,选择编辑 YAML。
在该 YAML 文件中,搜索 devops,将 enabled 的 false 改为 true。完成后,点击右下角的确定,保存配置。
devops:
enabled: true # 将“false”更改为“true”。
添加minio版本,在spec下面添加下面四个地址
spec:
minio_repo: docker.io.minio/minio
minio_tag: RELEASE.2021-12-29T06-49-06Z
mc_repo: docker.io.minio/mc
mac_tag: RELEASE.2021-12-29T06-52-55Z
在 kubectl 中执行以下命令检查安装过程:
kubectl logs -n kubesphere-system $(kubectl get pod -n kubesphere-system -l 'app in (ks-install, ks-installer)' -o jsonpath='{.items[0].metadata.name}') -f
卸载插件
卸载DevOps
卸载 DevOps:
helm uninstall -n kubesphere-devops-system devops
kubectl patch -n kubesphere-system cc ks-installer --type=json -p='[{"op": "remove", "path": "/status/devops"}]'
kubectl patch -n kubesphere-system cc ks-installer --type=json -p='[{"op": "replace", "path": "/spec/devops/enabled", "value": false}]'
删除 DevOps 资源:
# 删除所有 DevOps 相关资源
for devops_crd in $(kubectl get crd -o=jsonpath='{range .items[*]}{.metadata.name}{"\n"}{end}' | grep "devops.kubesphere.io"); do
for ns in $(kubectl get ns -ojsonpath='{.items..metadata.name}'); do
for devops_res in $(kubectl get $devops_crd -n $ns -oname); do
kubectl patch $devops_res -n $ns -p '{"metadata":{"finalizers":[]}}' --type=merge
done
done
done
# 删除所有 DevOps CRD
kubectl get crd -o=jsonpath='{range .items[*]}{.metadata.name}{"\n"}{end}' | grep "devops.kubesphere.io" | xargs -I crd_name kubectl delete crd crd_name
# 删除 DevOps 命名空间
kubectl delete namespace kubesphere-devops-system
监控和日志配置
监控组件配置
Prometheus 配置
KubeSphere 默认集成了 Prometheus 进行监控,可以通过以下方式自定义配置:
# 编辑 ks-installer 配置
kubectl edit cc -n kubesphere-system ks-installer
# 在 monitoring 部分进行配置
monitoring:
storageClass: "" # 指定存储类
prometheusReplicas: 1
prometheusMemoryRequest: 400Mi
prometheusVolumeSize: 20Gi
alertmanagerReplicas: 1
Grafana 集成
可以集成外部 Grafana 进行更丰富的监控展示:
# 获取 Prometheus 地址
kubectl get svc -n kubesphere-monitoring-system prometheus-k8s
# 在 Grafana 中添加 Prometheus 数据源
# URL: http://prometheus-k8s.kubesphere-monitoring-system:9090
日志收集配置
启用日志系统
logging:
enabled: true
containerruntime: docker
logsidecar:
enabled: true
replicas: 2
ElasticSearch 配置
es:
elasticsearchDataReplicas: 1
elasticsearchDataVolumeSize: 20Gi
elasticsearchMasterReplicas: 1
elasticsearchMasterVolumeSize: 4Gi
elkPrefix: logstash
故障排查
常见问题
1. Pod 无法启动
问题描述: Pod 一直处于 Pending 或 CrashLoopBackOff 状态
排查步骤:
# 查看 Pod 状态
kubectl describe pod <pod-name> -n <namespace>
# 查看 Pod 日志
kubectl logs <pod-name> -n <namespace>
# 查看事件
kubectl get events -n <namespace> --sort-by='.lastTimestamp'
常见原因:
- 资源不足(CPU/内存)
- 镜像拉取失败
- 存储卷挂载失败
- 网络策略限制
2. 节点 NotReady
问题描述: 节点状态显示为 NotReady
排查步骤:
# 查看节点状态
kubectl describe node <node-name>
# 检查 kubelet 日志
journalctl -u kubelet -f
# 检查容器运行时
systemctl status docker
# 或
systemctl status containerd
常见原因:
- kubelet 服务异常
- 容器运行时故障
- 网络插件问题
- 磁盘空间不足
3. etcd 集群异常
问题描述: etcd 集群无法正常工作
排查步骤:
# 检查 etcd 集群健康状态
kubectl -n kubesphere-system exec -it etcd-master -- etcdctl \
--endpoints=https://127.0.0.1:2379 \
--cacert=/etc/kubernetes/pki/etcd/ca.crt \
--cert=/etc/kubernetes/pki/etcd/healthcheck-client.crt \
--key=/etc/kubernetes/pki/etcd/healthcheck-client.key \
endpoint health
# 查看 etcd 成员
etcdctl member list
调试命令
集群状态检查
# 检查集群信息
kubectl cluster-info
# 查看所有节点状态
kubectl get nodes -o wide
# 查看所有 Pod 状态
kubectl get pods --all-namespaces
# 查看组件状态
kubectl get componentstatuses
网络诊断
# 测试 Pod 间网络连通性
kubectl run test-pod --image=busybox --rm -it -- sh
# 在 Pod 内执行
ping <other-pod-ip>
nslookup kubernetes.default
# 查看 Service 端点
kubectl get endpoints
# 查看网络策略
kubectl get networkpolicies --all-namespaces
日志查看
系统组件日志
# Master 组件日志
journalctl -u kube-apiserver -f
journalctl -u kube-controller-manager -f
journalctl -u kube-scheduler -f
# 节点组件日志
journalctl -u kubelet -f
journalctl -u kube-proxy -f
# 容器运行时日志
journalctl -u docker -f
journalctl -u containerd -f
KubeSphere 组件日志
# 查看 ks-installer 日志
kubectl logs -n kubesphere-system $(kubectl get pod -n kubesphere-system -l app=ks-install -o jsonpath='{.items[0].metadata.name}') -f
# 查看 ks-apiserver 日志
kubectl logs -n kubesphere-system -l app=ks-apiserver -f
# 查看 ks-console 日志
kubectl logs -n kubesphere-system -l app=ks-console -f
生产环境最佳实践
高可用配置
1. Master 节点高可用
生产环境建议部署 3 个或更多 Master 节点:
# config-sample.yaml
spec:
hosts:
- {name: master1, address: 192.168.188.138, internalAddress: 192.168.188.138, role: [control-plane,etcd]}
- {name: master2, address: 192.168.188.139, internalAddress: 192.168.188.139, role: [control-plane,etcd]}
- {name: master3, address: 192.168.188.140, internalAddress: 192.168.188.140, role: [control-plane,etcd]}
controlPlaneEndpoint:
domain: lb.kubesphere.local
address: "192.168.188.100" # 负载均衡器 VIP
port: 6443
2. etcd 高可用
- 使用奇数个 etcd 节点(3、5 或 7)
- 配置 etcd 数据备份
- 使用 SSD 存储提高性能
# etcd 备份脚本
#!/bin/bash
ETCDCTL_API=3 etcdctl \
--endpoints=https://127.0.0.1:2379 \
--cacert=/etc/kubernetes/pki/etcd/ca.crt \
--cert=/etc/kubernetes/pki/etcd/healthcheck-client.crt \
--key=/etc/kubernetes/pki/etcd/healthcheck-client.key \
snapshot save /backup/etcd-snapshot-$(date +%Y%m%d_%H%M%S).db
安全配置
1. RBAC 配置
创建最小权限的角色和绑定:
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: pod-reader
namespace: default
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "list"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: read-pods
namespace: default
subjects:
- kind: User
name: jane
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: Role
name: pod-reader
apiGroup: rbac.authorization.k8s.io
2. 网络策略
限制 Pod 间的网络访问:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: deny-all
namespace: production
spec:
podSelector: {}
policyTypes:
- Ingress
- Egress
3. Pod 安全策略
apiVersion: policy/v1beta1
kind: PodSecurityPolicy
metadata:
name: restricted
spec:
privileged: false
allowPrivilegeEscalation: false
requiredDropCapabilities:
- ALL
volumes:
- 'configMap'
- 'emptyDir'
- 'projected'
- 'secret'
- 'downwardAPI'
- 'persistentVolumeClaim'
runAsUser:
rule: 'MustRunAsNonRoot'
seLinux:
rule: 'RunAsAny'
fsGroup:
rule: 'RunAsAny'
性能优化
1. kubelet 参数优化
编辑 /var/lib/kubelet/config.yaml:
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
# 提高 Pod 启动速度
serializeImagePulls: false
maxParallelImagePulls: 5
# 资源预留
systemReserved:
cpu: 100m
memory: 100Mi
kubeReserved:
cpu: 100m
memory: 100Mi
# 垃圾回收
imageGCHighThresholdPercent: 85
imageGCLowThresholdPercent: 80
2. etcd 性能优化
# 增加 etcd 配额
etcdctl quota set --backend-bytes=$((16*1024*1024*1024))
# 定期压缩历史版本
etcdctl compact $(etcdctl endpoint status --write-out="json" | jq -r '.[] | .Status.header.revision')
# 定期去碎片化
etcdctl defrag --endpoints=localhost:2379
3. API Server 优化
# 编辑 /etc/kubernetes/manifests/kube-apiserver.yaml
apiServer:
extraArgs:
max-requests-inflight: "1000"
max-mutating-requests-inflight: "500"
default-watch-cache-size: "1000"
audit-log-maxage: "30"
audit-log-maxbackup: "3"
audit-log-maxsize: "100"
备份策略
1. etcd 定期备份
创建定时任务:
# /etc/systemd/system/etcd-backup.service
[Unit]
Description=etcd backup
[Service]
Type=oneshot
ExecStart=/usr/local/bin/etcd-backup.sh
# /etc/systemd/system/etcd-backup.timer
[Unit]
Description=etcd backup timer
[Timer]
OnCalendar=daily
Persistent=true
[Install]
WantedBy=timers.target
2. 持久化存储备份
使用 Velero 进行集群备份:
# 安装 Velero
wget https://github.com/vmware-tanzu/velero/releases/download/v1.9.0/velero-v1.9.0-linux-amd64.tar.gz
tar -xvf velero-v1.9.0-linux-amd64.tar.gz
sudo mv velero-v1.9.0-linux-amd64/velero /usr/local/bin/
# 创建备份
velero backup create my-backup --include-namespaces app1,app2
# 定期备份
velero schedule create daily-backup --schedule="@daily" --ttl 720h0m0s
3. 配置文件备份
#!/bin/bash
# 备份 Kubernetes 配置
BACKUP_DIR="/backup/k8s-config-$(date +%Y%m%d)"
mkdir -p $BACKUP_DIR
# 备份证书
cp -r /etc/kubernetes/pki $BACKUP_DIR/
# 备份配置文件
cp -r /etc/kubernetes/*.conf $BACKUP_DIR/
# 备份 kubelet 配置
cp /var/lib/kubelet/config.yaml $BACKUP_DIR/
# 打包压缩
tar czf $BACKUP_DIR.tar.gz $BACKUP_DIR
rm -rf $BACKUP_DIR
相关文章
Kubernetes 部署系列
- 多节点部署Kubernetes集群 - 生产环境多节点集群部署方案
- Centos 9单节点安装K8s、KubeSphere(arm64) - ARM64架构单节点部署指南
容器基础技术
- Docker安装 - Docker容器运行时安装配置
- Docker环境部署 - Docker生产环境部署指南