[英]Kubernetes Ingress to External Service?
假设我有一个不在 Kubernetes 上托管的服务。 我还在我的 kubernetes 集群上设置了一个入口控制器和证书管理器。
因为使用 kubernetes ingress 来控制对服务的访问非常简单和容易,所以我想要一个指向非 kubernetes 服务的 kubernetes ingress。
例如,我有一个托管在https://10.0.40.1:5678
(需要 ssl,但需要自签名证书)的服务,并希望在service.example.com
上访问。
您可以通过为外部服务器手动创建 Service 和 Endpoint 对象来实现。
对象看起来像这样:
apiVersion: v1
kind: Service
metadata:
name: external-ip
spec:
ports:
- name: app
port: 80
protocol: TCP
targetPort: 5678
clusterIP: None
type: ClusterIP
---
apiVersion: v1
kind: Endpoints
metadata:
name: external-ip
subsets:
- addresses:
- ip: 10.0.40.1
ports:
- name: app
port: 5678
protocol: TCP
然后,您可以创建一个 Ingress 对象,该对象将指向具有端口80
Service external-ip
:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: external-service
spec:
rules:
- host: service.example.com
http:
paths:
- backend:
serviceName: external-ip
servicePort: 80
path: /
如果您的外部服务上配置了 dns 条目,您可以使用 kubernetes externalName 服务。
---
apiVersion: v1
kind: Service
metadata:
name: my-service
namespace: prod
spec:
type: ExternalName
externalName: myexternal.http.service.com
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: externalNameservice
namespace: prod
spec:
rules:
- host: service.example.com
http:
paths:
- backend:
serviceName: my-service
servicePort: 80
path: /
这样kubernetes创建cname记录my-service指向myexternal.http.service.com
所以我使用基于 nginx 的 kubernetes 入口控制器通过非标准端口代理托管外部服务
apiVersion: v1
kind: Service
metadata:
name: managed-expose
namespace: default
spec:
type: ExternalName
externalName: <external-service> eg example.example.com
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: managed-expose
namespace: default
annotations:
nginx.ingress.kubernetes.io/backend-protocol: "HTTPS" #important
spec:
rules:
- host: <some-host-on-your-side> eg managed.yourdomain.com
http:
paths:
- backend:
serviceName: managed-expose
servicePort: <port of external service> eg 4589
path: /
tls:
- hosts:
- managed.yourdomain.com
secretName: <tls secret for your domain>
当然,您需要确保可以从集群内部访问托管 url,可以进行简单的检查,例如
curl -v https://example.example.com:4589
我只是想根据 Kubernetes 版本 v1.21.1 在这里更新@Moulick 的答案,至于 ingress 配置已经改变了一点。 在我的示例中,我为我的 nginx 控制器使用了 Let's Encrypt:
apiVersion: v1
kind: Service
metadata:
name: external-service
namespace: default
spec:
type: ExternalName
externalName: <some-host-on-your-side> eg managed.yourdomain.com
ports:
- port: <port of external service> eg 4589
---
kind: Ingress
apiVersion: networking.k8s.io/v1
metadata:
name: external-service
namespace: default
annotations:
cert-manager.io/cluster-issuer: "letsencrypt-prod"
nginx.ingress.kubernetes.io/proxy-body-size: 100m
nginx.ingress.kubernetes.io/backend-protocol: "HTTPS" #important
spec:
tls:
- hosts:
- <some-host-on-your-side> eg managed.yourdomain.com
secretName: tls-external-service
rules:
- host: <some-host-on-your-side> eg managed.yourdomain.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: external-service
port:
number: <port of external service> eg 4589
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.