我想让 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)来生成您的app1
、app2
和您的mysql
。我将包括公开示例应用程序的指南,例如您在此答案末尾提到的示例应用程序。
至于kubeadm
:
Kubeadm 执行必要的操作,使最小可行集群启动并运行。根据设计,它只关心引导,而不关心置备计算机。
Kubernetes.io:库贝德姆
简而言之,kubeadm
在机器(裸机、虚拟机)上使用,以运行配置Kubernetes集群的步骤(假设操作系统已安装、配置等)。
小费!
minikube
正在使用kubeadm
来预配其单节点群集。
2:我不应该能够创建另一个负载均衡器吗?我想要,所以选择器在该负载均衡器中将是 app2,但由于我已经有一个,新的选择器会一直保留到我删除第一个。但是当我安装 nginx-ingress 控制器时,它带有一个类型的 loadBalancer,如果我创建一个具有相同内容的 yaml,更改端口它将起作用并且不会保持挂起状态......为什么?
我们需要在这里区分 2 个术语:
-
类型
LoadBalancer
的服务 - 用于使用云提供商的负载均衡器在外部公开应用。在minikube
或docker
等解决方案中,它通常映射到 VM 的 IP (minikube
) 或本地托管您的计算机 (Docker) -
Ingress
资源 - 将 HTTP 和 HTTPS 路由从群集外部公开到群集内的服务。流量路由由入口资源上定义的规则控制。
根据我的经验,LoadBalancer
类型的服务主要使用资源在Layer7
Ingress
运行Layer4
。LoadBalancer
不会根据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 的有用指南。要让您的app1
和app2
访问您的mysql
容器,您可以使用类型ClusterIP
或headlessService
的服务。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
及其关联的服务 - 编辑类型
LoadBalancer
的nginx-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
免責聲明!
- 尝试在基于 Windows 和 Mac 的环境之间执行此步骤时可能会有所不同
- 尝试在
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
编辑类型为LoadBalancer
的nginx-ingress
服务
您需要编辑nginx-ingress-controller
类型为LoadBalancer
的服务,以支持80
和443
以外的端口。
$ 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