简介

Kubernetes 跟 Docker 等很多项目最大的不同,就在于它不推荐你使用命令行的方式直接运行容器(虽然 kubectl run 支持),而是采用yaml/json 文件的方式。最直接的好处是,你会有一个文件能记录下 Kubernetes到底“run”了什么。使用文件的优点归纳起来

Convenience,比如kubectl create -f https://k8s.io/examples/application/deployment.yaml --record 命令行可这样玩不了

Maintenance, 比如使用git 管理

Flexibility,也就是说表达能力更强

简化 Kubernetes Yaml 文件创建由于Yaml文件格式比较复杂,即使是老司机有时也不免会犯错或需要查询文档,因此可以dry-run 一下,kubectl run myapp --image=nginx --dry-run -o yaml 会输出模拟运行 nginx 镜像的yaml 文件内容,copy-paste 即可。或者你可以kubectl get deployment my-nginx -o yaml 查看一个已有 kubernetes object 的配置,依葫芦画瓢。

了解kubernetes yaml 主要从两个维度:

yaml 文件的普遍特征

Kubernetes Object 的共同特征

yaml 的一些知识

YAML, which stands for Yet Another Markup Language,yaml 是一个标记语言

YAML is a superset of JSON, yaml 是json 的超集

there are only two types of structures you need to know about in YAML:

Lists

Maps

yaml Maps

apiVersion: v1

kind: Pod

metadata:

name: rss-site

labels:

app: web

Maps let you associate name-value pairs

只要“平行/级”,就是同一个层级的key-value。有了缩进,就表示一个map value。层级之间缩进空格数任意,哪怕一个空格也可以,但不要使用tab。 For example, name and labels are at the same indentation level, so the processor knows they’re both part of the same map; it knows that app is a value for labels because it’s indented further.

yaml list

args

- sleep

- "1000"

- message

- "Bring back Firefly!"

you can have virtually any number of items in a list, which is defined as items that start with a dash (-) indented from the parent.

Describing a Kubernetes Object

Kubernetes Object

Kubernetes Objects are persistent entities in the Kubernetes system. A Kubernetes object is a “record of intent”–once you create the object, the Kubernetes system will constantly work to ensure that object exists.

What containerized applications are running (and on which nodes)

The resources available to those applications

The policies around how those applications behave, such as restart policies, upgrades, and fault-tolerance

Every Kubernetes object includes two nested object fields that govern the object’s configuration: the object spec and the object status.

The spec, which you must provide, describes your desired state

The status describes the actual state of the object, and is supplied and updated by the Kubernetes system. pod 状态可以使用 kubectl get pod pod_name -o yaml 来查看,或者 kubectl describe pod pod_name 。

At any given time, the Kubernetes Control Plane actively manages an object’s actual state to match the desired state you supplied. 基于这种机制 不管是kubectl create -f 还是 kubectl replace -f 都可以是 kubectl apply -f,这或许也是kubernetes 声明式api 的一个体现吧。

yaml 配置共同点

apiVersion - Which version of the Kubernetes API you’re using to create this object

kind - What kind of object you want to create

metadata - Data that helps uniquely identify the object, including a name string, UID, and optional namespace

spec - The precise format of the object spec is different for every Kubernetes object, and contains nested fields specific to that object. 每一个 Kubernetes object 就得参见 Kubernetes API Reference了

metadata 与 spec 分别代表了 共性与个性,数据表设计也可以参照这个思路

metadata 中包含Label 和 Annotation,作用差不多,但有两个区别

k8s 支持根据 label 对object 进行检索, Annotation 不行

因为label 需要支持检索,所以label 只能是kv 结构,Annotation value 可以是复杂一点,比如json 字符串

PodPreset

开发人员习惯的写的,是最简单的pod

apiVersion: v1

kind: Pod

metadata:

name: website

labels:

app: website

role: frontend

spec:

containers:

- name:website

image: nginx

ports:

- containerPort:80

但对运维来说,在实际环境中还需添加大量的配置,此时,运维可以事先定义一个PodPreset.yaml,并创建一个PodPresetkubectl create -f preset.yaml。 之后开发创建的pod(有一个规则匹配) 都会自动加上 preset.yaml 指定的配置。

访问多个kubernetes 集群

一般情况,kubernetes 单独搭建在一个集群上,开发者通过开发机 或某一个跳板机上 通过kubectl 操作kubernetes,kubectl 会读取~/.kube/config 文件读取集群信息

kubernetes 一般会有多个集群:测试环境(运行公司测试环境的服务),开发环境(用来验证新功能)==> developer 需要在本机 上使用kubectl 访问多个k8s集群

~/.kube/config 是一个yaml 文件,可以配置多个集群的信息

apiVersion: v1

kind: Config

clusters:

users:

contexts:

可以看到 几个核心配置都是数组

apiVersion: v1

kind: Config

clusters:

- cluster:

name: development

- cluster:

name: scratch

users:

- name: developer

- name: experimenter

contexts:

- context:

cluster: development

user: developer

name: dev-frontend

name: dev-frontend

- context:

cluster: scratch

user: experimenter

name: exp-scratch

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