繁体   English   中英

Kubernetes 入口到外部服务?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM