K8s核心操作——Pod、Service与Deployment实操

搭建好K8s集群后,最核心的操作就是部署和管理应用。在K8s中,应用的部署和管理离不开三个核心概念:Pod、Service和Deployment。本文将详细讲解这三个概念的作用,以及如何通过kubectl命令和配置文件,实现应用的部署、访问、扩容和滚动更新,让你真正上手操作K8s。

### 一、Pod:K8s最小的部署单元

Pod是K8s中最小的部署单元,也是K8s管理的最小对象。简单来说,Pod就是一个或多个容器的集合,这些容器共享网络和存储资源,紧密协作,共同完成一个特定的任务。比如,一个Web应用可能需要一个前端容器和一个后端容器,这两个容器就可以部署在同一个Pod中,共享网络空间,实现高效通信。

#### 1. Pod的核心特点

- Pod是临时的:Pod不是持久化的,当Pod出现故障、节点重启或被调度到其他节点时,原有的Pod会被删除,K8s会重新创建一个新的Pod;

- 容器共享资源:同一个Pod中的所有容器共享网络命名空间(可以通过localhost互相访问)和存储卷(可以共享文件);

- 一个Pod对应一个应用实例:通常情况下,一个Pod只部署一个应用容器(除非是紧密耦合的多个容器),多个应用实例会通过多个Pod部署。

#### 2. 部署Pod的两种方式

方式1:通过kubectl run命令快速部署(适合测试)

例如,部署一个Nginx Pod:

kubectl run nginx-pod --image=nginx:1.21 --port=80

命令说明:--image指定容器镜像,--port指定容器暴露的端口。

方式2:通过配置文件部署(适合生产环境,可复用、可版本控制)

创建一个nginx-pod.yaml配置文件,内容如下:

apiVersion: v1

kind: Pod

metadata:

name: nginx-pod

labels:

app: nginx

spec:

containers:

- name: nginx

image: nginx:1.21

ports:

- containerPort: 80

执行部署命令:kubectl apply -f nginx-pod.yaml

#### 3. 常用Pod操作命令

- 查看Pod列表:kubectl get pods

- 查看Pod详情:kubectl describe pod nginx-pod

- 查看Pod日志:kubectl logs nginx-pod

- 进入Pod容器:kubectl exec -it nginx-pod -- /bin/bash

- 删除Pod:kubectl delete pod nginx-pod(或kubectl delete -f nginx-pod.yaml)

### 二、Service:解决Pod访问问题

Pod是临时的,其IP地址会随着Pod的重建而变化,这就导致了一个问题:如何稳定地访问Pod中的应用?Service就是为了解决这个问题而存在的,它为一组具有相同标签的Pod提供一个固定的访问地址(ClusterIP),无论Pod如何重建、IP如何变化,都可以通过Service的固定地址访问到应用。

#### 1. Service的核心作用

- 固定访问地址:为Pod提供固定的ClusterIP(集群内部可访问)或NodePort(外部可访问),解决Pod IP不固定的问题;

- 负载均衡:当多个Pod对应一个Service时,Service会将请求均匀分发到各个Pod,实现负载均衡;

- 服务发现:通过标签选择器,自动关联具有相同标签的Pod,无需手动配置Pod IP。

#### 2. 部署Service的示例(以Nginx Service为例)

创建nginx-service.yaml配置文件,内容如下:

apiVersion: v1

kind: Service

metadata:

name: nginx-service

spec:

type: NodePort # 外部可访问类型,会在每个节点上开放一个端口

selector:

app: nginx # 关联标签为app:nginx的Pod

ports:

- port: 80 # Service的端口

targetPort: 80 # Pod的端口

nodePort: 30080 # 节点开放的端口(范围30000-32767)

执行部署命令:kubectl apply -f nginx-service.yaml

部署完成后,执行kubectl get svc,可查看Service的ClusterIP和NodePort,通过“节点IP:30080”即可从外部访问Nginx应用。

#### 3. Service的常见类型

- ClusterIP:默认类型,仅集群内部可访问,适合集群内部服务之间的通信;

- NodePort:在每个节点上开放一个端口,外部可通过“节点IP:NodePort”访问,适合测试环境;

- LoadBalancer:结合云厂商的负载均衡器,提供外部访问入口,适合生产环境;

- ExternalName:将Service映射到外部域名,适合访问集群外部的服务。

### 三、Deployment:实现Pod的自动化管理

直接部署Pod虽然简单,但无法实现Pod的扩容、缩容、滚动更新和故障自愈。Deployment是K8s中用于管理Pod的控制器,它可以定义Pod的副本数量、更新策略等,实现Pod的自动化管理,确保Pod的实际状态与期望状态一致。

#### 1. Deployment的核心作用

- 副本管理:指定Pod的副本数量,确保始终有指定数量的Pod在运行,故障时自动补充;

- 滚动更新:在不中断服务的情况下,逐步更新Pod的镜像版本,避免服务 downtime;

- 回滚:当更新出现问题时,可以快速回滚到之前的稳定版本;

- 扩缩容:根据业务需求,手动或自动调整Pod的副本数量,实现弹性伸缩。

#### 2. 部署Deployment的示例(以Nginx Deployment为例)

创建nginx-deployment.yaml配置文件,内容如下:

apiVersion: apps/v1

kind: Deployment

metadata:

name: nginx-deployment

spec:

replicas: 3 # Pod副本数量为3

selector:

matchLabels:

app: nginx

template:

metadata:

labels:

app: nginx

spec:

containers:

- name: nginx

image: nginx:1.21

ports:

- containerPort: 80

执行部署命令:kubectl apply -f nginx-deployment.yaml

#### 3. 常用Deployment操作命令

- 查看Deployment列表:kubectl get deployments

- 查看Deployment详情:kubectl describe deployment nginx-deployment

- 扩缩容:kubectl scale deployment nginx-deployment --replicas=5(将副本数调整为5)

- 滚动更新:kubectl set image deployment nginx-deployment nginx=nginx:1.22(将镜像更新为1.22版本)

- 查看更新状态:kubectl rollout status deployment nginx-deployment

- 回滚:kubectl rollout undo deployment nginx-deployment(回滚到上一个版本)

- 删除Deployment:kubectl delete deployment nginx-deployment

### 总结

Pod、Service、Deployment三者相辅相成:Deployment管理Pod的生命周期(副本、更新、回滚),Service为Pod提供固定访问地址和负载均衡,Pod则是应用运行的载体。掌握这三个核心概念和操作,就能完成K8s中大部分的应用部署和管理工作。下一篇文章,我们将讲解K8s的运维管理技巧,包括日志收集、监控告警、故障排查等,帮助你更好地维护K8s集群。

更多推荐