K8s: 在Pod里面配置容器启动的命令参数及容器间依赖的环境变量

在Pod里面配置容器启动的命令参数


1 ) 概述

  • 创建 Pod 时,可以为其下的容器设置启动时要执行的命令及其参数
  • 如果要设置命令,就填写在配置文件的 command 字段下
  • 如果要设置命令的参数,就填写在配置文件的 args 字段下
  • 一旦 Pod 创建完成,该命令及其参数就无法再进行更改了
  • 如果在配置文件中设置了容器启动时要执行的命令及其参数
  • 那么容器镜像中自带的命令与参数将会被覆盖而不再执行
  • 如果配置文件中只是设置了参数,却没有设置其对应的命令
  • 那么容器镜像中自带的命令会使用该新参数作为其执行时的参数
  • 说明: 在有些容器运行时中, command 字段对应 entrypoint

2 )示例

2.1 基本配置

  • 现在,创建一个只包含单个容器的 Pod

  • 在 Pod 配置文件中设置了一个命令与两个参数

  • 创建 args.yaml

    apiVersion: v1
    kind: Pod
    metadata:
     name: command-demo
     labels:
     purpose: demonstrate-command
    spec:
     containers:
     - name: command-demo-container
     image: nginx # 这里正常来说替换成 centos
     command: ["printenv"]
     args: ["HOSTNAME", "KUBERNETES_PORT"]
     restartPolicy: OnFailure
    
  • $ kubectl apply -f args.yaml

    pod/args-demo created
    
  • $ kubectl get po | grep args

    args-demo        0/1     Completed          0              34s
    
  • $ kubectl logs args-demo

    args-demo
    tcp://10.1.0.1:443
    
  • 以上是打印出来了几个环境变量

2.2 将环境变量作为命令参数

  • 在上面的示例中,直接将一串字符作为命令的参数
  • 除此之外,我们还可以将环境变量作为命令的参数
  • 现在,我们想要自己定义一些环境变量,修改 yaml 文件
  • 关键修改如下
    spec:
      containers:
      - name: args-demo-container
        image: nginx # 这里正常来说替换成 centos
        env:
        - name: MSG
          value: 'hello world'
        resources:
          limits:
            memory: "64Mi"
            cpu: "200m"
        ports:
        - containerPort: 80
        command: ["/bin/echo"]
        args: ["$(MSG)"]
      restartPolicy: OnFailure
    
  • 重新 delete pod 后,重新 apply 之后查看日志
  • $ kubectl logs args-demo
    hello world
    
  • 以上,可见输出了定义的环境变量

Pod容器间依赖的环境变量

  • 当创建一个 Pod 时,可以为运行在 Pod 中的容器设置相互依赖的环境变量
  • 设置相互依赖的环境变量,你就可以在配置清单文件的 env 的 value 中使用 $(VAR_NAME)
  • 现在创建一个单容器的 Pod, 此 Pod 的配置文件定义了一个已定义常用用法的相互依赖的环境变量
  • 创建 env-dep.yaml
    apiVersion: v1
    kind: Pod
    metadata:
      name: env-dep-demo
      labels:
        name: env-dep-demo
    spec:
      containers:
      - name: env-dep-demo
        image: busybox
        resources:
          limits:
            memory: "64Mi"
            cpu: "200m"
        command:
        - sh
        - -c
        args:
        - printf SERVICE_ADDRESS=$SERVICE_ADDRESS'\n'; printf ESCAPED_REFERENCE=$ESCAPED_REFERENCE'\n'; sleep 120
        env:
        - name: SERVICE_IP
          value: "172.17.0.1"
        - name: SERVICE_PORT
          value: "80"
        - name: SERVICE_ADDRESS
          value: "$(PROTOCOL)://$(SERVICE_IP):$(SERVICE_PORT)"
        - name: PROTOCOL
          value: "https"
        - name: ESCAPED_REFERENCE
          value: "$(PROTOCOL)://$(SERVICE_IP):$(SERVICE_PORT)"
    
  • 注意,上述配置中,args 中要加上 sleep, 否则就会退出
  • $ kubectl apply -f env-dep.yaml 创建 pod
pod/env-dep-demo created
  • $ kubectl get po | grep env 获取 pod 状态
    env-dep-demo     1/1     Running            0               21s
    
  • $ kubectl logs env-dep-demo 查看 pod 日志
    SERVICE_ADDRESS=$(PROTOCOL)://172.17.0.1:80
    ESCAPED_REFERENCE=https://172.17.0.1:80
    
  • 以上可以看到,因为 PROTOCOL 的定义位置
  • 导致了第一个没有正确打印出来,但是第二个正常
  • 修改yaml文件的最后一行,这里多加了 $, 也就是 $$
    	    - name: ESCAPED_REFERENCE
    	      value: "$$(PROTOCOL)://$(SERVICE_IP):$(SERVICE_PORT)"
    
  • 重新 apply 等待运行后,执行 $ kubectl logs env-dep-demo
    SERVICE_ADDRESS=$(PROTOCOL)://172.17.0.1:80
    ESCAPED_REFERENCE=$(PROTOCOL)://172.17.0.1:80
    
  • 可见,多加了一个 $, 就无法正常显示了
  • 总结,以下几点需要特别注意:
    • 定义env的位置和引用的位置
    • 不能多加 $
    • 还有,解析不正确的环境变量通常不会阻止容器启动
### Ubuntu上的Kubernetes集群中设置Java运行环境 #### 准备工作 为了确保Java应用程序能够在Kubernetes集群内正常运行,需要确认所有节点已经正确安装并配置好Docker以及必要的依赖项。对于新创建的虚拟机实例可能还需要额外安装一些基础工具[^1]。 #### Java环境变量配置 当在容器化环境中部署Java应用时,通常会通过自定义镜像来包含所需的JDK版本和其他依赖库。然而也可以利用`kubectl exec`命令进入正在运行的Pod内部修改其环境变量以支持特定于Java的应用程序需求[^5]。 ```bash kubectl exec -it <pod-name> -- /bin/bash export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64 export PATH=$PATH:$JAVA_HOME/bin ``` 上述脚本展示了如何手动向指定Pod添加临时性的Java路径设定;不过更推荐的做法是在构建阶段就将这些设置集成到Dockerfile当中: ```dockerfile FROM ubuntu:latest RUN apt-get update && \ apt-get install -y openjdk-11-jdk-headless && \ rm -rf /var/lib/apt/lists/* ENV JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64 ENV PATH=${JAVA_HOME}/bin:${PATH} ``` 此Dockerfile片段说明了怎样基于官方Ubuntu镜像准备一个带有预设Java环境的工作空。这样做的好处是可以保证每次启动新的Pod实例都会自动继承正确的Java配置而无需再次调整。 #### 应用部署清单编写 为了让Kubernetes能够识别和管理含有Java组件的服务,应当撰写相应的YAML描述文档。下面给出了一段简化版的例子用于展示基本结构: ```yaml apiVersion: apps/v1 kind: Deployment metadata: name: java-app-deployment spec: replicas: 3 selector: matchLabels: app: java-webapp template: metadata: labels: app: java-webapp spec: containers: - name: java-container image: custom-java-image:tag ports: - containerPort: 8080 env: - name: JAVA_OPTS value: "-Xms512m -Xmx1g" ``` 这里的关键在于`env`字段部分,允许管理员灵活地传递各种参数给目标进程,从而实现更加精细化的性能调优[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wang's Blog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值