kubernetes-Ingress 资源未按预期工作,无法使用子域公开 2 个应用



我想让 2 个应用程序在 kubernetes 上运行,使用入口资源指向同一端口中的每个应用程序。

我应该能够在app1.localhost:8181/cxf中访问 app1 版本,在app2.localhost:8181/cxf中访问 app2 版本

我使用 docker 和 kubernetes,mysql 和 karaf 与 kar。我正在本地测试(本地主机)。

我尝试了很多在互联网上搜索的东西,包括向主机添加ip +主机名,但没有运气。发生的情况是它始终显示相同的应用程序,与我插入的主机名无关紧要。

在分享我的 yamls 之前,我有一些问题:

1: 我在想也许我应该有 2 个节点?一个使用 MySQL 和 App1,另一个使用 MySQL 和 App2?所以在一个我可以访问app1.localhost/cxf服务,而在另一个app2.localhost/cxf服务中......也许没有多大意义...我读到我需要 kubeadm 为此,并且无法将其安装在 Windows 上。我想我必须为此使用迷你库贝?

阿拉伯数字: 我不应该能够创建另一个负载均衡器吗?我想要,所以选择器在该负载均衡器中将是 app2,但由于我已经有一个,新的选择器只会保持<pending>,直到我删除第一个。 但是当我安装 nginx-ingress 控制器时,它带有一个类型的 loadBalancer,如果我创建一个具有相同内容的 yaml,更改端口它将起作用并且不会保持挂起状态......为什么?

3: 如果我有 app1 的 2 个副本和 app2 的 2 个副本,每个应用应该有一个负载均衡器,对吗?

4: 我应该为 mysql 包含一个 loadBalancer 吗?拥有 MySQL 副本有意义吗?

5: 自从我安装 nginx-controller 时,当我检查我的 kubernetes 仪表板时,它附带了一个 loadBalancer。可以编辑和添加我的 karaf 端口以公开服务吗?

请注意,我使用 helm 安装了 nginx 入口控制器,因为否则入口资源将无法工作,至少这是我读到的。我为此使用了头盔:https://github.com/kubernetes/ingress-nginx/blob/master/docs/deploy/index.md#using-helm

注意:mysql 工作正常,所以我没有在这里发布 yaml,所以它不会太长。

这些是我的山药:

