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



    前言

    在这里插入图片描述

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


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

    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
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    1. 基于 YAML 文件创建一个 Pod:
    $ kubectl apply -f https://k8s.io/examples/pods/commands.yaml
    
    • 1
    1. 获取正在运行的 Pods:
    $ kubectl get pods
    
    • 1

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

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

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

    command-demo
    tcp://10.3.240.1:443

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

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

    env:
    - name: MESSAGE
      value: "hello world"
    command: ["/bin/echo"]
    args: ["$(MESSAGE)"]
    
    • 1
    • 2
    • 3
    • 4
    • 5

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

    1.3、在 Shell 来执行命令

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

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

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

    当创建一个 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
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    1. 依据清单创建 Pod:
    $ kubectl apply -f https://k8s.io/examples/pods/inject/dependent-envars.yaml
    
    • 1

    pod/dependent-envars-demo created

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

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

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

    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
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    1. 基于配置清单创建一个 Pod:
    $ kubectl apply -f https://k8s.io/examples/pods/inject/envars.yaml
    
    • 1
    1. 获取一下当前正在运行的 Pods 信息:
    $ kubectl get pods -l purpose=demonstrate-envars
    
    • 1

    查询结果应为:

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

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

    打印结果应为:

    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)"]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

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

    总结

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

  • 相关阅读:
    力扣——剑指 Offer II 092. 翻转字符
    【闲聊杂谈】ElasticSearch的分布式原理
    天然气跟踪监管系统功能模块实现
    Java基础-继承
    一个产品经理回忆录
    虚假内容检测,谣言检测,不实信息检测,事实核查;纯文本,多模态,多语言;数据集整理
    .NET 6 在已知拓扑路径的情况下使用 Dijkstra,A*算法搜索最短路径
    【头歌实验】三、Python顺序结构程序设计
    java 通过Tess4j 读取图片中的文字
    QQ空间里面的照片变模糊了怎么办?时间越久越模糊怎么修复清晰?
  • 原文地址:https://blog.csdn.net/u010755471/article/details/126617195