网络知识 娱乐 【云原生 | Kubernetes 系列】K8s 实战 如何给应用注入数据

【云原生 | Kubernetes 系列】K8s 实战 如何给应用注入数据

给应用注入数据

  • 前言
  • 一、为容器设置启动时要执行的命令和参数
    • 1.1、创建 Pod 时设置命令及参数
    • 1.2、使用环境变量来设置参数
    • 1.3、在 Shell 来执行命令
  • 二、为容器定义相互依赖的环境变量
  • 三、为容器设置环境变量
    • 3.1、在配置中使用环境变量
  • 总结


前言

在这里插入图片描述

前面我们已经一起学习了很多的东西了,本篇文章,我们将一起学习,如何给应用注入数据,当然,本篇文章不会讲解全部知识点,而是带领大家,一起学习如何对我们的项目进行相关的配置和设置。


一、为容器设置启动时要执行的命令和参数

1.1、创建 Pod 时设置命令及参数

创建 Pod 时,可以为其下的容器设置启动时要执行的命令及其参数。如果要设置命令,就填写在配置文件的 command 字段下,如果要设置命令的参数,就填写在配置文件的 args 字段下。一旦 Pod 创建完成,该命令及其参数就无法再进行更改了。

如果在配置文件中设置了容器启动时要执行的命令及其参数,那么容器镜像中自带的命令与参数将会被覆盖而不再执行。如果配置文件中只是设置了参数,却没有设置其对应的命令,那么容器镜像中自带的命令会使用该新参数作为其执行时的参数。

在目录 pods/commands.yaml 创建一个只包含单个容器的 Pod。在 Pod 配置文件中设置了一个命令与两个参数:

apiVersion: v1
kind: Pod
metadata:
  name: command-demo
  labels:
    purpose: demonstrate-command
spec:
  containers:
  - name: command-demo-container
    image: debian
    command: ["printenv"]
    args: ["HOSTNAME", "KUBERNETES_PORT"]
  restartPolicy: OnFailure
  1. 基于 YAML 文件创建一个 Pod:
$ kubectl apply -f https://k8s.io/examples/pods/commands.yaml
  1. 获取正在运行的 Pods:
$ kubectl get pods

查询结果显示在 command-demo 这个 Pod 下运行的容器已经启动完成。

  1. 如果要获取容器启动时执行命令的输出结果,可以通过 Pod 的日志进行查看:
$ kubectl logs command-demo

日志中显示了 HOSTNAMEKUBERNETES_PORT 这两个环境变量的值:

command-demo
tcp://10.3.240.1:443

1.2、使用环境变量来设置参数

在上面的示例中,我们直接将一串字符作为命令的参数。除此之外,我们还可以将环境变量作为命令的参数。

env:
- name: MESSAGE
  value: "hello world"
command: ["/bin/echo"]
args: ["$(MESSAGE)"]

这意味着可以将那些用来设置环境变量的方法应用于设置命令的参数,其中包括了 ConfigMaps 与 Secrets。

1.3、在 Shell 来执行命令

需要在 Shell 脚本中运行命令。 例如,要执行的命令可能由多个命令组合而成,或者它就是一个 Shell 脚本。 这时,就可以通过如下方式在 Shell 中执行命令:

command: ["/bin/sh"]
args: ["-c", "while true; do echo hello; sleep 10;done"]

二、为容器定义相互依赖的环境变量

当创建一个 Pod 时,你可以为运行在 Pod 中的容器设置相互依赖的环境变量。 设置相互依赖的环境变量,你就可以在配置清单文件的 env 的 value 中使用 $(VAR_NAME)。

在本练习中,你会创建一个单容器的 Pod。 此 Pod 的配置文件定义了一个已定义常用用法的相互依赖的环境变量。 下面是目录 pods/inject/dependent-envars.yaml Pod 的配置清单:

apiVersion: v1
kind: Pod
metadata:
  name: dependent-envars-demo
spec:
  containers:
    - name: dependent-envars-demo
      args:
        - while true; do echo -en 'n'; printf UNCHANGED_REFERENCE=$UNCHANGED_REFERENCE'n'; printf SERVICE_ADDRESS=$SERVICE_ADDRESS'n';printf ESCAPED_REFERENCE=$ESCAPED_REFERENCE'n'; sleep 30; done;
      command:
        - sh
        - -c
      image: busybox:1.28
      env:
        - name: SERVICE_PORT
          value: "80"
        - name: SERVICE_IP
          value: "172.17.0.1"
        - name: UNCHANGED_REFERENCE
          value: "$(PROTOCOL)://$(SERVICE_IP):$(SERVICE_PORT)"
        - name: PROTOCOL
          value: "https"
        - name: SERVICE_ADDRESS
          value: "$(PROTOCOL)://$(SERVICE_IP):$(SERVICE_PORT)"
        - name: ESCAPED_REFERENCE
          value: "$$(PROTOCOL)://$(SERVICE_IP):$(SERVICE_PORT)"
  1. 依据清单创建 Pod:
