前言

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(3094780) → Pod(80) → 容器(80

六、快速编写YAML文件的3种实用技巧

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