• k8s-pod使用


    该文章为课程的笔记,所以部分笔记来自课程,半原创

    概述

    在 Kubernetes 中,有几种特殊的 Volume,它们存在的意义不是为了存放容器里的数据,也不是用来进行容器和宿主机之间的数据交换。这些特殊 Volume 的作用,是``为容器提供预先定义好的数据``。所以,从容器的角度来看,这些 Volume 里的信息就是仿佛是被 Kubernetes“投射”(Project)进入容器当中的。这正是 Projected Volume 的含义。
    

    到目前为止,Kubernetes 支持的 Projected Volume 一共有四种:

    • Secret;
    • ConfigMap;
    • Downward API;
    • ServiceAccountToken。

    Secret

    Secret的作用,是帮你把 Pod 想要访问的加密数据,存放到 Etcd 中。然后,你就可以通过在 Pod 的容器里挂载 Volume 的方式,访问到这些 Secret 里保存的信息了。

    Secret 的例子

    Secret的例子,比如存放数据库的认证信息.

    $ cat ./username.txt
    admin
    $ cat ./password.txt
    c1oudc0w!
     
    $ kubectl create secret generic user --from-file=./username.txt
    $ kubectl create secret generic pass --from-file=./password.txt
    
    
    $ kubectl get secrets
    NAME           TYPE                                DATA      AGE
    user          Opaque                                1         51s
    pass          Opaque                                1         51s
    
    
    

    再执行

    apiVersion: v1
    kind: Pod
    metadata:
      name: test-projected-volume 
    spec:
      containers:
      - name: test-secret-volume
        image: busybox
        args:
        - sleep
        - "86400"
        volumeMounts:
        - name: mysql-cred
          mountPath: "/projected-volume"
          readOnly: true
      volumes:
      - name: mysql-cred
        projected:
          sources:
          - secret:
              name: user
          - secret:
              name: pass
    

    ConfigMap

    ConfigMap 保存的是不需要加密的、应用所需的配置信息。而 ConfigMap 的用法几乎与 Secret 完全相同:你可以使用 kubectl create configmap 从文件或者目录创建 ConfigMap,也可以直接编写 ConfigMap 对象的 YAML 文件。

    ConfigMap 例子

    一个 Java 应用所需的配置文件(.properties 文件),就可以通过下面这样的方式保存在 ConfigMap 里

    # .properties 文件的内容
    $ cat example/ui.properties
    color.good=purple
    color.bad=yellow
    allow.textmode=true
    how.nice.to.look=fairlyNice
     
    # 从.properties 文件创建 ConfigMap
    $ kubectl create configmap ui-config --from-file=example/ui.properties
     
    # 查看这个 ConfigMap 里保存的信息 (data)
    $ kubectl get configmaps ui-config -o yaml
    apiVersion: v1
    data:
      ui.properties: |
        color.good=purple
        color.bad=yellow
        allow.textmode=true
        how.nice.to.look=fairlyNice
    kind: ConfigMap
    metadata:
      name: ui-config
      ...
    

    Downward API

    让 Pod 里的容器能够直接获取到这个 Pod API 对象本身的信息。

    Downward API 例子

    apiVersion: v1
    kind: Pod
    metadata:
      name: test-downwardapi-volume
      labels:
        zone: us-est-coast
        cluster: test-cluster1
        rack: rack-22
    spec:
      containers:
        - name: client-container
          image: k8s.gcr.io/busybox
          command: ["sh", "-c"]
          args:
          - while true; do
              if [[ -e /etc/podinfo/labels ]]; then
                echo -en '
    
    '; cat /etc/podinfo/labels; fi;
              sleep 5;
            done;
          volumeMounts:
            - name: podinfo
              mountPath: /etc/podinfo
              readOnly: false
      volumes:
        - name: podinfo
          projected:
            sources:
            - downwardAPI:
                items:
                  - path: "labels"
                    fieldRef:
                      fieldPath: metadata.labels
    

    在这个 Pod 的 YAML 文件中,我定义了一个简单的容器,声明了一个 projected 类型的 Volume。只不过这次 Volume 的数据来源,变成了 Downward API。而这个 Downward API Volume,则声明了要暴露 Pod 的 metadata.labels 信息给容器。

    通过这样的声明方式,当前 Pod 的 Labels 字段的值,就会被 Kubernetes 自动挂载成为容器里的 /etc/podinfo/labels 文件。

    而这个容器的启动命令,则是不断打印出 /etc/podinfo/labels 里的内容。所以,当我创建了这个 Pod 之后,就可以通过 kubectl logs 指令,查看到这些 Labels 字段被打印出来,如下所示:

    $ kubectl create -f dapi-volume.yaml
    $ kubectl logs test-downwardapi-volume
    cluster="test-cluster1"
    rack="rack-22"
    zone="us-est-coast"
    

    目前,Downward API 支持的字段已经非常丰富了,比如:

    1. 使用 fieldRef 可以声明使用:
    spec.nodeName - 宿主机名字
    status.hostIP - 宿主机 IP
    metadata.name - Pod 的名字
    metadata.namespace - Pod 的 Namespace
    status.podIP - Pod 的 IP
    spec.serviceAccountName - Pod 的 Service Account 的名字
    metadata.uid - Pod 的 UID
    metadata.labels['<KEY>'] - 指定 <KEY> 的 Label 值
    metadata.annotations['<KEY>'] - 指定 <KEY> 的 Annotation 值
    metadata.labels - Pod 的所有 Label
    metadata.annotations - Pod 的所有 Annotation
    
    1. 使用 resourceFieldRef 可以声明使用:
    容器的 CPU limit
    容器的 CPU request
    容器的 memory limit
    容器的 memory request
    

    上面这个列表的内容,随着 Kubernetes 项目的发展肯定还会不断增加。所以这里列出来的信息仅供参考,你在使用 Downward API 时,还是要记得去查阅一下官方文档。

    不过,需要注意的是,Downward API 能够获取到的信息,一定是 Pod 里的容器进程启动之前就能够确定下来的信息。而如果你想要获取 Pod 容器运行后才会出现的信息,比如,容器进程的 PID,那就肯定不能使用 Downward API 了,而应该考虑在 Pod 里定义一个 sidecar 容器。

    其实,Secret、ConfigMap,以及 Downward API 这三种 Projected Volume 定义的信息,大多还可以通过环境变量的方式出现在容器里。但是,通过环境变量获取这些信息的方式,不具备自动更新的能力。所以,一般情况下,我都建议你使用 Volume 文件的方式获取这些信息。

    参考资料

    • 深入剖析Kubernetes课程
  • 相关阅读:
    day58
    day57
    day55
    day56
    day54
    Vue(练习二)
    Vue练习
    Vue框架
    作业
    Django(九)
  • 原文地址:https://www.cnblogs.com/Benjious/p/14799838.html
Copyright © 2020-2023  润新知