我的 Kubernetes 实例上设置了 Contour Ingress 控制器。我还根据 Contour 规范设置了 Ingress 资源和 HTTProxy 资源:
入口
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: common-api-ingress
annotations:
ingress.kubernetes.io/tls-minimum-version: "1.2"
spec:
ingressClassName: contour
tls:
- hosts:
- dev.mycompany.com
secretName: dev.mycompany.com-tls
rules:
- host: dev.mycompany.com
http:
paths:
- path: /api
pathType: Prefix
backend:
service:
name: my-service
port:
number: 80
- path: /swagger
pathType: Prefix
backend:
service:
name: my-service
port:
number: 80
HTTP代理
apiVersion: projectcontour.io/v1
kind: HTTPProxy
metadata:
name: signalr-proxy
spec:
virtualhost:
fqdn: dev.mycompany.com
tls:
secretName: dev.mycompany.com-tls
routes:
- conditions:
- prefix: /api/notificationhub
enableWebsockets: true # Setting this to true enables websocket for all paths that match /websocket
services:
- name: my-service
port: 80
此配置按预期工作,当我打开 UI 的 Chrome 开发人员工具时,我在“控制台”选项卡上看到以下日志:
config vundefined loaded
main.56e2cc4e6f9f283a998a.js:2 [01-003] redirecting...
main.56e2cc4e6f9f283a998a.js:2 Connection to signalR has been established....
2.b4c26156c9f4449d4bbf.js:2 Resetting cache..
我决定放弃 Contour 的自定义 HTTPProxy 资源并保留普通的 Ingress 资源。为此,我删除了之前提供的 HTTPProxy 资源,并在 Ingress 资源上添加了启用 websocket 流量的注释。更新后的 Ingress 资源如下:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: common-api-ingress
annotations:
ingress.kubernetes.io/tls-minimum-version: "1.2"
projectcontour.io/websocket-routes: /api/notificationhub/
spec:
ingressClassName: contour
tls:
- hosts:
- dev.mycompany.com
secretName: dev.mycompany.com-tls
rules:
- host: dev.mycompany.com
http:
paths:
- path: /api/notificationhub/
pathType: Prefix
backend:
service:
name: my-service
port:
number: 80
- path: /swagger
pathType: Prefix
backend:
service:
name: my-service
port:
number: 80
当我部署此更新时,我在 Chrome 开发者工具控制台中收到以下错误:
config vundefined loaded
main.56e2cc4e6f9f283a998a.js:2 [01-002] redirecting...
main.56e2cc4e6f9f283a998a.js:2 ERROR e
Wn @ main.56e2cc4e6f9f283a998a.js:2
main.56e2cc4e6f9f283a998a.js:2 Connection to signalR has been established....
api/UserSettings/:1 Failed to load resource: the server responded with a status of 405 ()
2.b4c26156c9f4449d4bbf.js:2 Resetting cache...
视觉:
Contour 部署具有以下一组 pod:
kubectl -n projectcontour get pods
NAME READY STATUS RESTARTS AGE
contour-controller-contour-b5d6fdxxx-xxxxx 1/1 Running 1 (3d1h ago) 112d
contour-controller-contour-b5d6fdxxx-xx8x8 1/1 Running 1 (17d ago) 150d
contour-controller-contour-b5d6fdxxx-xxxxx 1/1 Running 2 (3d1h ago) 150d
contour-controller-envoy-ncxxx 2/2 Running 0 10d
contour-controller-envoy-wcxxx 2/2 Running 0 150d
contour-controller-envoy-wxxxx 2/2 Running 0 150d
contour-controller-envoy-xkxxx 2/2 Running 2 (69d ago) 146d
但是我有另一个 Grafana 的 Ingress 资源,它使用 websockets 并且工作完美。下面提供了 Helm value.yaml 文件:
adminPassword: "*xxa]{xxxxxxxxxxx"
grafana.ini:
server:
root_url: https://dev.mycompany.com/-/grafana
serve_from_sub_path: true
smtp:
enabled: true
host: mail2.mycompany.com:25
from_address: [email protected]
skip_verify: true
ingress:
enabled: true
ingressClassName: contour
annotations:
projectcontour.io/websocket-routes: /-/grafana/
hosts:
- dev.mycompany.com
path: /-/grafana/
tls:
- hosts:
- dev.mycompany.com
secretName: dev.mycompany.com-tls
persistence:
enabled: true
我错过了什么?
我错误地配置了 websocket 路由。我所需要的只是为 websocket 路由本身添加一个单独的路径:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: common-api-ingress
annotations:
ingress.kubernetes.io/tls-minimum-version: "1.2"
projectcontour.io/websocket-routes: /api/notificationhub
spec:
ingressClassName: contour
tls:
- hosts:
- dev.mycompany.com
secretName: dev.mycompany.com-tls
rules:
- host: dev.mycompany.com
http:
paths:
- path: /api
pathType: Prefix
backend:
service:
name: my-service
port:
number: 80
- path: /api/notificationhub
pathType: Prefix
backend:
service:
name: my-service
port:
number: 80
- path: /swagger
pathType: Prefix
backend:
service:
name: my-service
port:
number: 80