k8s三 | 使用YAML文件定义资源对象

这篇文章我们来学习使用 Kubernetes 的必备技能:编写配置文件

首先Kubernetes 跟 Docker 等项目的不同就在于它不推荐使用命令行的方式直接运行容器(虽然 Kubernetes 项目也支持这种方式,比如:kubectl run),而是希望你用 YAML 文件的方式,即:把容器的定义、参数、配置,统统记录在一个 YAML 文件中,然后用一句指令把它运行起来,这样做的好处是可以通过文件的方式记录 Kubernetes 做了什么操作和相关的配置。

一. YAML基础

YAML是专门用来写配置文件的语言,非常简洁和强大,远比JSON格式方便。
YAML语言(发音/jeme/)的设计目标,就是方便人类读写。

1. 它的基本语法规则如下:
  • 大小写敏感使用
  • 缩进表示层级关系
  • 缩进时不允许使用Tab键,只允许使用空格
  • 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可
  • #表示注释,从这个字符一直到行尾,都会被解析器忽略

在kubernetes中,需要了解两种结构类型

  • Maps:字典即key:value 键值对
  • Lists: 列表即数组
2. Maps

Maps是字典,也就是一个 key: value的键值对,Maps可以让我们更加方便的去书写配置信息,例如

---
apiVersion: v1
kind: Pod

---是分隔符,是可选的,在单一文件中可用连续三个---区分来多个文件或者资源对象。 上面分别定义两个key(键): kind和 apiVersion,对应的value(值)分别是:V1和Pod。

Maps嵌套

---
apiVersion: v1
kind: Pod
metadata:
   name: nginx
   lables:
    app: web

metadata这个Key对应的value值就是一个Maps,而且嵌套的Labels这个KEY的值又是一个Maps,我们可以根据自己的情况进行多层嵌套。

3. Lists

Lists列表,其实就是数组,在YAML文件中我们可以这样定义

args
  - Cat
  - Dog
  - Fish

可以有任何数量的项在列表中,每个项的定义以破折号(-)开头的与父元素直接可以缩进一个空格。Iist的子项也可以是Maps,Maps的子项也可以是List如下所示

---
apiVersion: v1
kind: Pod
metadata:
 name: nginx
 labels:
  app: web
spec:
 containers:
  - name: front-end
    image: nginx
    ports:
     - containerPort: 80
  - name: flaskapp-demo
    image: jcdemo/flaskapp
    ports:
      - containerPort: 5000

我们定义了一个叫containers的List对象,每个子项都由name,image,ports的组成,每个ports都有一个key为containerPort的map组成。

二. 使用Yaml创建Kubernetes资源对象

1. 使用Yaml创建创建Pod
---
apiVersion: v1
kind: Pod
metadata:
 name: kube100-site
 labels:
  app: web
spec:
 containers:
  - name: front-end
    image: nginx
    ports:
     - containerPort: 80
  - name: flaskapp-demo
    image: jcdemo/flaskapp
    ports:
        - containerPort: 5000

这是我们上面定义的一个普通的POD文件,我们先来简单分析下文件内容

  • apiversion:这里它的值是v1,这个版本号需要根据我们安装的 kubernetesk版本资源类型进行变化的,记住不是写死的。
  • kind:这里我们创建的是一个Pod,当然根据你的实际情况,这里资源类型可以是 Deployment、Job、 ngress、 Service等。
  • metadata:包含了我们定义的Pod的一些meta信息,比如名称namespace、标签等信息。
  • spec:包括一些 containers、 storage、volumes,或者其他 Kubernetes需要知道的参数,以及诸如是否在容器失败时重新启动容可以在特定 KubernetesAPI找到完整的 Kubernetes Podl的属性。

让我们来看一个典型的容器的定义

····
spec:
  containers:
    - name: front-end
      image: nginx
      ports:
        - containerPort: 80

这是一个简单的最小定义,名字为( front-end),基于 nginx的镜像,以及容器将会监听的一个端口(80)。在这些当中,只有名字是非常需要的,你也可以指定一个更加复杂的属性,例如在容器启动时运行的命令,应使用的参数工作目录,或每次实例化时是否拉取映像的新副本。以下为容器可选的设置属性:

  • name
  • image
  • command
  • args
  • workingDir
  • ports
  • env
  • resources
  • volumeMounts
  • livenessProbe
  • readinessProbe
  • livecycle
  • terminationMessage
  • imagePullPolicy
  • securityContext
  • stdin
  • stdinOnce
  • tty

我们将上面的内容保存为Pod.yaml 文件,来创建Pod资源对象

$ kubectl  create -f  pod.yaml
pod "kube 100-site"created

查看POD的状态

$  kubectl get pods
NAME          READY  STATUS  RESTARTS  AGE
kube-100-site  2/2        Running   0                1m

如果状态不是Running,可以使用前面的 kubectl describe进行排查。
我们先删除上面创建的POD:

$ kubectl delete  -f pod.yaml
pod "kube 100-site"deleted
2. 使用Yaml创建创建Deployment

在上面的例子中,我们只是单纯的POD实例,但是如果这个POD出现了故障的话,我们的服务也就挂了,所以 kubernetest提供了一个 Deployment的概念,可去管理POD的副本,也就是副本集,这样就可以保证一定数量的副本是可用的,不会以为一个pod挂掉导致整个服务挂掉。我们可以这样定义一个Deployment

---
apiVersion : extensions/v1beta1
kind : Deployment
metadata
  name : kube100-site
spec:
  replicas : 2

注意:
这里的 apiVersion对应的值是 extensions/1beta1,当然kind要指定为Deployment,然后我们可以指定一些meta信息,比如名字,或者标签之类的。最后最重要的是spec配置选项,这里我们定义需要两个副本,当然还有很多可以设置的属性,比如一个Pod在没有任何错误变成准备的情况下必须达到的最小秒数。

现在我们来定义一个完整的 Deployment的YAML文件

---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
 name: kube100-site
spec:
 replicas: 2
 template:
  metadata:
   labels:
    app: web
  spec:
   containers:
    - name: front-end
      image: nginx
      ports:
       - containerPort: 80
    - name: flaskapp-demo
      image: jcdemo/flaskapp
      ports:
       - containerPort: 5000

注意其中的 Template,其实就是POD对象的定义。
将上面的YAML文件保存为 deployment.yaml,然后创建Deployment

 $ kubectl  create   -f  deployment.yaml

同样的,想要查看它的状态,我们可以检查 Deployment的列表

$ kubectl get deployments
NAME           DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
kube100-site   2         2         2            2           3d

我们可以看到所有的Pods都已经正常运行。

总结:到这里我们就完成了使用YAML文件创建 Kubernetes Deployment的过程,在创建其他的资源对象时也是如此,在了解了YAML文件的基础后,定义YAML文件其实已经很简单了,最主要的是要根据实际情况去定义YAML文件,所以查阅 Kubernetes文档很重要可以使用http://www.yamllint.com/去检验YAML文件的合法性。


上篇文章:k8s二 | 使用kubeadm部署K8S
系列文章:深入理解Kuerneters
参考资料:从Docker到Kubernetes进阶-阳明

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,142评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,298评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,068评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,081评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,099评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,071评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,990评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,832评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,274评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,488评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,649评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,378评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,979评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,625评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,643评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,545评论 2 352

推荐阅读更多精彩内容