K8S:我如何通过进入我的应用
我正在尝试在K8中曝光我的应用程序。
我设置了一个提供以下属性的入口控制器:
kubectl get svc,pods --namespace ingress
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/ingress-nginx-nginx-ingress LoadBalancer 10.254.234.220 111.111.111.111 80:32097/TCP,443:32755/TCP 16d
NAME READY STATUS RESTARTS AGE
pod/ingress-nginx-nginx-ingress-68848c49f8-54lx4 1/1 Running 0 12d
pod/ingress-nginx-nginx-ingress-68848c49f8-5dx97 1/1 Running 0 12d
pod/ingress-nginx-nginx-ingress-68848c49f8-89grn 1/1 Running 0 12d
因此,当我转到https://111.111.111.111
(不是我的浏览器中的真实地址)时,我会得到:
这是我的应用程序的入口。
ingress:
name: externalIngress
enabled: true
type: LoadBalancer
ingressClassName: "nginx"
annotations:
kubernetes.io/ingress.class: "nginx"
nginx.ingress.kubernetes.io/rewrite-target: /$2
hosts:
- host:
paths:
- path: "/"
backend:
serviceName: my-app
servicePort: 80
使用模板:yaml`:
{{- if .Values.ingress.enabled -}}
{{- $fullName := include "my-app.fullname" . -}}
{{- $svcPort := .Values.service.port -}}
{{- if semverCompare ">=1.14-0" .Capabilities.KubeVersion.GitVersion -}}
apiVersion: networking.k8s.io/v1beta1
{{- else -}}
apiVersion: extensions/v1beta1
{{- end }}
kind: Ingress
metadata:
name: {{ $fullName }}
labels:
{{- include "my-app.labels" . | nindent 4 }}
{{- with .Values.ingress.annotations }}
annotations:
{{- toYaml . | nindent 4 }}
{{- end }}
spec:
{{- if .Values.ingress.tls }}
tls:
{{- range .Values.ingress.tls }}
- hosts:
{{- range .hosts }}
- {{ . | quote }}
{{- end }}
secretName: {{ .secretName }}
{{- end }}
{{- end }}
rules:
{{- range .Values.ingress.hosts }}
- host: {{ .host | quote }}
http:
paths:
{{- range .paths }}
- path: {{ .path }}
backend:
serviceName: {{ $fullName }}
servicePort: {{ $svcPort }}
{{- end }}
{{- end }}
{{- end }}
我有一个为入口设置的服务:
kubectl get service --namespace=ingress -o yaml
apiVersion: v1
items:
- apiVersion: v1
kind: Service
metadata:
annotations:
meta.helm.sh/release-name: ingress-nginx
meta.helm.sh/release-namespace: ingress
creationTimestamp: "2022-04-29T14:51:36Z"
labels:
app.kubernetes.io/instance: ingress-nginx
app.kubernetes.io/managed-by: Helm
app.kubernetes.io/name: ingress-nginx-nginx-ingress
helm.sh/chart: nginx-ingress-0.10.4
name: ingress-nginx-nginx-ingress
namespace: ingress
resourceVersion: "4711523"
selfLink: /api/v1/namespaces/ingress/services/ingress-nginx-nginx-ingress
uid: a8183382-151f-499b-b06f-0a189e302226
spec:
clusterIP: 10.254.234.220
externalTrafficPolicy: Local
healthCheckNodePort: 31343
ports:
- name: http
nodePort: 32097
port: 80
protocol: TCP
targetPort: 80
- name: https
nodePort: 32755
port: 443
protocol: TCP
targetPort: 443
selector:
app: ingress-nginx-nginx-ingress
sessionAffinity: None
type: LoadBalancer
status:
loadBalancer:
ingress:
- ip: 111.111.111.111
kind: List
metadata:
resourceVersion: ""
selfLink: ""
我有一个为我的应用程序设置的服务
kubectl get service --namespace=my-app -o yaml
apiVersion: v1
items:
- apiVersion: v1
kind: Service
metadata:
annotations:
meta.helm.sh/release-name: my-app
meta.helm.sh/release-namespace: my-app
creationTimestamp: "2022-05-12T12:11:47Z"
labels:
app.kubernetes.io/instance: my-app
app.kubernetes.io/managed-by: Helm
app.kubernetes.io/name: my-app
app.kubernetes.io/version: 1.16.0
helm.sh/chart: my-app-0.1.0
name: my-app
namespace: my-app
resourceVersion: "7395487"
selfLink: /api/v1/namespaces/my-app/services/my-app
uid: d72661e1-be92-42f5-a030-65bdf4da06c8
spec:
clusterIP: 10.254.153.184
ports:
- name: http
port: 80
protocol: TCP
targetPort: http
selector:
app.kubernetes.io/instance: my-app
app.kubernetes.io/name: my-app
sessionAffinity: None
type: ClusterIP
status:
loadBalancer: {}
kind: List
metadata:
resourceVersion: ""
selfLink: ""
和以下输入:
kubectl get ingress --namespace=my-app -o yaml
apiVersion: v1
items:
- apiVersion: extensions/v1beta1
kind: Ingress
metadata:
annotations:
kubernetes.io/ingress.class: nginx
meta.helm.sh/release-name: my-app
meta.helm.sh/release-namespace: my-app
nginx.ingress.kubernetes.io/rewrite-target: /$2
creationTimestamp: "2022-05-16T11:38:13Z"
generation: 3
labels:
app.kubernetes.io/instance: my-app
app.kubernetes.io/managed-by: Helm
app.kubernetes.io/name: my-app
app.kubernetes.io/version: 1.16.0
helm.sh/chart: my-app-0.1.0
name: my-app
namespace: my-app
resourceVersion: "8501216"
selfLink: /apis/extensions/v1beta1/namespaces/my-app/ingresses/my-app
uid: 27fa844e-7672-47ff-94b2-b9c18492cb5d
spec:
rules:
- http:
paths:
- backend:
serviceName: my-app
servicePort: 80
path: /
status:
loadBalancer: {}
kind: List
metadata:
resourceVersion: ""
selfLink: ""
基于此,我希望能够转到 http://111.111.111.111.1111 /并将其路由到my-app
,但我只得到404。
入口日志给出:
controller.go:3050[] Using the DEPRECATED annotatio │
│ n 'kubernetes.io/ingress.class'. The 'ingressClassName' field will be ignored.
我在
event.go:285[] Event(v1.ObjectReference{Kind:"Ingre │
│ ss", Namespace:"my-app", Name:"my-app", UID:"27fa844e-7672-47ff-94b2-b9c18492cb5d", APIVersion:"networking.k8s.io/v1beta1", ResourceVersio │
│ n:"8499566", FieldPath:""}): type: 'Warning' reason: 'Rejected' my-app/my-app was rejected: with error: spec.rules[0].host: Required value
做什么错!?
I'm trying to expose my application in K8s.
I have set up an Ingress Controller which gives the following properties:
kubectl get svc,pods --namespace ingress
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/ingress-nginx-nginx-ingress LoadBalancer 10.254.234.220 111.111.111.111 80:32097/TCP,443:32755/TCP 16d
NAME READY STATUS RESTARTS AGE
pod/ingress-nginx-nginx-ingress-68848c49f8-54lx4 1/1 Running 0 12d
pod/ingress-nginx-nginx-ingress-68848c49f8-5dx97 1/1 Running 0 12d
pod/ingress-nginx-nginx-ingress-68848c49f8-89grn 1/1 Running 0 12d
So when i go to https://111.111.111.111
(not the real address) in my browser, I get:
This is the ingress for my app in values.yaml`
ingress:
name: externalIngress
enabled: true
type: LoadBalancer
ingressClassName: "nginx"
annotations:
kubernetes.io/ingress.class: "nginx"
nginx.ingress.kubernetes.io/rewrite-target: /$2
hosts:
- host:
paths:
- path: "/"
backend:
serviceName: my-app
servicePort: 80
using the template:
{{- if .Values.ingress.enabled -}}
{{- $fullName := include "my-app.fullname" . -}}
{{- $svcPort := .Values.service.port -}}
{{- if semverCompare ">=1.14-0" .Capabilities.KubeVersion.GitVersion -}}
apiVersion: networking.k8s.io/v1beta1
{{- else -}}
apiVersion: extensions/v1beta1
{{- end }}
kind: Ingress
metadata:
name: {{ $fullName }}
labels:
{{- include "my-app.labels" . | nindent 4 }}
{{- with .Values.ingress.annotations }}
annotations:
{{- toYaml . | nindent 4 }}
{{- end }}
spec:
{{- if .Values.ingress.tls }}
tls:
{{- range .Values.ingress.tls }}
- hosts:
{{- range .hosts }}
- {{ . | quote }}
{{- end }}
secretName: {{ .secretName }}
{{- end }}
{{- end }}
rules:
{{- range .Values.ingress.hosts }}
- host: {{ .host | quote }}
http:
paths:
{{- range .paths }}
- path: {{ .path }}
backend:
serviceName: {{ $fullName }}
servicePort: {{ $svcPort }}
{{- end }}
{{- end }}
{{- end }}
I have a service set up for the ingress:
kubectl get service --namespace=ingress -o yaml
apiVersion: v1
items:
- apiVersion: v1
kind: Service
metadata:
annotations:
meta.helm.sh/release-name: ingress-nginx
meta.helm.sh/release-namespace: ingress
creationTimestamp: "2022-04-29T14:51:36Z"
labels:
app.kubernetes.io/instance: ingress-nginx
app.kubernetes.io/managed-by: Helm
app.kubernetes.io/name: ingress-nginx-nginx-ingress
helm.sh/chart: nginx-ingress-0.10.4
name: ingress-nginx-nginx-ingress
namespace: ingress
resourceVersion: "4711523"
selfLink: /api/v1/namespaces/ingress/services/ingress-nginx-nginx-ingress
uid: a8183382-151f-499b-b06f-0a189e302226
spec:
clusterIP: 10.254.234.220
externalTrafficPolicy: Local
healthCheckNodePort: 31343
ports:
- name: http
nodePort: 32097
port: 80
protocol: TCP
targetPort: 80
- name: https
nodePort: 32755
port: 443
protocol: TCP
targetPort: 443
selector:
app: ingress-nginx-nginx-ingress
sessionAffinity: None
type: LoadBalancer
status:
loadBalancer:
ingress:
- ip: 111.111.111.111
kind: List
metadata:
resourceVersion: ""
selfLink: ""
I have a service set up for my app
kubectl get service --namespace=my-app -o yaml
apiVersion: v1
items:
- apiVersion: v1
kind: Service
metadata:
annotations:
meta.helm.sh/release-name: my-app
meta.helm.sh/release-namespace: my-app
creationTimestamp: "2022-05-12T12:11:47Z"
labels:
app.kubernetes.io/instance: my-app
app.kubernetes.io/managed-by: Helm
app.kubernetes.io/name: my-app
app.kubernetes.io/version: 1.16.0
helm.sh/chart: my-app-0.1.0
name: my-app
namespace: my-app
resourceVersion: "7395487"
selfLink: /api/v1/namespaces/my-app/services/my-app
uid: d72661e1-be92-42f5-a030-65bdf4da06c8
spec:
clusterIP: 10.254.153.184
ports:
- name: http
port: 80
protocol: TCP
targetPort: http
selector:
app.kubernetes.io/instance: my-app
app.kubernetes.io/name: my-app
sessionAffinity: None
type: ClusterIP
status:
loadBalancer: {}
kind: List
metadata:
resourceVersion: ""
selfLink: ""
And the following ingress:
kubectl get ingress --namespace=my-app -o yaml
apiVersion: v1
items:
- apiVersion: extensions/v1beta1
kind: Ingress
metadata:
annotations:
kubernetes.io/ingress.class: nginx
meta.helm.sh/release-name: my-app
meta.helm.sh/release-namespace: my-app
nginx.ingress.kubernetes.io/rewrite-target: /$2
creationTimestamp: "2022-05-16T11:38:13Z"
generation: 3
labels:
app.kubernetes.io/instance: my-app
app.kubernetes.io/managed-by: Helm
app.kubernetes.io/name: my-app
app.kubernetes.io/version: 1.16.0
helm.sh/chart: my-app-0.1.0
name: my-app
namespace: my-app
resourceVersion: "8501216"
selfLink: /apis/extensions/v1beta1/namespaces/my-app/ingresses/my-app
uid: 27fa844e-7672-47ff-94b2-b9c18492cb5d
spec:
rules:
- http:
paths:
- backend:
serviceName: my-app
servicePort: 80
path: /
status:
loadBalancer: {}
kind: List
metadata:
resourceVersion: ""
selfLink: ""
A clusterRole for the ingress with the following permissions:
Based on this, I'd expect to be able to go to http://111.111.111.111/ and be routed to my-app
but I just get the 404.
The ingress logs give:
controller.go:3050[] Using the DEPRECATED annotatio │
│ n 'kubernetes.io/ingress.class'. The 'ingressClassName' field will be ignored.
and
event.go:285[] Event(v1.ObjectReference{Kind:"Ingre │
│ ss", Namespace:"my-app", Name:"my-app", UID:"27fa844e-7672-47ff-94b2-b9c18492cb5d", APIVersion:"networking.k8s.io/v1beta1", ResourceVersio │
│ n:"8499566", FieldPath:""}): type: 'Warning' reason: 'Rejected' my-app/my-app was rejected: with error: spec.rules[0].host: Required value
What am I doing wrong!?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
模板后通常更容易共享YAML :)
为了使您需要工作 -
(在Ingress名称空间)
(应用程序空间)
,我的猜测就是您的问题 - 试图将流量直接发送到POD而不是通过服务。如果我的猜测是错误的,则NGINX入口控制器的日志应该更加清楚。您可能不需要运行其中的3个,特别是启动BTW;)
Its usually easier to share the yaml AFTER the templating :)
In order for this to work you need-
( in the ingress namespace)
(in your app namespace)
Since you didn't mention a service, my guess is thats your issue- trying to send traffic directly to the pod instead of through a service. If my guess is wrong, the logs from the nginx ingress controller should be more clear. You probably don't need to run 3 of those especially to start btw ;)