GKE 入口修改现有主机/路径

问题描述 投票:0回答:3

是否可以从命令行/通过脚本修改(添加/删除)现有主机? 我想在首次部署新应用程序时动态添加它们。我目前最终得到了这个脚本:

#!/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:
条目之前,并重新应用配置。 这与其说是一个不错的解决方案,不如说是一个黑客攻击。

我想知道是否可以配置入口以根据同一项目中服务的一些注释动态加载主机和路径,或者我是否至少可以调用一些命令来添加或删除主机。

google-cloud-platform google-kubernetes-engine kubernetes-ingress gke-networking
3个回答
0
投票

您可以下载 JSON 格式的配置,并使用 kubectl 补丁 COMMAND 可以更新对象。因此,您可以将所有这些放入脚本中以动态更新入口。欲了解更多信息,请点击上述链接。

示例:kubectl get ing mying -o json


0
投票

我不确定你的要求是什么,但我想通常这样的事情会用 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

0
投票

UI 的解决方案是:在 GKE 中,转到

Gateways, Services & Ingress
,然后转到
Ingress
,然后单击您需要的入口。

然后有一个编辑按钮,您可以在其中更改清单

© www.soinside.com 2019 - 2024. All rights reserved.