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

tuq*_*tuq 12 docker kubernetes windows-subsystem-for-linux wsl-2

目前,我正在使用 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
    
Run Code Online (Sandbox Code Playgroud)

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

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

tuq*_*tuq 12

最后我找到了修复的方法。我必须通过命令部署 ingress Nginx:

kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v0.41.2/deploy/static/provider/cloud/deploy.yaml
Run Code Online (Sandbox Code Playgroud)

(按照https://kubernetes.github.io/ingress-nginx/deploy/#docker-for-mac 上的说明进行操作。它适用于 Windows 的 Docker)

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

  • 如果访问后端时仍然收到 nginx 404 错误页面,请检查入口部署中是否有“注释”部分,如果没有,请添加注释:kubernetes.io/ingress.class:“nginx”。 (7认同)

Mal*_*ata 10

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

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

apiVersion: v1
kind: Service
metadata:
  name: webapp-service
spec:
  type: NodePort
  selector:
    app: webapp
  ports:
  - name: http
    protocol: TCP
    port: 3000
    nodePort: 30090
Run Code Online (Sandbox Code Playgroud)

您的 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
Run Code Online (Sandbox Code Playgroud)

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

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


Don*_*llo 9

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

使用helm(v3 - 请参阅文档):

helm install --namespace kube-system nginx ingress-nginx --repo https://kubernetes.github.io/ingress-nginx
Run Code Online (Sandbox Code Playgroud)

使用kubectl(见文档):

kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v0.43.0/deploy/static/provider/cloud/deploy.yaml
Run Code Online (Sandbox Code Playgroud)

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

127.0.0.1     ingress.local
127.0.0.1     my.other.service.local
# ...
Run Code Online (Sandbox Code Playgroud)

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

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