带有入口示例的迷你库贝不起作用



我正在尝试让入口控制器在 Minikube 中工作,并按照此处的 K8s 文档中的步骤进行操作,但看到的结果不同,因为入口控制器的 IP 地址与 Minikube 的 IP 地址不同(示例似乎表明它们应该是相同的):

$ kubectl get ingress
NAME              HOSTS              ADDRESS     PORTS   AGE
example-ingress   hello-world.info   10.0.2.15   80      12m
$ minikube ip
192.168.99.101

当我尝试连接到 Minikube IP 地址(直接使用该地址而不是将其添加到我的本地主机文件)时,我收到来自 NGINX 的"未找到"响应:

$ curl http://`minikube ip`/
<html>
<head><title>404 Not Found</title></head>
<body>
<center><h1>404 Not Found</h1></center>
<hr><center>openresty/1.15.8.1</center>
</body>
</html>

当我尝试连接到与入口控制器关联的 IP 地址时,它只是挂起。

我应该期望地址与 K8s 文档指示的地址相同吗?

一些附加信息:

$ kubectl get nodes -o wide
NAME       STATUS   ROLES    AGE     VERSION   INTERNAL-IP   EXTERNAL-IP   OS-IMAGE              KERNEL-VERSION   CONTAINER-RUNTIME
minikube   Ready    master   2d23h   v1.16.0   10.0.2.15     <none>        Buildroot 2018.05.3   4.15.0           docker://18.9.9
$ kubectl get ingresses example-ingress -o yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
annotations:
kubectl.kubernetes.io/last-applied-configuration: |
{"apiVersion":"networking.k8s.io/v1beta1","kind":"Ingress","metadata":{"annotations":{"nginx.ingress.kubernetes.io/rewrite-target":"/$1"},"name":"example-ingress","namespace":"default"},"spec":{"rules":[{"host":"hello-world.info","http":{"paths":[{"backend":{"serviceName":"web","servicePort":8080},"path":"/"}]}}]}}
nginx.ingress.kubernetes.io/rewrite-target: /$1
creationTimestamp: "2019-10-28T15:36:57Z"
generation: 1
name: example-ingress
namespace: default
resourceVersion: "25609"
selfLink: /apis/extensions/v1beta1/namespaces/default/ingresses/example-ingress
uid: 5e96c378-fbb1-4e8f-9738-3693cbce7d9b
spec:
rules:
- host: hello-world.info
http:
paths:
- backend:
serviceName: web
servicePort: 8080
path: /
status:
loadBalancer:
ingress:
- ip: 10.0.2.15

以下是对我有用的方法:

  1. 迷你库贝开始

  2. Minikube 插件启用入口

  3. Minikube 插件启用入口 DNS

  4. 等到你看到入口-nginx-controller-XXXX已启动并运行使用Kubectl get pods -n ingress-nginx

  5. 使用 K8s 示例 yaml 文件创建入口

  6. 更新服务部分以指向已创建的节点端口服务

  7. 附加127.0.0.1 hello-world.info到 MacOS 上的/etc/hosts 文件(注意: 不要使用迷你库贝 IP)

  8. 运行minikube tunnel( 保持窗口打开。输入密码后,将不再有消息,光标只是闪烁)

  9. 在浏览器中点击hello-world.info(或您在yaml文件中配置的任何主机),它应该可以工作

我已经在 Linux 环境(在 GCP 上)重现了您的场景,并且我还有不同的 IP:

user@bf:~$ minikube ip
192.168.39.144
user@bf:~$ kubectl get ingresses
NAME              HOSTS   ADDRESS           PORTS   AGE
example-ingress   *       192.168.122.173   80      30m

您的问题与您拥有不同的IP无关。该指南指示我们使用以下规则创建入口:

spec:
rules:
- host: hello-world.info

此规则告知入口服务需要具有hello-world.info名称的 DNS 记录。 如果您进一步遵循该指南,它会指示您在主机文件上创建一个指向入口 IP 或 Minikube IP 的条目。

注意:如果您在本地运行 Minikube,请使用minikube ip获取外部 IP。入口列表中显示的 IP 地址 将是内部 IP.
来源:使用 NGINX 入口控制器在 Minikube 上设置入口

(如果要卷曲 IP 而不是 DNS 名称,则需要从入口中删除主机规则)

它应该看起来像这样:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: example-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- http:
paths:
- path: /
backend:
serviceName: web
servicePort: 8080

应用更改:

user@bf:~$ kubectl apply -f example-ingress.yaml

并使用 -Lk 选项卷曲 IP,以克服与安全连接相关的问题。

