将本地执行的服务(minikube)集成到Kubernetes集群中

时间:2020-04-06 12:20:52

标签: kubernetes cluster-computing workflow minikube

我目前正在为一个包含大约十项服务的现有设置设计Kubernetes集群。以前,我是使用minikube在本地开发和测试这些服务的,后来我在不同的物理机器上将它们发布为一个自托管的Kubernetes实例(我们将其称为登台系统)。这些部署的服务中的某些服务需要访问同一网络中其他计算机上的资源。这意味着我的开发环境(minikube)也需要访问那些外部资源。这是该集群中一个进程的简短“模型”。

+-----------+
| External  |
| Service X |
+-----------+
    ^
    |
+-----------+       +-----------+
| Service A |  <--  | Service B |
+-----------+       +-----------+

由于进行了一些网络更改,因此我不再可以访问这些远程资源,这意味着本地计算机不再可以访问外部服务X。我想问问是否有可能在本地计算机上托管Service B,但是将其“连接”到远程集群。是否可以将minikube用作现有Kubernetes实例的简单节点?我在很大程度上依赖于CoreDNS的服务发现,这意味着我想找到一个基础架构级别的解决方案,而不是应用程序级别的方法。如果登台系统甚至不真正知道我的服务B不是本地托管的,那将是理想的。很抱歉,这可能是一个愚蠢的问题,但目前看来我对Kubernetes有点了解。

1 个答案:

答案 0 :(得分:0)

如果您有两个单独的 kubernetes集群,例如 Minikube 和其他一些远程kubernetes集群的本地实例,并且您希望它们能够彼此交互,您可以将其用于Services without selectors

您可以将远程 kubernetes集群视为任何其他外部资源(例如在单独的计算机/ vm上运行的数据库服务器),并且可以在内部将其公开给集群。通常,我们在外部公开在 k8s集群上运行的内容,但是在这种情况下,我们希望在内部向集群公开外部资源,就好像它是另一个内部资源一样。从Pods的角度看,它实际上看起来像是内部资源,可以在其本地群集域下使用,其方式与内部资源完全相同,并由简单的ClusterIP服务公开。

让我们快速看一下如何实现它。官方kubernetes文档的this section中对此进行了很好的解释:

服务最常见的是对Kubernetes Pod的抽象访问,但是它们 还可以提取其他种类的后端。例如:

  • 您希望在生产中使用外部数据库集群,但是在测试环境中,您将使用自己的数据库。
  • 您想将您的服务指向其他Namespace中的服务 或在另一个群集上。
  • 您正在将工作负载迁移到Kubernetes。在评估该方法时,您只在Kubernetes中运行一部分后端。

在任何这些情况下,您都可以定义没有Pod的服务 选择器。例如:

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  ports:
    - protocol: TCP
      port: 80
      targetPort: 9376

因为此服务没有选择器,所以相应的端点 对象不会自动创建。您可以手动映射服务 通过添加一个 手动端点对象:

apiVersion: v1
kind: Endpoints
metadata:
  name: my-service
subsets:
  - addresses:
      - ip: 192.0.2.42
    ports:
      - port: 9376

如果提到的 dev staging 环境之间只有网络连接,则可以使用没有选择器的服务。如果您需要 Minikube 群集通过 staging 群集能够连接到192.0.2.42:9376上公开的内容,则只需在中使用此IP >端点对象定义。服务已定义为在80上侦听,因此最终会在此标准端口下在内部向您公开 Minikube Pods

该解决方案的最大优点是,Service可以使内部的特定外部资源可供本地 k8s集群上的Pods中运行的应用使用,并且使用其DNS名称,即在同一service-name中使用namespace或通过群集中任何<my-service-name>.<namespace>.svc.cluster.local中的FQDN namespace来引用它。

如果外部资源域名下可用,则您也可以考虑使用ExternalName,这是一种特殊的服务,没有选择器,在这种情况下,您不必手动配置任何Endpoints对象。其定义可能如下所示:

apiVersion: v1
kind: Service
metadata:
  name: my-service
  namespace: prod
spec:
  type: ExternalName
  externalName: my.database.example.com
相关问题