首页 > 解决方案 > 从集群外部连接到 statefulset 内的特定 pod

问题描述

我有一个与 StatefulSet Kubernetes 教程中描述的相匹配的 StatefulSet,它创建了一个 mysql 主/从结构。我有以下 Kubernetes 对象:

    NAME          READY   STATUS    RESTARTS   AGE
pod/mysql-0   2/2     Running   7          23h
pod/mysql-1   2/2     Running   6          23h
pod/mysql-2   2/2     Running   6          23h

NAME                 TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
service/kubernetes   ClusterIP   10.152.183.1    <none>        443/TCP    21d
service/mysql        ClusterIP   None            <none>        3306/TCP   23h
service/mysql-read   ClusterIP   10.152.183.89   <none>        3306/TCP   23h

NAME                     READY   AGE
statefulset.apps/mysql   3/3     23h

编辑: mysql 和 mysql-read 服务与所有 mysql pod 连接。

节点在我的电脑上,我用的是microk8s。

现在我有一个小程序在我的计算机上运行(不在集群中),我想连接到 StatefulSet 中的主服务器(mysql-0)。我需要像只与 mysql-0 连接的服务之类的东西。关于如何做的任何建议?

编辑:想法是找到一个解决方案,允许我仅使用 .yaml 文件部署集群。找到一个包含更多命令的命令并不有趣kubectl apply

该程序如下:

import mysql.connector

mydb = mysql.connector.connect(
  host="localhost??",
  user="root",
  passwd="",
  database="testtable"
)

mycursor = mydb.cursor()

sql = "INSERT INTO testtable (name) VALUES (%s)"
val = ("holaquetal")
mycursor.execute(sql, val)

mydb.commit()

我想我可以向 mysql-0 pod 添加一个不同的标签并添加一个查找该标签的 NodePort 服务,但我不想通过命令行来执行此操作。是否可以在 StatefulSet yaml 中为 mysql-0 添加一个标签?

另一个想法可能是向microk8s提供的DNS服务器查询DNS,寻找“mysql.mysql-0”,但我不知道如何将程序连接到DNS服务器,以便我可以使用host=mysql.mysql-0或整个 CNAME。

标签: kubernetes

解决方案


如果节点在您的计算机上,则可以使用port-forward将 mysql 的端口从 pod 转发到您的本地。尝试这个:

kubectl port-forward mysql-0 3306:3306

或直接转发到您的主服务

kubectl port-forward svc/mysql-read 3306:3306


推荐阅读