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

lex*_*ler 5 json jsonpath kubernetes kubectl

当我想提取某个容器环境变量的当前值时,我可以使用 jsonpath 语法如下:

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

这将返回名称为 env varialbe 的值SOME_ENV_VARIABLE。带有 json 容器环境变量的 Pod 部分将如下所示:

            "spec": {
                "containers": [
                    {
                        "env": [
                            {
                                "name": "SOME_ENV_VARIABLE",
                                "value": "some_value"
                            },
                            {
                                "name": "ANOTHER_ENV_VARIABLE",
                                "value": "another_value"
                            }
                        ],
Run Code Online (Sandbox Code Playgroud)

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

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

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

mch*_*wre 7

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

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
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助。