对于运维工程师和开发者来说,掌握 Kubernetes(K8s) 已成为一项核心技能。本文将带你从零开始,在 CentOS 7.9 环境中完成一套完整的 K8s 集群部署,并深入理解其核心概念。无论你是初学者还是想巩固基础,这篇指南都将为你提供清晰、可操作的步骤。

Kubernetes 是什么?为什么我们需要它?

Kubernetes,简称 K8s,是当前最流行的开源 容器编排 平台。它源自 Google 多年的大规模容器管理经验,旨在自动化地部署、扩展和管理 容器化部署 应用。

想象一下,当你管理成百上千个 Docker 容器时,手动操作会变得极其复杂和脆弱。K8s 就像一个智能指挥官,解决了以下关键挑战:

  • 服务发现与负载均衡:容器如何互相找到?流量如何分发?
  • 自动发布与回滚:如何无缝更新应用,并在出错时快速恢复?
  • 自我修复:容器崩溃时自动重启,节点故障时自动迁移。
  • 存储编排:轻松为容器挂载持久化存储。
  • 配置与密钥管理:安全地管理密码和配置信息。

K8s 核心架构:Master 与 Node 的协作

一个 K8s 集群由两类节点组成:控制平面(Master)工作节点(Node)

控制平面 (Master) - 集群的大脑

Master 负责所有全局决策和集群管理。其核心组件包括:

  • kube-apiserver (kube-apiserver):所有操作的入口,提供 REST API。
  • etcd (etcd):高可用的键值存储,保存集群状态。
  • kube-scheduler (kube-scheduler):负责将 Pod 调度到合适的节点。
  • kube-controller-manager (kube-controller-manager):运行各种控制器,确保集群达到期望状态。

工作节点 (Node) - 集群的肢体

Node 负责运行实际的容器化应用。每个节点上运行着:

  • kubelet (kubelet):与 Master 通信的代理,管理容器生命周期。
  • kube-proxy (kube-proxy):网络代理,实现服务发现和负载均衡。
  • 容器运行时:如 Docker 或 containerd。

核心概念:Pod、Deployment 与 Service

K8s 的最小调度单元是 Pod,它是一个或多个共享网络和存储的容器组。我们通常不直接创建 Pod,而是通过更高级的控制器来管理它们:

  • Deployment:最常用的无状态应用部署方式,支持滚动更新和扩缩容。
  • Service:为一组 Pod 提供稳定的网络入口和负载均衡。
  • Ingress:管理外部访问,提供 HTTP/HTTPS 路由。
  • ConfigMap & Secret:将配置和敏感信息与镜像解耦。

提示:理解这些概念是掌握 K8s 的关键。建议先花 10 分钟熟悉它们,再开始部署。

️ 环境准备与基础配置

本次部署使用三台 CentOS 7.9 虚拟机,配置如下表:

系统IP角色
centos7.9172.16.106.135k8s-master
centos7.9172.16.106.136k8s-node1
centos7.9172.16.106.138k8s-node2

1. 设置主机名

在每台机器上分别执行以下命令,设置唯一的主机名:

在 172.16.106.135 执行:

hostnamectl set-hostname k8s-master && bash

在 172.16.106.136 执行:

hostnamectl set-hostname k8s-node1 && bash

在 172.16.106.138 执行:

hostnamectl set-hostname k8s-node2 && bash

2. 关闭防火墙与 SELinux

⚠️ 注意:在生产环境中请按需配置防火墙规则,这里为简化部署直接关闭。

三台机器均执行:

systemctl stop firewalld #临时关闭
systemctl disable firewalld #永久关闭
setenforce 0 #临时关闭
vim /etc/selinux/config #永久关闭
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#     enforcing - SELinux security policy is enforced.
#     permissive - SELinux prints warnings instead of enforcing.
#     disabled - No SELinux policy is loaded.
SELINUX=disabled  #改为disabled
# SELINUXTYPE= can take one of three values:
#     targeted - Targeted processes are protected,
#     minimum - Modification of targeted policy. Only selected processes are protected.
#     mls - Multi Level Security protection.
SELINUXTYPE=targeted

3. 关闭 Swap 分区

K8s 要求关闭 Swap,以确保资源分配稳定。三台机器执行:

swapoff -a #临时关闭
sed -ri 's/.*swap.*/#&/' /etc/fstab #永久关闭

4. 配置 Hosts 与网络

添加主机名映射,便于节点间通信:

sudo cat << EOF >> /etc/hosts
172.16.106.135 k8s-master
172.16.106.136 k8s-node1
172.16.106.138 k8s-node2
EOF

将 IPv4 流量传递到 iptables 链:

cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system #执行后生效

5. 配置 YUM 源与安装 Docker

配置阿里云镜像源加速安装:

cd /etc/yum.repos.d/ #进入此目录
rm -rf /etc/yum.repos.d/* #删除无用源
#wegt 拉取我们需要的yum源
wget -O /etc/yum.repos.d/centos7.repo http://mirrors.aliyun.com/repo/Centos-7.repo
wget -O /etc/yum.repos.d/epel-7.repo http://mirrors.aliyun.com/repo/epel-7.repo
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum clean all #清理yum缓存
yum makecache #建立元数据缓存

安装 Docker 并设置开机自启:

yum install -y docker-ce-20.10.16-3.el7 docker-ce-cli-20.10.16-3.el7 containerd.io
systemctl start docker #启动
systemctl enable docker #开机自启

☸️ 安装 Kubernetes 组件

1. 配置 K8s YUM 源

三台机器统一配置:

cat < /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

2. 安装 kubeadm、kubelet 和 kubectl

执行安装命令:

yum install -y kubelet-1.22.2 kubeadm-1.22.2 kubectl-1.22.2
systemctl start kubelet #启动
systemctl enable kubelet #开机自启

3. 配置 Docker 镜像加速

添加国内镜像加速器,提升拉取速度:

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "registry-mirrors": [
    "https://docker.registry.cyou",
    "https://docker-cf.registry.cyou",
    "https://dockercf.jsdelivr.fyi",
    "https://docker.jsdelivr.fyi",
    "https://dockertest.jsdelivr.fyi",
    "https://mirror.aliyuncs.com",
    "https://dockerproxy.com",
    "https://mirror.baidubce.com",
    "https://docker.m.daocloud.io",
    "https://docker.nju.edu.cn",
    "https://docker.mirrors.sjtug.sjtu.edu.cn",
    "https://docker.mirrors.ustc.edu.cn",
    "https://mirror.iscas.ac.cn",
    "https://docker.rainbond.cc"
  ],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  }
}
EOF
sudo systemctl daemon-reload #重新载入
sudo systemctl restart docker
sudo systemctl enable docker

初始化 Master 节点

1. 执行初始化命令

在 Master 节点(135)执行:

kubeadm init \
--apiserver-advertise-address=172.16.106.135 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.22.2 \
--control-plane-endpoint k8s-master \
--service-cidr=172.16.0.0/16 \
--pod-network-cidr=10.244.0.0/16
#注意172.16.106.135 换成你实际master ip 即可

初始化成功后,会输出类似以下的内容(请保存好 kubeadm join 命令,后续 Worker 节点加入时需要):

Your Kubernetes control-plane has initialized successfully!
To start using your cluster, you need to run the following as a regular user:
  mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config
Alternatively, if you are the root user, you can run:
  export KUBECONFIG=/etc/kubernetes/admin.conf
You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  https://kubernetes.io/docs/concepts/cluster-administration/addons/
You can now join any number of control-plane nodes by copying certificate authorities
and service account keys on each node and then running the following as root:
  kubeadm join k8s-master:6443 --token kc162j.fb0xi065kd07o2w6 \
        --discovery-token-ca-cert-hash sha256:26efadd65956d56720d09850df8720b3087ca78b2d7510fedf53ddc26e907fc8 \
        --control-plane
Then you can join any number of worker nodes by running the following on each as root:
kubeadm join k8s-master:6443 --token kc162j.fb0xi065kd07o2w6 \
        --discovery-token-ca-cert-hash sha256:26efadd65956d56720d09850df8720b3087ca78b2d7510fedf53ddc26e907fc8

2. 配置 kubectl

在 Master 节点执行以下三条命令,使 kubectl 能正常使用:

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

重要:下面这行是 Worker 节点加入集群的命令,请妥善保存:

kubeadm join k8s-master:6443 --token kc162j.fb0xi065kd07o2w6 \
        --discovery-token-ca-cert-hash sha256:26efadd65956d56720d09850df8720b3087ca78b2d7510fedf53ddc26e907fc8

3. 安装网络插件 (Calico)

三台机器拉取网络插件镜像:

docker pull quay.io/coreos/flannel:v0.14.0

在 Master 节点应用 Calico 的 YAML 文件:

wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
kubectl apply -f kube-flannel.yml

工作节点加入集群

在两个 Worker 节点(136 和 138)上执行之前保存的 kubeadm join 命令:

kubeadm join k8s-master:6443 --token kc162j.fb0xi065kd07o2w6 \
        --discovery-token-ca-cert-hash sha256:26efadd65956d56720d09850df8720b3087ca78b2d7510fedf53ddc26e907fc8

✅ 加入成功后,在 Master 节点查看集群状态:

kubectl get nodes
[root@k8s-master ~]# kubectl get nodes
NAME         STATUS   ROLES                  AGE   VERSION
k8s-master   Ready    control-plane,master   16h   v1.22.2
k8s-node1    Ready                     15h   v1.22.2
k8s-node2    Ready                     15h   v1.22.2

当所有节点状态显示为 Ready,说明集群已成功搭建!

为工作节点添加标签

在 Master 执行以下命令,为节点打上角色标签:

kubectl label nodes k8s-node1 node-role.kubernetes.io/worker=  #给node1添加标签
kubectl label nodes k8s-node2 node-role.kubernetes.io/worker=  #给node2添加标签
再次执行kebuctl get nodes 查询
[root@k8s-master ~]# kubectl get nodes
NAME         STATUS   ROLES                  AGE   VERSION
k8s-master   Ready    control-plane,master   16h   v1.22.2
k8s-node1    Ready    worker                 15h   v1.22.2
k8s-node2    Ready    worker                 15h   v1.22.2
节点标签已经变为worker

总结与常用命令

至此,你已成功在 CentOS 7.9 上部署了一个三节点的 Kubernetes 集群。整个过程涵盖了从环境准备到集群初始化的所有关键步骤。以下是一些常用命令,助你快速上手:

# 集群信息
kubectl cluster-info                          # 显示集群基本信息
kubectl version                               # 显示客户端和服务器版本
kubectl get nodes                             # 查看所有节点状态
kubectl get nodes -o wide                     # 查看节点详细信息(包括IP等)
kubectl describe node              # 查看某个节点的详细描述
# 命名空间操作
kubectl get namespaces                        # 查看所有命名空间
kubectl create namespace      # 创建命名空间
kubectl delete namespace      # 删除命名空间
# Pod管理
kubectl get pods                              # 查看默认命名空间的Pod
kubectl get pods -n                # 查看指定命名空间的Pod
kubectl get pods -A                           # 查看所有命名空间的Pod
kubectl describe pod                # 查看Pod详细描述
kubectl logs                        # 查看Pod日志
kubectl logs -f                     # 实时跟踪Pod日志
kubectl exec -it  -- /bin/bash      # 进入Pod的交互式终端
kubectl delete pod                  # 删除Pod
# 部署管理
kubectl get deployments                       # 查看部署
kubectl describe deployment  # 查看部署详情
kubectl scale deployment/ --replicas=3 # 扩展副本数量
kubectl rollout status deployment/      # 查看部署状态
kubectl rollout history deployment/     # 查看部署历史
kubectl rollout undo deployment/        # 回滚到上一个版本
# 服务管理
kubectl get services                          # 查看服务
kubectl describe service        # 查看服务详情
kubectl expose deployment/ --port=80    # 创建服务暴露部署
# 配置管理
kubectl get configmaps                        # 查看ConfigMap
kubectl get secrets                           # 查看Secret
kubectl apply -f                   # 应用YAML配置文件
kubectl delete -f                  # 删除YAML配置创建的资源
# 标签和选择器
kubectl get pods --show-labels                # 查看Pod及标签
kubectl label pod  env=prod         # 给Pod添加标签
kubectl get pods -l app=nginx                 # 根据标签筛选Pod
# 资源详情
kubectl get all                               # 查看所有资源
kubectl api-resources                         # 查看所有API资源类型
kubectl top nodes                             # 查看节点资源使用情况
kubectl top pods                              # 查看Pod资源使用情况
# 调试和诊断
kubectl events                                # 查看事件
kubectl cp :      # 从Pod复制文件到本地
kubectl auth can-i create pods                # 检查当前用户权限

实践建议:部署完成后,可以尝试使用 kubectl create deployment 部署一个 Nginx 应用,再通过 kubectl expose 暴露服务,体验 K8s 的自动化能力。

[AFFILIATE_SLOT_1]

延伸阅读:如果你想深入了解 K8s 的调度策略、存储卷管理或安全配置,推荐阅读官方文档或订阅我们的后续文章。

[AFFILIATE_SLOT_2]

最后,感谢所有在社区中分享知识的运维同仁。希望这篇指南能帮助你顺利踏上 容器编排 的实践之路!