定义:YAML(YAML Ain’t Markup Language)是一种用于配置文件的数据序列化格式,常用于Kubernetes(K8S)中的资源定义。
K8S中文文档:Kubernetes(k8s)中文文档 Kubernetes概述_Kubernetes中文社区
1. Pod
(1)Pod是Kubernetes中最小的部署单元,通常包含一个或多个容器。
(2)Pod
必须定义labels
标签,才能和Deployment
,Service
等资源进行关联。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端口