使用 WLS2 在 Docker 桌面上启用 Ingress 控制器

Posted

技术标签:

【中文标题】使用 WLS2 在 Docker 桌面上启用 Ingress 控制器【英文标题】:Enable Ingress controller on Docker Desktop with WLS2 【发布时间】:2021-03-19 11:16:14 【问题描述】:

目前,我正在使用带有 WSL2 集成的 Docker Desktop。我发现 Docker Desktop 自动为我创建了一个集群。这意味着我不必安装和使用 MinikubeKind 来创建集群。 问题是,如果我使用 Docker Desktop 中的“内置”集群,如何启用 Ingress Controller? 我尝试创建一个 Ingress 来检查这是否有效,但正如我猜测的那样,它不起作用。

我创建的 YAML 文件如下:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: webapp
spec:
  minReadySeconds: 30
  selector:
    matchLabels:
      app: webapp
  replicas: 1
  template:
    metadata:
      labels:
        app: webapp
    spec:
      containers:
      - name: webapp
        image: nodejs-helloworld:v1

--- 

apiVersion: v1
kind: Service
metadata:
  name: webapp-service

spec:
  selector: 
    app: webapp
  
  ports:
    - name: http
      port: 3000
      nodePort: 30090 # only for NotPort > 30,000
    
  type: NodePort #ClusterIP inside cluster

---

apiVersion: networking.k8s.io/v1
kind: Ingress 
metadata:
  name: webapp-ingress
spec:
  defaultBackend:
    service:
      name: webapp-service
      port:
        number: 3000
  rules:
  - host: ingress.local
    http:
      paths:
      - path: / 
        pathType: Prefix
        backend:
          service:
            name:  webapp-service
            port: 
              number: 3000
    

我尝试访问 ingress.local/ 但没有成功。 (我在主机文件中添加了 ingress.local 以指向 127.0.0.1。webappkubernetes.docker.internal:30090 上运行良好)

您能帮我找出根本原因吗? 谢谢。

【问题讨论】:

【参考方案1】:

我终于找到了解决方法。我必须通过命令部署入口 nginx

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

(遵循https://kubernetes.github.io/ingress-nginx/deploy/#docker-for-mac 的说明。它适用于 Docker for Windows)

现在我可以成功访问http://ingress.local了。

【讨论】:

有关ValidatingWebhookConfiguration 的疑难解答,另请参阅***.com/questions/61616203/… 谢谢!这真的帮助了我。我花了很长时间试图让它与 minikube 一起工作,但无济于事,但在 Windows 的 docker 桌面上遵循这个效果很好。再次感谢! 如果访问后端时仍然出现 nginx 404 错误页面,请检查您的 ingress 部署中是否有“注释”部分,如果没有,请添加注释:kubernetes.io/ingress.class: “nginx”。 @AmelMahmuzić 你的评论很棒!我在问题中的示例中所做的一切都是正确的,但是添加了注释: kubernetes.io/ingress.class: "nginx" 解决了它,谢谢。 @Shadi 太棒了。很高兴听到它奏效了。【参考方案2】:

你必须在你的集群上安装一个 ingress-nginx 控制器,这样你的节点就会有一个开放的 80/443 端口。

使用helm(v3 - 请参阅documentation):

helm install --namespace kube-system nginx ingress-nginx --repo https://kubernetes.github.io/ingress-nginx

使用kubectl(见documentation):

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

然后手动将 Ingress 的主机名添加到 /etc/hosts

127.0.0.1     ingress.local
127.0.0.1     my.other.service.local
# ...

那么如果你在http://ingress.local提出请求:

DNS 解析将路由到您的集群节点 然后入口控制器将在端口 80 上处理请求 然后 ingress 会将请求路由到配置的后端服务 服务将路由到可用的 pod

【讨论】:

【参考方案3】:

最新版本的 Docker Desktop for Windows 已经添加了一个 hosts 文件条目:127.0.0.1 kubernetes.docker.internal

如果你想指向127.0.0.1,你必须在 Ingress 定义中使用kubernetes.docker.internal URL 作为主机名。这应该在此页面上的文档中 kubernetes.github.io/ingress-nginx/deploy 但那里没有 Docker Desktop for Windows 部分。 您的文件应如下所示:

apiVersion: v1
kind: Service
metadata:
  name: webapp-service
spec:
  type: NodePort
  selector:
    app: webapp
  ports:
  - name: http
    protocol: TCP
    port: 3000
    nodePort: 30090

您的 Ingress 文件应如下所示:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: webapp-ingress 
spec:
  rules:
  - host: kubernetes.docker.internal
    http:
      paths:
      - path: /
        backend:
          serviceName: webapp-service 
          servicePort: http

然后您就可以使用http://kubernetes.docker.internal/ 连接到应用程序了。

您可以在此处查看示例:wsl2-docker-for-desktop。

【讨论】:

感谢@Malgorzata,但它仍然无法正常工作。 “kubernetes.docker.internal 拒绝连接。” @tuq 你必须安装 nginx-ingress,这样你的集群才会监听 80 端口【参考方案4】:

我使用 Docker-Desktop 版本安装 nginx-ingress 控制器 https://kubernetes.github.io/ingress-nginx/deploy/#docker-desktop

卷曲http://kubernetes.docker.internal/

当然,我还没有安装任何工作负载,但默认入口控制器工作正常。

【讨论】:

以上是关于使用 WLS2 在 Docker 桌面上启用 Ingress 控制器的主要内容,如果未能解决你的问题,请参考以下文章

docker-in-docker (dind) 服务在 gitlab ci 中的作用

如何在桌面上安装运行Rancher 2.0

Nginx 与 Docker : nginx: [emerg] 未知指令“启用”在 /etc/nginx/nginx.conf

win10了远程桌面内部错误怎么解决方法

Docker-in-Docker 与 Gitlab 共享运行器,用于构建和推送 docker 镜像到注册表

如何在容器上编辑 Docker 端口和参数? (使用适用于 Windows 的 Docker 桌面)[重复]