K8s 基本使用(二)

YAML字段的含义和作用

每个 Kubernetes YAML 文件都必须包含这四个顶级字段:

1
2
3
4
5
6
7
8
apiVersion: v1        # Kubernetes API 版本
kind: Pod # 资源类型
metadata: # 元数据
name: nginx-pod # 资源名称
spec: # 资源规格说明
containers: # 容器配置
- name: nginx # 容器名称
image: nginx:1.14.2 # 容器镜像

使用 --- 分隔符可以在一个文件中定义多个资源:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 3
# ... 部署配置

---
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
# ... 服务配置

一些常见的配置如下:

Deployment

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
# Deployment配置
apiVersion: apps/v1 # API版本
kind: Deployment # 资源类型
metadata: # 元数据
name: my-app # Deployment名称
namespace: default # 命名空间
labels: # 标签
app: my-app # 用于标识应用
environment: production # 环境标识
annotations: # 注释,用于存储非标识性信息
description: "示例应用部署"
spec: # 规格说明
replicas: 3 # Pod副本数量
selector: # 选择器,用于选择要管理的Pod
matchLabels: # 匹配标签
app: my-app # 必须与Pod模板中的标签一致
strategy: # 部署策略
type: RollingUpdate # 滚动更新策略
rollingUpdate: # 滚动更新配置
maxSurge: 1 # 最大额外可以存在的副本数
maxUnavailable: 1 # 最大不可用的副本数
minReadySeconds: 5 # Pod就绪后最小等待时间
revisionHistoryLimit: 10 # 保留的历史版本数量
template: # Pod模板
metadata: # Pod元数据
labels: # Pod标签
app: my-app
spec: # Pod规格说明
serviceAccountName: my-service-account # 服务账号名称
terminationGracePeriodSeconds: 30 # Pod终止宽限期
containers: # 容器配置
- name: main-container # 容器名称
image: nginx:1.14.2 # 容器镜像
imagePullPolicy: IfNotPresent # 镜像拉取策略
ports: # 端口配置
- name: http # 端口名称
containerPort: 80 # 容器端口
protocol: TCP # 协议
env: # 环境变量
- name: DB_HOST # 环境变量名称
value: "mysql" # 环境变量值
- name: API_KEY # 从Secret获取的环境变量
valueFrom:
secretKeyRef:
name: api-secret # Secret名称
key: api-key # Secret中的键名
resources: # 资源限制和请求
requests: # 资源请求
cpu: "100m" # CPU请求
memory: "128Mi" # 内存请求
limits: # 资源限制
cpu: "200m" # CPU限制
memory: "256Mi" # 内存限制
livenessProbe: # 存活检查
httpGet: # HTTP GET检查
path: /healthz # 检查路径
port: http # 检查端口
initialDelaySeconds: 15 # 初始延迟
periodSeconds: 10 # 检查间隔
readinessProbe: # 就绪检查
httpGet: # HTTP GET检查
path: /ready # 检查路径
port: http # 检查端口
initialDelaySeconds: 5 # 初始延迟
periodSeconds: 10 # 检查间隔
volumeMounts: # 卷挂载配置
- name: config-volume # 配置卷
mountPath: /etc/config # 挂载路径
- name: data-volume # 数据卷
mountPath: /data # 挂载路径
volumes: # 卷定义
- name: config-volume # 配置卷名称
configMap: # ConfigMap卷
name: app-config # ConfigMap名称
- name: data-volume # 数据卷名称
persistentVolumeClaim: # PVC卷
claimName: data-pvc # PVC名称
affinity: # 亲和性配置
nodeAffinity: # 节点亲和性
requiredDuringSchedulingIgnoredDuringExecution: # 硬性调度要求
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/os # 节点标签键
operator: In # 操作符
values: # 匹配值
- linux
podAntiAffinity: # Pod反亲和性
preferredDuringSchedulingIgnoredDuringExecution: # 软性调度偏好
- weight: 100 # 权重
podAffinityTerm:
labelSelector:
matchExpressions:
- key: app
operator: In
values:
- my-app
topologyKey: kubernetes.io/hostname # 拓扑域
tolerations: # 容忍配置
- key: "node-role.kubernetes.io/master" # 容忍键
operator: "Exists" # 操作符
effect: "NoSchedule" # 效果

Service

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# Service配置
apiVersion: v1 # API版本
kind: Service # 资源类型
metadata: # 元数据
name: my-service # 服务名称
namespace: default # 命名空间
labels: # 标签
app: my-app # 应用标签
spec: # 规格说明
type: ClusterIP # 服务类型(集群内部访问)
ports: # 端口配置
- port: 80 # 服务端口
targetPort: http # 目标端口(容器端口)
protocol: TCP # 协议
name: http # 端口名称
selector: # 选择器
app: my-app # 选择具有此标签的Pod

ConfigMap

