说我有一个不在Kubernetes上托管的服务。我还在kubernetes集群上设置了一个入口控制器和证书管理器。
因为使用kubernetes入口来控制对服务的访问非常简单,所以我想拥有一个指向非kubernetes服务的kubernetes入口。
例如,我有一个托管在https://10.0.40.1:5678
上的服务(需要SSL,但具有自签名证书),并且想要访问service.example.com
。
答案 0 :(得分:5)
您can通过为外部服务器手动创建服务和端点对象来实现。
对象看起来像这样:
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对象,该对象将通过端口external-ip
指向服务80
:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: external-service
spec:
rules:
- host: service.example.com
http:
paths:
- backend:
serviceName: external-ip
servicePort: 80
path: /
答案 1 :(得分:2)
所以我使用基于 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
答案 2 :(得分:-1)
您无法在入口配置中指定某个规则应将流量转移到群集外部托管的服务。
您唯一的选择是在集群内部创建一个反向代理服务,并使其充当用户和真实服务之间的中间人。
简单方法-
var httpProxy = require('http-proxy');
var proxy = httpProxy.createProxyServer(options);
http.createServer(function(req, res) {
proxy.web(req, res, { target: 'http://mytarget.com:8080' });
});
答案 3 :(得分:-2)
如果外部服务上配置了dns条目,则可以使用kubernetes externalName服务。
如果外部服务上配置了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
以这种方式,kubernetes创建cname记录my-service指向myexternal.http.service.com