HOME / ARTICLE

Kubernetes 基础知识

  • 2017-08-18 00:03:11

YAML 基础

 

YAML 是一个可读性高,用来表达数据序列的格式。它使用空白符号缩进和大量依赖外观的特色,特别适合用来表达或编辑数据结构、各种配置文件,其让人最容易上手的特色是巧妙避开各种封闭符号,如:引号、各种括号等,这些符号在嵌套结构时会变得复杂而难以辨认。

JSON 是 YAML 的子集,因此大部分的 JSON 文件都是有效的 YAML 文件。在书写 YAML 文件时可以加入选择性的空行,以增加可读性。在一个文件中,可同时包含多个文件,并用 `---` 分隔。选择性的符号 `...` 可以用来表示文件结尾(在利用流的通信中,这非常有用,可以在不关闭流的情况下,发送结束信号)。

 

YAML 中常用的基本类型只有两种:Lists 和 Maps。

 

### YAML Lists

 

Lists 习惯上比较常用区块格式(block format)表示,也就是用短杠+空白字符作为起始。

args
  - sleep
  - "1000"
  - message
  - "hello, world"


与之等价的 JSON 格式为:

{
	"args": ["sleep", "1000", "message", "hello, world"]
}

 

YAML Maps

 

键值和数据由冒号及空白字符分开。区块形式(常使用与YAML数据文档中)使用缩进和换行符分隔key: value对。比如:

---
apiVersion: v1
kind: Pod

 

与之等价的 JSON 格式为

 

```

{

"apiVersion": "v1",

"kind": "Pod"

}

```

嵌套使用基本类型可以表达更加复杂的数据结构:

 

```

---

apiVersion: v1

kind: Pod

metadata:

  name: nginx-deployment

  label: 

foo: bar

```

 

与之等价的 JSON 格式为

 

```

{

"apiVersion": "v1",

"kind": "Pod",

"metadata": {

"name": "nginx-deployment",

"label": {

"foo": "bar"

}

}

}

```

 

### 层次化结构

 

在 Lists 中嵌套 Maps

```

containers

- name: front-end

  image: nginx

- name: back-end

  image: python

```

与之等价的 JSON 格式为

```

{

"containers": [

{

"name": "front-end",

"image": "nginx"

}, {

"name": "back-end",

"image": "python"

}

]

}

```

 

在 Maps 中嵌套 Lists:

```

restartPolicy: Always

containers

- name: front-end

  image: nginx

- name: back-end

  image: python

```

与之等价的 JSON 格式为

```

{

"restartPolicy": "Always",

"containers": [

{

"name": "front-end",

"image": "nginx"

}, {

"name": "back-end",

"image": "python"

}

]

}

```

 

## 创建一个 Deployment

一个 Deployment 代表集群中的一个运行中的应用。下面这个例子表示运行一个 Nginx 应用并在集群总启动 3 个实例。

```

apiVersion: apps/v1beta1 # for versions before 1.6.0 use extensions/v1beta1

kind: Deployment

metadata:

  name: nginx-deployment

spec:

  replicas: 3

  template:

    metadata:

      labels:

        app: nginx

    spec:

      containers:

      - name: nginx

        image: nginx:1.7.9

        ports:

        - containerPort: 80

```

 

其中有三个必填字段,分别是:

 

- `apiVersion` 所使用的 Kubernetes API 版本

- `kind` 要创建的对象类型

- `metadata` 该对象的唯一识别符。包括一个 String 类型的 `name`, UID, 和可选的 `namespace`

 

除此之外,每个 Kubernetes 对象都有一个 `spec` 字段来描述对这个对象运行时的预期状态,有一个 `status` 字段描述这个对象当前的真正状态。`spec` 字段需要用户指定,`status` 则由系统指定。

 

 

## Kubernetes Pod

 

Pod 是 Kubernetes 可操纵的最基本单位。一个 Pod 代表集群中的一个进程。Pod 的模板在上面创建 Deployment 的例子中已有体现,即 `template` 字段。

```

apiVersion: apps/v1beta1 # for versions before 1.6.0 use extensions/v1beta1

kind: Pod

metadata:

  labels:

  app: nginx

spec:

  containers:

  - name: nginx

    image: nginx:1.7.9

    ports:

    - containerPort: 80

```

作为另一种 Kubernetes 对象,Pod 和 Deployment 有相似的模板结构,`apiVersion`, `kind`, `metadata`, `spec`。

 

## Kubernetes Service

 

Service 是对 Pod 控制策略的抽象。

 

```

apiVersion: v1

kind: Service

metadata:

  name: my-service

spec:

  selector:

    app: nginx

  ports:

    - protocol: TCP

      port: 80

      targetPort: 9376

```

 

## 参考文献

 

- https://www.mirantis.com/blog/introduction-to-yaml-creating-a-kubernetes-deployment/

- https://zh.wikipedia.org/wiki/YAML

- https://kubernetes.io/docs/concepts/workloads/controllers/deployment/

- https://kubernetes.io/docs/concepts/services-networking/service/