使用 WLS2 在 Docker 桌面上启用 Ingress 控制器
Enable Ingress controller on Docker Desktop with WLS2
目前,我正在使用 Docker 桌面与 WSL2 集成。我发现 Docker Desktop 自动为我创建了一个集群。这意味着我不必安装和使用 Minikube 或 Kind 来创建集群。
问题是,如果我使用来自 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。并且 webapp 在 kubernetes.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/
当然我还没有安装任何工作负载,但默认入口控制器工作正常。
目前,我正在使用 Docker 桌面与 WSL2 集成。我发现 Docker Desktop 自动为我创建了一个集群。这意味着我不必安装和使用 Minikube 或 Kind 来创建集群。 问题是,如果我使用来自 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。并且 webapp 在 kubernetes.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/
当然我还没有安装任何工作负载,但默认入口控制器工作正常。