kubernetes开发运维系列_基础篇-YAML 文件

我们在安装 kubernetes 集群的时候使用了一些 YAML 文件来创建相关的资源,
所以我们先来简单看一看 YAML 文件是如何工作的,并使
YAML 文件来定义一个 kubernetes pod,然后再来定义一个 kubernetes deployment
 

YAML 基础

它的基本语法规则如下:
  1. 大小写敏感
  2. 使用缩进表示层级关系
  3. 缩进时不允许使用Tab键,只允许使用空格。
  4. 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可
  5. # 表示注释,从这个字符一直到行尾,都会被解析器忽略。
在我们的 kubernetes 中,你只需要两种结构类型就行了:
  1. Lists
  2. Maps
也就是说,你可能会遇到 Lists Maps Maps Lists ,等等。不过不用担心,你只要掌握
了这两种结构也就可以了,其他更加复杂的我们暂不讨论。
 
 

Maps

首先我们来看看 Maps ,我们都知道 Map 是字典,就是一个 key:value 的键值对, Maps 可以让
我们更加方便的去书写配置信息,例如:
 
第一行的 --- 是分隔符,是可选的,在单一文件中,可用连续三个连字号 --- 区分多个文件。这
里我们可以看到,我们有两个键: kind apiVersion ,他们对应的值分别是: v1 Pod
上面的 YAML 文件转换成 JSON 格式的话,你肯定就容易明白了:
 

{"apiVersion": "v1", "kind": "pod" }

我们在创建一个相对复杂一点的 YAML 文件,创建一个 KEY 对应的值不是字符串而是一个 Maps

上面的 YAML 文件, metadata 这个 KEY 对应的值就是一个 Maps 了,而且嵌套的 labels 这个
KEY 的值又是一个 Map ,你可以根据你自己的情况进行多层嵌套。
上面我们也提到了 YAML 文件的语法规则, YAML 处理器是根据行缩进来知道内容之间的关联性
的。比如我们上面的 YAML 文件,我用了两个空格作为缩进,空格的数量并不重要,但是你得保持一
致,并且至少要求一个空格(什么意思?就是你别一会缩进两个空格,一会缩进 4 个空格)。
我们可以看到 name labels 是相同级别的缩进,所以 YAML 处理器就知道了他们属于同一个
MAP ,而 app labels 的值是因为 app 的缩进更大。
注意:在 YAML 文件中绝对不要使用 tab 键。
 
 
同样的,我们可以将上面的 YAML 文件转换成 JSON 文件:
 
 
1. {
2. "apiVersion" : "v1" ,
3. "kind" : "Pod" ,
4. "metadata" : {
5.            "name" : "kube100-site" ,
6.            "labels" : {
7.                    "app" : "web"
8.             }
9.        }
10. }
或许你对上面的 JSON 文件更熟悉,但是你不得不承认 YAML 文件的语义化程度更高吧?
 

Lists

Lists 就是列表,说白了就是数组,在 YAML 文件中我们可以这样定义:

 
你可以有任何数量的项在列表中,每个项的定义以破折号( - )开头的,与父元素直接可以缩进一个空
格。
 
当然, list 的子项也可以是 Maps Maps 的子项也可以是 list 如下所示:
 
 
 
比如这个 YAML 文件,我们定义了一个叫 containers List 对象,每个子项都由 name
image ports 组成,每个 ports 都有一个 key containerPort Map 组成,
 

使用 YAML 创建 Pod

现在我们已经对 YAML 文件有了大概的了解了,我相信你应该没有之前那么懵逼了吧?我们还是来使
YAML 文件来创建一个 Deployment
 
 
API 说明: https://kubernetes.io/docs/reference/generated/kubernetes-
api/v1.10/
 
创建 Pod
 
 
---
apiVersion: v1
kind: Pod
metadata:                           #元数据信息
  name: first-pod                    #kubectl get  pods 和 登陆容器显示的名字
  labels:                           #标签,可以作为查询条件 kubectl get pods -l
    app: tomcat
    node: devops-103
spec:
  containers:                         #容器
    - name: tomcat                    #容器名称
      image: docker.io/tomcat         #使用的镜像
      ports:
        - containerPort: 8080
    - name: nginx                    #容器名称
      image: docker.io/nginx        #使用的镜像
      ports:
        - containerPort: 80
  # 设置env,登陆到容器中查看环境变量, DEME_GREETING 的值是 "hello from the enviroment"
  env:              
    - name:GREETING
      value: "hello from the environment"                #规格
