• YAML配置文件


     kubernetes 集群需要使用了一些 YAML 文件来创建相关的资源,先来简单看一看 YAML 文件是如何工作的,并使用 YAML 文件来定义一个 kubernetes pod,然后再来定义一个 kubernetes deployment;

    YAML 基础

    基本语法规则:

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

    在 kubernetes 中,只需要两种结构类型就行了:

    • Lists
    • Maps

    你可能会遇到 Lists 的 Maps 和 Maps 的 Lists,不过不用担心,只要掌握了这两种结构也就可以了;

    Maps

    首先来看看 Maps,我们都知道 Map 是字典,就是一个key:value的键值对,Maps 可以让我们更加方便的去书写配置信息,例如:

    ---
    apiVersion: v1
    kind: Pod

    第一行的---是分隔符,是可选的,在单一文件中,可用连续三个连字号---区分多个文件。这里我们可以看到,我们有两个键:kind 和 apiVersion,他们对应的值分别是:v1 和Pod。上面的 YAML 文件转换成 JSON 格式的话:

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

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

    ---
    apiVersion: v1
    kind: Pod
    metadata:
      name: kube100-site
      labels:
        app: web

    上面的 YAML 文件,metadata 这个 KEY 对应的值就是一个 Maps 了,而且嵌套的 labels 这个 KEY 的值又是一个 Map,你可以根据你自己的情况进行多层嵌套。

    上面我们也提到了 YAML 文件的语法规则,YAML 处理器是根据行缩进来知道内容之间的嗯关联性的。比如我们上面的 YAML 文件,我用了两个空格作为缩进,空格的数量并不重要,但是你得保持一致,并且至少要求一个空格(什么意思?就是你别一会缩进两个空格,一会缩进4个空格)。

    我们可以看到 name 和 labels 是相同级别的缩进,所以 YAML 处理器就知道了他们属于同一个 MAP,而 app 是 labels 的值是因为 app 的缩进更大。

    注意:在 YAML 文件中绝对不要使用 tab 键。

    同样的,我们可以将上面的 YAML 文件转换成 JSON 文件:

    {
      "apiVersion": "v1",
      "kind": "Pod",
      "metadata": {
        "name": "kube100-site",
        "labels": {
          "app": "web"
        }
      }
    }

    Lists

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

    args
      - Cat
      - Dog
      - Fish

    你可以有任何数量的项在列表中,每个项的定义以破折号(-)开头的,与父元素直接可以缩进一个空格。对应的 JSON 格式如下:

    {
        "args": ["Cat", "Dog", "Fish"]
    }

    当然,list 的子项也可以是 Maps,Maps 的子项也可以是list如下所示:

    ---
    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

    比如这个 YAML 文件,我们定义了一个叫 containers 的 List 对象,每个子项都由 name、image、ports 组成,每个 ports 都有一个 key 为 containerPort 的 Map 组成,同样的,我们可以转成如下 JSON 格式文件:

    {
        "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
                }]
            }]
        }
    }

    使用 YAML 创建 Pod

    API 说明: https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.10/

    创建 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,这个版本号需要根据我们安装的 kubernetes 版本和资源类型进行变化的
    • kind,这里我们创建的是一个 Pod,当然根据你的实际情况,这里资源类型可以是 Deployment、Job、Ingress、Service 等待。
    • metadata:包含了我们定义的 Pod 的一些 meta 信息,比如名称、namespace、标签等等信息。
    • spec:包括一些 containers,storage,volumes,或者其他 Kubernetes 需要知道的参数,以及诸如是否在容器失败时重新启动容器的属性。
  • 相关阅读:
    【转】centos7升级git版本
    小程序购物车抛物线动画(通用)
    IDEA高级操作
    JAVA获取各种路径
    这些SpringBoot天生自带Buff工具类你都用过哪些?
    搜狗输入法简繁问题
    Java8 Stream流递归,几行代码搞定遍历树形结构
    SpringBoot 启动时实现自动执行代码的几种方式讲解
    公司用的 MySQL 团队开发规范,非常详细,建议收藏!
    Springboot整合websocket全面解析
  • 原文地址:https://www.cnblogs.com/52py/p/10997589.html
Copyright © 2020-2023  润新知