负载均衡器:(我可以将其替换为 nginx 负载均衡器?

apiVersion: v1
kind: Service
metadata:
name: lb-service
spec:
type: LoadBalancer
selector:
app: app1
ports:
- protocol: TCP
name: app1
port: 3306
targetPort: 3306
- protocol: TCP
name: app1-8080
port: 8080
targetPort: 8080
- protocol: TCP
name: app1-8101
port: 8101
targetPort: 8101
- protocol: TCP
name: app1-8181
port: 8181
targetPort: 8181
status:
loadBalancer:
ingress:
- hostname: localhost

应用1:

apiVersion: v1
kind: Service
metadata:
name: app1-service
spec:
ports:
- port: 8101
selector:
app: app1
clusterIP: None
---
apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2
kind: Deployment
metadata:
name: app1-deployment
spec:
selector:
matchLabels:
app: app1
replicas: 1
template:
metadata:
labels:
app: app1
spec:
containers:
- name: app1
image: app1:latest

App2:与 App1相同,但版本不同(旧服务)

入口资源:(这不起作用)

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: apps-ingress
#annotations:
#nginx.ingress.kubernetes.io/rewrite-target: /$1
spec:
rules:
- host: app1.localhost
http:
paths:
- path: /
backend:
serviceName: app1-service
servicePort: 8181
- host: app2.localhost
http:
paths:
- path: /
backend:
serviceName: app2-service
servicePort: 8181

呵呵,我在这里错过了一些东西...

谢谢你的时间!

编辑:

我想我发现了问题,我现在正在尝试解决它。 似乎入口仅在端口 80 中适用于 http,并且我使用 cxf 在端口 8181 下列出我的服务。和 8080 用于肥皂服务。 所以我想我必须公开这些端口,我会没事的?去试试看

编辑2:我试过了,但它不起作用,我遵循了这个例子:https://kubernetes.io/docs/tasks/access-application-cluster/ingress-minikube/

该示例工作正常,但是当我更改入口以使用我的应用程序时,它不起作用。 我需要访问 :8181/cxf 才能让我的应用程序正常工作,有什么办法可以做到这一点吗? 由于入口使用端口 80,当我输入app1.localhost时,它与app1.localhost:80相同,对吗?问题是,我需要app1.localhost:8181/cxf才能访问我的服务。但我想这会翻译成:app1.localhost:80:8181/cxf??

有人可以帮忙吗?:( 当我说端口 8181 时,我想我可以使用另一个nodePort:这基本上是端口转发,对吧?但是如果我这样做,问题是,当我想部署我的第二个应用程序以访问app2.localhost如果我放置相同的nodePort它将以错误结束,因为我希望端口相同,但不同的主机名。

在帖子中回答问题:

1:我在想也许我应该有 2 个节点? 一个使用 MySQL 和 App1,另一个使用 MySQL 和 App2? 所以在一个我可以访问app1.localhost/cxf服务,在另一个app2.localhost/cxf服务中......也许没有多大意义...我读到我需要 kubeadm 为此,并且无法将其安装在 Windows 上。我想我必须为此使用迷你库贝?

不需要有 2 个节点。您可以使用单节点 Kubernetes 安装,例如minikube或 Docker Desktop(使用 Kubernetes)来生成您的app1app2和您的mysql。我将包括公开示例应用程序的指南,例如您在此答案末尾提到的示例应用程序。

至于kubeadm

Kubeadm 执行必要的操作,使最小可行集群启动并运行。根据设计,它只关心引导,而不关心置备计算机。

Kubernetes.io:库贝德姆

简而言之,kubeadm在机器(裸机、虚拟机)上使用,以运行配置Kubernetes集群的步骤(假设操作系统已安装、配置等)。

小费!

minikube正在使用kubeadm来预配其单节点群集。


2:我不应该能够创建另一个负载均衡器吗?我想要,所以选择器在该负载均衡器中将是 app2,但由于我已经有一个,新的选择器会一直保留到我删除第一个。但是当我安装 nginx-ingress 控制器时,它带有一个类型的 loadBalancer,如果我创建一个具有相同内容的 yaml,更改端口它将起作用并且不会保持挂起状态......为什么?

我们需要在这里区分 2 个术语:

  • 类型LoadBalancer的服务 - 用于使用云提供商的负载均衡器在外部公开应用。在minikubedocker等解决方案中,它通常映射到 VM 的 IP (minikube) 或本地托管您的计算机 (Docker)

  • Ingress资源 - 将 HTTP 和 HTTPS 路由从群集外部公开到群集内的服务。流量路由由入口资源上定义的规则控制。

根据我的经验,LoadBalancer类型的服务主要使用资源在Layer7Ingress运行Layer4LoadBalancer不会根据Host标头路由流量。它将根据您的服务和Deployment的标签和选择器进行路由。Ingress资源旨在为HTTP/HTTPS流量提供服务。它将包含根据Host标头路由流量的工具。

这是公开应用的 2 种不同方式,应被视为不同。

小费!

nginx-ingress正在使用类型LoadBalancer的服务将流量路由到nginx-ingress-controller。从那里进行分析并发送到特定目的地(根据Ingress资源)!

您在External-IP列中具有Pending的事实可能与以下事实有关:已使用LoadBalancer类型服务中使用的端口(port参数)。


3:如果我有 app1 的 2 个副本和 app2 的 2 个副本,每个应用程序应该有一个负载均衡器,对吗?

对于每个应用程序,您需要有一个LoadBalancer.您的应用程序有多少副本(甚至可以是 100)并不重要。基于上一句:

  • app1-LoadBalancer型第1次服务
  • app2-LoadBalancer型的第二次服务

在公开应用程序时,我尝试像下面这样想(它真的很简化):

  • 我正在公开不是HTTP/HTTPS的流量 -LoadBalancer类型的服务
  • 我正在公开一些示例应用程序/应用程序,我需要具有Ingress功能(基于Host的路由,重写,SSL等) -Ingress资源

免責聲明!

公开具有Ingress资源的应用时,无需使用类型LoadBalancer的服务。


4: 我应该为 mysql 包含一个 loadBalancer 吗? 拥有 MySQL 副本有意义吗?

有很多关于在 Kubernetes 中部署 mysql 的有用指南。要让您的app1app2访问您的mysql容器,您可以使用类型ClusterIPheadlessService的服务。mysql的多个副本肯定会提高多节点群集中的容错能力,但它需要已经包含某种复制逻辑。

您可以通过以下链接阅读更多信息:

  • Kubernetes.io:文档:定义服务
  • Kubernetes.io:文档:无外设服务
  • Kubernetes.io:文档:运行复制的有状态应用程序

5:自从我安装 nginx-controller 时,当我检查我的 kubernetes 仪表板时,它附带了一个 loadBalancer。可以编辑和添加我的 karaf 端口以公开服务吗?

在专门为ingress-nginx-controller创建预配ingress-nginx-controller时创建的类型LoadBalancer的服务。

如果您想公开您的karaf您可以选择:

  • 根据Ingress资源的规范使用ingress-nginx-controller公开它。
  • 通过 TCP/UDP 服务nginx-ingress-controller公开它(它不会有Ingress资源的功能):
  • 使用另一个类型为LoadBalancer的服务示例公开它


本指南旨在与安装了 Kubernetes 的Docker Desktop配合使用

假设您要:

我应该能够在 app1.localhost:8181/cxf 中访问 app1 版本,在 app2.localhost:8181/cxf 中访问 app2 版本

假设你有一个带有 Docker 桌面的 Kubernetes 实例,你需要遵循以下示例:

  • 安装nginx-ingress
  • 生成示例应用hello-one及其关联的服务
  • 生成示例应用hello-two及其关联的服务
  • 编辑类型LoadBalancernginx-ingress服务
  • 创建和应用Ingress资源
  • 进行一些 DNS 更改
  • 测试
<小时 />

安装nginx-ingress

跑:

$ kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v0.35.0/deploy/static/provider/cloud/deploy.yaml

免責聲明!

  1. 尝试在基于 Windows 和 Mac 的环境之间执行此步骤时可能会有所不同
  2. 尝试在minikube实例上执行此步骤时可能存在差异

安装页面:

  • Kubernetes.github.io:入口:部署

生成hello-one示例应用及其关联的服务

下面是hello-one应用的定义:

apiVersion: apps/v1
kind: Deployment
metadata:
name: hello-one
spec:
selector:
matchLabels:
app: hello-one
version: 1.0.0
replicas: 1
template:
metadata:
labels:
app: hello-one
version: 1.0.0
spec:
containers:
- name: hello
image: "gcr.io/google-samples/hello-app:1.0" # <-- notice the 1.0
env:
- name: "PORT"
value: "50001"

下面是hello-one应用服务的定义:

apiVersion: v1
kind: Service
metadata:
name: hello-one-service
spec:
type: NodePort
selector:
app: hello-one
version: 1.0.0
ports:
- name: hello-one-port
protocol: TCP
port: 80
targetPort: 50001

Spawnhello-two示例应用和与之关联的服务

以下是hello-two应用的定义:

apps/v1
kind: Deployment
metadata:
name: hello-two
spec:
selector:
matchLabels:
app: hello-two
version: 2.0.0
replicas: 1
template:
metadata:
labels:
app: hello-two
version: 2.0.0
spec:
containers:
- name: hello
image: "gcr.io/google-samples/hello-app:2.0" # <-- notice the 2.0
env:
- name: "PORT"
value: "50001"

下面是hello-two应用的服务的定义:

apiVersion: v1
kind: Service
metadata:
name: hello-two-service
spec:
type: NodePort
selector:
app: hello-two
version: 2.0.0
ports:
- name: hello-two-port
protocol: TCP
port: 80
targetPort: 50001

编辑类型为LoadBalancernginx-ingress服务

您需要编辑nginx-ingress-controller类型为LoadBalancer的服务,以支持80443以外的端口。

  • $ kubectl edit service -n ingress-nginx ingress-nginx-controller

负责路由的部分:

ports:
- name: http
nodePort: 32202
port: 80 # <-- CHANGE HERE FOR 8181!
protocol: TCP
targetPort: http
- name: https
nodePort: 31130
port: 443 # <-- CHANGE HERE FOR 8182!
protocol: TCP
targetPort: https

创建并应用Ingress资源

您需要使用以下Ingress资源才能访问您的应用程序:

  • hello-one.kubernetes.local:8181/cxf
  • hello-two.kubernetes.lcoal:8181/cxf
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: hello-ingress 
spec:
rules:
- host: hello-one.kubernetes.docker.internal
http:
paths:
- path: /
backend:
serviceName: hello-one-service 
servicePort: hello-one-port
- host: hello-two.kubernetes.docker.internal
http:
paths:
- path: /
backend:
serviceName: hello-two-service 
servicePort: hello-two-port

免責聲明!

Ingress未配置/cxf路径。您可以在此处查看更多资源:

  • Kubernetes.github.io:入口路径匹配

进行一些 DNS 更改

您需要编辑主机的 DNS 设置以支持新创建的host名称。这部分将取决于您使用的操作系统。要添加的行:

127.0.0.1 hello-one.kubernetes.docker.internal
127.0.0.1 hello-two.kubernetes.docker.internal
<小时 />

测试

您可以通过curl或 Web 浏览器测试您的设置:

  • $ curl hello-one.kubernetes.docker.internal:8181
Hello, world!
Version: 1.0.0
Hostname: hello-one-696db54c4d-5fqt8
  • $ curl hello-two.kubernetes.docker.internal:8181
Hello, world!
Version: 2.0.0
Hostname: hello-two-664ddf4cf6-4jhfr

相关内容

  • 没有找到相关文章

最新更新