使用 WLS2 在 Docker 桌面上启用 Ingress 控制器
Posted
技术标签:
【中文标题】使用 WLS2 在 Docker 桌面上启用 Ingress 控制器【英文标题】:Enable Ingress controller on Docker Desktop with WLS2 【发布时间】:2021-03-19 11:16:14 【问题描述】:目前,我正在使用带有 WSL2 集成的 Docker Desktop。我发现 Docker Desktop 自动为我创建了一个集群。这意味着我不必安装和使用 Minikube 或 Kind 来创建集群。 问题是,如果我使用 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 上运行良好)
您能帮我找出根本原因吗? 谢谢。
【问题讨论】:
【参考方案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
的疑难解答,另请参阅***.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/
当然,我还没有安装任何工作负载,但默认入口控制器工作正常。
【讨论】:
以上是关于使用 WLS2 在 Docker 桌面上启用 Ingress 控制器的主要内容,如果未能解决你的问题,请参考以下文章
docker-in-docker (dind) 服务在 gitlab ci 中的作用
Nginx 与 Docker : nginx: [emerg] 未知指令“启用”在 /etc/nginx/nginx.conf