是否可以从命令行/通过脚本修改(添加/删除)现有主机? 我想在首次部署新应用程序时动态添加它们。我目前最终得到了这个脚本:
#!/bin/bash
APP_NAME=$1
if [[ -z $(kubectl get ingress ingress-gw -o yaml | grep "serviceName: $APP_NAME-service") ]]
then echo "$(kubectl get ingress ingress-gw -o yaml | sed '/^status:$/Q')
- host: $APP_NAME.example.com
http:
paths:
- path: "/*"
backend:
serviceName: $APP_NAME-service
servicePort: 80
$(kubectl get ingress ingress -o yaml | sed -n -e '/^status:$/,$p')" | kubectl apply -f -
fi
简而言之,它会下载现有的入口配置,检查应用程序是否已定义,如果未定义,则将其注入到文件末尾,就在
status:
条目之前,并重新应用配置。
这与其说是一个不错的解决方案,不如说是一个黑客攻击。
我想知道是否可以配置入口以根据同一项目中服务的一些注释动态加载主机和路径,或者我是否至少可以调用一些命令来添加或删除主机。
我不确定你的要求是什么,但我想通常这样的事情会用 Helm 来完成。您可以使用模板定义入口并指定values.yaml,它可以提供生成该文件所需的值。对使用
helm create
生成的舵图进行了轻微修改
{{- if .Values.ingress.enabled -}}
{{- $fullName := include "ingresstest.fullname" . -}}
{{- $svcPort := .Values.service.port -}}
{{- if semverCompare ">=1.14-0" .Capabilities.KubeVersion.GitVersion -}}
apiVersion: networking.k8s.io/v1beta1
{{- else -}}
apiVersion: extensions/v1beta1
{{- end }}
kind: Ingress
metadata:
name: {{ $fullName }}
labels:
{{- include "ingresstest.labels" . | nindent 4 }}
{{- with .Values.ingress.annotations }}
annotations:
{{- toYaml . | nindent 4 }}
{{- end }}
spec:
{{- if .Values.ingress.tls }}
tls:
{{- range .Values.ingress.tls }}
- hosts:
{{- range .hosts }}
- {{ . | quote }}
{{- end }}
secretName: {{ .secretName }}
{{- end }}
{{- end }}
rules:
{{- range $host := .Values.ingress.hosts }}
- host: {{ $host.host | quote }}
http:
paths:
{{- range .paths }}
- path: {{ . }}
backend:
serviceName: {{ $host.service }}
servicePort: {{ $svcPort }}
{{- end }}
{{- end }}
{{- end }}
和values.yaml(片段)
ingress:
enabled: true
annotations: {}
# kubernetes.io/ingress.class: nginx
# kubernetes.io/tls-acme: "true"
hosts:
- host: foo.example.com
service: foo-service
paths:
- "/*"
- host: bar.example.com
service: bar-service
paths:
- "/*"
给出了类似的结果:
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: RELEASE-NAME-ingresstest
labels:
helm.sh/chart: ingresstest-0.1.0
app.kubernetes.io/name: ingresstest
app.kubernetes.io/instance: RELEASE-NAME
app.kubernetes.io/version: "1.16.0"
app.kubernetes.io/managed-by: Helm
spec:
rules:
- host: "foo.example.com"
http:
paths:
- path: /*
backend:
serviceName: foo-service
servicePort: 80
- host: "bar.example.com"
http:
paths:
- path: /*
backend:
serviceName: bar-service
servicePort: 80
UI 的解决方案是:在 GKE 中,转到
Gateways, Services & Ingress
,然后转到 Ingress
,然后单击您需要的入口。
然后有一个编辑按钮,您可以在其中更改清单