我在使Nginx入口控制器在Kubernetes集群中工作时遇到了一些麻烦。根据{{3}}
,我已经创建了nginx-ingress部署,服务,角色等。我还部署了一个简单的hello-world
应用,该应用监听端口8080
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: hello-world
namespace: default
spec:
selector:
matchLabels:
name: hello-world
template:
metadata:
labels:
name: hello-world
spec:
containers:
- name: hello-world
image: myrepo/hello-world
resources:
requests:
memory: 200Mi
cpu: 150m
limits:
cpu: 300m
ports:
- name: http
containerPort: 8080
protocol: TCP
并为此创建了服务
kind: Service
apiVersion: v1
metadata:
namespace: default
name: hello-world
spec:
selector:
app: hello-world
ports:
- name: server
port: 8080
最后,我创建了一个TLS秘密(my-tls-secret
)并按照说明部署了nginx入口。例如:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
annotations:
kubernetes.io/ingress.class: nginx
name: hello-world
namespace: default
spec:
rules:
- host: hello-world.mydomain.com
http:
paths:
- path: /
backend:
serviceName: hello-world
servicePort: server
tls:
- hosts:
- hello-world.mydomain.com
secretName: my-tls-cert
但是,我无法访问我的应用程序,并且在日志中看到
W0103 19:11:15.712062 6 controller.go:826] Service "default/hello-world" does not have any active Endpoint.
I0103 19:11:15.712254 6 controller.go:172] Configuration changes detected, backend reload required.
I0103 19:11:15.864774 6 controller.go:190] Backend successfully reloaded.
我不确定为什么会说Service "default/hello-world" does not have any active Endpoint
。我为traefik入口控制器使用了类似的服务定义,没有任何问题。
我希望nginx入口缺少明显的东西。您能提供的任何帮助将不胜感激!
答案 0 :(得分:1)
我发现自己做错了。在我的应用程序定义中,我使用name
作为选择器
selector:
matchLabels:
name: hello-world
template:
metadata:
labels:
name: hello-world
在我的服务中,我使用的是app
selector:
app: hello-world
将我的服务更新为使用app
后,它可以正常工作
selector:
matchLabels:
app: hello-world
template:
metadata:
labels:
app: hello-world
答案 1 :(得分:0)
可能发生的另一种情况是,当入口控制器的入口类与用于您的服务的入口资源清单中的入口类不匹配时。
Nginx安装命令,简短示例:
helm install stable/nginx-ingress \
--name ${INGRESS_RELEASE_NAME} \
--namespace ${K8S_NAMESPACE} \
--set controller.scope.enabled=true \
--set controller.scope.namespace=${K8S_NAMESPACE} \
--set controller.ingressClass=${NGINX_INGRESS_CLASS}
入口资源规范。 ,摘录:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
labels:
annotations:
# folowing line is not valid for K8s or Helm,
# but reflects the values must be the same
kubernetes.io/ingress.class: ${NGINX_INGRESS_CLASS}
答案 2 :(得分:0)
在我们的例子中,这是由于入口资源定义在与服务不同的命名空间上造成的。
种类:入口
api版本:networking.k8s.io/v1beta1
元数据:
名称:nginx-ingress-rules
namespace: default #<= 确保这与您尝试访问的服务上的命名空间的值相同
答案 3 :(得分:0)
我遇到了同样的问题,看起来是由于服务端口缺少名称造成的。
以下票证显示了用户 xcq1
的用户发现: