gpt4 book ai didi

kubernetes - 如何在 Kubernetes 上修补已部署的 Ingress 资源?

转载 作者:行者123 更新时间:2023-12-04 14:54:20 26 4
gpt4 key购买 nike

我有以下 Ingress 资源:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: main-ingress
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/ssl-redirect: "false"
nginx.ingress.kubernetes.io/force-ssl-redirect: "false"
nginx.ingress.kubernetes.io/proxy-read-timeout: "86400"
nginx.ingress.kubernetes.io/proxy-send-timeout: "86400"

spec:
tls:
- secretName: the-secret
hosts:
- sample.domain.com
- sample2.domain.com
- rabbit.domain.com
- hub.domain.com
- grafana.domain.com

rules:

- host: sample.domain.com
http:
paths:
- path: /
backend:
serviceName: fe-srvc
servicePort: 80
- path: /api
backend:
serviceName: be-srvc
servicePort: 80

- host: sample2.domain.com
http:
paths:
- path: /
backend:
serviceName: fe2-srvc
servicePort: 80
- path: /api
backend:
serviceName: be-srvc
servicePort: 80

## The Extra Services ###
- host: rabbit.domain.com
http:
paths:
- path: /
backend:
serviceName: rabbitmq-srvc
servicePort: 80

我想在部署后修补它。

所以我用它来尝试替换 be-srvc值与 some-srvc :
kubectl patch ing/main-ingress --patch '{ "spec" : { "rules": [{"http":{"paths":[ {"- path":"/"},{"backend":{"serviceName":"other-srvc"}},{"servicePort":"80"} ] }}]}}'

我收到这个错误:
The Ingress "main-ingress" is invalid:
* spec.rules[0].http.backend.serviceName: Required value
* spec.rules[0].http.backend.servicePort: Invalid value: 0: must be between 1 and 65535, inclusive

任何见解将不胜感激!

最佳答案

你的补丁有很多问题;例如 "- path"而不是 "path"但也错误地引用了对象级别。但是,即使您修复了错误,这也不会按预期工作。让我们看看为什么。
kubectl patch是对 的请求战略合并补丁 .修补阵列时,如 .spec.rules.spec.rules.http.paths在这种情况下,策略性合并补丁可以使用定义的补丁类型和合并补丁合并键来为对象做正确的事情。然而,在 Ingress 对象的情况下,没有人费心去定义这些。这意味着任何补丁都会覆盖整个对象;这不会是人们所希望的一次很好的合并。

要完成问题中提到的特定更改,您可以执行以下操作:

kubectl get ing/main-ingress -o json \ 
| jq '(.spec.rules[].http.paths[].backend.serviceName | select(. == "be-srvc")) |= "some-srvc"' \
| kubectl apply -f -

以上将更改所有出现的 be-srvc服务于 some-srvc .请记住,这里有一个短暂的竞争条件:如果 Ingress 在 kubectl get 之后被修改运行更改将失败并显示错误 Operation cannot be fulfilled on ingresses.extensions "xx": the object has been modified ;要处理这种情况,您需要实现重试逻辑。

如果索引在上面提到的数组中是已知的,您可以直接完成补丁:
kubectl patch ing/main-ingress --type=json \
-p='[{"op": "replace", "path": "/spec/rules/0/http/paths/1/backend/serviceName", "value":"some-srvc"}]'
kubectl patch ing/main-ingress --type=json \
-p='[{"op": "replace", "path": "/spec/rules/1/http/paths/1/backend/serviceName", "value":"some-srvc"}]'

上面的两个命令将更改 sample.domain.com/api 的后端和 sample2.domain.com/apisome-srvc .

这两个命令也可以这样组合:
kubectl patch ing/main-ingress --type=json \
-p='[{"op": "replace", "path": "/spec/rules/0/http/paths/1/backend/serviceName", "value":"some-srvc"}, {"op": "replace", "path": "/spec/rules/1/http/paths/1/backend/serviceName", "value":"some-srvc"}]'

这具有相同的效果,作为额外的好处,这里没有竞争条件;补丁保证是原子的。

关于kubernetes - 如何在 Kubernetes 上修补已部署的 Ingress 资源?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50762250/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com