Ingress 不转发请求 - 适用于 Windows 和 kubernetes 的 Docker 桌面

2024-01-07

EDIT:

我删除了 minikube,在 Windows 的 Docker 桌面中启用了 kubernetes 并安装ingress-nginx手动。

$helm upgrade --install ingress-nginx ingress-nginx --repo https://kubernetes.github.io/ingress-nginx --namespace ingress-nginx --create-namespace
Release "ingress-nginx" does not exist. Installing it now.
Error: rendered manifests contain a resource that already exists. Unable to continue with install: ServiceAccount "ingress-nginx" in namespace "ingress-nginx" exists and cannot be imported into the current release: invalid ownership metadata; annotation validation error: missing key "meta.helm.sh/release-name": must be set to "ingress-nginx"; annotation validation error: missing key "meta.helm.sh/release-namespace": must be set to "ingress-nginx"

它给了我一个错误,但我认为这是因为我之前已经这样做了,因为:

$kubectl get svc -n ingress-nginx
NAME                                 TYPE           CLUSTER-IP       EXTERNAL-IP   PORT(S)                      AGE
ingress-nginx-controller             LoadBalancer   10.106.222.233   localhost     80:30199/TCP,443:31093/TCP   11m
ingress-nginx-controller-admission   ClusterIP      10.106.52.106    <none>        443/TCP                      11m

然后再次应用我的所有 yaml 文件,但这次 ingress 没有获取任何地址:

$kubectl get ing
NAME                CLASS    HOSTS       ADDRESS   PORTS   AGE
myapp-ingress       <none>   myapp.com             80      10m

我正在使用 docker 桌面(Windows)并通过 minikube addons enable 命令安装了 nginx-ingress 控制器:

$kubectl get pods -n ingress-nginx
NAME                                        READY   STATUS      RESTARTS   AGE
ingress-nginx-admission-create--1-lp4md     0/1     Completed   0          67m
ingress-nginx-admission-patch--1-jdkn7      0/1     Completed   1          67m
ingress-nginx-controller-5f66978484-6mpfh   1/1     Running     0          67m

并应用了我所有的 yaml 文件:

$kubectl get svc --all-namespaces -o wide
NAMESPACE       NAME                                 TYPE           CLUSTER-IP       EXTERNAL-IP   PORT(S)                      AGE   SELECTOR
default         event-service-svc                    ClusterIP      10.108.251.79    <none>        80/TCP                       16m   app=event-service-app
default         kubernetes                           ClusterIP      10.96.0.1        <none>        443/TCP                      16m   <none>
default         mssql-clusterip-srv                  ClusterIP      10.98.10.22      <none>        1433/TCP                     16m   app=mssql
default         mssql-loadbalancer                   LoadBalancer   10.109.106.174   <pending>     1433:31430/TCP               16m   app=mssql
default         user-service-svc                     ClusterIP      10.111.128.73    <none>        80/TCP                       16m   app=user-service-app
ingress-nginx   ingress-nginx-controller             NodePort       10.101.112.245   <none>        80:31583/TCP,443:30735/TCP   68m   app.kubernetes.io/component=controller,app.kubernetes.io/instance=ingress-nginx,app.kubernetes.io/name=ingress-nginx
ingress-nginx   ingress-nginx-controller-admission   ClusterIP      10.105.169.167   <none>        443/TCP                      68m   app.kubernetes.io/component=controller,app.kubernetes.io/instance=ingress-nginx,app.kubernetes.io/name=ingress-nginx
kube-system     kube-dns                             ClusterIP      10.96.0.10       <none>        53/UDP,53/TCP,9153/TCP       72m   k8s-app=kube-dns

所有 Pod 和服务似乎都运行正常。检查 Pod 日志,所有迁移等均已生效,并且应用程序已启动并运行。但是当我尝试发送 HTTP 请求时,出现套接字挂断错误。我检查了所有 Pod 的所有日志,找不到任何有用的内容。

$kubectl get ingress
NAME                CLASS   HOSTS           ADDRESS     PORTS   AGE
myapp-ingress   nginx   myapp.com       localhost   80      74s

这也有点奇怪,我希望 ADRESS 设置为 IP,而不是本地主机。因此,在 /etc/hosts 中添加 myapp.com 的 127.0.0.1 条目似乎也不太正确。

我的问题是我可能做错了什么?或者我如何追踪我的请求被转发到哪里?

入口-svc.yaml

  apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: myapp-ingress
    spec:
      rules:
      - host: myapp.com
        http:
          paths:
          - path: /api/Users
            pathType: Prefix
            backend:
              service:
                name: user-service-svc
                port:
                  number: 80
          - path: /api/Events
            pathType: Prefix
            backend:
              service:
                name: event-service-svc
                port:
                  number: 80

事件-depl.yaml:

  apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: event-service-app
      labels:
        app: event-service-app
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: event-service-app
      template:
        metadata:
          labels:
            app: event-service-app
        spec:
          containers:
            - name: event-service-app
              image: ghcr.io/myapp/event-service:master
              imagePullPolicy: Always
              ports:
                - containerPort: 80
          imagePullSecrets:
            - name: myapp
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: event-service-svc
    spec:
      selector:
        app: event-service-app
      ports:
        - protocol: TCP
          port: 80
          targetPort: 80

再生产

我使用 minikube 重现了这个案例v1.24.0, Docker 桌面4.2.0, 引擎20.10.10

First, localhostingress 中的出现是出于逻辑原因,域后面的 IP 地址是什么并不重要/etc/hosts,我添加了一个不同的测试,但它仍然显示 localhost。仅有的metallb将提供来自设置网络的 IP 地址。

会发生什么

当 minikube 驱动程序为docker,minikube 创建一个大容器(VM),在其中运行 kubernetes 组件。这可以通过运行来检查docker ps主机系统中的命令:

$ docker ps

CONTAINER ID   IMAGE                                 COMMAND                  CREATED          STATUS          PORTS                                                                                                                                  NAMES
f087dc669944   gcr.io/k8s-minikube/kicbase:v0.0.28   "/usr/local/bin/entr…"   16 minutes ago   Up 16 minutes   127.0.0.1:59762->22/tcp, 127.0.0.1:59758->2376/tcp, 127.0.0.1:59760->5000/tcp, 127.0.0.1:59761->8443/tcp, 127.0.0.1:59759->32443/tcp   minikube

进而minikube ssh进入这个容器并运行docker ps查看所有 Kubernetes 容器。

向前进。介绍之前ingress,已经很清楚,即使NodePort不按预期工作。让我们检查一下。

有两种方式获取minikube VM IP:

  1. run minikube IP
  2. kubectl get nodes -o wide并找到节点的IP

接下来会发生什么NodePort请求应该发送至minikube_IP:Nodeport虽然它不起作用。发生这种情况是因为 minikube VM 内的 docker 容器没有暴露在集群之外(另一个 docker 容器)。

On minikube要访问集群内的服务,有一个特殊的命令 -minikube service %service_name% https://minikube.sigs.k8s.io/docs/commands/service/这将创建一个到内部服务的直接隧道minikube VM(你可以看到它包含service URL with NodePort应该可以工作):

$ minikube service echo

|-----------|------|-------------|---------------------------|
| NAMESPACE | NAME | TARGET PORT |            URL            |
|-----------|------|-------------|---------------------------|
| default   | echo |        8080 | http://192.168.49.2:32034 |
|-----------|------|-------------|---------------------------|
* Starting tunnel for service echo.
|-----------|------|-------------|------------------------|
| NAMESPACE | NAME | TARGET PORT |          URL           |
|-----------|------|-------------|------------------------|
| default   | echo |             | http://127.0.0.1:61991 |
|-----------|------|-------------|------------------------|
* Opening service default/echo in default browser...
! Because you are using a Docker driver on windows, the terminal needs to be open to run it

现在它可以在主机上使用:

$ curl http://127.0.0.1:61991/

StatusCode        : 200
StatusDescription : OK

添加入口

继续前进并添加入口。

$ minikube addons enable ingress
$ kubectl get svc -A

NAMESPACE       NAME                                 TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)                      AGE
default         echo                                 NodePort    10.111.57.237   <none>        8080:32034/TCP               25m
ingress-nginx   ingress-nginx-controller             NodePort    10.104.52.175   <none>        80:31041/TCP,443:31275/TCP   2m12s

试图得到任何回应ingress通过击打minikube_IP:NodePort没有运气:

$ curl 192.168.49.2:31041

curl : Unable to connect to the remote server
At line:1 char:1
+ curl 192.168.49.2:31041

尝试创建一个隧道minikube service命令:

$ minikube service ingress-nginx-controller -n ingress-nginx

