一、Docker Cgroup 驱动配置
1.1 CGroup 驱动的重要性
在 Linux 系统中,控制组(CGroup)用于限制分配给进程的资源。kubelet 和容器运行时都需要使用相同的 cgroup 驱动来管理资源分配。
# 配置 Docker 使用 systemd 作为 cgroup 驱动
sudo tee /etc/docker/daemon.json <<EOF
{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2",
"registry-mirrors": [
"https://docker.mirrors.ustc.edu.cn",
"https://docker.xuanyuan.me",
"https://docker.1ms.run",
"https://docker.1panel.live",
"https://hub.rat.dev",
"https://docker-mirror.aigc2d.com",
"https://docker.mybacc.com",
"https://dytt.online"
]
}
EOF
# 重启 Docker 服务
systemctl restart docker
二、Kubernetes 仓库配置
2.1 配置阿里云镜像源
# 创建 Kubernetes yum 仓库配置文件
cat <<EOF | tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
# 临时关闭 SELinux
setenforce 0
# 永久禁用 SELinux(生产环境需谨慎)
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
三、Kubernetes 组件安装与配置
3.1 查看可用版本
# 查看可用的 kubeadm 版本
dnf list --showduplicates kubeadm
3.2 安装指定版本组件
# 安装 Kubernetes 1.23.17 版本组件
dnf install kubeadm-1.23.17-0 kubectl-1.23.17-0 kubelet-1.23.17-0 -y
# 自动安装的依赖包:
# kubeadm-1.23.17-0.x86_64
# kubectl-1.23.17-0.x86_64
# kubelet-1.23.17-0.x86_64
# cri-tools-1.26.0-0.x86_64
# kubernetes-cni-1.2.0-0.x86_64
3.3 配置 kubelet cgroup 驱动
# 设置 kubelet 使用 systemd cgroup 驱动
tee /etc/sysconfig/kubelet <<EOF
KUBELET_EXTRA_ARGS="--cgroup-driver=systemd"
EOF
# 启用 kubelet 服务
systemctl enable kubelet
3.4 查看所需镜像
# 查看 Kubernetes 所需镜像列表
kubeadm config images list
输出示例:
registry.k8s.io/kube-apiserver:v1.23.17
registry.k8s.io/kube-controller-manager:v1.23.17
registry.k8s.io/kube-scheduler:v1.23.17
registry.k8s.io/kube-proxy:v1.23.17
registry.k8s.io/pause:3.6
registry.k8s.io/etcd:3.5.6-0
registry.k8s.io/coredns/coredns:v1.8.6
3.5 生成初始化配置文件
# 生成默认初始化配置
kubeadm config print init-defaults > kube-init.yml
# 编辑配置文件
vim kube-init.yml
修改后的配置文件示例:
apiVersion: kubeadm.k8s.io/v1beta3
kind: InitConfiguration
localAPIEndpoint:
advertiseAddress: 192.168.2.32 # 管理端 IP 地址
bindPort: 6443 # API Server 端口
nodeRegistration:
criSocket: /var/run/dockershim.sock
imagePullPolicy: IfNotPresent
name: master01 # 节点名称
taints: null
---
apiVersion: kubeadm.k8s.io/v1beta3
kind: ClusterConfiguration
kubernetesVersion: 1.23.17 # Kubernetes 版本
imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers # 使用阿里云镜像
networking:
dnsDomain: cluster.local
serviceSubnet: 10.96.0.0/12
controllerManager: {}
scheduler: {}
etcd:
local:
dataDir: /var/lib/etcd
四、集群初始化
4.1 初始化 Master 节点
# 使用配置文件初始化集群
kubeadm init --config kube-init.yml
4.2 配置 kubectl
# 创建 .kube 目录并复制配置文件
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
# 或者使用环境变量方式
export KUBECONFIG=/etc/kubernetes/admin.conf
4.3 查看节点状态
kubectl get nodes
输出示例:
NAME STATUS ROLES AGE VERSION
master01 NotReady control-plane,master 19m v1.23.17
五、网络插件部署
5.1 安装 Calico 网络插件
# 下载 Calico 3.24.1 配置文件
wget https://raw.githubusercontent.com/projectcalico/calico/v3.24.1/manifests/calico.yaml
# 部署 Calico 网络
kubectl apply -f calico.yaml
5.2 验证网络插件
# 查看 kube-system 命名空间下的 Pod
kubectl get pod -n kube-system
# 查看节点状态(应该变为 Ready)
kubectl get nodes
六、测试集群功能
6.1 创建测试应用
创建 nginx-test.yaml 文件:
apiVersion: v1
kind: Pod
metadata:
name: nginx-test
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.20.2
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: nginx-svc
spec:
type: NodePort
selector:
app: nginx
ports:
- name: http
protocol: TCP
port: 80
targetPort: 80
nodePort: 30002
6.2 部署测试应用
# 部署 Nginx 应用
kubectl apply -f nginx-test.yaml
# 查看 Pod 状态
kubectl get pod
# 查看 Service
kubectl get svc
# 测试访问
curl http://<节点IP>:30002
6.3 清理测试应用
# 删除测试应用
kubectl delete -f nginx-test.yaml
# 或者删除单个 Pod
kubectl delete pod nginx-test
七、Worker 节点加入集群
7.1 获取加入命令
# 查看初始化时生成的加入命令
# 在 Master 节点上执行
# 如果 token 过期(24小时有效期),重新生成
kubeadm token create --print-join-command
7.2 Worker 节点执行加入命令
# 在 Worker 节点上执行(示例)
kubeadm join 192.168.2.32:6443 \
--token abcdef.0123456789abcdef \
--discovery-token-ca-cert-hash sha256:1d5e264d2e0dd29e0f8d433b4f548901a187b21f97d15cb73fe171ca5a43f17b
八、Kubernetes 核心组件说明
| 组件 | 功能描述 |
|---|---|
| kubeadm | 用于初始化集群,生成安全证书和令牌,配置集群所需组件 |
| kubelet | 与 Master 节点通信,根据调度决策创建/更新/删除 Pod,维护节点容器状态 |
| kubectl | Kubernetes 集群管理命令行工具 |
| kube-proxy | 维护节点网络规则,实现服务发现和负载均衡 |
| kube-scheduler | 调度 Pod 到合适的节点 |
| kube-controller-manager | 运行控制器进程,维护集群状态 |
| etcd | 分布式键值存储,保存集群所有数据 |
九、故障排查
9.1 常见问题
-
节点处于 NotReady状态
# 查看节点详细信息 kubectl describe node <节点名称> # 查看 kubelet 日志 journalctl -u kubelet -f2. Pod 创建失败
查看 Pod 详情
kubectl describe pod <pod名称>
查看 Pod 日志
kubectl logs <pod名称>
3.镜像拉取失败
# 检查镜像仓库配置
docker info | grep -i mirror
9.2 重置集群
# 如果初始化失败,可以重置集群
kubeadm reset
rm -rf /etc/kubernetes/
rm -rf ~/.kube/
十、总结
本文详细介绍了 Kubernetes 1.23.17 集群的完整部署流程,包括:
-
Docker cgroup 驱动配置
-
Kubernetes 仓库配置
-
组件安装与配置
-
集群初始化
-
网络插件部署
-
集群功能测试
-
Worker 节点加入
-
故障排查方法