自学k8s系列~03之YAML

YAML是什么

基本语法

  • 大小写敏感。

  • 使用缩进来表示层级关系。

  • 使用空格而不是 tab。

  • 缩进的空格数要对齐,相同层级要对齐。

  • # 表示注释。对比 JSON 无法写注释这一点,强太多。

数据类型

  • 对象
  • 数组
  • 纯量

对象

  • 键值对的集合,即 Map

对象的一组键值对表示。

1
key: value

数组

1
2
3
4
key:
- value1
- value2
- value3

每个 value 和横杠(-) 之间有一个空格。

纯量

  • 单个,不可以再分的值

纯量包含以下值:

  • 字符串
  • 布尔值
  • 数值
  • Null
  • 时间
  • 日期

字符串表示

  • 简单字符串示例
1
name: sjl #最简单的字符串示例
  • 特殊符号字符串
1
name: 'sjl sjl' #包含空格等特殊字符,需要放在引号中
  • 单引号和双引号
1
2
name: 'sjl \n sjl'
name: "sjl \n sjl"

单引号会对特殊字符 进行转义。上面示例中的 \n 会转义为 \\n 在展示的时候,还是字符串。双引号不会对特殊字符转义,上面示例中的 \n 不会转义,字符串的表示还是为 \n ,这样在某些编程语言中会视作换行符。

  • 单引号转义
1
name: 'sjl''s'

上面示例中的 ' 单引号是字符串的一部分,需要再添加一个单引号将其转义。与 Java 中的 \ 转义符含义类似。

布尔值

布尔值用 truefalse 来表示

1
2
enable: true
enable: false

数值

1
number: 111

null

null 使用 ~ 来表示。

1
person: ~

日期

日期采用 ISO 8601 表示法,一般为 yyyy-MM-dd 的格式

1
date: 2021-08-26

时间

日期和时间之间,使用 T 进行分隔

1
datetime: 2021-08-26T22:03:44

完整示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.17.9
ports:
- containerPort: 8088

k8s配置内容

k8s 配置 yaml 文件主要包含以下五块内容:

  • apiVersion: 当前配置格式的版本
  • kind: 要创建资源的类型, DeploymentPodServiceNamespaceReplicaSetDeanmonSetJobCronJob
  • metadata: 元数据, name 是必选项。
  • spec: 是对应 kind 类型的说明。
  • status: 是资源当前的状态,kubernetes 会尽最大努力使 spec 和 status 相匹配。

YAML 如何加载

1
kubectl apply -f yaml_file_path

部署 nginxYAML

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
labels:
app: nginx
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.19.7
ports:
- containerPort: 8088

执行 kubectl apply -f deployment.yaml 创建 Deployment

部署 YAML

  • 准备 YAML 文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
namespace: sjl
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.19.7
ports:
- containerPort: 80
  • 部署到 k8s
1
kubectl apply -f ./deployment.yaml
  • 用 curl 发起 http 请求

主要步骤:1. 查看部署的 pod 的 IP 地址

1
2
3
4
5
# 查看部署的 pod 的 IP 地址
kubectl get pods -n sjl -o wide
# 下面是输出结果
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-deployment-59f854fb7c-vlkhj 1/1 Running 0 12m 172.17.0.5 minikube <none> <none>

可以看到 IP 是 172.17.0.5,进入 minikube 的 ssh 中,然后使用 curl 发起 http 请求

1
2
3
4
5
# 进行 minikube 的 ssh 中
minikube ssh

# 使用 curl 发起请求
curl 172.17.0.5

在查看 pod 的 log 是否有记录

1
2
3
4
5
6
7
8
9
10
11
kubectl logs nginx-deployment-59f854fb7c-vlkhj -n sjl
# 下面是打印的日志
/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
/docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
10-listen-on-ipv6-by-default.sh: info: Getting the checksum of /etc/nginx/conf.d/default.conf
10-listen-on-ipv6-by-default.sh: info: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf
/docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
/docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh
/docker-entrypoint.sh: Configuration complete; ready for start up
172.17.0.1 - - [27/Aug/2021:16:16:39 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.68.0" "-"

可以在最后一行看到,发起了 http 请求。