【问题标题】:Define Environment Variables referring to variable environment for a Container [kubernetes]定义环境变量引用容器的变量环境 [kubernetes]
【发布时间】:2020-07-22 07:32:42
【问题描述】:

我有一个用于 Spring Boot 应用程序的 K8s 部署 我想创建一个转储文件.hprof,其名称为 pod ($hostname)

我的JAVA_OPTIONS参数是可变环境 我想引用父级内部的另一个变量JAVA_Options

containers:
- env:
  - name: SPRING_PROFILES_ACTIVE
    value: prod,swagger
  - name: JAVA_OPTS
    value: ' -XX:MaxRAMPercentage=50 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/jvm-data/$HOSTNAME.hprof'

我希望有一个包含主机名的变量:

$ echo $JAVA_OPTS -XX:MaxRAMPercentage=50 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/jvm-data/myPodNameStaging.hprof

我得到的结果是: $HOSTNAME.hprof 设置为字符串。

我也尝试了很多组合$(HOSTNAME)${HOSTNAME}。我总是得到变量的名称而不是内容值。

我的问题是:如何引用$HOSTNAME

【问题讨论】:

    标签: linux maven kubernetes containers kubernetes-pod


    【解决方案1】:

    这是不可能的。您将需要以其他方式定义这些或以其他方式自己处理插值。一个常见的选项是这样的:

    command:
    - sh
    - -c
    - |
      JAVA_OPTS="asdfasdf" java -whatever
    

    但这确实需要完全覆盖来自底层容器的命令,这很烦人。也就是说,您可以在卷路径中进行有限的替换,因此可能会在该级别处理它而不是针对这种特殊情况。

    【讨论】:

      【解决方案2】:

      我正在使用 nginx 尝试这个,但是变量替换是有效的,也许你可以试试:

      apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2
      kind: Deployment
      metadata:
        name: nginx-deployment
      spec:
        selector:
          matchLabels:
            app: nginx
        replicas: 2 # tells deployment to run 2 pods matching the template
        template:
          metadata:
            labels:
              app: nginx
          spec:
            containers:
            - name: nginx
              image: nginx:1.14.2
              ports:
              - containerPort: 80
              env:
              - name: POD_HOSTNAME
                valueFrom:
                  fieldRef:
                    fieldPath: status.podIP
              - name: SPRING_PROFILES_ACTIVE
                value: prod,swagger
              - name: JAVA_OPTS
                value: -XX:MaxRAMPercentage=50 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/jvm-data/$(POD_HOSTNAME).hprof
      

      然后就可以看到JAVA_OPTS的内容了:

      root@nginx-deployment-5bc5fcdc8b-f4ldx:/# echo $JAVA_OPTS
      -XX:MaxRAMPercentage=50 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/jvm-data/10.32.17.138.hprof
      

      【讨论】:

        【解决方案3】:

        Kubernetes 中 pod 的主机名始终与 pod 名称相同,在 Linux 上,我们有一个环境变量 $HOSTNAME。所以你可以用它来实现你所需要的:

        这是一个可能适合您需求的示例:

        apiVersion: v1
        kind: Pod
        metadata:
          name: busybox
          namespace: default
        spec:
          containers:
          - name: busybox
            image: k8s.gcr.io/busybox:1.24 
            env:
            - name: SPRING_PROFILES_ACTIVE
              value: prod,swagger    
            command: [ "sh", "-c"]
            args:
            - while true; do
                export JAVA_OPTS="-XX:MaxRAMPercentage=50 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/jvm-data/$HOSTNAME.hprof";
                printenv JAVA_OPTS;
                printenv SPRING_PROFILES_ACTIVE;
                sleep 10;
              done;
            imagePullPolicy: IfNotPresent
          restartPolicy: Always
        

        如果你运行kubectl get logs busybox,你可以看到这个输出:

        -XX:MaxRAMPercentage=50 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/jvm-data/busybox.hprof
        prod,swagger
        -XX:MaxRAMPercentage=50 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/jvm-data/busybox.hprof
        prod,swagger
        -XX:MaxRAMPercentage=50 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/jvm-data/busybox.hprof
        prod,swagger
        -XX:MaxRAMPercentage=50 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/jvm-data/busybox.hprof
        prod,swagger
        -XX:MaxRAMPercentage=50 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/jvm-data/busybox.hprof
        prod,swagger
        -XX:MaxRAMPercentage=50 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/jvm-data/busybox.hprof
        prod,swagger
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-06-06
          • 1970-01-01
          相关资源
          最近更新 更多