【问题标题】:Enable Ingress controller on Docker Desktop with WLS2使用 WLS2 在 Docker 桌面上启用 Ingress 控制器
【发布时间】: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 上运行良好)

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

【问题讨论】:

    标签: docker kubernetes windows-subsystem-for-linux wsl-2


    【解决方案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 的疑难解答,另请参阅stackoverflow.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/

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

      【讨论】:

        猜你喜欢
        • 2021-11-26
        • 1970-01-01
        • 2022-07-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-06-22
        • 2021-05-15
        相关资源
        最近更新 更多