news 2026/8/30 22:24:12

Kubernetes(K8s)容器化部署

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Kubernetes(K8s)容器化部署

Kubernetes(简称K8s)是一个生产级别的开源容器编排平台,由Google基于其在容器集群方面的经验设计而成。它能够帮助你确保容器化应用在你想要的时间和地点运行,实现应用的自动化部署、弹性伸缩与高可用。本文将从零开始,带你完成从环境搭建到应用部署的全流程。

第一部分:Kubernetes 核心概念

在动手实践之前,理解Kubernetes的几个核心概念至关重要。

一、Pod —— 最小部署单元

Pod是Kubernetes中最小的、可部署的计算单元。它可以包含一个或多个紧密关联的容器(如业务容器 + 日志收集容器),这些容器共享同一个网络命名空间(IP地址、端口)和存储卷,始终被调度到同一节点上运行。Pod是Kubernetes资源分配的最小单位。

二、Deployment —— 应用生命周期管理器

Deployment负责创建和更新应用的实例。它通过ReplicaSet控制Pod的副本数量,支持滚动更新、版本回滚等策略。创建Deployment后,Kubernetes控制平面会将应用实例调度到集群中的各个节点上。如果托管实例的节点关闭或被删除,Deployment控制器会自动将其替换到另一个节点上,提供自我修复能力。

三、Service —— 稳定的访问入口

Service是Kubernetes中用于暴露Pod网络访问的抽象组件。由于Pod的IP是临时的(Pod重建后IP会变更),Service为这组Pod提供一个稳定的虚拟IP和DNS名称。当多个Pod关联到同一个Service时,Service会自动进行负载均衡。

Service的三种主要类型:

  • ClusterIP(默认):仅在集群内部暴露服务
  • NodePort:在每个节点上开放固定端口,外部可通过节点IP:NodePort访问
  • LoadBalancer:结合云厂商的负载均衡器对外暴露服务

四、Ingress —— 七层路由网关

Ingress是Kubernetes的API对象,用于定义外部访问集群服务的七层(HTTP/HTTPS)路由规则。它不同于Service(仅提供四层负载均衡),而是通过Ingress控制器(如Nginx Ingress、Traefik)实现基于域名或路径的路由、SSL卸载等功能。

第二部分:环境搭建

一、前置准备

部署Kubernetes需要以下环境:

项目要求
操作系统Linux(建议CentOS 7.6+ / Ubuntu 18.04+)或 macOS
硬件配置至少4核8G内存(建议)
容器运行时Docker CE 19.03+ 或 containerd
K8s工具链kubeadm、kubectl、kubelet(版本1.24+)
基础知识熟悉容器化概念、YAML语法、基础Linux命令

二、开发环境:使用 Minikube 搭建本地集群

Minikube是学习Kubernetes最便捷的方式,可在本地快速启动单节点集群。

1. 安装 Minikube(以Linux为例):

curl-LOhttps://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64sudoinstallminikube-linux-amd64 /usr/local/bin/minikube

2. 启动集群

minikube start--driver=docker--cpus=4--memory=8192

3. 安装 kubectl(Kubernetes命令行客户端):

# 以Linux为例curl-LO"https://dl.k8s.io/release/$(curl-L-shttps://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"sudoinstall-oroot-groot-m0755 kubectl /usr/local/bin/kubectl

4. 验证集群状态

kubectl get nodes-owide kubectl version# 查看客户端和服务器版本

三、生产环境:使用 kubeadm 搭建多节点集群

生产环境推荐使用kubeadm搭建多节点集群。

1. 集群初始化(在控制平面节点执行):

sudokubeadm init --pod-network-cidr=10.244.0.0/16 --kubernetes-version=v1.24.0# 配置kubectlmkdir-p$HOME/.kubesudocp-i/etc/kubernetes/admin.conf$HOME/.kube/configsudochown$(id-u):$(id-g)$HOME/.kube/config

2. 添加工作节点(在每个工作节点执行):

kubeadmjoin<控制平面IP>:<端口>--token<token>--discovery-token-ca-cert-hash sha256:<hash>

提示:Token有效期为24小时,超时需通过kubeadm token create重新生成。

3. 部署CNI网络插件(如Calico):

kubectl apply-fhttps://raw.githubusercontent.com/projectcalico/calico/v3.24.5/manifests/calico.yaml

第三部分:部署第一个应用

一、通过命令行直接部署

最简单的入门方式,使用kubectl create deployment命令:

# 创建一个nginx deployment,副本数为3kubectl create deployment nginx--image=nginx:latest--replicas=3

二、通过 YAML 文件部署(推荐)

YAML文件是Kubernetes的标准配置方式,便于版本控制和重复使用。

1. 创建 Deployment 配置文件nginx-deployment.yaml

apiVersion:apps/v1kind:Deploymentmetadata:name:nginx-demolabels:app:webspec:replicas:3# 副本数量selector:matchLabels:app:web# 必须与Pod模板中的标签匹配template:metadata:labels:app:webspec:containers:-name:nginximage:nginx:1.25ports:-containerPort:80resources:# 资源限制,防止资源争抢requests:cpu:"100m"memory:"128Mi"limits:cpu:"500m"memory:"512Mi"

