目录
技能展示
文章
日记
时间线
项目展示
分类
标签
Android Bash Burp C++ CS CTF DLL劫持 Docker Fastjson Fastjson2 FNV-1a FreeCMS FRP GetShell GitHub IPv6 Java JNDI John JS加密 JS逆向 K8s Kafka Kali lama-cleaner Linux mitmproxy MSF MySQL Nim Nmap NPS Office OID Payload Phar PHP phpMyAdmin POP链 PWN Pyinstaller Python RCE RSA Shellcode SNMP SQL注入 SSH SSRF Ubuntu USB Web Webshell Web安全 Windows XSS YAML Zookeeper 主机探测 代码审计 伪协议 免杀 内网 内网穿透 加密 加解密 参数 反序列化 反弹shell 命令 哈希碰撞 图像处理 域渗透 字符串逃逸 容器 密码学 密码破解 提权 数据库 文件上传 日志分析 未授权访问 权限维持 汇总 流量分析 消息队列 溯源 漏洞 漏洞分析 漏洞利用 端口扫描 编译 网络管理 资产探测 跨平台 运维 进程隐藏 逆向
目录
目录
1850 字
9 分钟
K8s YAML 编写指南:Deployment 与 Service
一、核心概念
K8s 中部署一个应用,通常需要两个 YAML 文件:
| 文件 | 作用 | 类比 |
|---|---|---|
| Deployment | 定义”跑什么”(镜像、副本数、容器配置) | 决定开几家店 |
| Service | 定义”怎么访问”(端口映射、网络暴露) | 决定怎么找到店 |
1用户请求 → Service (端口映射) → Pod (容器运行应用)二、Deployment 编写详解
2.1 完整模板
1apiVersion: apps/v1 # API 版本(Deployment 固定写 apps/v1)2kind: Deployment # 资源类型3metadata: # 元数据(名称、标签等)4 name: java-chains # Deployment 名称(全局唯一)5 labels: # Deployment 级别的标签6 app: java-chains7spec: # 规格说明8 replicas: 1 # 运行几个 Pod 副本9 selector: # 选择器(匹配哪些 Pod 属于这个 Deployment)10 matchLabels:11 app: java-chains # 必须与 template.metadata.labels 一致12 template: # Pod 模板(定义 Pod 的内容)13 metadata:14 labels:15 app: java-chains # Pod 的标签(selector 通过这个匹配)16 spec: # Pod 的规格17 containers:18 - name: java-chains # 容器名称19 image: java-chains-1.4.1:latest # 镜像名称:标签20 imagePullPolicy: IfNotPresent # 镜像拉取策略21 ports:22 - containerPort: 8011 # 容器监听的端口2.2 各字段详解
metadata(元数据)
1metadata:2 name: java-chains # 名称,kubectl get/deploy/logs 时用这个名字3 labels: # 键值对标签,用于 Service 选择和分类4 app: java-chains # 自定义标签名,通常用 app=<应用名>5 namespace: default # 可选,指定命名空间,默认 defaultspec(规格)
1spec:2 replicas: 1 # Pod 副本数量,高可用设为 33 selector: # Pod 选择器,必须与 template.labels 匹配4 matchLabels:5 app: java-chainstemplate(Pod 模板)
1 template:2 metadata:3 labels:4 app: java-chains # ⚠️ 必须与 selector.matchLabels 一致5 spec:6 containers:7 - name: java-chains8 image: java-chains-1.4.1:latest9 imagePullPolicy: IfNotPresent10 ports:11 - containerPort: 80112.3 imagePullPolicy 镜像拉取策略
| 策略 | 含义 | 适用场景 |
|---|---|---|
IfNotPresent | 本地有就用本地的,没有才拉取 | 本地开发的镜像 |
Always | 每次创建 Pod 都拉取最新镜像 | 使用 latest 标签时 |
Never | 从不拉取,只用本地镜像 | 离线环境 |
2.4 多容器示例
一个 Pod 可以运行多个容器(通常一个主容器 + 多个边车容器):
1spec:2 containers:3 - name: java-chains4 image: java-chains-1.4.1:latest5 ports:6 - containerPort: 80117 - name: log-collector # 边车容器:收集日志8 image: log-collector:latest9 volumeMounts:10 - name: logs11 mountPath: /app/logs12 volumes:13 - name: logs14 emptyDir: {}三、Service 编写详解
3.1 Service 类型对比
| 类型 | 外部可访问 | 适用场景 |
|---|---|---|
ClusterIP | ❌ 仅集群内部 | 微服务间通信、内部 API |
NodePort | ✅ 通过 节点IP:端口 | 开发测试、简单对外暴露 |
LoadBalancer | ✅ 通过云厂商负载均衡 | 生产环境(需要云支持) |
3.2 ClusterIP(默认,仅内部访问)
1apiVersion: v12kind: Service3metadata:4 name: java-chains5spec:6 type: ClusterIP # 默认值,可省略7 selector:8 app: java-chains # 通过标签选择 Pod9 ports:10 - port: 8011 # Service 对外暴露的端口11 targetPort: 8011 # 转发到 Pod 的 containerPort访问方式:集群内其他 Pod 通过 java-chains.default.svc.cluster.local:8011 访问。
3.3 NodePort(对外暴露端口)
1apiVersion: v12kind: Service3metadata:4 name: java-chains5spec:6 type: NodePort7 selector:8 app: java-chains9 ports:10 - port: 8011 # 集群内部访问端口11 targetPort: 8011 # Pod 容器端口12 nodePort: 30011 # 外部访问端口(范围 30000-32767)访问方式:浏览器通过 http://localhost:30011 访问。
3.4 多端口 Service
一个 Service 可以暴露多个端口:
1apiVersion: v12kind: Service3metadata:4 name: java-chains5spec:6 type: NodePort7 selector:8 app: java-chains9 ports:10 - name: http # 端口名称(必须)11 port: 801112 targetPort: 801113 nodePort: 3001114 - name: metrics # 第二个端口15 port: 909016 targetPort: 909017 nodePort: 30090⚠️ 多端口时,每个端口必须有
name字段。
3.5 多个 Service 合并写法
多个 Service 可以写在同一个 YAML 文件中,用 --- 分隔:
1apiVersion: v12kind: Service3metadata:4 name: java-chains5spec:6 type: NodePort7 selector:8 app: java-chains9 ports:10 - port: 801111 targetPort: 801112 nodePort: 3001113---14apiVersion: v115kind: Service16metadata:17 name: java-sec-code18spec:19 type: ClusterIP20 selector:21 app: java-sec-code22 ports:23 - port: 808024 targetPort: 8080四、端口映射详解
4.1 三层端口关系
1外部请求 → nodePort → port → targetPort → containerPort → 应用2(浏览器) (宿主机) (Service) (转发规则) (容器内) (监听)| 字段 | 在哪定义 | 谁在使用 | 是否必须 |
|---|---|---|---|
containerPort | Deployment | 容器内的应用 | 建议填写(文档作用) |
targetPort | Service | Service 转发目标 | ✅ 必须 |
port | Service | 集群内其他 Pod | ✅ 必须 |
nodePort | Service | 外部浏览器 | 仅 NodePort 类型 |
4.2 port 和 targetPort 可以不同
1ports:2 - port: 80 # 集群内访问 :803 targetPort: 8011 # 实际转发到容器的 80114 nodePort: 30080 # 外部访问 :30080这样:
- 集群内:
curl java-chains:80→ 转发到容器 8011 - 集群外:
curl localhost:30080→ 转发到容器 8011
4.3 nodePort 端口范围
默认范围是 30000-32767,超出范围会报错。
如果需要使用范围外的端口(如 18011),有两种方式:
方式一:修改 kube-apiserver 参数(不推荐)
Docker Desktop 可以在设置中修改,但不建议。
方式二:使用 port-forward(推荐,临时方案)
1# 将本地 18011 映射到 Service 的 80112kubectl port-forward svc/java-chains 18011:80113
4# 然后浏览器访问 http://localhost:18011方式三:使用 docker run 的 -p 参数(Docker Desktop 特有)
1# 不需要改 YAML,直接映射2kubectl port-forward svc/java-chains 18011:8011 --address 0.0.0.0五、完整操作流程
5.1 从零部署一个应用
1# ===== 第一步:构建镜像 =====2cd demo/java-chains-1.4.1/3docker build -t java-chains-1.4.1:latest .4
5# ===== 第二步:加载镜像到 K8s =====6# Docker Desktop 内置 K8s 可以直接使用 docker build 的镜像7# Minikube 需要额外加载:8# minikube image load java-chains-1.4.1:latest9
10# ===== 第三步:部署 Deployment =====11kubectl apply -f java-chains-deploy.yaml12
13# ===== 第四步:创建 Service =====14kubectl apply -f services.yaml15
16# ===== 第五步:验证 =====17kubectl get pods -l app=java-chains18kubectl get svc java-chains19
20# ===== 第六步:访问 =====21# ClusterIP 类型(仅内部)22kubectl port-forward svc/java-chains 8011:801123# 浏览器访问 http://localhost:801124
25# NodePort 类型(直接访问)26# 浏览器访问 http://localhost:300115.2 修改端口映射
1# 1. 编辑 services.yaml,修改 port/targetPort/nodePort2vi services.yaml3
4# 2. 重新 apply(K8s 会自动更新)5kubectl apply -f services.yaml6
7# 3. 验证8kubectl get svc java-chains5.3 修改镜像版本
1# 1. 修改 deploy.yaml 中的 image 字段2# image: java-chains-1.4.1:latest3# 改为4# image: java-chains-1.4.2:latest5
6# 2. 重新 apply7kubectl apply -f java-chains-deploy.yaml8
9# 3. 查看 Pod 是否重建(新镜像会触发滚动更新)10kubectl get pods -l app=java-chains -w5.4 扩缩容
1# 方式一:修改 deploy.yaml 中 replicas 字段后 apply2
3# 方式二:命令行直接扩缩4kubectl scale deployment java-chains --replicas=35
6# 查看副本数7kubectl get pods -l app=java-chains5.5 删除资源
1# 删除 Service2kubectl delete -f services.yaml3
4# 删除 Deployment5kubectl delete -f java-chains-deploy.yaml6
7# 或按名称删除8kubectl delete svc java-chains9kubectl delete deployment java-chains六、常用排查命令
1# 查看 Pod 状态2kubectl get pods -l app=java-chains3
4# 查看 Pod 详情(包括事件)5kubectl describe pod <pod-name>6
7# 查看 Pod 日志8kubectl logs <pod-name>9kubectl logs <pod-name> -f # 实时日志10kubectl logs <pod-name> --tail 50 # 最后50行11
12# 查看 Service 详情13kubectl describe svc java-chains14
15# 查看 Service 端点(Pod 是否被正确关联)16kubectl get endpoints java-chains17
18# 进入容器19kubectl exec -it <pod-name> -- sh20
21# 端口转发(临时暴露)22kubectl port-forward svc/java-chains 8011:801123
24# 查看 Pod 所在节点25kubectl get pods -l app=java-chains -o wide七、常见问题
Q1: Service 创建了但 Endpoints 为空?
1kubectl get endpoints java-chains2# 如果显示 <none>,说明 selector 没有匹配到任何 Pod原因:Service 的 selector.app 与 Pod 的 labels.app 不一致。
排查:
1kubectl get pods --show-labels | grep java-chainsQ2: 修改了 YAML 但没有生效?
1# 检查是否有语法错误(dry-run 不实际执行)2kubectl apply -f services.yaml --dry-run=client3
4# 查看当前实际生效的配置5kubectl get svc java-chains -o yamlQ3: NodePort 端口冲突?
1The Service "java-chains" is invalid: spec.ports[0].nodePort: Invalid value: 30011: provided port is already allocated说明 30011 已被其他 Service 占用。换一个端口即可。
Q4: Pod 一直 CrashLoopBackOff?
1kubectl logs <pod-name> # 查看应用日志2kubectl describe pod <pod-name> # 查看事件(可能有镜像拉取失败等信息)常见原因:镜像不存在、应用启动报错、端口被占用。
Q5: 如何查看当前集群所有端口映射?
1kubectl get svc --all-namespaces2# 或更详细3kubectl get svc -o wide --all-namespaces K8s YAML 编写指南:Deployment 与 Service
/posts/2026/06/k8s-yaml-guide/ 部分信息可能已经过时
目录
技能展示
文章
日记
时间线
项目展示
分类
标签
Android Bash Burp C++ CS CTF DLL劫持 Docker Fastjson Fastjson2 FNV-1a FreeCMS FRP GetShell GitHub IPv6 Java JNDI John JS加密 JS逆向 K8s Kafka Kali lama-cleaner Linux mitmproxy MSF MySQL Nim Nmap NPS Office OID Payload Phar PHP phpMyAdmin POP链 PWN Pyinstaller Python RCE RSA Shellcode SNMP SQL注入 SSH SSRF Ubuntu USB Web Webshell Web安全 Windows XSS YAML Zookeeper 主机探测 代码审计 伪协议 免杀 内网 内网穿透 加密 加解密 参数 反序列化 反弹shell 命令 哈希碰撞 图像处理 域渗透 字符串逃逸 容器 密码学 密码破解 提权 数据库 文件上传 日志分析 未授权访问 权限维持 汇总 流量分析 消息队列 溯源 漏洞 漏洞分析 漏洞利用 端口扫描 编译 网络管理 资产探测 跨平台 运维 进程隐藏 逆向
目录