K8s实战:Pod、Service与Deployment全解析
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集群。
更多推荐
所有评论(0)