【问题标题】:Unable to setup Kubernetes Ingress for QuestDB via Helm无法通过 Helm 为 QuestDB 设置 Kubernetes Ingress
【发布时间】:2021-06-16 04:22:48
【问题描述】:

我是 Kubernetes、Helm 和 Yaml 的初学者。我正在尝试通过我的 minikube 中的 Kubernetes Ingress Controller 设置访问 QuestDB 控制台,但是在运行 helm 升级时出现以下错误。谁能建议我如何纠正这个问题?

Error: UPGRADE FAILED: failed to create resource: Ingress.extensions "questdb" is invalid: spec: Invalid value: []networking.IngressRule(nil): either `defaultBackend` or `rules` must be specified

这是我最重要的 value.yaml

ingress:
  enabled: true
  rules:
    - host: localhost
      http:
        paths:
          - path: /questdb
            backend:
              serviceName: questdb-headless
              servicePort: 9000
          - path: /influxdb
            backend:
              serviceName: questdb-headless
              servicePort: 9009     

我使用本地版本安装了 QuestDB helm chart,该版本仅对原始 ingress.yaml 进行了轻微修改,以引用networking.k8s.io/v1 而不是networking.k8s.io/v1beta1。这是本地的:

{{- if .Values.ingress.enabled -}}
{{- $fullName := include "questdb.fullname" . -}}
{{- $svcPort := .Values.service.port -}}
{{- if semverCompare ">=1.14-0" .Capabilities.KubeVersion.GitVersion -}}
apiVersion: networking.k8s.io/v1
{{- else -}}
apiVersion: extensions/v1
{{- end }}
kind: Ingress
metadata:
  name: {{ $fullName }}
  labels:
    {{- include "questdb.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 .Values.ingress.hosts }}
    - host: {{ .host | quote }}
      http:
        paths:
          {{- range .paths }}
          - path: {{ . }}
            backend:
              serviceName: {{ $fullName }}
              servicePort: {{ $svcPort }}
          {{- end }}
    {{- end }}
  {{- end }}

我在这些版本上运行:

- helm : v3.6.0
- Kubernetes : 
Client Version: version.Info{Major:"1", Minor:"19", GitVersion:"v1.19.7", GitCommit:"1dd5338295409edcfff11505e7bb246f0d325d15", GitTreeState:"clean", BuildDate:"2021-01-13T13:23:52Z", GoVersion:"go1.15.5", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"20", GitVersion:"v1.20.2", GitCommit:"faecb196815e248d3ecfb03c680a4507229c2a56", GitTreeState:"clean", BuildDate:"2021-01-13T13:20:00Z", GoVersion:"go1.15.5", Compiler:"gc", Platform:"linux/amd64"}

NAME                    NAMESPACE       CHART                           APP VERSION
kubernetes-ingress      default         kubernetes-ingress-1.15.2       1.6.2
questdb                 default         questdb-0.8.0                   6.0.3

有关原始图表和模板的更多详细信息可以在这里找到:https://github.com/questdb/questdb-kubernetes/tree/master/charts/questdb

【问题讨论】:

    标签: kubernetes kubernetes-helm kubernetes-ingress questdb


    【解决方案1】:

    Ingress 模板希望事物保持在 .Values.ingress.hosts 之下,但您的值在 .Values.ingress.rules 之下。

    此外,路径需要直接保留在主机项下,而不是在 http 下,因为入口正在使用它与 a

    {{- range .paths }}
    

    .Values.ingress.hosts 项下。而且,路径只是字符串,因为服务名称和端口直接取自 fullname.Values.service.port


    我会尝试将您的值更改为:

    ingress:
      enabled: true
      hosts:
        - host: localhost
          paths:
            - "/questdb"
            - "/influxdb"
    

    或类似的东西。

    此外,如果您添加参数--debug --dry-run,您可以尝试查看 helm upgrade 或 install 命令的输出,这可以极大地帮助您识别此类问题,并在创建时显示定义(如果有当然,在构建模板时不会出错)


    更新:由于您还更改了 Ingress 模板以使用 networking.k8s.io/v1,因此您还需要更改模板的创建方式,因为新类型的 Ingress 以不同的方式期望事物,如你可以在文档中看到:https://kubernetes.io/docs/concepts/services-networking/ingress/

    规则可能变成这样:

    rules:
    {{- range .Values.ingress.hosts }}
    - host: {{ .host | quote }}
      http:
        paths:
          {{- range .paths }}
          - path: {{ .path }}
            backend:
              service:
                name: {{ .svc }}
                port:
                  number: {{ .port }}
          {{- end }}
    {{- end }}
    

    并删除

    的声明
    {{- $fullName := include "questdb.fullname" . -}}
    {{- $svcPort := .Values.service.port -}}
    

    现在没用了。有了这个,你可以改变你的价值观如下:

    ingress:
      enabled: true
      hosts:
        - host: localhost
          paths:
            - path: "/questdb"
              svc: questdb-headless
              port: 9000
            - path: "/influxdb"
              svc: questdb-headless
              port: 9009
    

    但是您在值中指定的服务当然必须在某些地方创建(通过入口并且它需要公开所需的端口)

    【讨论】:

    • 我尝试了 --debug --dry-run 选项,它似乎抱怨找不到 serviceName 和 servicePort。我应该如何在覆盖 values.yaml 中指定它们?错误:升级失败:错误验证“”:错误验证数据:[ValidationError(Ingress.spec.rules[0].http.paths[0].backend):io.k8s.api.networking 中的未知字段“serviceName”。 v1.IngressBackend, ValidationError(Ingress.spec.rules[0].http.paths[0].backend): io.k8s.api.networking.v1.IngressBackend 中的未知字段“servicePort”,
    • 这是因为您将定义更改为使用networking.k8s.io/v1,但您没有更改模板。新的 Ingress 资源定义期望事物以不同的路径和不同的方式出现。我会修改我的答案来解释
    • 谢谢,我必须在 ingress.yaml 中添加一个额外的“pathType : {{ .pathType }}”,然后在 values.yaml 中添加“pathType: Prefix”,然后我就可以成功安装 helm chart
    猜你喜欢
    • 2019-08-08
    • 2019-03-03
    • 2021-06-23
    • 1970-01-01
    • 2018-07-18
    • 2020-01-09
    • 1970-01-01
    • 1970-01-01
    • 2019-06-19
    相关资源
    最近更新 更多