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

Enable Ingress controller on Docker Desktop with WLS2

目前,我正在使用 Docker 桌面与 WSL2 集成。我发现 Docker Desktop 自动为我创建了一个集群。这意味着我不必安装和使用 MinikubeKind 来创建集群。 问题是,如果我使用来自 Docker 桌面的“内置”集群,我如何启用 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 )

你能帮我知道根本原因吗? 谢谢。

Windows 的最新版 Docker 桌面已经添加了一个主机文件条目:127.0.0.1 kubernetes.docker.internal

您必须使用 kubernetes.docker.internal URL as a hostname in Ingress definition if you want to point to 127.0.0.1. This should be in the docs on this page kubernetes.github.io/ingress-nginx/deploy,但 Windows 部分没有 Docker 桌面。 您的文件应如下所示:

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/ 连接到应用程序了。

您可以在此处查看示例:

终于找到解决方法了。我必须通过命令部署入口 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 和 Windows)

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

您必须在您的集群上安装一个 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

然后手动将您的入口主机名添加到 /etc/hosts:

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

然后,如果您在 http://ingress.local 上提出请求:

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

我使用的是Docker-桌面版来安装nginx-ingress控制器 https://kubernetes.github.io/ingress-nginx/deploy/#docker-desktop

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

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