Kubernetes进入外部服务?

时间:2019-09-03 02:09:00

标签: kubernetes

说我有一个不在Kubernetes上托管的服务。我还在kubernetes集群上设置了一个入口控制器和证书管理器。

因为使用kubernetes入口来控制对服务的访问非常简单,所以我想拥有一个指向非kubernetes服务的kubernetes入口。

例如,我有一个托管在https://10.0.40.1:5678上的服务(需要SSL,但具有自签名证书),并且想要访问service.example.com

4 个答案:

答案 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