Skip to content

Kubernetes 对象描述文件

Kubernetes 对象描述文件(通常称为 manifest 文件)是用于定义和配置 Kubernetes 资源的 YAML 或 JSON 文件。这些文件描述了应用程序的期望状态,包括 Pods、Services、Deployments 等资源。

基本结构

一个典型的 Kubernetes YAML 描述文件包含以下主要部分:

yaml
apiVersion: apps/v1        # 与k8s集群版本有关,使用kubectl api-versions即可查看当前集群支持的版本
kind: Deployment           # 资源类型
metadata:                  # 资源的元数据,即Deployment的一些基本属性和信息
  name: nginx-deployment   # 资源名称
  labels:                  # 标签,可以灵活定位一个或多个资源
    app: nginx             # 为该资源设置key为app,value为nginx的标签
spec:                      # 这是关于资源的描述,即期待该Deployment在k8s中如何使用
  replicas: 1              # 使用该资源创建一个应用程序实例。副本数
  selector:                # 标签选择器,与上面的标签共同作用
    matchLabels:           # 选择包含标签app:nginx的资源
      app: nginx
  template:                # 这是选择或创建的Pod的模板
    metadata:              # Pod的元数据
      labels:              # Pod的标签,上面的selector即选择包含标签app:nginx的Pod
        app: nginx
    spec:                  # 期望Pod实现的功能(即在pod中部署)
      containers:
      - name: nginx
        image: nginx:1.7.9 # 使用的镜像
  ports:
  - name: nginx-port 		# 端口的名字
    protocol: TCP 			# 协议类型 TCP/UDP
    port: 80 				# 集群内的其他容器组可通过 80 端口访问 Service
    nodePort: 32600 		# 通过任意节点的 32600 端口访问 Service
    targetPort: 80 			# 将请求转发到匹配 Pod 的 80 端口
  type: NodePort 			# Serive的类型,ClusterIP/NodePort/LoaderBalancer

常见资源类型

  1. Pod - 最基本的部署单元
  2. Deployment - 管理 Pod 的副本集
  3. Service - 定义如何访问应用程序
  4. ConfigMap - 存储配置数据
  5. Secret - 存储敏感数据
  6. Namespace - 逻辑上隔离集群资源
  7. PersistentVolume/PersistentVolumeClaim - 存储管理
  8. StatefulSet - 管理有状态应用
  9. DaemonSet - 确保所有节点运行一个 Pod 副本
  10. Job/CronJob - 运行一次性或定时任务

编写最佳实践

  1. 使用有意义的名称:资源名称应描述其用途
  2. 添加标签和注释:便于组织和查询
  3. 指定资源限制:为容器设置 CPU 和内存限制
  4. 使用 ConfigMap 和 Secret:避免将配置硬编码在描述文件中
  5. 版本控制:将描述文件存储在版本控制系统中
  6. 模板化:使用 Helm 或 Kustomize 管理复杂配置
  7. 验证文件:使用 kubectl apply --dry-run=client -f file.yaml 验证

常用命令

  • 应用配置:kubectl apply -f filename.yaml
  • 查看资源:kubectl get <resource-type>
  • 删除资源:kubectl delete -f filename.yaml
  • 编辑资源:kubectl edit <resource-type>/<name>

yaml 创建资源

创建一个命令空间

yaml
apiVersion: v1
kind: Namespace
metadata:
  name: demo
  labels:
    app: nginx

创建一个Service暴露应用

yaml
apiVersion: v1
kind: Service
metadata:
  labels:
    app: nginx
  name: nginx-service
  namespace: demo
spec:
  selector:
    app: nginx
  type: ClusterIP
  ports:
    - name: http
      port: 80
      protocol: TCP
      targetPort: 80

与Deployment 绑定

Service 通过 selector 字段选择具有特定标签的 Pod,而 Deployment 通过 template.metadata.labels 为创建的 Pod 打上标签,从而实现间接绑定。

yaml
apiVersion: v1
kind: Service
metadata:
  name: my-app-service
spec:
  selector:
    app: my-app  # 必须与Deployment中Pod的标签匹配
  ports:
    - protocol: TCP
      port: 80      # Service对外暴露的端口
      targetPort: 80 # 容器暴露的端口(与containerPort一致)
  type: ClusterIP   # Service类型
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: my-app  # 选择器标签
  template:
    metadata:
      labels:
        app: my-app  # Pod标签(必须与selector.matchLabels匹配)
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80

验证绑定

bash
kubectl describe service my-app-service

部署nginx应用

yaml
# 创建命名空间
apiVersion: v1
kind: Namespace
metadata:
  name: demo
  labels:
    app: nginx
spec: {}
---
# 创建暴露信息
apiVersion: v1
kind: Service
metadata:
  labels:
    app: nginx
  name: nginx-service
  namespace: demo
spec:
  selector:
    app: nginx
  type: ClusterIP
  ports:
    - name: http
      port: 80
      protocol: TCP
      targetPort: 80
---
# 创建无状态应用
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  namespace: demo
  labels:
    app: nginx
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - image: nginx
        imagePullPolicy: Always
        name: nginx-container
        ports:
        - name: http
          containerPort: 80
          protocol: TCP
      resources:
          limits:
            cpu: "500m"
            memory: "512Mi"
          requests:
            cpu: "100m"
            memory: "128Mi"

创建一个pod声明环境变量

当创建pod的时候我们可以为pod声明一些环境变量,有利于我们对pod的管理和调用,设置环境变量,配置文件里面包含env或者envFrom两个字段。通过yaml文件创建的时候声明环境变量

yaml
# 创建命名空间
apiVersion: v1
kind: Namespace
metadata:
  name: mysql
  labels:
    app: mysql
---
# 创建pod
apiVersion: v1
kind: Pod
metadata:
  name: my-mysql
  namespace: mysql
  labels:
    app: mysql
spec:
  containers:
  - image: mysql:5.7
    name: mysql
    env:
    - name: MYSQL_ROOT_PASSWORD
      value: "123456"
    - name: MYSQL_DATABASE
      value: "yunjisuan"