2. 部署应用

kubectl apply-fnginx-deployment.yaml

3. 验证部署状态

kubectl get deployments# 查看Deployment状态kubectl get pods-lapp=web# 查看Pod状态(-l表示按标签筛选)kubectl describe deployment nginx-demo# 查看详细信息

第四部分:暴露服务 —— 让应用可访问

一、创建 Service

配置文件nginx-service.yaml

apiVersion:v1kind:Servicemetadata:name:nginx-servicespec:selector:app:web# 关联标签为 app:web 的Podports:-protocol:TCPport:80# Service的端口targetPort:80# 容器内部的端口type:LoadBalancer# 服务类型

部署Service:

kubectl apply-fnginx-service.yaml

查看Service信息:

kubectl get svc

在Minikube环境中,可通过以下命令获取访问URL:

minikubeservicenginx-service

二、使用 Ingress 实现七层路由(进阶)

对于生产环境,通常使用Ingress实现基于域名的路由。

1. 安装 Nginx Ingress 控制器

kubectl apply-fhttps://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.8.1/deploy/static/provider/cloud/deploy.yaml

2. 创建 Ingress 配置ingress.yaml

apiVersion:networking.k8s.io/v1kind:Ingressmetadata:name:http-ingressspec:rules:-host:example.comhttp:paths:-path:/apipathType:Prefixbackend:service:name:api-serviceport:number:80-path:/webpathType:Prefixbackend:service:name:web-serviceport:number:80tls:# HTTPS配置(可选)-hosts:-example.comsecretName:tls-secret

3. 部署 Ingress

kubectl apply-fingress.yaml

第五部分:持久化存储

容器是无状态的,当Pod被重建时,容器内的数据会丢失。对于数据库等有状态应用,需要持久化存储。

Kubernetes通过PersistentVolume(PV)PersistentVolumeClaim(PVC)实现存储管理:

  • PV:集群中的存储资源,由管理员事先制备或通过StorageClass动态制备
  • PVC:用户对存储的请求,指定大小和访问模式

创建 PVC 示例:

apiVersion:v1kind:PersistentVolumeClaimmetadata:name:my-pvcspec:accessModes:-ReadWriteOnce# 访问模式:单节点读写storageClassName:mysc# 存储类(用于动态制备)resources:requests:storage:100Gi# 请求的存储大小

创建PVC:

kubectl apply-fpvc.yaml kubectl get pvc# 查看PVC状态,Bound表示已绑定

在Pod中挂载PVC:

spec:containers:-name:appimage:myappvolumeMounts:-mountPath:/dataname:storagevolumes:-name:storagepersistentVolumeClaim:claimName:my-pvc

第六部分:配置管理 —— ConfigMap 与 Secret

一、ConfigMap —— 非敏感配置

apiVersion:v1kind:ConfigMapmetadata:name:app-configdata:app.properties:|database.url=jdbc:mysql://localhost:3306/mydb log.level=INFO

二、Secret —— 敏感信息(密码、证书等)

apiVersion:v1kind:Secretmetadata:name:db-secrettype:Opaquedata:username:YWRtaW4=# base64编码后的值password:cGFzc3dvcmQ=

第七部分:更新与回滚

一、滚动更新

Kubernetes支持滚动更新,实现零停机部署。

方式一:修改YAML文件后重新apply

# 修改nginx-deployment.yaml中的镜像版本为 nginx:1.26kubectl apply-fnginx-deployment.yaml

方式二:直接使用命令

kubectlsetimage deployment/nginx-demonginx=nginx:1.26

二、查看更新状态与回滚

kubectl rollout status deployment/nginx-demo# 查看更新状态kubectl rollouthistorydeployment/nginx-demo# 查看历史版本kubectl rollout undo deployment/nginx-demo# 回滚到上一版本kubectl rollout undo deployment/nginx-demo --to-revision=2# 回滚到指定版本

第八部分:扩缩容

一、手动扩缩容

kubectl scale deployment/nginx-demo--replicas=5# 扩容到5个副本kubectl get pods-lapp=web# 验证副本数

二、自动扩缩容(HPA)

HorizontalPodAutoscaler可根据CPU利用率自动调整副本数:

kubectl autoscale deployment/nginx-demo --cpu-percent=50--min=2--max=10

第九部分:进阶工具 —— Helm

Helm是Kubernetes的包管理工具,类似于Linux的yum/apt。它将应用及其依赖打包为Chart,实现了应用部署的标准化和自动化。

安装与使用:

# 安装Helmcurlhttps://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3|bash# 添加仓库helm repoaddstable https://charts.helm.sh/stable helm repo update# 安装应用helminstallmy-nginx stable/nginx-ingress# 升级应用helm upgrade my-nginx stable/nginx-ingress--setcontroller.replicaCount=3

第十部分:CI/CD 自动化部署

