Helm 图表和 Ingress 资源

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

我对 K8s 还很陌生。

我正在努力让我的应用程序对外界可见。我已经使用 Helm 和 helmfile 在我的应用程序中部署了 this Nginx Ingress Controller,这为我提供了外部 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

我的应用程序部署在端口 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 

我的入口控制器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
kubernetes kubernetes-helm kubernetes-ingress nginx-ingress ingress-controller
2个回答
6
投票

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

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

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

入口清单通常是 Helm Chart 的模板。所以你把它放在模板中。如果您这样做

helm create my-app
,您将获得一个良好的起点,包括入口。

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

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

-f
--set


0
投票

这是使用 Ingress 的分步指南。

完整源代码这里

第 1 步:创建舵图

helm create test-app-api

第2步:安装Ingress控制器

按照此处的说明进行操作。我正在使用 Docker Desktop Kubernetes 环境。

helm upgrade --install ingress-nginx ingress-nginx \
  --repo https://kubernetes.github.io/ingress-nginx \
  --namespace ingress-nginx --create-namespace

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

kubectl -n ingress-nginx get pod -o yaml

您需要从此控制器获得的信息是

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...

第 4 步:部署

helm upgrade --install test-app-release . \
--namespace=local \
--set test-app-api.image.tag="0.1.0" \
--set test-app-service.image.tag="0.1.0" \
--create-namespace \
--debug \
--dry-run

进行一次试运行以检查清单,如果一切看起来都不错,则运行不带

dry-run
标志的命令。

第 5 步:更新主机文件

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

kubectl get ingress -n local

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

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"}]

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

sudo vim /etc/hosts

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

使用

:wq
保存并退出。

第 6 步:测试应用程序

现在,您应该能够使用以下方式访问该应用程序:
http://chart-example.local/my-test-app/weatherforecast

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