Kubernetes进入外部服务?

ccl*_*oyd 2 kubernetes

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

由于使用kubernetes入口来控制对服务的访问是如此简单和容易,因此我想拥有一个指向非kubernetes服务的kubernetes入口。

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

Mou*_*ick 16

所以我使用ingress-nginx通过非标准端口代理托管外部服务

apiVersion: v1
kind: Service
metadata:
  name: external-service-expose
  namespace: default
spec:
  type: ExternalName
  externalName: <external-service> # eg example.example.com
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: external-service-expose
  namespace: default
  annotations:
    nginx.ingress.kubernetes.io/backend-protocol: "HTTPS" #important
spec:
  rules:
  - host: <some-host-on-your-side> # eg external-service.yourdomain.com
    http:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: external-service
            port:
              number: <port of external service> # eg 4589
  tls:
  - hosts:
    - external-service.yourdomain.com
    secretName: <tls secret for your domain>
Run Code Online (Sandbox Code Playgroud)

当然,您需要确保可以从集群内部访问托管 url,可以通过启动调试 pod 并执行以下操作来完成简单的检查

curl -v https://example.example.com:4589
Run Code Online (Sandbox Code Playgroud)


Ral*_*lph 8

我只是想根据 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
Run Code Online (Sandbox Code Playgroud)


Ant*_*nko 5

可以通过为外部服务器手动创建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
Run Code Online (Sandbox Code Playgroud)

然后,您可以创建一个Ingress对象,该对象指向external-ip带有port的Service 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: /
Run Code Online (Sandbox Code Playgroud)


c4f*_*t0r 5

如果您的外部服务上配置了 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: /
Run Code Online (Sandbox Code Playgroud)

这样kubernetes创建cname记录my-service指向myexternal.http.service.com

  • CNAME 不会有帮助,因为该问题需要将端口从 80 转换为 5678。 (2认同)