在容器编排领域,Kubernetes 1.23版本是个非常稳定的长期支持版本。这个版本发布于2021年12月,经过近两年的社区验证,各种边缘场景的bug都已被充分修复。而KubeSphere作为开源的Kubernetes管理平台,提供了企业级的多租户管理、监控告警、DevOps流水线等生产环境必需的功能组件。
我选择这个特定版本组合主要基于以下考虑:
根据实际生产经验,建议采用以下配置:
重要提示:所有节点必须保持时间同步,建议配置chronyd服务
以CentOS 7.9为例,需执行以下基础配置:
bash复制# 关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
# 禁用SELinux
setenforce 0
sed -i 's/^SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
# 加载内核模块
cat > /etc/modules-load.d/k8s.conf <<EOF
br_netfilter
ip_vs
ip_vs_rr
ip_vs_wrr
ip_vs_sh
nf_conntrack
EOF
# 配置内核参数
cat > /etc/sysctl.d/k8s.conf <<EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF
sysctl --system
Kubernetes 1.23版本开始默认使用containerd作为容器运行时:
bash复制# 安装依赖
yum install -y yum-utils device-mapper-persistent-data lvm2
# 添加docker-ce仓库(containerd在docker仓库中)
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# 安装containerd
yum install -y containerd.io
# 生成默认配置
containerd config default > /etc/containerd/config.toml
# 修改sandbox镜像为国内源
sed -i 's|k8s.gcr.io/pause|registry.cn-hangzhou.aliyuncs.com/google_containers/pause|g' /etc/containerd/config.toml
# 启动服务
systemctl enable containerd
systemctl start containerd
检查containerd使用的cgroup驱动是否与kubelet一致:
bash复制# 查看containerd配置
cat /etc/containerd/config.toml | grep SystemdCgroup
# 如果未配置,需要添加
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
SystemdCgroup = true
bash复制# 配置yum源
cat > /etc/yum.repos.d/kubernetes.repo <<EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=0
EOF
# 安装指定版本
yum install -y kubelet-1.23.17 kubeadm-1.23.17 kubectl-1.23.17
# 设置开机启动
systemctl enable kubelet
准备kubeadm配置文件:
yaml复制# kubeadm-config.yaml
apiVersion: kubeadm.k8s.io/v1beta3
kind: InitConfiguration
localAPIEndpoint:
advertiseAddress: 192.168.1.100 # 替换为实际IP
bindPort: 6443
nodeRegistration:
criSocket: /run/containerd/containerd.sock
imagePullPolicy: IfNotPresent
taints: null
---
apiVersion: kubeadm.k8s.io/v1beta3
kind: ClusterConfiguration
kubernetesVersion: 1.23.17
controlPlaneEndpoint: "192.168.1.100:6443"
imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers
networking:
podSubnet: "10.244.0.0/16"
serviceSubnet: "10.96.0.0/12"
---
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
cgroupDriver: systemd
执行初始化:
bash复制kubeadm init --config=kubeadm-config.yaml --upload-certs
初始化成功后,按照提示配置kubectl:
bash复制mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
这里选择Flannel作为CNI插件:
bash复制kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml
验证网络插件状态:
bash复制kubectl get pods -n kube-system -l app=flannel
KubeSphere需要以下组件:
安装metrics-server:
bash复制kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
使用最小化安装(仅核心功能):
bash复制kubectl apply -f https://github.com/kubesphere/ks-installer/releases/download/v3.3.2/kubesphere-installer.yaml
kubectl apply -f https://github.com/kubesphere/ks-installer/releases/download/v3.3.2/cluster-configuration.yaml
查看安装进度:
bash复制kubectl logs -n kubesphere-system $(kubectl get pod -n kubesphere-system -l app=ks-install -o jsonpath='{.items[0].metadata.name}') -f
安装完成后,获取控制台访问地址:
bash复制kubectl get svc -n kubesphere-system ks-console
默认管理员账号:
在/etc/sysctl.conf中添加:
conf复制# 提高连接跟踪表大小
net.netfilter.nf_conntrack_max=1048576
net.netfilter.nf_conntrack_tcp_timeout_established=86400
# 优化网络性能
net.core.somaxconn=32768
net.ipv4.tcp_max_syn_backlog=8192
创建/var/lib/kubelet/config.yaml:
yaml复制apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
evictionHard:
memory.available: "500Mi"
nodefs.available: "10%"
nodefs.inodesFree: "5%"
imagefs.available: "10%"
maxPods: 150
检查kubelet服务状态:
bash复制journalctl -u kubelet -n 50 --no-pager
验证网络插件:
bash复制kubectl get pods -n kube-system
检查容器运行时:
bash复制crictl ps -a
典型原因及解决方案:
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| 无可用节点 | 节点污点/资源不足 | kubectl describe node |
| 镜像拉取失败 | 镜像仓库不可达 | 配置私有仓库或使用国内镜像 |
| PVC未绑定 | StorageClass配置错误 | kubectl get pvc |
Kubernetes证书默认1年有效期,提前3个月更新:
bash复制kubeadm certs renew all
systemctl restart kubelet
从1.23升级的建议路径:
1.23 → 1.24 → 1.25 → 1.26
每个版本升级前需要:
为KubeSphere用户创建自定义角色:
yaml复制apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: production
name: app-developer
rules:
- apiGroups: [""]
resources: ["pods", "services"]
verbs: ["create", "get", "list"]
限制命名空间间通信:
yaml复制apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: default-deny
namespace: production
spec:
podSelector: {}
policyTypes:
- Ingress
- Egress
通过控制台可查看:
配置日志收集器:
yaml复制apiVersion: apps/v1
kind: DaemonSet
metadata:
name: filebeat
spec:
template:
spec:
containers:
- name: filebeat
image: docker.elastic.co/beats/filebeat:8.5.0
volumeMounts:
- name: varlog
mountPath: /var/log
volumes:
- name: varlog
hostPath:
path: /var/log