Docker与Kubernetes入门指南——小白也能看懂的容器技术

发布时间:2026/7/27 9:12:04

Docker与Kubernetes入门指南——小白也能看懂的容器技术 1. 引言容器技术的前世今生在软件开发的世界里一直存在一个难题“在我的机器上能运行怎么到你那就报错了”环境不一致、依赖冲突、配置复杂……这些问题常常让开发者和运维人员头疼不已。为了解决这个问题虚拟化技术应运而生。传统的虚拟机如VMware、VirtualBox通过模拟整个硬件再在上面运行完整的操作系统从而实现了环境的隔离。但虚拟机太重了每个虚拟机都需要占用大量磁盘空间、内存和CPU资源启动也需要几分钟。这时容器技术登场了。容器不像虚拟机那样模拟硬件和运行完整操作系统而是共享宿主机的操作系统内核只将应用程序及其依赖库、配置文件等打包在一起形成一个独立的运行环境。容器轻量、快速、资源利用率高启动只需秒级。容器的概念其实很早就有如Linux的chroot、LXC但真正让容器技术火起来的是Docker。Docker在2013年发布提供了简单易用的命令行工具和镜像格式大大降低了容器技术的使用门槛让“构建一次到处运行”成为现实。随着容器越来越多如何管理成百上千个容器又成了新问题。于是Kubernetes简称K8s应运而生。Kubernetes是Google开源的容器编排平台能够自动化地部署、伸缩、管理容器化应用。如今Kubernetes已成为云原生时代的事实标准。本指南将带小白读者一步步走进容器技术的世界从Docker的基础操作到Kubernetes的核心概念并通过实战案例巩固理解。全文约2万字力求通俗易懂希望你能轻松上手2. Docker基础篇2.1 什么是DockerDocker是一个开源的容器化平台它可以让开发者将应用程序及其依赖打包成一个可移植的容器镜像然后在任何安装了Docker的机器上运行这个容器。Docker的口号是“Build, Ship, and Run Any App, Anywhere”。简单来说Docker提供了三个核心功能打包Build通过Dockerfile定义应用的运行环境构建出镜像。分发Ship将镜像推送到镜像仓库如Docker Hub其他人可以拉取使用。运行Run在任意主机上运行容器保证环境一致。2.2 安装DockerDocker支持主流操作系统Linux、macOS、Windows。下面分别介绍安装方法。Linux以Ubuntu为例bash# 更新软件包索引 sudo apt update # 安装依赖包 sudo apt install apt-transport-https ca-certificates curl software-properties-common # 添加Docker官方GPG密钥 curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - # 添加稳定版仓库 sudo add-apt-repository deb [archamd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable # 再次更新并安装Docker CE sudo apt update sudo apt install docker-ce # 启动Docker并设置开机自启 sudo systemctl start docker sudo systemctl enable docker # 验证安装 sudo docker run hello-worldmacOS下载Docker Desktop for Mac安装包需注册Docker Hub账号双击安装即可。安装后会在菜单栏出现Docker图标。Windows下载Docker Desktop for Windows同样双击安装。Windows 10/11专业版或企业版支持Hyper-V家庭版需使用WSL 2后端。安装完成后打开终端或PowerShell执行docker version查看信息。如果希望普通用户也能运行docker命令可以将用户加入docker组Linux下sudo usermod -aG docker $USER然后注销重新登录。2.3 Docker核心概念镜像、容器、仓库镜像Image一个只读的模板包含运行应用程序所需的所有内容操作系统基础层、代码、运行时、库、环境变量、配置文件等。可以类比为虚拟机镜像或Java中的类。容器Container镜像的一个运行实例可以启动、停止、删除、暂停。容器是轻量级的相互隔离。可以类比为虚拟机实例或Java中类的对象。仓库Repository存放镜像的地方类似Git仓库。Docker Hub是官方公共仓库也可以搭建私有仓库。2.4 第一个Docker容器Hello World安装好Docker后执行bashdocker run hello-world如果本地没有hello-world镜像Docker会自动从Docker Hub拉取然后运行一个容器输出欢迎信息。这验证了Docker能正常工作。2.5 操作容器启动、停止、删除运行一个交互式容器Ubuntubashdocker run -it ubuntu bash-it分配交互式终端这样就可以在容器里执行命令。ubuntu镜像名默认从Docker Hub拉取。bash容器启动后执行的命令。在容器内可以执行ls、apt update等操作。输入exit退出容器停止。常用容器命令bash# 查看运行中的容器 docker ps # 查看所有容器包括已停止 docker ps -a # 启动一个已存在的容器 docker start 容器ID或名称 # 停止一个运行中的容器 docker stop 容器ID # 删除一个已停止的容器 docker rm 容器ID # 强制删除运行中的容器 docker rm -f 容器ID # 查看容器日志 docker logs 容器ID # 在运行中的容器中执行命令 docker exec -it 容器ID bash2.6 Docker镜像的获取与管理拉取镜像bashdocker pull nginx:latest # 拉取最新版Nginx镜像 docker pull ubuntu:20.04 # 拉取指定版本的Ubuntu查看本地镜像bashdocker images删除镜像bashdocker rmi nginx:latest镜像标签可以为镜像打标签tagbashdocker tag ubuntu:20.04 myubuntu:v12.7 使用Dockerfile构建自定义镜像Dockerfile是一个文本文件包含一系列指令用于自动化构建镜像。下面是一个简单的Dockerfile示例基于Ubuntu安装Nginxdockerfile# 基础镜像 FROM ubuntu:20.04 # 维护者信息 LABEL maintaineryournameexample.com # 设置环境变量避免交互式安装时卡住 ENV DEBIAN_FRONTENDnoninteractive # 更新软件源并安装Nginx RUN apt update apt install -y nginx # 暴露端口 EXPOSE 80 # 启动Nginx前台运行 CMD [nginx, -g, daemon off;]在Dockerfile所在目录执行构建bashdocker build -t mynginx:v1 .-t指定镜像名和标签。.构建上下文路径即当前目录。构建完成后可用docker run -d -p 8080:80 mynginx:v1启动容器访问http://localhost:8080即可看到Nginx欢迎页。常用Dockerfile指令FROM指定基础镜像必须位于第一行。RUN在构建镜像时执行的命令每一条RUN都会创建一层镜像层。COPY/ADD将文件从构建上下文复制到镜像中。ADD支持自动解压tar包和远程URL。WORKDIR设置工作目录。ENV设置环境变量。EXPOSE声明容器内应用监听的端口仅是声明实际映射需用-p。CMD容器启动时执行的默认命令可以被覆盖。ENTRYPOINT配置容器启动时运行的命令不可被覆盖但可传参。2.8 数据持久化数据卷Volume默认情况下容器内创建的文件在容器删除后会丢失。为了实现数据持久化Docker提供了数据卷Volume。使用数据卷bash# 创建一个数据卷 docker volume create mydata # 启动容器并挂载数据卷 docker run -d -v mydata:/data --name myapp ubuntu sleep 3600 # 查看数据卷信息 docker volume inspect mydata数据卷由Docker管理存在于宿主机特定目录。另一种方式是绑定挂载将宿主机目录映射到容器内bashdocker run -d -v /host/path:/container/path ubuntu ...这种方式更灵活但依赖宿主机目录结构。2.9 网络基础容器间的通信Docker默认创建三种网络bridge、host、none。默认情况下容器连接到bridge网络可以互相通过IP通信但无法通过容器名直接访问。要让容器通过名字通信可以创建自定义网络。创建自定义网络bashdocker network create mynet启动容器并连接到网络bashdocker run -d --name app1 --network mynet nginx docker run -d --name app2 --network mynet nginx现在app2可以ping app1需容器内有ping命令。自定义网络提供了自动DNS解析。2.10 Docker Compose多容器应用实际应用中一个项目往往包含多个服务如Web应用数据库缓存。手动管理多个容器的启动顺序、网络连接、数据卷等会很麻烦。Docker Compose通过一个YAML文件定义多容器应用用一条命令即可启动整个应用。安装Docker ComposeDocker Desktop for Mac/Windows已自带Compose。Linux下需单独安装bashsudo curl -L https://github.com/docker/compose/releases/download/v2.24.0/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose sudo chmod x /usr/local/bin/docker-composedocker-compose.yml示例创建一个docker-compose.yml文件yamlversion: 3 services: web: image: nginx:latest ports: - 8080:80 volumes: - ./html:/usr/share/nginx/html networks: - appnet db: image: mysql:5.7 environment: MYSQL_ROOT_PASSWORD: rootpass volumes: - dbdata:/var/lib/mysql networks: - appnet volumes: dbdata: networks: appnet:启动所有服务bashdocker-compose up -d停止并删除容器和网络bashdocker-compose down查看日志bashdocker-compose logs -fDocker Compose非常适合开发环境和简单的部署。但在生产环境中容器数量多、分布在不同主机上时就需要容器编排工具如Kubernetes。3. Docker实战容器化一个Web应用为了更直观地理解Docker的使用我们从一个简单的Node.js应用开始将其容器化并用Docker Compose集成数据库。3.1 准备一个简单的Node.js应用首先创建一个项目目录比如node-app。在目录下创建app.jsjavascriptconst express require(express); const mysql require(mysql); const app express(); const port 3000; // MySQL连接配置环境变量或硬编码待会儿会用环境变量 const db mysql.createConnection({ host: process.env.DB_HOST || localhost, user: process.env.DB_USER || root, password: process.env.DB_PASSWORD || password, database: process.env.DB_NAME || testdb }); db.connect(err { if (err) { console.error(数据库连接失败:, err); } else { console.log(数据库连接成功); } }); app.get(/, (req, res) { res.send(Hello World!); }); app.get(/users, (req, res) { db.query(SELECT * FROM users, (err, results) { if (err) { res.status(500).send(err); } else { res.json(results); } }); }); app.listen(port, () { console.log(应用监听端口 ${port}); });创建package.jsonjson{ name: node-app, version: 1.0.0, dependencies: { express: ^4.18.2, mysql: ^2.18.1 } }3.2 编写Dockerfile在项目根目录创建Dockerfiledockerfile# 使用官方Node.js镜像作为基础 FROM node:18-alpine # 设置工作目录 WORKDIR /app # 复制package.json和package-lock.json如果有 COPY package*.json ./ # 安装依赖 RUN npm install # 复制应用程序代码 COPY . . # 暴露应用端口 EXPOSE 3000 # 启动命令 CMD [node, app.js]3.3 构建镜像并运行容器构建镜像bashdocker build -t node-app:v1 .运行容器假设本地没有MySQL暂时先不连接数据库bashdocker run -d -p 3000:3000 --name myapp node-app:v1访问http://localhost:3000应该看到“Hello World!”。但访问/users会报错因为没有数据库。下面我们用Docker Compose启动应用MySQL。3.4 使用Docker Compose管理应用数据库创建docker-compose.ymlyamlversion: 3.8 services: db: image: mysql:5.7 environment: MYSQL_ROOT_PASSWORD: rootpass MYSQL_DATABASE: testdb MYSQL_USER: appuser MYSQL_PASSWORD: apppass volumes: - dbdata:/var/lib/mysql - ./init.sql:/docker-entrypoint-initdb.d/init.sql # 初始化脚本 ports: - 3306:3306 # 仅开发时暴露生产不建议 networks: - appnet app: build: . depends_on: - db environment: DB_HOST: db DB_USER: appuser DB_PASSWORD: apppass DB_NAME: testdb ports: - 3000:3000 networks: - appnet volumes: dbdata: networks: appnet:创建初始化SQL脚本init.sqlsqlCREATE TABLE IF NOT EXISTS users ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(100) NOT NULL ); INSERT INTO users (name) VALUES (Alice), (Bob);现在启动bashdocker-compose up -d等待数据库初始化完成访问http://localhost:3000/users应能看到JSON数据。至此我们成功容器化了一个Node.js应用并整合了数据库。4. 为什么需要容器编排上面的Docker Compose可以在单机上很好地管理多个容器。但在生产环境中我们面临更多挑战容器分布在多台服务器如何跨主机通信、调度高可用某个容器挂了如何自动恢复负载均衡流量大时如何动态增加容器数量滚动更新如何在不中断服务的情况下升级应用服务发现容器IP变化如何让其他服务找到它存储、配置、密钥管理如何统一管理这些问题正是容器编排工具要解决的。目前最流行的容器编排平台就是Kubernetes。5. Kubernetes基础篇5.1 什么是KubernetesKubernetes简称K8s是一个开源的容器编排引擎用于自动化部署、扩展和管理容器化应用。它最初由Google设计现在由云原生计算基金会CNCF维护。Kubernetes提供了一个“集群”的概念一组机器节点组成一个计算资源池Kubernetes负责将容器调度到合适的节点上并保证它们按照用户期望的状态运行。5.2 Kubernetes核心概念集群Cluster一组节点物理机或虚拟机包括一个主节点Master和多个工作节点Node。节点Node集群中的一台机器可以是物理机或虚拟机。每个节点上运行着容器运行时如Docker和Kubelet与Master通信的代理。PodKubernetes最小的部署单元一个Pod可以包含一个或多个紧密相关的容器共享网络和存储。通常一个Pod只运行一个主容器。控制器Controller负责管理Pod的控制器例如Deployment、StatefulSet、DaemonSet等。Service定义一组Pod的访问策略通常为一组Pod提供稳定的IP和DNS名实现负载均衡。命名空间Namespace将集群资源划分为多个虚拟集群用于隔离不同团队或项目。ConfigMap / Secret将配置信息与容器镜像解耦方便管理。Ingress管理外部访问集群服务的入口通常提供HTTP路由。5.3 安装Kubernetes环境Minikube对于学习推荐使用Minikube它可以在本地启动一个单节点Kubernetes集群。安装Minikube以Linux为例bash# 下载Minikube二进制文件 curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64 sudo install minikube-linux-amd64 /usr/local/bin/minikube # 启动集群自动安装kubectl minikube start --driverdocker # 如果已有Docker用docker驱动macOS和Windows用户可以用Docker Desktop自带的Kubernetes或者用Minikube。安装完成后验证bashkubectl cluster-info kubectl get nodes5.4 kubectl基本命令kubectl是Kubernetes的命令行工具用于与集群交互。常用命令bash# 查看所有资源 kubectl get all # 查看Pod kubectl get pods # 查看详细信息 kubectl describe pod pod-name # 创建资源通过YAML文件 kubectl apply -f my-deployment.yaml # 删除资源 kubectl delete -f my-deployment.yaml # 查看日志 kubectl logs pod-name # 进入Pod执行命令 kubectl exec -it pod-name -- /bin/sh # 端口转发临时访问Pod kubectl port-forward pod-name 8080:805.5 第一个应用在Kubernetes中部署Nginx创建nginx-deployment.yamlyamlapiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment spec: replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:latest ports: - containerPort: 80部署bashkubectl apply -f nginx-deployment.yaml查看Podbashkubectl get pods创建Service暴露它们yamlapiVersion: v1 kind: Service metadata: name: nginx-service spec: selector: app: nginx ports: - protocol: TCP port: 80 targetPort: 80 type: LoadBalancer # 在Minikube下需要运行 minikube tunnel 才能获取外部IP应用Servicebashkubectl apply -f nginx-service.yaml在Minikube中可以使用minikube service nginx-service打开浏览器访问。5.6 Pod详解Pod是Kubernetes中最小的调度单元。一个Pod可以包含多个容器它们共享网络命名空间同一个IP和端口空间存储卷Volume进程间通信IPC常见场景一个主容器一个辅助容器sidecar例如日志收集器、代理等。Pod的生命周期PendingPod已被接受但有一个或多个容器尚未创建。RunningPod已经绑定到节点所有容器已创建至少有一个在运行。Succeeded所有容器成功终止。Failed所有容器终止至少一个容器失败。CrashLoopBackOff容器启动后崩溃Kubelet正在重启。5.7 控制器Deployment与ReplicaSetDeployment是最常用的控制器它管理ReplicaSet副本集进而管理Pod。Deployment支持声明式更新、回滚、滚动升级。ReplicaSet确保指定数量的Pod副本始终运行。Deployment在ReplicaSet基础上提供更高级的功能如版本更新。创建Deployment时可以指定strategy来控制更新策略yamlstrategy: type: RollingUpdate rollingUpdate: maxUnavailable: 1 maxSurge: 1其他控制器StatefulSet用于有状态应用提供稳定的网络标识和持久化存储。DaemonSet在每个节点上运行一个Pod用于监控、日志收集等。Job / CronJob运行一次性任务或定时任务。5.8 服务发现Service由于Pod会动态创建和销毁IP会变化因此需要Service为一组Pod提供稳定的访问入口。Service通过标签选择器selector关联Pod。Service类型ClusterIP默认仅在集群内部可访问分配一个虚拟IP。NodePort在每个节点上开放一个静态端口外部可通过NodeIP:NodePort访问。LoadBalancer在云提供商上自动创建外部负载均衡器将流量转发到NodePort。ExternalName将服务映射到外部DNS名。示例ClusterIP ServiceyamlapiVersion: v1 kind: Service metadata: name: my-service spec: selector: app: myapp ports: - protocol: TCP port: 80 targetPort: 80805.9 配置管理ConfigMap与SecretConfigMap用于存储非机密性的配置数据如环境变量、配置文件。Secret用于存储敏感数据如密码、密钥以Base64编码存储并且支持加密。ConfigMap示例yamlapiVersion: v1 kind: ConfigMap metadata: name: app-config data: DB_HOST: mysql-service DB_NAME: testdb APP_COLOR: blue在Pod中引用ConfigMap作为环境变量yamlenv: - name: DB_HOST valueFrom: configMapKeyRef: name: app-config key: DB_HOST也可以将ConfigMap挂载为文件。Secret示例创建Secret命令行bashkubectl create secret generic db-secret --from-literalpasswordrootpassSecret的YAMLyamlapiVersion: v1 kind: Secret metadata: name: db-secret type: Opaque data: password: cm9vdHBhc3M # base64编码的 rootpass在Pod中引用Secret作为环境变量注意Secret需先解码。5.10 数据持久化PersistentVolume与PersistentVolumeClaimKubernetes通过PersistentVolumePV和PersistentVolumeClaimPVC来管理持久化存储。PV集群管理员预先配置的存储资源如NFS、云盘。PVC用户对存储的请求像“我要5GB的快速存储”。Pod通过PVC使用PV。流程管理员创建PV。用户创建PVC。Pod的volumes中引用PVC。示例PV本地hostPath仅用于测试yamlapiVersion: v1 kind: PersistentVolume metadata: name: pv-local spec: capacity: storage: 10Gi volumeMode: Filesystem accessModes: - ReadWriteOnce hostPath: path: /data/pv示例PVCyamlapiVersion: v1 kind: PersistentVolumeClaim metadata: name: pvc-demo spec: accessModes: - ReadWriteOnce resources: requests: storage: 5GiPod中使用yamlvolumes: - name: data persistentVolumeClaim: claimName: pvc-demo5.11 命名空间Namespace命名空间提供资源隔离。默认有default、kube-system系统组件、kube-public等。可以创建自己的命名空间。bashkubectl create namespace myapp在YAML中指定metadata.namespace。查看某命名空间的资源bashkubectl get pods -n myapp5.12 Ingress外部访问Service的NodePort和LoadBalancer方式通常用于暴露服务。但更常见的做法是使用Ingress它提供基于HTTP/HTTPS的路由规则将外部请求转发到不同的Service。Ingress需要安装Ingress控制器如nginx-ingress、traefik。Minikube自带Ingress插件bashminikube addons enable ingress创建Ingress示例yamlapiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: example-ingress spec: rules: - host: myapp.local http: paths: - path: / pathType: Prefix backend: service: name: nginx-service port: number: 80修改本地hosts文件将myapp.local指向Minikube IPminikube ip然后访问即可。6. Kubernetes实战部署完整应用现在我们将之前Docker Compose中的Node.js应用MySQL部署到Kubernetes中。6.1 将之前的Node.js应用部署到Kubernetes首先我们需要将应用的Docker镜像推送到一个仓库如Docker Hub以便Kubernetes节点拉取。或者使用Minikube的内置镜像缓存如果镜像已在本地。这里假设我们将镜像推送到Docker Hub需注册bashdocker tag node-app:v1 yourusername/node-app:v1 docker push yourusername/node-app:v1如果不想推送也可以在Minikube环境中直接使用本地镜像执行eval $(minikube docker-env)然后在当前终端构建镜像就可以在Minikube内使用。6.2 使用Deployment管理应用创建app-deployment.yamlyamlapiVersion: apps/v1 kind: Deployment metadata: name: node-app spec: replicas: 2 selector: matchLabels: app: node-app template: metadata: labels: app: node-app spec: containers: - name: node-app image: yourusername/node-app:v1 # 替换为你的镜像 ports: - containerPort: 3000 env: - name: DB_HOST value: mysql-service # 稍后创建的Service名 - name: DB_USER value: appuser - name: DB_PASSWORD value: apppass - name: DB_NAME value: testdb6.3 创建Service暴露应用创建app-service.yamlyamlapiVersion: v1 kind: Service metadata: name: node-app-service spec: selector: app: node-app ports: - protocol: TCP port: 80 targetPort: 3000 type: LoadBalancer # 在Minikube下用minikube tunnel或NodePort6.4 使用ConfigMap配置应用将环境变量提取到ConfigMap中更灵活。创建app-config.yamlyamlapiVersion: v1 kind: ConfigMap metadata: name: app-config data: DB_HOST: mysql-service DB_USER: appuser DB_NAME: testdb然后修改Deployment的env部分yamlenv: - name: DB_HOST valueFrom: configMapKeyRef: name: app-config key: DB_HOST - name: DB_USER valueFrom: configMapKeyRef: name: app-config key: DB_USER - name: DB_NAME valueFrom: configMapKeyRef: name: app-config key: DB_NAME - name: DB_PASSWORD valueFrom: secretKeyRef: name: db-secret key: password密码存入Secret见后。6.5 添加MySQL数据库MySQL是有状态应用可以使用StatefulSet或者简单的DeploymentPersistentVolume。创建mysql-deployment.yamlyamlapiVersion: apps/v1 kind: Deployment metadata: name: mysql spec: selector: matchLabels: app: mysql template: metadata: labels: app: mysql spec: containers: - name: mysql image: mysql:5.7 env: - name: MYSQL_ROOT_PASSWORD valueFrom: secretKeyRef: name: db-secret key: rootpassword - name: MYSQL_DATABASE value: testdb - name: MYSQL_USER value: appuser - name: MYSQL_PASSWORD valueFrom: secretKeyRef: name: db-secret key: password ports: - containerPort: 3306 volumeMounts: - name: mysql-data mountPath: /var/lib/mysql - name: init-sql mountPath: /docker-entrypoint-initdb.d volumes: - name: mysql-data persistentVolumeClaim: claimName: mysql-pvc - name: init-sql configMap: name: mysql-init-sql创建PVCmysql-pvc.yamlyamlapiVersion: v1 kind: PersistentVolumeClaim metadata: name: mysql-pvc spec: accessModes: - ReadWriteOnce resources: requests: storage: 5Gi创建ConfigMapmysql-init-sql.yamlyamlapiVersion: v1 kind: ConfigMap metadata: name: mysql-init-sql data: init.sql: | CREATE TABLE IF NOT EXISTS users ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(100) NOT NULL ); INSERT INTO users (name) VALUES (Alice), (Bob);创建Secretdb-secret.yamlyamlapiVersion: v1 kind: Secret metadata: name: db-secret type: Opaque data: rootpassword: cm9vdHBhc3M # rootpass的base64 password: YXBwcGFzcw # apppass的base64创建Servicemysql-service.yaml供app访问yamlapiVersion: v1 kind: Service metadata: name: mysql-service spec: selector: app: mysql ports: - protocol: TCP port: 3306 targetPort: 33066.6 应用扩容与滚动更新现在所有资源都已定义执行bashkubectl apply -f db-secret.yaml kubectl apply -f mysql-init-sql.yaml kubectl apply -f mysql-pvc.yaml kubectl apply -f mysql-deployment.yaml kubectl apply -f mysql-service.yaml kubectl apply -f app-config.yaml kubectl apply -f app-deployment.yaml kubectl apply -f app-service.yaml检查状态bashkubectl get pods kubectl get svc如果一切正常可以使用minikube service node-app-service访问应用。扩容将Node.js应用副本数扩展到3bashkubectl scale deployment node-app --replicas3滚动更新修改代码后构建新镜像yourusername/node-app:v2然后更新Deploymentbashkubectl set image deployment/node-app node-appyourusername/node-app:v2或者直接修改YAML后apply。Kubernetes会执行滚动更新逐个替换Pod确保服务不中断。查看更新状态bashkubectl rollout status deployment/node-app如有问题可回滚bashkubectl rollout undo deployment/node-app至此我们完成了一个完整的Kubernetes应用部署。7. 进阶概念与生态7.1 HelmKubernetes包管理器Helm是Kubernetes的包管理工具类似yum或apt。它将一组Kubernetes资源打包成Chart方便分发、安装、升级、回滚。安装Helm客户端bashcurl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash查找Chart如WordPressbashhelm search hub wordpress添加仓库并安装bashhelm repo add bitnami https://charts.bitnami.com/bitnami helm install my-wordpress bitnami/wordpressHelm通过模板化生成YAML可以自定义参数。对于复杂应用推荐使用Helm管理。7.2 存储类StorageClass在云环境中StorageClass定义了动态创建PV的存储类型如SSD、HDD。PVC可以通过指定StorageClassName来请求特定类型的存储。示例StorageClassAWS EBSyamlapiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: fast provisioner: kubernetes.io/aws-ebs parameters: type: gp2PVC引用yamlspec: storageClassName: fast resources: requests: storage: 10Gi7.3 网络策略NetworkPolicy默认情况下Kubernetes允许所有Pod之间的通信。为了安全可以使用NetworkPolicy限制流量。这需要CNI网络插件支持如Calico、Cilium。示例禁止来自其他命名空间的访问只允许某标签的Pod访问。yamlapiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: deny-from-other-namespaces spec: podSelector: {} policyTypes: - Ingress ingress: - from: - namespaceSelector: matchLabels: project: myapp7.4 水平自动伸缩HPAHorizontalPodAutoscaler根据CPU、内存使用率或自定义指标自动调整Deployment的副本数。示例基于CPU使用率保持平均50%副本范围1-10。yamlapiVersion: autoscaling/v2 kind: HorizontalPodAutoscaler metadata: name: node-app-hpa spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: node-app minReplicas: 1 maxReplicas: 10 metrics: - type: Resource resource: name: cpu target: type: Utilization averageUtilization: 507.5 服务网格Service Mesh简介服务网格如Istio、Linkerd在Kubernetes基础上提供了更细粒度的流量管理、安全、可观测性功能。它们通过在每个Pod中注入sidecar代理拦截所有进出流量实现金丝雀发布、蓝绿部署服务间mTLS加密流量镜像、故障注入分布式追踪、监控7.6 CI/CD集成将Docker和Kubernetes集成到CI/CD流水线可以实现代码提交后自动构建镜像、推送仓库、更新Kubernetes中的应用。常用工具有JenkinsGitLab CIGitHub ActionsArgoCDGitOps例如GitHub Actions的流程代码push触发workflow构建Docker镜像并推送到Docker Hub更新Kubernetes Deployment的镜像版本可选等待滚动更新完成

相关新闻