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