这是我们上面定义的一个普通的 POD 文件,我们先来简单分析下文件内容:
 
apiVersion ,这里它的值是 v1 ,这个版本号需要根据我们安装的 kubernetes 版本和资源
类型进行变化的,记住不是写死的
 
kind ,这里我们创建的是一个 Pod ,当然根据你的实际情况,这里资源类型可以是
Deployment Job Ingress Service 等待。
 
metadata :包含了我们定义的 Pod 的一些 meta 信息,比如名称、 namespace 、标签等等信
息。
 
spec :包括一些 containers storage volumes ,或者其他 Kubernetes 需要知道的参
数,以及诸如是否在容器失败时重新启动容器的属性。你可以在特定 Kubernetes API 找到完
整的 Kubernetes Pod 的属性。
让我们来看一个典型的容器的定义:
 
 
在这个例子中,这是一个简单的最小定义:一个名字( front-end ),基于 nginx 的镜像,以及容
器 将会监听的一个端口( 80 )。在这些当中,只有名字是必需要的,你也可以指定一个更加复杂的
属性,例如在容器启动时运行的命令,应使用的参数,工作目录,或每次实例化时是否拉取映像的新副
本。以下是一些容器可选的设置属性:
 
name
image
command
args
workingDir
ports
env
resources
volumeMounts
livenessProbe
readinessProbe
livecycle
terminationMessagePath
imagePullPolicy
securityContext
stdin
stdinOnce
tty
明白了 POD 的定义后,我们将上面创建 POD YAML 文件保存成 first-pod .yaml,然后使
kubectl 创建 POD
 
1. $ kubectl create - f pod . yaml
2. pod "kube100-site" created
 
然后我们就可以使用我们前面熟悉的 kubectl 命令来查看 POD 的状态了:
 
 
 
到这里我们的 POD 就创建成功了,如果你在创建过程中有任何问题,我们同样可以使用
kubectl describe 进行排查。我们先删除上面创建的 POD
 
1. $ kubectl delete - f first-pod . yaml
2. pod "first-pod“  deleted
 
 

创建 Deployment

现在我们可以来创建一个真正的 Deployment 。在上面的例子中,我们只是单纯的创建了一个 POD
实例,但是如果这个 POD 出现了故障的话,我们的服务也就挂掉了,所以 kubernetes 提供了一
Deployment 的概念,可以让 kubernetes 去管理一组 POD 的副本,也就是副本集,这样就可
以保证一定数量的副本一直可用的,不会因为一个 POD 挂掉导致整个服务挂掉。我们可以这样定义一
Deployment
 
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment        #//部署名称
  labels:
    app: nginx
spec:
  replicas: 3                   #//副本数量
  selector:                     #//Pod选择规则
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:                   #//Pods标签
        app: nginx
    spec:
      containers:
        - name: nginx
          image: docker.io/nginx:1.7.9
          ports:
            - containerPort: 80
      terminationGracePeriodSeconds: 30

注意这里的 apiVersion 对应的值是 app/v1 ,当然 kind 要指定为

Deployment ,因为这就是我们需要的,然后我们可以指定一些 meta 信息,比如名字,或者标签之
类的。最后,最重要的是 spec 配置选项,这里我们定义需要3个副本,当然还有很多可以设置的属
性,比如一个 Pod 在没有任何错误变成准备的情况下必须达到的最小秒数。
我们可以在 Kubernetes v1beta1 API 参考中找到一个完整的 Depolyment 可指定的参数列表。
 
 
看起来是不是和我们上面的 pod.yaml 很类似啊,注意其中的 template ,其实就是对 POD 对象的
定义。将上面的 YAML 文件保存为 deployment.yaml ,然后创建 Deployment
 
 
$ kubectl create - f deployment . yaml
 
deployment "nginx-deployment " created
 
 
 
同样的,想要查看它的状态,我们可以检查 Deployment 的列表:
 
 
我们可以看到所有的 Pods 都已经正常运行了。
到这里我们就完成了使用 YAML 文件创建 Kubernetes Deployment 的过程,在了解了 YAML
件的基础后,定义 YAML 文件其实已经很简单了,最主要的是要根据实际情况去定义 YAML 文件,所
以查阅 Kubernetes 文档很重要。
 
可以使用 http://www.yamllint.com/ 去检验 YAML 文件的合法性。
 
 
 
 
 
 
 
 
 
 
 

猜你喜欢

转载自blog.csdn.net/Coder_Boy_/article/details/112706997