如何使用Kubectl在部署中修补容器环境变量?

时间:2019-09-05 07:06:04

标签: json kubernetes kubectl jsonpath

当我想提取某个容器env variabe的当前值时,可以使用jsonpath,其语法如下:

kubectl get pods -l component='somelabel' -n somenamespace -o \
jsonpath='{.items[*].spec.containers[*].env[?(@.name=="SOME_ENV_VARIABLE")].value}')

这将返回名称为SOME_ENV_VARIABLE的env varialbe的值。 json中包含容器env变量的Pod部分将如下所示:

            "spec": {
                "containers": [
                    {
                        "env": [
                            {
                                "name": "SOME_ENV_VARIABLE",
                                "value": "some_value"
                            },
                            {
                                "name": "ANOTHER_ENV_VARIABLE",
                                "value": "another_value"
                            }
                        ],

当我想在部署中修补一些值时,我使用的语法如下:

kubectl -n kube-system patch svc kubernetes-dashboard --type='json' -p="[{'op': 'replace', 'path': '/spec/ports/0/nodePort', 'value': $PORT}]"

但是在需要使用'op': 'replace'这样的表达式的情况下,如何用env[?(@.name=="SOME_ENV_VARIABLE")]修补变量?我应该使用哪种语法?

2 个答案:

答案 0 :(得分:3)

您可以使用kubectl patch来更新k8s部署的环境变量,而不是kubectl set env命令。

envvalue=$(kubectl get pods -l component='somelabel' -n somenamespace -o jsonpath='{.items[*].spec.containers[*].env[?(@.name=="SOME_ENV_VARIABLE")].value}')
kubectl set env deployment/my-app-deploy op=$envvalue

希望这会有所帮助。

答案 1 :(得分:0)

  • op:替换 路径:/ spec / template / spec / containers / 0 / env / 0 / name 值:YOUR_VARIABLE_NAME
  • op:替换 路径:/ spec / template / spec / containers / 0 / env / 0 / value 值:YOUR_VARIABLE_VALUE