我正在尝试为kubernetes 1.26.3实现nginx入口控制器。我正在使用rancher桌面1.8.1在本地机器上进行测试。截至本文发布,所有内容都是最新版本。如果重要的话,我用容器。我是k8s的新手,我发现很难根据例子找出问题所在。
我在8080端口上的集群中运行了一个服务游戏核心服务,我可以通过在pod中sshing或使用浏览器并将服务设置为节点端口来测试它的工作情况。
现在我试图设置nginxingress来替换nodeport,因为nodeport不是公开服务的好选择。我想通过调用localhost:80/myservice从poster外部调用我的kubernetes服务。我用以下命令安装了控制器:
- 安装说明
- helm repo添加nginx稳定https://helm.nginx.com/stable
- helm回购更新
- 头盔安装nginx-ingress-v1 nginx稳定/nginx入口--跳过crd
即使没有收到错误消息,我也不确定它是否安装干净。我看到在我的默认命名空间中添加了一个名为nginx-ingress-v1-controller的pod正在运行。我还看到一个名为svclb-nginx-ingress-v1-controller的pod/deployment被添加到kube系统中,但它处于挂起状态。我认为设置不正确,但不清楚如何调试或发现错误。或者,在我设置其他配置之前,它应该是挂起的。。我迷路了。
然后我通过kubectl应用了这个ingress.yaml:
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: /
pathType: Prefix
backend:
service:
name: game-core-service
port:
number: 80
关于这个yaml,很少有什么事情是完全不清楚的:
- 我们真的需要ingressClassName吗?还是只有当您有多个入口控制器时才需要。定义默认ingress类的例子似乎没有引用nginx,所以不知道它们对我所做的事情是否正确(一个例子会很好)
- backend.service.port指的是传入端口号还是服务运行的端口?理想情况下,我会将端口80或443上的任何内容转发到端口8080上的服务
如果您能回答这些问题,我们将不胜感激。谢谢
看起来您已经陷入了手动配置kubernetes rabbits的陷阱。Kubernetes最大的问题之一是有数百万种方法可以获得相同的结果。
你正走在正确的轨道上,但对你来说,掌舵为你驾驶一切可能会更快。
TLDR答案
我们真的需要ingressClassName吗?还是只有在您具有多个入口控制器。定义默认值的示例ingress类似乎没有引用nginx,所以不知道它们是否是纠正我所做的(举个例子就好了)
我相信还有其他方法可以配置它,但我要使用的方法是将ingressClassName定义为nginx
。
backend.service.port是指传入端口号还是服务运行的端口?我最好转发任何关于端口80或443到端口8080 上的服务
后端服务是docker容器运行的端口。你真的不需要担心这一点,因为kubernetes可以为你处理所有这些。
冗长的答案
如果使用helm进行安装,则可以选择在安装过程中使用values.yaml文件。这个文件是你所追求的所有旋钮的所在地。values.yaml文件将根据您选择安装的helm repo而有所不同。看起来你正在使用NGINX官方回购,你可以在这里找到官方价值。
首先要做的是下载该文件的本地副本,并根据您的目的对其进行编辑。我建议先尝试使用它,尽可能少地进行编辑——我刚刚提取了那个版本,并将其应用到我的开发集群中,像podinfo这样的应用程序立即工作起来。
现在,对于不明显的部分,有几种方法可以发布服务:
- URL路由ie.test.com/myapp
- DNS命名应用程序ie.myapp.test.com
我个人偏好使用DNS名称,但这取决于您的用例。
让我们使用podinfo来演示如何将应用程序配置为使用ingress nginx作为其入口。
URL路由
- 下载podinfo的values.yaml并将其保存在本地
- 编辑values.yaml文件并找到
ingress:
部分。这将是您安装的大多数/所有舵图中的常见部分 - 按如下方式将主机添加到您的ingress,确保添加您希望让ingress nginx为应用程序提供服务的路径
ingress:
enabled: true
className: "nginx"
annotations:
kubernetes.io/ingress.class: nginx
hosts:
- host: test.com
paths:
- path: /podinfo
pathType: ImplementationSpecific
- 将其添加到您的podinfo values.yaml后,您需要按照如下方式安装podinfo helm图表:
helm upgrade --install --wait podinfo --namespace podinfo --values values.yaml oci://ghcr.io/stefanprodan/charts/podinfo
- 过了一会儿,您应该会看到一个入口出现在podinfo命名空间中:
root@dev:~# kubectl get ingress -n podinfo -o yaml
apiVersion: v1
kind: List
items:
- apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
kubernetes.io/ingress.class: nginx
meta.helm.sh/release-name: podinfo
meta.helm.sh/release-namespace: podinfo
labels:
app.kubernetes.io/managed-by: Helm
app.kubernetes.io/name: podinfo
app.kubernetes.io/version: 6.3.5
helm.sh/chart: podinfo-6.3.5
name: podinfo
namespace: podinfo
spec:
ingressClassName: nginx
rules:
- host: test.com
http:
paths:
- backend:
service:
name: podinfo
port:
number: 9898
path: /podinfo
pathType: ImplementationSpecific
status:
loadBalancer:
ingress:
- ip: 10.20.20.100
请注意,输出正确地显示了路径和主机值,并且在注释中,ingress.class被设置为nginx,这就是告诉nginx提供这些内容的原因。
DNS路由
这个方法几乎与上面的方法完全相同,只是在values.yaml文件中,您将路径保留为/
,主机是您希望用于应用程序的dns名称,如下所示:
ingress:
enabled: true
className: "nginx"
annotations:
kubernetes.io/ingress.class: nginx
hosts:
- host: podinfo.test.com
paths:
- path: /
pathType: ImplementationSpecific
一旦你应用了这个值。yaml,你应该会看到以下内容:
root@dev:~# kubectl get ingress -n podinfo -o yaml
apiVersion: v1
kind: List
items:
- apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
kubernetes.io/ingress.class: nginx
meta.helm.sh/release-name: podinfo
meta.helm.sh/release-namespace: podinfo
labels:
app.kubernetes.io/managed-by: Helm
app.kubernetes.io/name: podinfo
app.kubernetes.io/version: 6.3.5
helm.sh/chart: podinfo-6.3.5
name: podinfo
namespace: podinfo
spec:
ingressClassName: nginx
rules:
- host: podinfo.test.com
http:
paths:
- backend:
service:
name: podinfo
port:
number: 9898
path: /
pathType: ImplementationSpecific
status:
loadBalancer:
ingress:
- ip: 10.20.20.100
我希望这能有所帮助。我最喜欢的Kubernetes网站之一是David Young的《极客食谱》。他的网站上有一些记录良好的例子,展示了K8S堆栈上有用的应用程序,最重要的是如何配置它们。