user@bf:~$ curl -Lk 192.168.39.144
Hello, world!
Version: 1.0.0
Hostname: web-9bbd7b488-l5gc9

除了接受的答案之外,minikube现在还有一个tunnel命令,允许您为服务生成外部 IP 地址,可以直接在主机上访问这些地址,而无需使用通用minikube ip

在单独的终端中运行minikube tunnel。这将作为守护程序在前台运行。 在不同的终端中,执行kubectl apply -f <file_name>命令以部署所需的服务。它应为你生成一个 IP 地址,该地址直接路由到你的服务,并在该地址上的端口 80 上可用。

有关minikube文档的更多信息:https://minikube.sigs.k8s.io/docs/tasks/loadbalancer/

我在Windows 11上得到了Minikube为我工作

minikube start --vm-driver=hyperv

安装迷你库贝入口控制器

minikube addons enable ingress
minikube addons enable ingress-dns

部署掌舵图

helm install ...

获取 Kubernetes IP 地址

nslookup <host-found-in-ingress> $(minikube ip)

添加到等/主机

<minikube-ip> <domain-url>

住!

curl <domain-url>

你的问题来自你如何开始 minkube。如果您只使用"minikube start",它将使用您的本地 docker 桌面。这适用于大多数方案,但对于入口,由于某种原因,将不允许公开入口的外部 IP。

实现此目的的正确方法是使用 hyberv 驱动程序启动 minikube。有两个步骤:

  • 在管理模式下启动Windows powershell*重要,并运行commnad:

    Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V -All

  • 如果尚未激活,则需要重新启动。您也可以从 Windows 功能手动配置它。

  • 使用驱动程序 hyperv 启动 minikube。还需要在管理员中使用Powershell。如果您没有管理员权限,则可能无法执行此操作

    minikube start --driver=hyperv

  • 将 kyperv 设置为默认值:

    minikube config set driver hyperv

  • 最后一步需要使用删除重新启动群集,并且该步骤是可选的。

有关如何使用 hyperv 设置 minikube 的完整文档: https://minikube.sigs.k8s.io/docs/drivers/hyperv/

示例如何设置入口: https://kubernetes.io/docs/tasks/access-application-cluster/ingress-minikube/

对于 Docker 桌面驱动程序(默认)

您应该使用以下命令创建到集群的隧道:

米尼库贝隧道

您必须确定正在运行的"docker 模式"。它可以是"docker desktop"或"docker engine":

  • 检查码头工人模式:

    docker version | grep "Docker Engine"

    客户: 码头工人引擎 - 社区

    docker version | grep "Docker Engine"

    客户: 码头工人引擎 - 社区

    服务器:码头工人引擎 - 社区

如果您没有看到服务器,则您正在使用 Docker Desktop 运行 docker 最好的解决方案是将其关闭。

当您运行minikube start如果您使用的是 Docker 桌面,您将收到警告

❗ 为了改善体验,建议使用 Docker 引擎而不是 Docker Desktop。 码头工人引擎安装说明:https://docs.docker.com/engine/install/#server

  1. 在迷你立方体中启用入口并加载所有准备数据。我将使用 https://kubernetes.io/docs/tasks/access-application-cluster/ingress-minikube/作为基础:

    minikube addons enable ingress
    kubectl create deployment web --image=gcr.io/google-samples/hello-app:1.0
    kubectl expose deployment web --type=NodePort --port=8080
    kubectl apply -f https://k8s.io/examples/service/networking/example-ingress.yaml
    kubectl get ingress
    
  2. 在 minikube 集群内外进行测试 3.1 内部:

    minikube ssh
    curl -H "Host: hello-world.info" 127.0.0.1 #its work
    

    3.2 外部码头工人引擎

    curl -H "Host: hello-world.info" $(minikube ip) # only for docker engine
    

    3.3 外部码头工人桌面

    ping $(minikube ip) # you won't see a response if it's docker desktop
    ssh -i $(minikube ssh-key) -p "$(docker port minikube 22/tcp | awk -F ':' '{print $2}')" docker@$(docker port minikube 22/tcp | awk -F ':' '{print $1}') #its work
    

    制作 SSH 隧道

    ssh -i $(minikube ssh-key) -p "$(docker port minikube 22/tcp | awk -F ':' '{print $2}')" docker@$(docker port minikube 22/tcp | awk -F ':' '{print $1}') -L 8008:localhost:80
    curl -H "Host: hello-world.info" 127.0.0.1:8008 #its work
    

相关内容

  • 没有找到相关文章

最新更新