暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

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

运维技术社 2020-01-02
358

这篇文章我们来学习使用 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可以让我们更加方便的去书写配置信息,例如

  1. ---

  2. apiVersion: v1

  3. kind: Pod

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

Maps嵌套

  1. ---

  2. apiVersion: v1

  3. kind: Pod

  4. metadata:

  5. name: nginx

  6. lables:

  7. app: web

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

3. Lists

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

  1. args

  2. - Cat

  3. - Dog

  4. - Fish

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

  1. ---

  2. apiVersion: v1

  3. kind: Pod

  4. metadata:

  5. name: nginx

  6. labels:

  7. app: web

  8. spec:

  9. containers:

  10. - name: front-end

  11. image: nginx

  12. ports:

  13. - containerPort: 80

  14. - name: flaskapp-demo

  15. image: jcdemo/flaskapp

  16. ports:

  17. - containerPort: 5000

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

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

1. 使用Yaml创建创建Pod
  1. ---

  2. apiVersion: v1

  3. kind: Pod

  4. metadata:

  5. name: kube100-site

  6. labels:

  7. app: web

  8. spec:

  9. containers:

  10. - name: front-end

  11. image: nginx

  12. ports:

  13. - containerPort: 80

  14. - name: flaskapp-demo

  15. image: jcdemo/flaskapp

  16. ports:

  17. - containerPort: 5000

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

  • apiversion:这里它的值是v1,这个版本号需要根据我们安装的 kubernetesk版本资源类型进行变化的,记住不是写死的。

  • kind:这里我们创建的是一个Pod,当然根据你的实际情况,这里资源类型可以是 Deployment、Job、 ngress、 Service等。

  • metadata:包含了我们定义的Pod的一些meta信息,比如名称namespace、标签等信息。

  • spec:包括一些 containers、 storage、volumes,或者其他 Kubernetes需要知道的参数,以及诸如是否在容器失败时重新启动容可以在特定 KubernetesAPI找到完整的 Kubernetes Podl的属性。

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

  1. ····

  2. spec

  3. containers:

  4. - name: front-end

  5. image: nginx

  6. ports:

  7. - 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资源对象

  1. $ kubectl create -f pod.yaml

  2. pod "kube 100-site"created

查看POD的状态

  1. $ kubectl get pods

  2. NAME READY STATUS RESTARTS AGE

  3. kube-100-site 2/2 Running 0 1m

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

  1. $ kubectl delete -f pod.yaml

  2. pod "kube 100-site"deleted

2. 使用Yaml创建创建Deployment

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

  1. ---

  2. apiVersion : extensions/v1beta1

  3. kind : Deployment

  4. metadata

  5. name : kube100-site

  6. spec:

  7. replicas : 2

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

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

  1. ---

  2. apiVersion: extensions/v1beta1

  3. kind: Deployment

  4. metadata:

  5. name: kube100-site

  6. spec:

  7. replicas: 2

  8. template:

  9. metadata:

  10. labels:

  11. app: web

  12. spec:

  13. containers:

  14. - name: front-end

  15. image: nginx

  16. ports:

  17. - containerPort: 80

  18. - name: flaskapp-demo

  19. image: jcdemo/flaskapp

  20. ports:

  21. - containerPort: 5000

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

  1. $ kubectl create -f deployment.yaml

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

  1. $ kubectl get deployments

  2. NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE

  3. kube100-site 2 2 2 2 3d

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

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

敬请关注

参考资料

深入理解Pod-Yaml文件——阳明


文章转载自运维技术社,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论