Helm 图表和 Ingress 资源

Wha*_*hat 5 kubernetes kubernetes-helm kubernetes-ingress nginx-ingress ingress-controller

我对 K8s 还很陌生。

我正在努力让我的应用程序对外界可见。我已经在我的应用程序中部署了这个Nginx Ingress Controller,使用 Helm 和helmfile,它为我提供了外部 IP 地址和负载均衡器。

据我了解,我现在需要ingress resource配置路由映射。

我计划使用这个入口资源作为起点。

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: minimal-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  ingressClassName: nginx-example
  rules:
  - http:
      paths:
      - path: /testpath
        pathType: Prefix
        backend:
          service:
            name: test
            port:
              number: 80
Run Code Online (Sandbox Code Playgroud)

我的应用程序部署在端口 80 上的单独命名空间中。

我的问题是:我应该将用于创建资源的 yaml 放在哪里?

如果可能的话,我希望将所有内容保留在 Helm 中,以便更轻松地管理配置,因此kubectl除非必须,否则我不想使用。

我的头盔文件

repositories:
 
- name: stable
  url: https://charts.helm.sh/stable
- name: nginx-stable
  url: https://helm.nginx.com/stable

releases:

  # other apps configured here

  - name: ingress-nginx
    namespace: ingress
    createNamespace: true
    chart: nginx-stable/nginx-ingress
    values:
      - ./ingress/values.yaml
    version: 0.10.4
    installed: true 
Run Code Online (Sandbox Code Playgroud)

我的入口控制器values.yaml:

---
rbac:
  create: true

serviceAccount:
  create: true
  name: nginx-ingress-public

controller:
  ingressClassResource:
    enabled: true
    default: true

  replicaCount: 3
  minAvailable: 3
  updateStrategy:
    rollingUpdate:
      maxSurge: 3
      maxUnavailable: 0
Run Code Online (Sandbox Code Playgroud)

The*_*ool 6

您应该仅部署入口控制器一次,因为它可以处理整个集群的所有入口流量。

有时部署多个是有意义的,例如我们运行 2 个入口控制器。1 个用于内部流量(私有 IP),1 个用于外部流量(公共 IP)。

一旦你有了它,你只需告诉你的其他 helm 版本使用它的入口类。

入口清单通常是 Helm Chart 的模板。所以你把它放在模板中。如果您这样做helm create my-app,您将获得一个良好的起点,包括入口。

一旦图表中有入口模板,您就可以像往常一样将此模板的一些合理默认值添加到图表的 value.yaml 中。

部署图表时,您可以使用某些标志来覆盖默认值。即-f--set

  • @WhatTheWhat,是的,值文件用于设置模板目录中模板使用的默认值。安装图表时,您可以使用 -f 或 --set 标志覆盖这些设置。 (2认同)

Ash*_*h K 1

这是使用 Ingress 的分步指南。

完整源代码在这里

第 1 步:创建舵图

helm create test-app-api
Run Code Online (Sandbox Code Playgroud)

步骤 2:安装 Ingress 控制器

该命令负责安装它。参考

helm upgrade --install ingress-nginx ingress-nginx \
  --repo https://kubernetes.github.io/ingress-nginx \
  --namespace ingress-nginx --create-namespace
Run Code Online (Sandbox Code Playgroud)

将部署一个 pod,您可以检查:

kubectl -n ingress-nginx get pod -o yaml
Run Code Online (Sandbox Code Playgroud)

您需要从此控制器获取的信息将ingressClassName被放入您的values.yaml文件中,最终将其写入ingress.yaml文件。

ingressClassName通过运行以下命令查找控制器的:kubectl get ingressclasses或通过 K8s 仪表板查找。

命令方式:

仪表板方式:

第 3 步:更新中的入口部分values.yaml

test-app-api: 
  # Other settings ...
  ingress:
    enabled: true
    className: nginx   # <--- ADD THIS GUY
    annotations:
      # Reference: https://kubernetes.github.io/ingress-nginx/examples/rewrite/
      nginx.ingress.kubernetes.io/use-regex: "true"
      nginx.ingress.kubernetes.io/rewrite-target: /$2
    hosts:
      - host: chart-example.local
        paths:
          - path: /my-test-app(/|$)(.*)
            pathType: ImplementationSpecific
  # Other settings...
Run Code Online (Sandbox Code Playgroud)

第 4 步:部署

helm upgrade --install test-app-release . \
--namespace=local \
--set test-app-api.image.tag="0.1.0" \
--create-namespace \
--debug \
--dry-run
Run Code Online (Sandbox Code Playgroud)

进行一次试运行以检查清单,如果一切看起来都不错,则运行不带--dry-run标志的命令。

第 5 步:更新主机文件

检查您部署的入口以查看分配给您的主机的地址,因为您将使用该地址来更新您的主机文件。

kubectl get ingress -n local
Run Code Online (Sandbox Code Playgroud)

还可以在控制器日志中看到:

W1119 05:14:31.194021       7 controller.go:1214] Service "local/test-app-release-test-app-api" does not have any active Endpoint.
I1119 05:15:19.437846       7 status.go:304] "updating Ingress status" namespace="local" ingress="test-app-release-test-app-api" currentValue=null newValue=[{"hostname":"localhost"}]
Run Code Online (Sandbox Code Playgroud)

现在将此映射添加到主机文件中。(我在 Mac 上使用 vim 编辑主机文件。)

sudo vim /etc/hosts
Run Code Online (Sandbox Code Playgroud)

在主机文件底部输入服务器 IP 地址,后跟一个空格,然后是域名。

保存并退出:wq

第 6 步:测试应用程序

现在,您应该能够从集群外部访问该应用程序。
例如: http://chart-example.local/my-test-app/weatherforecast