服务将所有流量分发到由复制控制器创建的其中一个 POD

服务将所有流量分发到由复制控制器创建的其中一个 POD

我有一个可创建多个 POD 的复制控制器。每个 POD 内都有一个运行应用程序的容器。

现在在容器内,它可以调用如下的 kubernetes API。

KUBE_TOKEN=$(</var/run/secrets/kubernetes.io/serviceaccount/token)
curl --silent --insecure --header "Authorization: Bearer $KUBE_TOKEN"  \
      https://$KUBERNETES_SERVICE_HOST:$KUBERNETES_PORT_443_TCP_PORT/api/v1/namespaces/$POD_NAMESPACE/pods/$POD_NAME

POD_NAME是 POD 的名称; POD_NAMESPACE是 POD 的命名空间

集群中的应用实例组成一个集群,集群中选举出一个应用实例为主实例,其他为从实例,实时从主实例复制数据,当主实例故障时,另一个从实例将被提升为主实例。

当容器中的应用程序提升为主应用程序时,我希望主应用程序实例调用kubernetes API,以便所有流量都流向这个POD /容器。

{
  "kind": "Service",
  "apiVersion": "v1",
  "metadata": {
    "name": "my-cluster"
  },
  "spec": {
    "ports": [{
      "port": 33379,
      "targetPort": 33379
    }],
    "type" : "None",
    "selector": {
      "name": "<POD_NAME>"
    }
  }
}

我指定了POD_NAME作为选择器,但是服务找不到任何 POD。

我该如何配置服务以便所有流量都流向该 POD?

答案1

您可以让服务选择器选择一个"master"标签,例如"role": "master"- 然后您可以将主标签添加到被选为主的 pod。可以使用 PATCH 方法在正在运行的 pod 上更改标签。

我指定了 POD_NAME 作为选择器,但是服务找不到任何 POD。

name标签与选择器中的任何其他标签的处理方式相同。一种常见的做法是将名称标签添加到与元数据名称匹配的 Pod,然后在选择器中使用该标签,但如果 Pod 上没有该标签,选择器将找不到它。

相关内容