我对 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
---
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
您应该仅部署入口控制器一次,因为它可以处理整个集群的所有入口流量。
有时部署多个是有意义的,例如我们运行 2 个入口控制器。 1 个用于内部流量(私有 IP),1 个用于外部流量(公共 IP)。
一旦你有了它,你只需告诉你的其他 helm 版本使用它的入口类。
入口清单通常是 Helm Chart 的模板。所以你把它放在模板中。如果您这样做
helm create my-app
,您将获得一个良好的起点,包括入口。
图表中拥有入口模板后,您可以像往常一样将此模板的一些合理默认值添加到图表的values.yaml中。
部署图表时,您可以使用某些标志来覆盖默认值。即
-f
和 --set
。
这是使用 Ingress 的分步指南。
helm create test-app-api
按照此处的说明进行操作。我正在使用 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 仪表板找到它。
命令方式:
仪表板方式:
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...
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
标志的命令。
检查您部署的入口以查看分配给您的主机的地址,因为您将使用该地址来更新您的主机文件。
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
保存并退出。
现在,您应该能够使用以下方式访问该应用程序:
http://chart-example.local/my-test-app/weatherforecast