20

目前,我正在使用带有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 。webapp在kubernetes.docker.internal:30090上运行良好)

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

4

4 回答 4

21

最后我找到了修复的方法。我必须通过命令部署入口 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上的说明。它适用于 Windows 的 Docker)

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

于 2020-12-09T14:47:26.057 回答
15

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

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

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

使用kubectl(参见文档):

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 上处理请求
  • 然后 ingress 会将请求路由到配置的后端服务
  • 并且服务将路由到可用的 pod
于 2021-01-18T08:46:36.357 回答
7

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

如果您想kubernetes.docker.internal指向127.0.0.1. 这应该在此页面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

于 2020-12-08T14:36:54.450 回答
1

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

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

在此处输入图像描述

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

于 2021-08-25T07:18:17.740 回答