定义:YAML(YAML Ain’t Markup Language)是一种用于配置文件的数据序列化格式,常用于Kubernetes(K8S)中的资源定义。

K8S中文文档:Kubernetes(k8s)中文文档 Kubernetes概述_Kubernetes中文社区

1. Pod

(1)Pod是Kubernetes中最小的部署单元,通常包含一个或多个容器。
(2)Pod必须定义labels标签,才能和DeploymentService等资源进行关联。labels是Kubernetes中用于标识和选择资源的关键机制,每个对象可以有多个标签,但是key值必须唯一。

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
  labels:
    app: my-app
spec:
  containers:
  - name: my-container
    image: nginx
    ports:
    - containerPort: 80

2. Service

Service用于定义一组Pod的访问方式,通常用于暴露Pod的网络服务。想要被外部访问就需要设定Service。

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  selector:
    app: my-app
  ports:
  - protocol: TCP
    port: 80
    targetPort: 8080

3. Deployment

Deployment用于定义Pod的部署策略,支持滚动更新、回滚等操作。通常情况下,我们不会直接编写Pod,而是通过定义Deployment来生成Pod,便于我们管理。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
      - name: my-container
        image: nginx
        ports:
        - containerPort: 80

4. ConfigMap

(1)ConfigMap用于存储配置数据,可以在Pod中作为环境变量或配置文件使用。
(2)ConfigMap必须在Pod引用它之前创建
(3)Pod只能使用同一个命名空间内的ConfigMap

apiVersion: v1
kind: ConfigMap
metadata:
  name: my-config
data:
  config.properties: |
    key1=value1
    key2=value2

5. Secret

Secret用于存储敏感信息,如密码、密钥等。此处只是将明文变为了base64编码而已,所以安全性有限。

apiVersion: v1
kind: Secret
metadata:
  name: my-secret
type: Opaque
data:
  username: dXNlcm5hbWU=  # base64编码的字符串
  password: cGFzc3dvcmQ=  # base64编码的字符串

6. PersistentVolume (PV) 和 PersistentVolumeClaim (PVC)

PV(供给):相当于在磁盘中定义一个存储资源,此存储资源可以被K8S自动分配给相匹配的PVC,也可以自定义给哪一个PVC(通过storageClassName命名一致,可以将PV和PVC对应起来)。

apiVersion: v1
kind: PersistentVolume
metadata:
  name: my-pv
spec:
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteOnce
  storageClassName: slow
  hostPath:
    path: /mnt/data

PVC(需求):相当于用户定义需要的存储资源,访问模式等内容,可以通过storageClassName来和对应PV相匹配。

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: my-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi
  storageClassName: slow

备注:如果集群可以动态匹配资源,那就只编辑PVC就可以了。

7. Namespace

(1)Namespace用于将Kubernetes资源划分为不同的逻辑组。
(2)删除一个namespace会自动删除所有属于该namespace的资源(PV不一定会被回收,例如PV的  persistentVolumeReclaimPolicy: Retain 时,PV在被释放后不会自动回收或删除。persistentVolumeReclaimPolicy: Delete 时,PV在被释放后会删除)

apiVersion: v1
kind: Namespace
metadata:
  name: my-namespace

8. Ingress

Ingress用于管理外部访问Kubernetes服务的HTTP和HTTPS路由。

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  - host: my-app.example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: my-service
            port:
              number: 80

9. HorizontalPodAutoscaler (HPA)

HPA用于根据资源使用情况自动扩展Pod的数量。

apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
  name: my-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: my-deployment
  minReplicas: 1
  maxReplicas: 10
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 50

10. Job

Job用于运行一次性任务,任务完成后Pod会自动终止。

apiVersion: batch/v1
kind: Job
metadata:
  name: my-job
spec:
  template:
    spec:
      containers:
      - name: my-container
        image: busybox
        command: ["echo", "Hello, Kubernetes!"]
      restartPolicy: Never

11. CronJob

CronJob用于定期运行任务,类似于Linux的cron作业。

apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: my-cronjob
spec:
  schedule: "*/5 * * * *"
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: my-container
            image: busybox
            command: ["echo", "Hello, Kubernetes!"]
          restartPolicy: OnFailure

这些YAML配置文件定义了Kubernetes中各种资源的期望状态。通过kubectl apply -f <filename>.yaml命令可以将这些配置应用到Kubernetes集群中。

——MySQL案例——

1. Namespace(可选)

如果你希望将MySQL应用部署到一个特定的命名空间中,可以先创建一个Namespace。

apiVersion: v1
kind: Namespace
metadata:
  name: mysql-9

2. Yaml文件

apiVersion: v1
kind: Secret
metadata:
  name: mysql-pass
  namespace: mysql-9
type: Opaque
data:
  root_password: azgzbXlzcWw5

---

apiVersion: v1
kind: PersistentVolume
metadata:
  # PV是直接挂载到磁盘上的,没有命名空间一说,所以不设定namespace
  name: mysql-pv-volume
spec:
  capacity:
    storage: 20Gi
  volumeMode: Filesystem
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  storageClassName: slow
  hostPath:
    path: /var/lib/mysql

---

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mysql-pv-claim
  namespace: mysql-9
spec:
  resources:
    requests:
      storage: 20Gi
  storageClassName: slow
  volumeMode: Filesystem
  accessModes:
    - ReadWriteOnce

---

apiVersion: apps/v1
kind: Deployment
metadata:
  name: mysql-deployment
  namespace: mysql-9
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mysql
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
      - name: mysql
        image: mysql:9
        env:
        - name: MYSQL_ROOT_PASSWORD
          valueFrom:
            secretKeyRef:
              name: mysql-pass
              key: root_password
        # 设置的是允许root账户远端登录
        - name: MYSQL_ROOT_HOST
          value: "%"
        ports:
        - containerPort: 3306
        volumeMounts:
        # 定义挂载卷的文件名称以及文件所处的路径(此路径要与PV设置的保持一致)
        - name: mysql-persistent-storage
          mountPath: /var/lib/mysql
        # 定义Pod所占用的CPU和内存资源的上限值和下限值
        resources:
          # 定义了容器可以使用的最大资源量
          limits:
            cpu: "2" # 1 -> 1核 -> 1000M
            memory: "4Gi"
          # 定义了容器运行所必须的最低资源需求
          requests:
            cpu: "1"
            memory: "4Gi"
      volumes:
      # 定义挂载卷(引用PVC)
      - name: mysql-persistent-storage
        persistentVolumeClaim:
          claimName: mysql-pv-claim

---

apiVersion: v1
kind: Service
metadata:
  name: mysql-service
  namespace: mysql-9
spec:
  type: NodePort
  ports:
  - port: 3306
    targetPort: 3306
    nodePort: 30000
  selector:
    app: mysql

备注:需要确保集群的Master节点的防火墙有开启对应的端口;访问时使用的是Master的IP+Service设置的nodePort端口

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注