将Kubernetes与CI/CD工具集成,可实现从代码提交到生产环境部署的全自动化。

常用CI/CD工具与Kubernetes的集成方式:

工具集成方式
GitHub Actions在workflow中执行kubectl applyhelm upgrade
GitLab CI/CD通过.gitlab-ci.yml配置,执行kubectl/helm命令
Jenkins部署Jenkins到K8s集群,通过Pipeline执行部署
Argo CDGitOps方式,自动同步Git仓库中的配置到集群

典型CI/CD流水线示例(GitHub Actions):

name:Deploy to Kuberneteson:push:branches:[main]jobs:deploy:runs-on:ubuntu-lateststeps:-uses:actions/checkout@v3-name:Build and push imagerun:|docker build -t myapp:${{ github.sha }} . docker push myapp:${{ github.sha }}-name:Deploy to K8srun:|kubectl set image deployment/myapp app=myapp:${{ github.sha }} kubectl rollout status deployment/myapp

第十一部分:常用命令速查

命令说明
kubectl get nodes查看集群节点
kubectl get pods查看所有Pod
kubectl get pods -l app=web按标签筛选Pod
kubectl get deployments查看所有Deployment
kubectl get svc查看所有Service
kubectl get ingress查看所有Ingress
kubectl describe pod <名称>查看Pod详细信息
kubectl logs <Pod名称>查看Pod日志
kubectl exec -it <Pod名称> -- /bin/bash进入Pod容器
kubectl apply -f <文件>创建/更新资源
kubectl delete -f <文件>删除资源
kubectl scale deployment/<名称> --replicas=N扩缩容
kubectl rollout status deployment/<名称>查看滚动更新状态

第十二部分:常见问题与排查

1. Pod一直处于Pending状态

  • 原因:集群资源不足或节点未就绪
  • 排查kubectl describe pod <名称>查看事件信息

2. Pod一直处于ImagePullBackOff

  • 原因:镜像不存在、镜像仓库认证失败或网络问题
  • 排查:检查镜像名称是否正确,配置ImagePullSecrets

3. Service无法访问

  • 原因:标签选择器不匹配、端口配置错误
  • 排查kubectl describe svc <名称>查看Endpoints是否包含Pod IP

4. PVC处于Pending状态

  • 原因:没有匹配的PV或StorageClass
  • 排查kubectl get pv查看可用PV,检查StorageClass配置

总结

Kubernetes作为容器编排的事实标准,为容器化应用提供了从部署、扩缩容到自愈的完整解决方案。本文从核心概念出发,逐步讲解了环境搭建、应用部署、服务暴露、存储管理、配置管理、更新回滚以及CI/CD集成等全流程操作。

在实际生产环境中,建议:

  1. 开发测试使用Minikube或Kind快速验证
  2. 生产环境使用云厂商托管K8s服务或kubeadm搭建高可用集群
  3. 复杂应用使用Helm进行标准化部署管理
  4. 自动化运维结合CI/CD工具实现GitOps流水线

掌握Kubernetes容器化部署,是迈向云原生架构的关键一步。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/30 22:18:41

基于DbcParserLib的DBC文件高效管理工具EasyDbc设计与实战

简介&#xff1a;本资源是一个面向汽车电子工程师与CAN通信开发者的DBC文件智能处理工具集&#xff0c;基于DbcParserLib深度扩展&#xff0c;解决多源DBC整合难、Excel数据转标准格式效率低、信号逻辑定制化不足等实际工程痛点。压缩包共128个文件&#xff0c;含79个C#核心逻辑…

作者头像 李华
网站建设 2026/8/30 22:16:29

VS2019环境下MFC计算器开发:从零构建桌面应用完整指南

简介&#xff1a;本资源是基于Visual Studio 2019开发的C计算器实战项目&#xff0c;面向C初学者及Windows桌面应用入门学习者&#xff0c;聚焦从控制台到MFC图形界面的渐进式开发实践&#xff0c;解决语法应用、UI交互与运算逻辑整合等典型学习痛点。压缩包共48个文件&#xf…

作者头像 李华
网站建设 2026/8/30 22:09:30

FastAPI零基础入门:从环境搭建到权限管理实战

FastAPI 这几年的热度一直很高&#xff0c;尤其是在构建 REST API、微服务、AI 模型推理服务这些场景下&#xff0c;它的出镜率越来越频繁。很多后端开发者在从 Flask、Django 转向 FastAPI 时&#xff0c;最先感受到的就是“快”&#xff1a;不仅框架性能快&#xff0c;开发效…

作者头像 李华
网站建设 2026/8/30 22:07:22

基于SpringBoot的健康食谱管理系统的设计与实现

1. 项目背景与意义随着人们生活水平的不断提高&#xff0c;健康饮食逐渐成为社会关注的焦点。传统的食谱管理方式多依赖纸质记录或零散的网页收藏&#xff0c;存在信息分散、检索困难、缺乏个性化推荐等问题。与此同时&#xff0c;慢性疾病年轻化、亚健康人群扩大等趋势&#x…

作者头像 李华