1

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

#!/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:条目和重新应用配置之前。这与其说是一个很好的解决方案,不如说是一个 hack。

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

4

2 回答 2

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
于 2020-11-28T23:45:55.780 回答
0

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

示例:kubectl geting mying -o json

于 2020-11-27T23:09:42.227 回答