1
2
3
4
5
6
7
8
9
10
11
12
13
# ConfigMap配置
apiVersion: v1 # API版本
kind: ConfigMap # 资源类型
metadata: # 元数据
name: app-config # ConfigMap名称
namespace: default # 命名空间
data: # 配置数据
config.yml: | # 配置文件内容
environment: production
log_level: info
features:
feature1: true
feature2: false

Secret

1
2
3
4
5
6
7
8
apiVersion: v1  # API版本
kind: Secret # 资源类型
metadata: # 元数据
name: api-secret # Secret名称
namespace: default # 命名空间
type: Opaque # Secret类型(通用)
data: # 加密数据
api-key: BASE64_ENCODED_API_KEY # Base64编码的密钥

PersistentVolumeClaim(PVC)

1
2
3
4
5
6
7
8
9
10
11
12
13
# PersistentVolumeClaim配置
apiVersion: v1 # API版本
kind: PersistentVolumeClaim # 资源类型
metadata: # 元数据
name: data-pvc # PVC名称
namespace: default # 命名空间
spec: # 规格说明
accessModes: # 访问模式
- ReadWriteOnce # 单节点读写
resources: # 资源请求
requests: # 存储请求
storage: 1Gi # 存储大小
storageClassName: standard # 存储类名称

HorizontalPodAutoscaler(HPA)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# HorizontalPodAutoscaler配置
apiVersion: autoscaling/v2 # API版本
kind: HorizontalPodAutoscaler # 资源类型
metadata: # 元数据
name: my-app-hpa # HPA名称
namespace: default # 命名空间
spec: # 规格说明
scaleTargetRef: # 扩缩容目标
apiVersion: apps/v1 # 目标API版本
kind: Deployment # 目标类型
name: my-app # 目标名称
minReplicas: 1 # 最小副本数
maxReplicas: 10 # 最大副本数
metrics: # 度量指标
- type: Resource # 资源类型指标
resource: # 资源指标
name: cpu # CPU指标
target: # 目标值
type: Utilization # 使用率类型
averageUtilization: 80 # 平均使用率阈值

Ingress

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# Ingress配置
apiVersion: networking.k8s.io/v1 # API版本
kind: Ingress # 资源类型
metadata: # 元数据
name: my-ingress # Ingress名称
namespace: default # 命名空间
annotations: # 注释
nginx.ingress.kubernetes.io/rewrite-target: / # 路径重写
spec: # 规格说明
ingressClassName: nginx # Ingress类
rules: # 路由规则
- host: myapp.example.com # 主机名
http: # HTTP配置
paths: # 路径配置
- path: / # 路径
pathType: Prefix # 路径类型
backend: # 后端服务
service: # 服务配置
name: my-service # 服务名称
port: # 端口配置
name: http # 端口名称

NetworkPolicy

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# NetworkPolicy配置
apiVersion: networking.k8s.io/v1 # API版本
kind: NetworkPolicy # 资源类型
metadata: # 元数据
name: my-network-policy # 策略名称
namespace: default # 命名空间
spec: # 规格说明
podSelector: # Pod选择器
matchLabels: # 匹配标签
app: my-app # 应用标签
policyTypes: # 策略类型
- Ingress # 入站规则
- Egress # 出站规则
ingress: # 入站配置
- from: # 来源规则
- podSelector: # Pod选择器
matchLabels: # 匹配标签
app: allowed-app # 允许的应用
ports: # 端口规则
- protocol: TCP # 协议
port: 80 # 端口
egress: # 出站配置
- to: # 目标规则
- podSelector: # Pod选择器
matchLabels: # 匹配标签
app: allowed-destination # 允许的目标
ports: # 端口规则
- protocol: TCP # 协议
port: 5432 # 端口

ResourceQuota

1
2
3
4
5
6
7
8
9
10
11
12
13
# ResourceQuota配置
apiVersion: v1 # API版本
kind: ResourceQuota # 资源类型
metadata: # 元数据
name: my-quota # 配额名称
namespace: default # 命名空间
spec: # 规格说明
hard: # 硬限制
requests.cpu: "4" # CPU请求配额
requests.memory: 4Gi # 内存请求配额
limits.cpu: "8" # CPU限制配额
limits.memory: 8Gi # 内存限制配额
pods: "10" # Pod数量配额

LimitRange

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# LimitRange配置
apiVersion: v1 # API版本
kind: LimitRange # 资源类型
metadata: # 元数据
name: my-limit-range # 限制范围名称
namespace: default # 命名空间
spec: # 规格说明
limits: # 限制配置
- type: Container # 限制类型
default: # 默认限制
cpu: 200m # 默认CPU限制
memory: 256Mi # 默认内存限制
defaultRequest: # 默认请求
cpu: 100m # 默认CPU请求
memory: 128Mi # 默认内存请求
max: # 最大限制
cpu: 1 # 最大CPU限制
memory: 1Gi # 最大内存限制
min: # 最小限制
cpu: 50m # 最小CPU限制
memory: 64Mi # 最小内存限制