Kustomize 如何只替换 Ingress 配置中的主机
Kustomize how to replace only the host in Ingress configuration
我有这个 ingress.yaml 基本配置:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
labels:
sia: aza
app: asap-ingress-internal
name: asap-ingress-internal
annotations:
kubernetes.io/ingress.class: "nginx-external"
nginx.ingress.kubernetes.io/use-regex: "true"
spec:
rules:
- host: the-host-value
http:
paths:
- path: /asap-srv-template/(.*)
backend:
serviceName: asap-srv-template
servicePort: 8080
并且只想替换 spoec.rules.host 值(并保持所有 http.paths 不变。
所以我创建了一个这样的 env-var.yaml :
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: asap-ingress-internal
spec:
rules:
- host: the.real.hostname
但结果如下:
$ kustomize build
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
annotations:
kubernetes.io/ingress.class: nginx-external
nginx.ingress.kubernetes.io/use-regex: "true"
labels:
app: asap-ingress-internal
env: dev
sia: aza
name: asap-ingress-internal
namespace: aza-72461-dev
spec:
rules:
- host: the.real.hostname
我丢失了所有 http.paths 配置,我不知道该怎么做。
我尝试在 kustomization.yaml 中使用 patches: 或 patchesStrategicMerge,但结果始终相同。
如有任何帮助,我们将不胜感激
如果您使用的是最新版本的 kubernetes(我想从 18 开始),Ingres api 版本不再是测试版 apiVersion: extensions/v1beta1
,现在是 apiVersion: networking.k8s.io/v1
。
我已经测试了下面的示例并且它有效:
ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: asap-ingress-internal
annotations:
kubernetes.io/ingress.class: "nginx-external"
nginx.ingress.kubernetes.io/use-regex: "true"
spec:
rules:
- host: the-host-value
http:
paths:
- path: /asap-srv-template/(.*)
backend:
serviceName: asap-srv-template
servicePort: 8080
ingress-patch.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: asap-ingress-internal
spec:
rules:
- host: the.real.hostname
kustomization.yaml
resources:
- ingress.yaml
patchesStrategicMerge:
- ingress-patch.yaml
测试了 kubectl kustomize
(kubectl 版本为 v1.19.7
)和 kustomize build
(独立 kustomize 版本为 v3.5.4
)
您可以为此使用 json 补丁,下面是一个示例。
这是一个例子kustomization.yaml
。它会在 patches
部分调出一个补丁:
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- ../../base/app1
patches:
- target:
kind: Ingress
name: my-ingress
path: ingress-patch.json
这是一个例子ingress-patch.json
:
[
{
"op": "replace",
"path": "/spec/rules/0/host",
"value": "the.real.hostname"
}
]
另一种选择是做内嵌补丁。这与 mroma 提供的方法相同,但没有文件。我觉得比较简单。
# kustomization.yaml
resources:
- ingress.yaml
patches:
- target:
kind: Ingress
name: asap-ingress-internal
patch: |-
- op: replace
path: /spec/rules/0/host
value: the.real.hostname
我有这个 ingress.yaml 基本配置:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
labels:
sia: aza
app: asap-ingress-internal
name: asap-ingress-internal
annotations:
kubernetes.io/ingress.class: "nginx-external"
nginx.ingress.kubernetes.io/use-regex: "true"
spec:
rules:
- host: the-host-value
http:
paths:
- path: /asap-srv-template/(.*)
backend:
serviceName: asap-srv-template
servicePort: 8080
并且只想替换 spoec.rules.host 值(并保持所有 http.paths 不变。
所以我创建了一个这样的 env-var.yaml :
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: asap-ingress-internal
spec:
rules:
- host: the.real.hostname
但结果如下:
$ kustomize build
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
annotations:
kubernetes.io/ingress.class: nginx-external
nginx.ingress.kubernetes.io/use-regex: "true"
labels:
app: asap-ingress-internal
env: dev
sia: aza
name: asap-ingress-internal
namespace: aza-72461-dev
spec:
rules:
- host: the.real.hostname
我丢失了所有 http.paths 配置,我不知道该怎么做。
我尝试在 kustomization.yaml 中使用 patches: 或 patchesStrategicMerge,但结果始终相同。
如有任何帮助,我们将不胜感激
如果您使用的是最新版本的 kubernetes(我想从 18 开始),Ingres api 版本不再是测试版 apiVersion: extensions/v1beta1
,现在是 apiVersion: networking.k8s.io/v1
。
我已经测试了下面的示例并且它有效:
ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: asap-ingress-internal
annotations:
kubernetes.io/ingress.class: "nginx-external"
nginx.ingress.kubernetes.io/use-regex: "true"
spec:
rules:
- host: the-host-value
http:
paths:
- path: /asap-srv-template/(.*)
backend:
serviceName: asap-srv-template
servicePort: 8080
ingress-patch.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: asap-ingress-internal
spec:
rules:
- host: the.real.hostname
kustomization.yaml
resources:
- ingress.yaml
patchesStrategicMerge:
- ingress-patch.yaml
测试了 kubectl kustomize
(kubectl 版本为 v1.19.7
)和 kustomize build
(独立 kustomize 版本为 v3.5.4
)
您可以为此使用 json 补丁,下面是一个示例。
这是一个例子kustomization.yaml
。它会在 patches
部分调出一个补丁:
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- ../../base/app1
patches:
- target:
kind: Ingress
name: my-ingress
path: ingress-patch.json
这是一个例子ingress-patch.json
:
[
{
"op": "replace",
"path": "/spec/rules/0/host",
"value": "the.real.hostname"
}
]
另一种选择是做内嵌补丁。这与 mroma 提供的方法相同,但没有文件。我觉得比较简单。
# kustomization.yaml
resources:
- ingress.yaml
patches:
- target:
kind: Ingress
name: asap-ingress-internal
patch: |-
- op: replace
path: /spec/rules/0/host
value: the.real.hostname