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

使用WLS2在Docker桌面上启用入口控制器,docker,kubernetes,windows-subsystem-for-linux,wsl-2,Docker,Kubernetes,Windows Subsystem For Linux,Wsl 2,目前,我正在使用Docker Desktop与WSL2集成。我发现Docker Desktop自动为我创建了一个集群。这意味着我不必安装并使用Minikube或Kind来创建集群。 问题是,如果我使用Docker Desktop中的“内置”群集,如何启用Ingress Controller? 我试图创建一个入口来检查这是否有效,但据我猜测,它不起作用 我创建的YAML文件如下所示: apiVersion: apps/v1 kind: Deployment metadata: name: we

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

我创建的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,并且webapp在kubernetes.docker.internal:30090上运行良好)

你能帮我了解一下根本原因吗?
谢谢。

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

如果要指向
127.0.0.1
,则必须在入口定义中将URL用作主机名。这应该在本页的文档中,但没有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
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: webapp-ingress 
spec:
  rules:
  - host: kubernetes.docker.internal
    http:
      paths:
      - path: /
        backend:
          serviceName: webapp-service 
          servicePort: http
您的入口文件应如下所示:

apiVersion: v1
kind: Service
metadata:
  name: webapp-service
spec:
  type: NodePort
  selector:
    app: webapp
  ports:
  - name: http
    protocol: TCP
    port: 3000
    nodePort: 30090
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/


您可以在这里看到的示例:。

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

kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v0.41.2/deploy/static/provider/cloud/deploy.yaml
(按照处的说明进行操作。对于Docker for Windows,它工作正常)


现在我可以成功访问。

您必须在集群上安装一个ingress nginx控制器,这样您的节点将有一个打开的端口80/443

使用
helm
(v3-请参阅):

helm安装——名称空间kube系统nginx入口nginx——repohttps://kubernetes.github.io/ingress-nginx
使用kubectl(请参阅):

kubectl应用-fhttps://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
# ...
然后,如果您提出以下请求:

  • DNS解析将路由到您的群集节点
  • 然后入口控制器将在端口80上为请求提供服务
  • 然后入口将请求路由到已配置的后端服务
  • 服务将路由到一个可用的吊舱

谢谢@Malgorzata,但它仍然不起作用。“kubernetes.docker.internal拒绝连接。”@tuq您必须安装nginx入口,以便您的群集将在端口80上侦听
验证webhookconfiguration
问题的疑难解答,另请参阅