K8S(五)—— YAML文件解析
1、如何查看版本2、YAML格式语法3、案列中如何认识 资源清单编写4、k8sport nodeporttagetportcontainerPort昨天5、如何快速编写 yaml文件。
前言
1、如何查看版本
2、YAML格式语法
3、案列中如何认识 资源清单编写
4、k8s port nodeport tagetport containerPort 昨天
5、如何快速编写 yaml文件
一、K8s配置文件格式对比:YAML与JSON
JSON 格式:主要用于 api 接口之间消息的传递
YAML 格式:用于配置和管理,YAML 是一种简洁的非标记性语言,内容格式人性化,较易读
| 格式 | 核心用途 | 优势 | 劣势 |
|---|---|---|---|
| JSON | API接口消息传递(如K8s组件间通信) | 结构严谨、机器易解析、无歧义 | 语法繁琐、可读性差、不适合人工编写 |
| YAML | 资源配置与管理(人工编写/维护) | 语法简洁、格式人性化、易读易改 | 对缩进敏感、机器解析需处理格式校验 |
Kubernetes 支持 YAML 和 JSON 格式管理资源对象
日常运维中,优先选择YAML格式编写K8s资源清单,仅在API开发或自动化脚本中考虑JSON格式。
二、YAML语法格式详解
YAML的语法规则是编写正确配置文件的基础,需严格遵循以下规范,否则会导致K8s解析失败:
2.1 核心语法规则
1.大小写敏感:例如Name与name代表不同字段,需与K8s资源定义的字段严格匹配(如apiVersion而非apiversion)。
2.缩进表示层级:通过空格缩进体现字段间的父子关系(如metadata下的name需缩进),不支持Tab键(不同编辑器Tab宽度可能不一致,导致格式错乱)。
3.缩进空格数灵活:相同层级的字段左侧对齐即可,推荐统一使用“2个空格”作为基础缩进(K8s社区通用习惯)。
4.符号后需空格:特殊符号(冒号:、逗号,、短横杆-)后必须跟1个空格,例如name: nginx(冒号后空格)、- image: nginx(短横杆后空格)。
5.文件分隔符:—表示YAML文件的开始,若一个文件中定义多个资源(如同时定义Deployment和Service),可通过—分隔不同资源块。
6.注释语法:#开头的内容为注释,注释仅作用于单行,K8s解析时会忽略注释内容(推荐为关键字段添加注释,提升可维护性)。
●大小写敏感
●使用缩进表示层级关系
●不支持Tab键制表符缩进,只使用空格缩进
●缩进的空格数目不重要,只要相同层级的元素左侧对齐即可,通常开头缩进两个空格
●符号字符后缩进一个空格,如冒号,逗号,短横杆(-)等
●“—”表示YAML格式,一个文件的开始,用于分隔文件间
●“#”表示注释
2.2 语法示例(简单YAML结构)
# 注释:示例YAML结构,体现层级与符号规范
apiVersion: v1
kind: Pod
metadata:
name: my-pod # Pod名称(同一Namespace唯一)
labels: # 标签(用于K8s资源关联,如Service匹配Pod)
app: my-app
spec:
containers: # 容器列表(一个Pod可包含多个容器,用短横杆分隔)
- name: my-container # 第一个容器名称
image: nginx:1.15.4 # 容器镜像(需指定版本,避免拉取latest镜像)
ports:
- containerPort: 80 # 容器内部端口
三、查看K8s API版本(资源清单基础)
kubectl api-versions
# 部分输出如下
admissionregistration.k8s.io/v1beta1
apps/v1 # 稳定版(生产环境首选,如Deployment属于此类)
apps/v1beta1 # Beta版(测试特性,不建议生产使用,可能被废弃)
apps/v1beta2
v1 # 核心API组(如Pod、Service属于此类)
四、K8s资源清单实战:Deployment与Service
资源清单是YAML文件的核心应用场景,下面通过“Nginx Deployment(副本管理)”和“Nginx Service(对外访问)”两个案例,讲解资源清单的编写逻辑与操作流程。
4.1 案例1:Deployment资源(管理Pod副本)
Deployment是K8s中用于管理Pod副本的核心资源,可实现Pod的创建、扩容、滚动更新等功能。
4.1.1 编写Deployment YAML文件
1、创建目录并新建YAML文件:
mkdir -p /opt/demo && cd /opt/demo
vim nginx-deployment.yaml
2、编写YAML内容(关键字段已加注释):
apiVersion: apps/v1 #指定api版本标签
kind: Deployment #定义资源的类型/角色,deployment为副本控制器,此处资源类型可以是Deployment、Job、Ingress、Service等
metadata: #定义资源的元数据信息,比如资源的名称、namespace、标签等信息
name: nginx-deployment #定义资源的名称,在同一个namespace空间中必须是唯一的
labels: #定义Deployment资源标签
app: nginx
spec: #定义deployment资源需要的参数属性,诸如是否在容器失败时重新启动容器的属性
replicas: 3 #定义副本数量
selector: #定义标签选择器
matchLabels: #定义匹配标签
app: nginx #需与 .spec.template.metadata.labels 定义的标签保持一致
template: #定义业务模板,如果有多个副本,所有副本的属性会按照模板的相关配置进行匹配
metadata:
labels: #定义Pod副本将使用的标签,需与 .spec.selector.matchLabels 定义的标签保持一致
app: nginx
spec:
containers: #定义容器属性
- name: nginx #定义一个容器名,一个 - name: 定义一个容器
image: nginx:1.15.4 #定义容器使用的镜像以及版本
ports:
- containerPort: 80 #定义容器的对外的端口
4.1.2 创建与验证Deployment
1、执行YAML文件创建Deployment:
kubectl create -f nginx-deployment.yaml
# 输出:deployment.apps/nginx-deployment created
2、查看创建的Pod副本(验证是否正常运行):
kubectl get pods -o wide
# 输出示例(3个Pod均为Running状态,分布在不同Node)
4.2 案例2:Service资源(对外暴露访问)
Deployment创建的Pod仅能在K8s集群内部访问,需通过Service资源对外暴露端口,实现外部流量访问Pod。
4.2.1 编写Service YAML文件
1、新建Service YAML文件:
vim nginx-service.yaml
2、编写YAML内容(选择NodePort类型,支持外部访问):
apiVersion: v1 # API版本(Service属于核心组v1)
kind: Service # 资源类型(此处为Service)
metadata:
name: nginx-service # Service名称
labels:
app: nginx
spec:
type: NodePort # Service类型(NodePort:通过NodeIP+NodePort访问)
ports:
- port: 80 # Service集群内端口(集群内通过ClusterIP:port访问)
targetPort: 80 # 目标Pod端口(流量转发到Pod的80端口)
selector:
app: nginx # 标签选择器(匹配带有app: nginx的Pod)
4.2.2 创建与验证Service
1、执行YAML文件创建Service:
kubectl create -f nginx-service.yaml
# 输出:service/nginx-service created
2、查看Service信息(获取NodePort端口):
kubectl get svc
kubectl get svc
# 输出示例
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 18h
nginx-service NodePort 10.96.157.209 <none> 80:30947/TCP 16s
PORT(S):80:30947表示“Service集群内端口:NodePort外部端口”,其中30947是K8s自动分配的外部访问端口。
3、外部访问测试:
在浏览器或终端中通过“NodeIP:NodePort”访问Nginx,例如:
# 终端访问示例(NodeIP为192.168.10.15或192.168.10.16)
curl http://192.168.10.15:30947
# 输出Nginx默认首页HTML内容,说明访问成功
五、K8s中4类Port详解:port、nodePort、targetPort、containerPort
Kubernetes Service 端口类型对照表
| 类型 | 定义 | 用途 | 访问方式 | 备注 |
|---|---|---|---|---|
| port | Service的集群内端口 | 集群内部Pod访问Service的端口 | ClusterIP:port |
仅集群内可见,由用户指定(如80) |
| nodePort | Service的外部访问端口 | 外部客户端访问Service的端口 | NodeIP:nodePort |
由K8s自动分配(默认范围30000-32767),也可手动指定 |
| targetPort | 目标Pod的端口 | Service转发流量的目标端口 | 无直接访问方式 | 一般与Pod的containerPort一致,仅用于Service内部转发 |
| containerPort | 容器内部的端口 | 容器监听的端口 | 无直接访问方式 | 需与容器实际运行的端口匹配(如镜像内Nginx的端口),仅Pod内部可见 |
外部客户端访问Pod的完整流量路径如下:
外部客户端 → NodeIP:nodePort(Service外部入口)
→ ClusterIP:port(Service集群内入口)
→ PodIP:targetPort(Service转发到Pod)
→ 容器:containerPort(Pod内容器监听端口)
例如本文案例中的流量路径:
curl http://192.168.80.11:30947 → Service(30947→80) → Pod(80) → 容器(80)
六、快速编写YAML文件的3种实用技巧
、
更多推荐
所有评论(0)