|---------------|--------------------------|-------------|---------------------------|
|   NAMESPACE   |           NAME           | TARGET PORT |            URL            |
|---------------|--------------------------|-------------|---------------------------|
| ingress-nginx | ingress-nginx-controller | http/80     | http://192.168.49.2:31041 |
|               |                          | https/443   | http://192.168.49.2:31275 |
|---------------|--------------------------|-------------|---------------------------|
* Starting tunnel for service ingress-nginx-controller.
|---------------|--------------------------|-------------|------------------------|
|   NAMESPACE   |           NAME           | TARGET PORT |          URL           |
|---------------|--------------------------|-------------|------------------------|
| ingress-nginx | ingress-nginx-controller |             | http://127.0.0.1:62234 |
|               |                          |             | http://127.0.0.1:62235 |
|---------------|--------------------------|-------------|------------------------|
* Opening service ingress-nginx/ingress-nginx-controller in default browser...
* Opening service ingress-nginx/ingress-nginx-controller in default browser...
! Because you are using a Docker driver on windows, the terminal needs to be open to run it.

并得到404 from ingress-nginx这意味着我们可以向 ingress 发送请求:

$ curl http://127.0.0.1:62234

curl : 404 Not Found
nginx
At line:1 char:1
+ curl http://127.0.0.1:62234

解决方案

上面我解释了会发生什么。以下是如何使其发挥作用的三种解决方案:

  1. 使用另一个minikube 驱动程序 https://minikube.sigs.k8s.io/docs/drivers/(例如 virtualbox。我用过hyperv因为我的笔记本电脑有 Windows 10 Pro)

minikube ip将返回虚拟机的“正常”IP 地址,并且所有网络功能都将正常工作。您需要将此 IP 地址添加到/etc/hosts用于入口规则中使用的域

Note!虽然localhost被显示在kubectl get ing ingress输出在ADDRESS.

  1. 使用适用于 Windows 的 Docker 桌面中的内置 kubernetes 功能。

您将需要手动安装ingress-nginx https://kubernetes.github.io/ingress-nginx/deploy/#bare-metal-clusters并改变ingress-nginx-controller服务类型来自NodePort to LoadBalancer所以它可以在localhost并将继续工作。请找到我关于 Windows 的 Docker 桌面的另一个答案 https://stackoverflow.com/a/69113528/15537201

  1. (仅测试) - 使用端口转发

这几乎与完全相同的想法minikube service命令。但有更多的控制。您将从主机 VM 端口打开隧道80 to ingress-nginx-controller端口上的服务(最终是 pod)80以及。/etc/hosts应包含127.0.0.1 test.domain entity.

$ kubectl port-forward service/ingress-nginx-controller -n ingress-nginx 80:80

Forwarding from 127.0.0.1:80 -> 80
Forwarding from [::1]:80 -> 80

并测试它的工作原理:

$ curl test.domain

StatusCode        : 200
StatusDescription : OK

Windows 和 ingress 上 docker 桌面中的 kubernetes 更新:

论现代ingress-nginx版本.spec.ingressClassName应添加到入口规则中。看最后更新 https://kubernetes.github.io/ingress-nginx/#i-have-only-one-instance-of-the-ingresss-nginx-controller-in-my-cluster-what-should-i-do,因此入口规则应如下所示:

apiVersion: networking.k8s.io/v1
kind: Ingress
...
spec:
  ingressClassName: nginx # can be checked by kubectl get ingressclass
  rules:
  - host: myapp.com
    http:
      ...
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Ingress 不转发请求 - 适用于 Windows 和 kubernetes 的 Docker 桌面 的相关文章

