尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

基于虚拟机搭建K8s容器云平台:从环境规划到监控告警的实战指南

基于虚拟机搭建K8s容器云平台:从环境规划到监控告警的实战指南 1. 项目概述从虚拟机到容器云平台的实战跨越最近几年云计算技能大赛越来越火尤其是容器云平台这个赛道几乎成了检验选手综合能力的“试金石”。很多朋友无论是学生备赛还是运维工程师想提升技能都卡在了第一步如何在一个可控、可复现的环境里把这一整套复杂的平台给搭起来。直接上公有云成本高而且很多内部网络策略、软件源配置在比赛环境里根本行不通。所以用虚拟机VM在本地电脑上模拟出一个完整的实验环境就成了最靠谱、最经济的选择。这不仅仅是安装几个软件那么简单它涉及从底层虚拟化资源规划到中间件部署再到上层应用编排的完整链路理解。我结合多次带队参赛和实际项目交付的经验把搭建一个用于技能大赛的容器云平台的完整过程拆解出来目标就是让你能跟着步骤在自己的电脑上复现出一个功能完备、可用于深度学习和故障演练的平台。这个项目适合几类人一是正在备战各类云计算、云原生相关技能大赛的选手需要一个稳定的练习环境二是刚接触Kubernetes和容器技术的运维或开发工程师想找一个沙箱环境来验证概念和练习排错三是IT讲师或培训师需要一套标准化的实验环境用于教学。整个搭建过程我们会使用主流的开源软件栈确保技术的通用性和前瞻性。你会接触到虚拟化软件如VMware Workstation或VirtualBox、Linux系统配置、容器运行时、Kubernetes集群构建以及常用的云原生附加组件如镜像仓库、监控、日志系统。这个过程本身就是对云计算IaaS基础设施即服务和PaaS平台即服务层的一次深刻实践。2. 环境规划与基础资源准备2.1 虚拟化软件选型与主机资源评估工欲善其事必先利其器。第一步是选择虚拟化软件并评估你的宿主机就是你正在用的电脑资源是否够用。市面上主流的有VMware WorkstationPlayer、Oracle VirtualBox以及对于Windows 10/11用户可选的WSL2适用于Linux单节点学习但复杂集群搭建有限制。对于搭建多节点Kubernetes集群参加技能大赛的场景我强烈推荐VMware Workstation Pro。理由很直接它的网络配置功能非常强大且稳定支持创建复杂的自定义网络如仅主机、NAT、桥接模式的灵活组合这对于模拟生产环境的多节点通信至关重要。VirtualBox虽然免费但在处理多台虚拟机高负载运行时的性能和网络稳定性上有时会稍逊一筹。注意安装VMware Workstation后如果启动虚拟机时提示“VMware Workstation 无法连接到虚拟机”或“Virtualized Intel VT-x/EPT is not supported”这通常意味着你电脑的BIOS/UEFI设置中的CPU虚拟化技术Intel VT-x 或 AMD-V没有开启。重启电脑进入BIOS通常是开机时按F2、Del或F12键在CPU配置或安全相关选项中找到“Virtualization Technology”或“VT-x”选项将其设置为“Enabled”。接下来是残酷的资源评估。一个最小可用的Kubernetes集群至少需要1个控制平面节点Master 2个工作节点Worker。每个节点建议的最低配置为2核CPU、2GB内存、20GB磁盘。这样三台虚拟机就需要宿主机提供至少6核、6GB的闲置资源。但这只是“能跑起来”的配置如果要运行大赛中常见的微服务应用链、监控栈PrometheusGrafana、日志系统EFK等资源会非常紧张。我的经验是为每个节点分配2核4GB内存磁盘给到40GB。这样宿主机至少需要具备4核物理核心通过超线程模拟出更多逻辑核心供虚拟机使用和16GB以上的物理内存。磁盘空间建议预留200GB以上。检查你的任务管理器或系统监控确保在虚拟机全开时宿主机仍有资源保障日常操作否则整个环境会卡顿到无法使用。2.2 虚拟机模板创建与系统初始化我们不建议为每个节点从头安装一遍操作系统那样效率太低。正确的方法是先精心制作一个“黄金镜像”模板机然后通过克隆的方式快速生成其他节点。操作系统选择CentOS 7.9或Ubuntu 20.04/22.04 LTS。CentOS 7在传统企业环境更常见但已停止维护Ubuntu 22.04对新型硬件和软件包支持更好社区活跃。大赛环境为了兼容性可能仍指定CentOS 7但自己练习我推荐Ubuntu能接触到更多新特性。模板机安装与基础配置步骤如下新建虚拟机在VMware中选择“创建新的虚拟机” - “自定义” - 稍后安装操作系统选择Linux对应版本- 设置虚拟机名称如k8s-base-template和存储位置 - 处理器和内存按之前规划分配如2核4GB- 网络类型选择“NAT模式”模板机阶段先用NAT方便上网下载软件- 创建新虚拟磁盘40GB拆分成多个文件- 完成。安装操作系统挂载下载好的ISO镜像文件启动虚拟机进行安装。关键步骤包括分区对于学习环境手动分区可以简单点/boot给1GBswap给2-4GB内存8GB时swap大小约等于内存内存8GB时给4-8GB即可剩余全部空间给/。软件选择安装“最小安装”或“带GUI的服务器”如果后续需要图形界面操作但务必在附加选项中勾选“开发工具”这会安装GCC、Make等编译工具后续安装一些软件时会用到。网络与主机名开启以太网连接并设置一个临时主机名如base-template。创建用户除了root务必创建一个普通用户如k8sadmin并赋予sudo权限避免长期使用root操作。系统初始化脚本安装完成后先以root身份登录运行一个初始化脚本一次性完成基础配置。这是提升效率的关键。脚本内容主要包括#!/bin/bash # 1. 关闭防火墙和SELinux学习环境简化操作生产环境需严格配置 systemctl stop firewalld systemctl disable firewalld setenforce 0 sed -i s/^SELINUXenforcing/SELINUXdisabled/ /etc/selinux/config # 2. 关闭swapKubernetes 1.8要求 swapoff -a sed -i / swap / s/^\(.*\)$/#\1/g /etc/fstab # 3. 配置时间同步 yum install -y chrony # CentOS # apt install -y chrony # Ubuntu systemctl start chronyd systemctl enable chronyd # 4. 配置内核参数并加载模块容器网络所需 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 modprobe br_netfilter lsmod | grep br_netfilter # 检查是否加载成功 # 5. 配置国内yum/apt源加速软件安装 # 此处以阿里云源为例需根据实际系统版本替换 # CentOS 7: # mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup # curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo # Ubuntu 22.04: # sed -i s/archive.ubuntu.com/mirrors.aliyun.com/g /etc/apt/sources.list # sed -i s/security.ubuntu.com/mirrors.aliyun.com/g /etc/apt/sources.list # 6. 安装基础工具 yum install -y vim wget curl net-tools telnet bash-completion # CentOS # apt update apt install -y vim wget curl net-tools telnet bash-completion # Ubuntu echo Base system initialization completed!执行脚本后重启虚拟机使部分配置生效。安装VMware Tools或Open VM Tools这是实现宿主机和虚拟机之间文件共享、剪贴板共享、分辨率自适应的关键。在Ubuntu中通常直接安装open-vm-tools即可apt install -y open-vm-tools open-vm-tools-desktop。安装后你可以在VMware的虚拟机设置中添加“共享文件夹”将宿主机上的脚本、配置文件直接映射到虚拟机内极大方便后续操作。完成以上步骤后将这个虚拟机关机。在VMware的库中右键点击该虚拟机选择“管理” - “克隆”创建一个完整的克隆并将其作为你的模板机备份。后续所有集群节点都将从这个干净的模板克隆而来。3. 容器运行时与Kubernetes集群部署3.1 容器运行时安装与配置Kubernetes需要一个容器运行时来拉取镜像和运行容器。虽然Docker是最广为人知的但Kubernetes从1.24版本开始已移除对Docker的直接支持通过dockershim转而使用实现了CRI容器运行时接口的运行时如containerd或CRI-O。我推荐使用containerd它是Docker的底层运行时更轻量也是当前Kubernetes社区默认推荐和测试最充分的运行时。在所有节点包括后续克隆出来的Master和Worker节点上安装containerd对于Ubuntu系统# 安装依赖 apt update apt install -y apt-transport-https ca-certificates curl software-properties-common # 添加Docker官方GPG密钥containerd由Docker项目维护 curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg # 添加Docker仓库这里是为了获取containerd echo deb [arch$(dpkg --print-architecture) signed-by/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable | sudo tee /etc/apt/sources.list.d/docker.list /dev/null # 安装containerd apt update apt install -y containerd.io # 生成默认配置文件 containerd config default | sudo tee /etc/containerd/config.toml # 修改配置文件使用systemd作为cgroup驱动与K8s保持一致 sed -i s/SystemdCgroup false/SystemdCgroup true/ /etc/containerd/config.toml # 重启并启用containerd systemctl restart containerd systemctl enable containerd配置容器镜像加速器为了从国内快速拉取镜像需要修改containerd配置。编辑/etc/containerd/config.toml找到[plugins.io.containerd.grpc.v1.cri.registry.mirrors]部分添加国内镜像源例如阿里云[plugins.io.containerd.grpc.v1.cri.registry.mirrors] [plugins.io.containerd.grpc.v1.cri.registry.mirrors.docker.io] endpoint [https://registry.cn-hangzhou.aliyuncs.com, https://docker.mirrors.ustc.edu.cn]修改后再次重启containerdsystemctl restart containerd。使用ctr images pull docker.io/library/nginx:alpine测试镜像拉取是否成功且快速。3.2 Kubernetes组件安装与集群初始化现在我们在所有节点上安装Kubernetes的核心三件套kubeadm集群引导工具、kubelet节点代理、kubectl集群管理命令行工具。添加Kubernetes源并安装# 添加APT仓库GPG密钥 curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.28/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg # 添加Kubernetes APT仓库这里以1.28版本为例请根据大赛要求或最新稳定版调整 echo deb [signed-by/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.28/deb/ / | sudo tee /etc/apt/sources.list.d/kubernetes.list # 安装 apt update apt install -y kubelet kubeadm kubectl # 锁定版本避免意外升级导致集群不兼容 apt-mark hold kubelet kubeadm kubectl初始化Master节点首先从模板机克隆出三台新的虚拟机分别命名为k8s-masterk8s-worker1k8s-worker2。启动k8s-master修改主机名hostnamectl set-hostname k8s-master其他节点同理。修改每台机器的/etc/hosts文件添加所有节点的IP和主机名映射需要先配置静态IP见下文网络配置。在k8s-master上执行初始化命令。最关键的一步是规划Pod网络CIDR这是集群内Pod通信的网段不能与宿主机网络或虚拟机网络重叠。假设你的虚拟机NAT网段是192.168.10.0/24那么Pod网络可以设为10.244.0.0/16。kubeadm init \ --apiserver-advertise-address192.168.10.100 \ # Master节点的IP --image-repository registry.cn-hangzhou.aliyuncs.com/google_containers \ # 使用国内镜像源 --kubernetes-version v1.28.0 \ --service-cidr10.96.0.0/12 \ # Service网络CIDR --pod-network-cidr10.244.0.0/16 # Pod网络CIDR需与后续安装的网络插件匹配实操心得--apiserver-advertise-address一定要填Master节点在集群内部通信用的IP。如果虚拟机有多块网卡务必指定正确的那一个。初始化成功后会输出两条重要命令一条是kubeadm join ...用于Worker节点加入集群务必保存好另一条是配置kubectl的命令。配置kubectl在Master节点执行mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config执行kubectl get nodes此时Master节点状态应为NotReady因为还没有安装网络插件。安装Pod网络插件CNI这是让集群内Pod能够相互通信的关键。Flannel是简单常用的选择其配置与初始化时指定的--pod-network-cidr10.244.0.0/16对应。kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml等待片刻执行kubectl get pods -n kube-system看到kube-flannel-ds-*的Pod状态变为Running再查看节点状态kubectl get nodesMaster应显示为Ready。Worker节点加入集群在k8s-worker1和k8s-worker2上分别执行之前保存的kubeadm join命令。加入成功后在Master节点上执行kubectl get nodes应该能看到三个节点都是Ready状态。至此一个最基础的Kubernetes集群就搭建完成了。4. 集群网络与存储方案详解4.1 虚拟机网络架构设计与故障排查一个稳定的集群离不开清晰的网络规划。在VMware中我们通常采用“仅主机模式Host-Only NAT模式”的组合来隔离集群网络和外部网络。设计思路为每台虚拟机添加两块虚拟网卡。网卡1 (NAT模式)用于虚拟机访问互联网以下载软件包、拉取镜像。IP由VMware的DHCP自动分配。网卡2 (仅主机模式)用于集群内部节点间通信kubelet、kube-proxy、Pod网络等。我们需要为这块网卡配置静态IP并确保所有节点在同一网段且能互通。配置静态IP以Ubuntu为例网卡名可能是ens33, ens34等使用ip a查看 编辑/etc/netplan/01-netcfg.yaml文件名可能不同network: version: 2 ethernets: ens33: # NAT网卡DHCP dhcp4: true ens34: # 仅主机网卡静态IP dhcp4: no addresses: [192.168.10.100/24] # Master节点IPWorker节点设为101102 # 网关和DNS对于仅主机网络不是必须的但可以指向宿主机或留空 # gateway4: 192.168.10.1 nameservers: addresses: [114.114.114.114, 8.8.8.8]应用配置sudo netplan apply。然后互相ping一下静态IP确保连通。常见网络问题排查节点间无法ping通检查VMware虚拟网络编辑器确保“仅主机模式”的网卡在同一个子网如VMnet1并且没有启用DHCP冲突。检查虚拟机防火墙是否已关闭。Pod无法跨节点通信首先检查Flannel Pod是否运行正常。然后登录到Pod所在节点使用ip addr show flannel.1或cni0查看Flannel虚拟网卡是否创建成功IP是否在Pod CIDR范围内。可以使用kubectl describe pod pod-name查看Pod被调度到哪个节点然后去对应节点用crictl logs查看Flannel容器的日志。Service无法访问检查kube-proxyPod是否正常。检查CoreDNS Pod是否正常。使用kubectl get svc查看Service的ClusterIP和端口在集群内另一个Pod里用curl cluster-ip:port测试。4.2 动态存储供给StorageClass搭建默认情况下Pod中的存储是临时的Pod重启数据就丢失。技能大赛中常需要部署有状态应用如MySQL、Redis这就必须用到持久化存储。在本地虚拟机环境我们可以利用hostPath或搭建一个简单的NFS服务器来模拟共享存储并通过StorageClass实现动态供给。方案搭建NFS服务器并提供StorageClass选择一台虚拟机作为NFS服务器可以是Master节点但建议单独一台虚拟机以避免资源竞争。安装NFS服务端apt install -y nfs-kernel-server # Ubuntu # yum install -y nfs-utils # CentOS创建共享目录并配置导出mkdir -p /data/nfs-share chmod 777 /data/nfs-share # 简化权限生产环境需严格配置编辑/etc/exports添加一行/data/nfs-share *(rw,sync,no_subtree_check,no_root_squash)重启NFS服务systemctl restart nfs-kernel-server systemctl enable nfs-kernel-server。在所有Kubernetes节点包括Master安装NFS客户端apt install -y nfs-common在Kubernetes集群中部署NFS Client Provisioner这是一个自动为PVC持久卷声明创建PV持久卷的辅助程序。首先创建其RBAC权限和部署文件nfs-client-provisioner.yamlapiVersion: v1 kind: ServiceAccount metadata: name: nfs-client-provisioner namespace: default --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: nfs-client-provisioner-runner rules: - apiGroups: [] resources: [persistentvolumes] verbs: [get, list, watch, create, delete] - apiGroups: [] resources: [persistentvolumeclaims] verbs: [get, list, watch, update] - apiGroups: [storage.k8s.io] resources: [storageclasses] verbs: [get, list, watch] - apiGroups: [] resources: [events] verbs: [create, update, patch] --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: run-nfs-client-provisioner subjects: - kind: ServiceAccount name: nfs-client-provisioner namespace: default roleRef: kind: ClusterRole name: nfs-client-provisioner-runner apiGroup: rbac.authorization.k8s.io --- apiVersion: apps/v1 kind: Deployment metadata: name: nfs-client-provisioner namespace: default spec: replicas: 1 selector: matchLabels: app: nfs-client-provisioner strategy: type: Recreate template: metadata: labels: app: nfs-client-provisioner spec: serviceAccountName: nfs-client-provisioner containers: - name: nfs-client-provisioner image: chronolaw/nfs-subdir-external-provisioner:v4.0.2 # 一个常用的社区镜像 volumeMounts: - name: nfs-client-root mountPath: /persistentvolumes env: - name: PROVISIONER_NAME value: k8s-sigs.io/nfs-subdir-external-provisioner - name: NFS_SERVER value: 192.168.10.50 # 你的NFS服务器IP - name: NFS_PATH value: /data/nfs-share volumes: - name: nfs-client-root nfs: server: 192.168.10.50 path: /data/nfs-share应用部署kubectl apply -f nfs-client-provisioner.yaml。创建StorageClassapiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: nfs-client provisioner: k8s-sigs.io/nfs-subdir-external-provisioner parameters: archiveOnDelete: false reclaimPolicy: Delete volumeBindingMode: Immediate应用kubectl apply -f nfs-storageclass.yaml。将其设置为默认StorageClasskubectl patch storageclass nfs-client -p {metadata: {annotations:{storageclass.kubernetes.io/is-default-class:true}}}’。现在当你在部署StatefulSet或Deployment时在PVC中指定storageClassName: nfs-client或不指定使用默认的Kubernetes就会自动在NFS服务器的共享目录下创建一个以namespace-pvcname-pvid命名的子目录并绑定给Pod使用。5. 平台功能增强与运维监控部署5.1 私有镜像仓库Harbor搭建技能大赛中通常需要部署自定义的镜像从Docker Hub拉取既慢又不稳定。搭建一个内网私有镜像仓库是必须的。Harbor是VMware开源的企业级镜像仓库带Web界面支持权限管理、漏洞扫描、复制等功能非常适合比赛环境。我们在一台独立的虚拟机或资源充足的Master节点上部署Harbor。准备环境确保Docker和Docker Compose已安装Harbor的离线安装包自带Docker Compose。下载Harbor离线安装包从GitHub Release页面。配置Harbor解压后编辑harbor.yml文件。关键配置hostname: reg.k8s.local # 设置访问地址可以是IP或域名。在宿主机hosts文件中做映射。 http: port: 80 # 如果80端口被占用可改其他端口 harbor_admin_password: Harbor12345 # 设置admin密码 data_volume: /data/harbor # 持久化数据目录安装与启动执行安装脚本sudo ./install.sh。安装完成后访问http://reg.k8s.local即可登录管理界面。在Kubernetes中使用私有仓库需要在Kubernetes中创建一个Secret来存储仓库认证信息。kubectl create secret docker-registry harbor-registry-secret \ --docker-serverreg.k8s.local \ --docker-usernameadmin \ --docker-passwordHarbor12345 \ --docker-emailadminexample.com \ --namespacedefault在Pod的YAML文件中通过imagePullSecrets引用这个Secret才能拉取私有仓库的镜像。5.2 可视化监控与告警体系构建“无监控不运维”。一个完整的平台必须包含监控系统。我们使用经典的Prometheus Grafana组合。使用Helm部署Prometheus StackHelm是Kubernetes的包管理器能极大简化复杂应用的部署。首先在Master节点安装Helm客户端然后添加Prometheus社区仓库。# 安装Helm curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash # 添加仓库 helm repo add prometheus-community https://prometheus-community.github.io/helm-charts helm repo update # 创建命名空间 kubectl create namespace monitoring # 安装kube-prometheus-stack包含Prometheus, Grafana, AlertManager等 helm install prometheus prometheus-community/kube-prometheus-stack -n monitoring这个Chart会部署一整套监控组件。使用kubectl get pods -n monitoring查看所有Pod是否运行正常。访问Grafana部署完成后将Grafana服务改为NodePort类型方便从宿主机浏览器访问。kubectl patch svc prometheus-grafana -n monitoring -p {spec: {type: NodePort}} kubectl get svc prometheus-grafana -n monitoring # 查看分配的端口号例如 32688在宿主机浏览器访问http://任意节点IP:32688默认用户/密码是admin/prom-operator。登录后可以发现已经自动导入了很多Kubernetes集群的监控仪表盘。配置核心监控项节点资源关注CPU、内存、磁盘IO、网络流量。Grafana的“Node Exporter Full”仪表盘很全面。Pod/容器资源关注每个Pod的CPU/内存使用率、限制与请求的对比。Kubernetes组件监控API Server、Scheduler、Controller Manager、CoreDNS等的状态和性能。自定义业务监控可以在应用代码中暴露Prometheus格式的指标/metrics端点然后在Prometheus中添加抓取配置ServiceMonitor CRD。告警规则与通知AlertManager负责处理由Prometheus发出的告警。我们可以通过修改prometheus-community/kube-prometheus-stack的values文件或创建AlertmanagerConfig CRD来配置告警路由如分组、抑制、静默和接收器如发送邮件、集成钉钉/企业微信。对于技能大赛环境可以先将告警信息在Grafana界面或AlertManager的Web界面上展示出来。5.3 日志集中收集方案分布式系统的日志排查是难点我们需要一个中心化的日志系统。EFKElasticsearch, Fluentd, Kibana栈是常见选择但资源消耗较大。对于虚拟机实验环境Loki Promtail Grafana是更轻量级的选择而且Grafana我们已经有了。使用Helm部署Loki Stackhelm repo add grafana https://grafana.github.io/helm-charts helm repo update helm install loki grafana/loki-stack -n monitoring --set promtail.enabledtrue,loki.persistence.enabledtrue,loki.persistence.size5Gi这个命令会在monitoring命名空间部署Loki日志存储引擎和Promtail日志收集客户端。在Grafana中添加Loki数据源登录Grafana点击左侧齿轮图标 - Data Sources - Add data source。选择“Loki”。URL填写http://loki:3100Kubernetes服务名。点击“Save Test”显示绿色成功提示。查看日志在Grafana中点击左侧的“Explore”图标在数据源下拉框选择“Loki”。你可以使用LogQL查询语言来过滤和搜索日志。例如{appnginx}可以查看所有标签中app为nginx的Pod的日志。这对于快速定位某个微服务的错误日志非常有效。6. 技能大赛典型场景演练与故障注入平台搭好了最终是为了应对比赛。技能大赛的题目通常围绕“部署、故障、优化、安全”几个维度。下面模拟几个典型场景进行演练。6.1 场景一基于Helm快速部署复杂应用题目可能要求部署一个包含前端、后端、数据库的完整应用。我们以部署WordPress为例它包含WordPressPHP和MariaDBMySQL两个组件。添加Bitnami仓库并部署helm repo add bitnami https://charts.bitnami.com/bitnami helm install my-wordpress bitnami/wordpress -n wordpress --create-namespace \ --set mariadb.primary.persistence.storageClassnfs-client \ --set persistence.storageClassnfs-client \ --set wordpressUsernameadmin \ --set wordpressPasswordSuperSecretPassword \ --set service.typeNodePort这个命令会创建一个名为wordpress的命名空间并在其中部署WordPress和MariaDB数据持久化使用我们之前创建的nfs-clientStorageClass。访问与验证使用kubectl get svc -n wordpress查看WordPress服务的NodePort通过浏览器访问。登录管理后台发布一篇文章。然后模拟Pod故障kubectl delete pod wordpress-pod-name -n wordpress。Kubernetes会自动重建Pod由于数据存储在PVC中文章不会丢失。这考察了应用部署、持久化存储、服务暴露和高可用理解。6.2 场景二节点故障排查与恢复这是大赛高频故障点。模拟Worker节点k8s-worker1失联。制造故障在VMware中直接将k8s-worker1虚拟机关机。观察现象在Master节点执行kubectl get nodes会发现k8s-worker1状态变为NotReady。执行kubectl get pods -o wide可以看到原本运行在该节点上的Pod状态会变为Terminating或Unknown经过一段时间默认5分钟后控制平面会将它们标记为Terminating并在其他可用节点上重新调度如果Pod控制器是Deployment等。排查思路kubectl describe node k8s-worker1查看节点的详细事件可能会看到“NodeNotReady”或“Kubelet stopped posting node status”。ssh到故障节点如果还能连上检查kubelet服务状态systemctl status kubelet。查看日志journalctl -u kubelet -f。常见原因资源不足内存、磁盘、kubelet进程崩溃、网络分区、Docker/containerd异常。恢复操作启动k8s-worker1虚拟机等待kubelet服务自动启动并重新向Master注册。再次查看节点状态应恢复为Ready。观察Pod的重新调度情况。6.3 场景三网络策略与安全加固题目可能要求实现Pod间的网络隔离比如只允许前端Pod访问后端Pod的特定端口禁止其他访问。创建测试命名空间和Podkubectl create ns net-pol-test kubectl run frontend --imagenginx -n net-pol-test --labels appfrontend kubectl run backend --imagenginx -n net-pol-test --labels appbackend kubectl run other --imagenginx -n net-pol-test --labels appother应用NetworkPolicy创建一个网络策略YAML文件backend-allow-frontend.yamlapiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: backend-allow-frontend namespace: net-pol-test spec: podSelector: matchLabels: app: backend policyTypes: - Ingress ingress: - from: - podSelector: matchLabels: app: frontend ports: - protocol: TCP port: 80应用策略kubectl apply -f backend-allow-frontend.yaml。验证策略效果进入frontendPodkubectl exec -it frontend -n net-pol-test -- bash执行curl backend.net-pol-test.svc.cluster.local应该能成功通过Service域名访问。进入otherPodkubectl exec -it other -n net-pol-test -- bash执行同样的curl命令应该会超时失败因为流量被策略拒绝。这个场景考察了对Kubernetes网络模型、NetworkPolicy对象以及CNI插件如Calico Flannel默认不支持NetworkPolicy需额外配置的理解。6.4 场景四资源配额与限制管理防止某个团队或应用占用过多集群资源影响其他应用。创建ResourceQuota在命名空间级别限制总资源。apiVersion: v1 kind: ResourceQuota metadata: name: compute-resources namespace: quota-test spec: hard: requests.cpu: 2 requests.memory: 2Gi limits.cpu: 4 limits.memory: 4Gi pods: 10创建命名空间并应用kubectl create ns quota-test kubectl apply -f quota.yaml -n quota-test。创建LimitRange为命名空间内的Pod设置默认的资源请求和限制。apiVersion: v1 kind: LimitRange metadata: name: mem-limit-range namespace: quota-test spec: limits: - default: memory: 512Mi cpu: 500m defaultRequest: memory: 256Mi cpu: 250m type: Container测试尝试在quota-test命名空间中创建一个总资源请求超过Quota的Deployment创建会失败并提示超出配额。这考察了对Kubernetes资源管理模型的理解。通过以上四个场景的实战演练你不仅搭建了一个平台更掌握了在这个平台上进行操作、排错和优化的核心技能。这正是一个合格的云计算运维或开发者在技能大赛乃至实际工作中所需要的能力。整个搭建过程虽然步骤繁多但每一步都紧扣Kubernetes和云原生的核心概念理解其背后的原理比单纯记住命令更重要。当你能独立完成这一切并针对不同故障场景快速反应时面对大赛的挑战自然就胸有成竹了。
返回列表