【发布时间】:2021-12-03 01:00:36
【问题描述】:
我安装了 Docker Desktop (Windows),并开启了 Kubernetes。
我已经通过运行以下命令安装了 Nginx 入口控制器:
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.0.4/deploy/static/provider/cloud/deploy.yaml
我已经应用了以下 YAML...
apiVersion: apps/v1
kind: Deployment
metadata:
name: blah
spec:
replicas: 1
selector:
matchLabels:
app: blah
template:
metadata:
labels:
app: blah
spec:
containers:
- name: blah
image: tutum/hello-world
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: blah
spec:
type: NodePort
ports:
- name: http
port: 80
targetPort: 80
nodePort: 30010
selector:
app: blah
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: blah
spec:
defaultBackend:
service:
name: blah
port:
name: http
rules:
- host: kubernetes.docker.internal
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: blah
port:
name: HTTP
如果我从我的 Windows 机器 http://kubernetes.docker.internal/ 发出 GET 请求 - 我得到这个...
以上,我希望能打到我的豆荚。
如果我获取一个不存在的 URL(例如,'http://kubernetes.docker.internal/nonexistant'),我会得到 NGINX 404。
如果我在 HTTPS 版本“https://kubernetes.docker.internal”上执行此操作 - 我也会得到 404。
如果我通过 NodePort 'http://kubernetes.docker.internal:30010' 访问它,那么它会按预期工作,因为它没有使用入口。
就好像已经安装了 Nginx 控制器一样,但是任何请求都只是直接访问 Nginx,而忽略了我创建的任何入口。
我确定我遗漏了一些基本的东西 - 但对我做错了什么有什么想法吗?
更新
根据@clarj 的评论,我查看了 nginx 控制器日志,看到以下错误:“ingress does not contain a valid IngressClass”。所以我在入口中添加了以下内容......
annotations:
kubernetes.io/ingress.class: "nginx"
这已经消除了错误,但没有解决问题。
这是我现在的日志...
-------------------------------------------------------------------------------
NGINX Ingress controller
Release: v1.0.4
Build: 9b78b6c197b48116243922170875af4aa752ee59
Repository: https://github.com/kubernetes/ingress-nginx
nginx version: nginx/1.19.9
-------------------------------------------------------------------------------
W1014 18:13:38.886167 7 client_config.go:615] Neither --kubeconfig nor --master was specified. Using the inClusterConfig. This might not work.
I1014 18:13:38.886636 7 main.go:221] "Creating API client" host="https://10.96.0.1:443"
I1014 18:13:38.890654 7 main.go:265] "Running in Kubernetes cluster" major="1" minor="21" git="v1.21.4" state="clean" commit="3cce4a82b44f032d0cd1a1790e6d2f5a55d20aae" platform="linux/amd64"
I1014 18:13:38.979187 7 main.go:104] "SSL fake certificate created" file="/etc/ingress-controller/ssl/default-fake-certificate.pem"
I1014 18:13:38.987243 7 ssl.go:531] "loading tls certificate" path="/usr/local/certificates/cert" key="/usr/local/certificates/key"
I1014 18:13:38.992390 7 nginx.go:253] "Starting NGINX Ingress controller"
I1014 18:13:38.995200 7 event.go:282] Event(v1.ObjectReference{Kind:"ConfigMap", Namespace:"ingress-nginx", Name:"ingress-nginx-controller", UID:"4865a09a-18fe-4760-a466-742b63ab480f", APIVersion:"v1", ResourceVersion:"14917", FieldPath:""}): type: 'Normal' reason: 'CREATE' ConfigMap ingress-nginx/ingress-nginx-controller
I1014 18:13:40.095580 7 store.go:371] "Found valid IngressClass" ingress="default/blah" ingressclass="nginx"
I1014 18:13:40.095725 7 event.go:282] Event(v1.ObjectReference{Kind:"Ingress", Namespace:"default", Name:"blah", UID:"389b024c-9148-4ed0-83b6-a8be5e241655", APIVersion:"networking.k8s.io/v1", ResourceVersion:"25734", FieldPath:""}): type: 'Normal' reason: 'Sync' Scheduled for sync
I1014 18:13:40.193521 7 nginx.go:295] "Starting NGINX process"
I1014 18:13:40.193677 7 leaderelection.go:243] attempting to acquire leader lease ingress-nginx/ingress-controller-leader...
I1014 18:13:40.193757 7 nginx.go:315] "Starting validation webhook" address=":8443" certPath="/usr/local/certificates/cert" keyPath="/usr/local/certificates/key"
I1014 18:13:40.193876 7 controller.go:152] "Configuration changes detected, backend reload required"
I1014 18:13:40.195273 7 status.go:84] "New leader elected" identity="ingress-nginx-controller-5c8d66c76d-4gfd4"
I1014 18:13:40.213501 7 controller.go:169] "Backend successfully reloaded"
I1014 18:13:40.213577 7 controller.go:180] "Initial sync, sleeping for 1 second"
I1014 18:13:40.213614 7 event.go:282] Event(v1.ObjectReference{Kind:"Pod", Namespace:"ingress-nginx", Name:"ingress-nginx-controller-5c8d66c76d-fb79x", UID:"69db0f7e-0137-48ee-b4aa-fc28d5208423", APIVersion:"v1", ResourceVersion:"25887", FieldPath:""}): type: 'Normal' reason: 'RELOAD' NGINX reload triggered due to a change in configuration
I1014 18:14:23.192016 7 leaderelection.go:253] successfully acquired lease ingress-nginx/ingress-controller-leader
I1014 18:14:23.192035 7 status.go:84] "New leader elected" identity="ingress-nginx-controller-5c8d66c76d-fb79x"
更新 2
实际上,我上面的“更新”中的修复确实有效。我只需要在我的 GET 请求中使用 HTTP。
【问题讨论】:
-
你能从 NGINX Ingress 控制器添加日志吗?
-
啊,这给了我一个线索。它在控制器日志中说:“入口不包含有效的 IngressClass”。
-
虽然,添加 "kubernetes.io/ingress.class: "nginx"" 注释可以消除该错误,但不能解决问题。我会用日志更新我的帖子...
-
啊哈!它适用于该修复 - 使用 HTTPS! :)
标签: nginx kubernetes nginx-ingress docker-desktop