$ kubectl apply -f https://k8s.io/examples/pods/inject/dependent-envars.yaml

pod/dependent-envars-demo created

  1. 列出运行的 Pod:
$ kubectl get pods dependent-envars-demo

NAME READY STATUS RESTARTS AGE
dependent-envars-demo 1/1 Running 0 9s

  1. 检查 Pod 中运行容器的日志:
$ kubectl logs pod/dependent-envars-demo

UNCHANGED_REFERENCE= ( P R O T O C O L ) : / / 172.17.0.1 : 80 S E R V I C E A D D R E S S = h t t p s : / / 172.17.0.1 : 80 E S C A P E D R E F E R E N C E = (PROTOCOL)://172.17.0.1:80 SERVICE_ADDRESS=https://172.17.0.1:80 ESCAPED_REFERENCE= (PROTOCOL)://172.17.0.1:80SERVICEADDRESS=https://172.17.0.1:80ESCAPEDREFERENCE=(PROTOCOL)😕/172.17.0.1:80

如上所示,你已经定义了 SERVICE_ADDRESS 的正确依赖引用, UNCHANGED_REFERENCE 的错误依赖引用, 并跳过了 ESCAPED_REFERENCE 的依赖引用。

如果环境变量被引用时已事先定义,则引用可以正确解析, 比如 SERVICE_ADDRESS 的例子。

当环境变量未定义或仅包含部分变量时,未定义的变量会被当做普通字符串对待, 比如 UNCHANGED_REFERENCE 的例子。 注意,解析不正确的环境变量通常不会阻止容器启动。

$(VAR_NAME) 这样的语法可以用两个 $ 转义,既:$$(VAR_NAME)。 无论引用的变量是否定义,转义的引用永远不会展开。 这一点可以从上面 ESCAPED_REFERENCE 的例子得到印证。

三、为容器设置环境变量

创建 Pod 时,可以为其下的容器设置环境变量。通过配置文件的 env 或者 envFrom 字段来设置环境变量。

本示例中,将创建一个只包含单个容器的 Pod。Pod 的配置文件中设置环境变量的名称为 DEMO_GREETING, 其值为 “Hello from the environment”。

下面是目录 pods/inject/envars.yaml Pod 的配置清单:

apiVersion: v1
kind: Pod
metadata:
  name: envar-demo
  labels:
    purpose: demonstrate-envars
spec:
  containers:
  - name: envar-demo-container
    image: gcr.io/google-samples/node-hello:1.0
    env:
    - name: DEMO_GREETING
      value: "Hello from the environment"
    - name: DEMO_FAREWELL
      value: "Such a sweet sorrow"
  1. 基于配置清单创建一个 Pod:
$ kubectl apply -f https://k8s.io/examples/pods/inject/envars.yaml
  1. 获取一下当前正在运行的 Pods 信息:
$ kubectl get pods -l purpose=demonstrate-envars

查询结果应为:

NAME READY STATUS RESTARTS AGE
envar-demo 1/1 Running 0 9s

  1. 列出 Pod 容器的环境变量:
$ kubectl exec envar-demo -- printenv

打印结果应为:

NODE_VERSION=4.4.2
EXAMPLE_SERVICE_PORT_8080_TCP_ADDR=10.3.245.237
HOSTNAME=envar-demo

DEMO_GREETING=Hello from the environment
DEMO_FAREWELL=Such a sweet sorrow

3.1、在配置中使用环境变量

在 Pod 的配置中定义的环境变量可以在配置的其他地方使用, 例如可用在为 Pod 的容器设置的命令和参数中。 在下面的示例配置中,环境变量 GREETING ,HONORIFIC 和 NAME 分别设置为 Warm greetings to , The Most Honorable 和 Kubernetes。然后这些环境变量在传递给容器 env-print-demo 的 CLI 参数中使用。

apiVersion: v1
kind: Pod
metadata:
  name: print-greeting
spec:
  containers:
  - name: env-print-demo
    image: bash
    env:
    - name: GREETING
      value: "Warm greetings to"
    - name: HONORIFIC
      value: "The Most Honorable"
    - name: NAME
      value: "Kubernetes"
    command: ["echo"]
    args: ["$(GREETING) $(HONORIFIC) $(NAME)"]

创建后,命令 echo Warm greetings to The Most Honorable Kubernetes 将在容器中运行。

总结

看到这里,我想各位看官,已经针对容器设置启动时要执行的命令和参数、定义相互依赖的环境变量、为容器设置环境变量,这三个配置设置的内容学习了,下一篇我们将会针对本篇内容的学习进行实战。