随机推荐

  • 为什么使用 START_STICKY 重新启动 Android 服务如此缓慢?

    我有一个后台服务 我正在这个服务上进行所有操作 该服务有时会与活动配合使用 但如果应用程序关闭 服务将重新启动START STICKY 它工作正常 但有时需要很长时间才能重新启动 例如一分多钟 Override public void on
  • Angular.js 以编程方式将表单字段设置为脏

    我正在以编程方式更新表单上的一些字段的值 我想将字段状态设置为 dirty 做类似的事情 scope myForm username dirty true 似乎不起作用 有一个方法 setPristine我可以用它来重置字段的状态 但没有
  • React Router 4 正则表达式路径 - 匹配找不到参数

    我正在尝试为 React Router 4 进行正则表达式模式匹配 但不幸的是this props match params id未正确解析路径 并显示为未定义 我希望能够访问的路径示例 gps gps air gps a0b6dc45 1
  • 选择 jQuery 中每个可见的最后一个子项

    我想得到最后一个visible td每一个tr在一个表中 这不起作用 因为它尝试选择最后一个孩子if可见 var last visible cells table find tr td visible last child 到目前为止 我想
  • 从网站启动 Chrome 打包的 Web 应用程序

    我有一个 Chrome 打包的 Web 应用程序 这是必需的 因为它需要访问串行端口 并且当我单击该应用程序上的链接 按钮时 我希望能够从我的网站启动它 带有一些数据 网站 如果它能够检测用户是否没有运行 chrome 或者没有安装网络应用
  • 多线程控制台应用程序何时退出?

    class Program public static void Main String args var c new C var thread new Thread new ThreadStart c F thread Start Con
  • 将 cuBLAS 与 Thrust 的复数结合使用

    在我的代码中 我使用推力库中的复数数组 我想使用 cublasZgeam 来转置数组 使用 cuComplex h 中的复数并不是一个更好的选择 因为我对数组进行了大量算术运算 并且 cuComplex 没有定义的运算符 例如 这就是我定义
  • Android代码不扫描BLE设备CC2650

    我正在使用 CC2650STK SensorTag 我从 GitHub 下载了这个开源应用程序 https github com googlesamples android BluetoothLeGatt https github com
  • 如何正确调整 Facebook Canvas 应用程序 (iFrame) 的大小?

    我需要在更新页面内容后调整画布大小 我可以明确地做到这一点 FB Canvas setSize width 760 height 1480 但是 如果没有参数 它就无法工作 即 setSize 另外 我可以通过以下方式调整高度 FB Can
  • 保留 IBOutlet 视图元素真的是最佳实践吗?

    我不断遇到 UIViewControllers 包含大量 IBOutlet 将控制器连接到其视图的子视图 通常是 UILabels 的情况 遵循 最佳实践 即在所有 UI 元素上使用保留 property retain nonatomic
  • SQL 中的大文本和图像

    在 SQL 数据库中存储大量文本 例如 html 页面 是个好主意吗 或者将其作为 html 文件存储在文件系统中是一个更好的主意吗 图像也是如此 将图像数据存储在数据库中是一个好主意还是将它们放在磁盘上更好 例如 存储大量数据是否会导致性
  • 应用程序更新后推送通知令牌是否会更改?

    我问的是两种情况 1 我们从 App Store 进行定期更新后 2 在我们模拟更新后 通过从商店下载当前版本并从 Xcode 中安装和运行新版本 推送通知令牌会改变吗 如果改变 多久改变一次 例如 每次 还是时不时 我问这个 因为我正在做
  • 运行 pod install 时出现“您的项目未明确指定 CocoaPods 主规范存储库”警告

    我跑完之后pod install 我收到一条警告 您的项目没有明确指定 CocoaPods 主规范存储库 由于 CDN 现在被用作默认值 您可以通过以下方式安全地将其从存储库目录中删除 pod repo remove master 要抑制此
  • 为什么 Passport 不能与 cookieSession() 一起使用?

    我正在研究 facebook 授权 发现护照不能与 cookieSession 一起使用 只能与 session 一起使用 在第一种情况下 req user 始终未定义 有可能让它发挥作用吗 您仍然可以使用最新版本的 Express 重现此
  • NPOI - 写入文件会损坏 .xlsx 工作簿

    我有一段代码当前正在写入 xls工作簿 HSSFWorkbook 没有问题 但是 当我尝试使用相同的代码写入 xlsx工作簿 XSSFWorkbook 存档已损坏并且无法在 Excel 中打开 以下代码是我用来访问工作簿 编辑工作簿 然后保
  • 如何禁用下拉元素中的特定项目

    如何使用 jQuery 或 JavaScript 禁用下拉元素的某些项目 与禁用任何其他 HTML 元素相同的方式 使用 option selector prop disabled true 看到它在action http jsfiddle
  • Libgdx box2D 中的碰撞对于某些物体失败

    我正在使用 libgdx 和 box2d 开发我的第一个游戏 我正在使用调试渲染器来测试我的对象 我创建了一些类似汽车的物体 每辆车都有一个主体 它是一个6点的大多边形 长约1米 高0 7米 并有2个通过旋转关节连接的车轮 主车还通过旋转接
  • GDI+ LockBits()/UnLockBits() 异常

    我的程序是用 C 编写的 并在低级别上使用位图进行操作 一切工作正常 但有时 非常罕见 但稳定 会发生异常 通用 GDI 异常 并且很难重现这种情况 函数 LockBits 和 UnLockBits 发生异常 它包含错误代码 2147467
  • 如何在 QML 中捕获信号?

    如何将信号从一个 qml 组件发送到另一个 下面是一个例子 Rectangle id main width 360 height 360 signal clicked Text id testStr anchors centerIn par
  • Ingress 不转发请求 - 适用于 Windows 和 kubernetes 的 Docker 桌面

    EDIT 我删除了 minikube 在 Windows 的 Docker 桌面中启用了 kubernetes 并安装ingress nginx手动 helm upgrade install ingress nginx ingress ng