全部笔记All notes

Kubernetes本地集群快速部署完整指南

阅读 16m 39s16m 39s read

概述

本指南详细介绍了如何使用 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.04CPU:2 核,内存:4 G,硬盘:40 G
Debian Buster,StretchCPU:2 核,内存:4 G,硬盘:40 G
CentOS 7.xCPU:2 核,内存:4 G,硬盘:40 G
Red Hat Enterprise Linux 7CPU:2 核,内存:4 G,硬盘:40 G
SUSE Linux Enterprise Server 15 /openSUSE Leap 15.2CPU:2 核,内存:4 G,硬盘:40 G
  • CPU 必须为 x86_64,暂时不支持 Arm 架构的 CPU。
  • 系统应该为纯净镜像不包含其他服务

节点要求

  • 所有节点必须都能通过 SSH 访问。
  • 所有节点时间同步。
  • 所有节点都应使用 sudo/curl/openssl/tar。

容器要求(可以不安装容器)

支持的容器运行时版本
Docker19.3.8+
containerd最新版
CRI-O(试验版,未经充分测试)最新版
iSula(试验版,未经充分测试)最新版

依赖项要求

依赖项Kubernetes 版本 ≥ 1.18Kubernetes 版本 < 1.18
socat必须可选,但建议安装
conntrack必须可选,但建议安装
ebtables可选,但建议安装可选,但建议安装
ipset可选,但建议安装可选,但建议安装

网络和 DNS 要求

  • 请确保 /etc/resolv.conf 中的 DNS 地址可用,否则,可能会导致集群中的 DNS 出现问题。
  • 网络配置使用防火墙规则或安全组,请务必确保基础设施组件可以通过特定端口相互通信。建议您关闭防火墙。

演示机器准备

本示例使用三台 CentOS 7.9 虚拟机搭建集群:

主机 IP主机名角色配置
192.168.188.138mastercontrol plane, etcdCPU:4 核,内存:8 G,硬盘:40 G
192.168.188.143node1workerCPU:4 核,内存:8 G,硬盘:40 G
192.168.188.144node2workerCPU: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 节点需要开放的端口:

端口协议描述
6443TCPKubernetes API Server
2379-2380TCPetcd server client API
10250TCPKubelet API
10251TCPkube-scheduler
10252TCPkube-controller-manager
30000-32767TCPNodePort Services

Worker 节点需要开放的端口:

端口协议描述
10250TCPKubelet API
30000-32767TCPNodePort 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

进入引导画面后选中最新的内核默认启动

image-20231024093226585

重启系统并查看系统内核

#查看内核版本信息
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 部署系列

容器基础技术