Kubernetes入口路由HTTP与Kestrel



我是k8s新手,慢慢上手。我已经构建了一个运行在。net 5上的web api,只使用HTTPS(以前的版本使用http),我在docker撰写中构建了图像,一切都与默认的aspnetapp在本地按预期工作。我正在努力解决的问题是,我的入口路由似乎提前终止了连接。

我已经为kestrel创建了一个证书pfx,以a.b..com的CN名称运行,这来自于在文档中创建秘密所需的crt和密钥文件。但是根据我的理解,红隼需要一个PFX来运行(直接从盒子里出来)。

下面是我的入口,服务和部署片段以及来自日志的条目:我认为我的问题是,在日志中,它显示为"http"请求,但应该是https

日志:

2021/02/24 09:44:11 [error] 3231#3231: *44168360 upstream prematurely closed connection while reading response header from upstream, client: 127.0.0.1, server: _, request: "GET /dayofweek/api/1/dayofweek/action HTTP/2.0", upstream: "http://<podip>/api/1/dayofweek/action", host: "<clusterip>:<nodePort>"

入口:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: dayofweek-ingress-path
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /$1
nginx.ingress.kubernetes.io/auth-type: basic
nginx.ingress.kubernetes.io/auth-secret: basic-auth
#kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/ssl-passthrough: "true"
nginx.ingress.kubernetes.io/ssl-redirect: "true"
nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
spec:
rules:
- host: a.b.com
-  http:
paths:
- backend:
service:
name: dayofweek-svc
port:
number: 9057
path: /dayofweek/?(.*)
pathType: Prefix

Service + Deployment

apiVersion: v1
kind: Service
metadata:
name: dayofweek-svc
labels:
run: dayofweek-svc
spec:
ports:
- port: 9057
targetPort: 3441
protocol: TCP
name: https
selector:
app: dayofweek
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: dayofweek
spec:
replicas: 1
selector:
matchLabels:
app: dayofweek
template:
metadata:
labels:
app: dayofweek
spec:
volumes:
- name: cert-volume
persistentVolumeClaim:
claimName: persistentcerts-claim
containers:
- name: dayofweek
image: ...omitted
ports:
- containerPort: 3441
env:
- name: DOTNET_ENVIRONMENT
value: Development
- name: Culture
value: en-US #English by default
- name: ASPNETCORE_Kestrel__Certificates__Default__Path
value: /https/aspnetapp.pfx
- name: ASPNETCORE_Kestrel__Certificates__Default__Password
value: password
volumeMounts:
- mountPath: /https
name: cert-volume

我在这里遵循指南:https://kubernetes.io/docs/concepts/services-networking/connect-applications-service/

我似乎已经启动并运行了,但是由于某些原因,我不确定我是否因为添加了"-host"而使它过于复杂。元素。

任何帮助都将非常感激!

服务和部署看起来是正确的,但是我可以看到一些入口问题。

当使用ssl-passthrough基于路径的路由不起作用时,你可以跳过它。

还有,在你的配置中有一个错别字:

- host: a.b.com
-  http:    # <- HERE

不应该有第二个破折号

应该是这样的:

spec:
rules:
- host: a.b.com
http:
paths:

另外,看看nginx ingres文档对ssl-passthrough的说明:

SSL透传

——enable-ssl-passthrough标志启用SSL直通功能,默认情况下禁用。这是必需的在Ingress对象中启用直通后端.

警告该特性通过拦截设备上的所有流量来实现配置HTTPS端口(默认为443)并将其移交给本地TCP代理。这完全绕过了NGINX,并引入了一个不可忽略的性能损失。

SSL Passthrough利用SNI并从对象中读取虚拟域TLS协商,需要兼容的客户端。连接后已被TLS监听器接受,它是由控制器处理吗在后台和客户端之间来回传输。

如果没有与请求的主机名相匹配的主机名,则返回请求是否在配置的直通代理端口上移交给NGINX(默认值:442),它将请求代理到默认后端。


文档中也有:

SSL透传

nginx.ingress.kubernetes。Io/ssl-passthrough指示控制器将TLS连接直接发送到后端,而不是让NGINX解密通信。参见用户指南中的TLS/HTTPS。

* *默认情况下禁用SSL Passthrough,并且需要启动带——enable-ssl-passthrough标志的控制器。

注意

因为SSL Passthrough工作在OSI模型的第4层(TCP)和而不是在第7层(HTTP)上,使用SSL直通会使所有的在Ingress对象上设置的其他注释。


因此,根据文档,为了使其工作,您需要首先启用ssl-passthrough功能。在此之后,您可以使用ssl-passthrough注释,但这会使所有其他注释无效,并且基于路径的路由停止工作。

相关内容

  • 没有找到相关文章

最新更新