对于运维工程师和开发者来说,掌握 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.9 | 172.16.106.135 | k8s-master |
| centos7.9 | 172.16.106.136 | k8s-node1 |
| centos7.9 | 172.16.106.138 | k8s-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 的自动化能力。
延伸阅读:如果你想深入了解 K8s 的调度策略、存储卷管理或安全配置,推荐阅读官方文档或订阅我们的后续文章。
[AFFILIATE_SLOT_2]最后,感谢所有在社区中分享知识的运维同仁。希望这篇指南能帮助你顺利踏上 容器编排 的实践之路!
浙公网安备 33010602011771号