[TechStory]:将服务和数据库从OpenShift(或K8S)群集到另一个
#mysql #kubernetes #openshift #techstory

欢迎朋友加入另一个技术故事!

我对OpenShift的第一次经历是一项艰巨的任务,我对OpenShift或K8s一无所知!但是我负责将资源从集群迁移到彼此! (两次!)

但是我在中间学到了很多东西,所以让我们看看其中的一些。

在深入潜水之前,您可能会想知道什么是OpenShift,为什么我每次都将其名字放在K8S旁边,实际上是因为OpenShift构建在K8的顶部,并且有点相同(+几个功能),所以Don担心差异。

所以有什么问题?

正如我之前告诉您的,我必须将诸如应用程序(PODS+Services+路线),数据库(+其数据)等资源从OKD3 clusterOKD3 cluster)(OKD4 cluster(OpenShift的不同版本)

)移动。

这种迁移的原因?我不知道!
老实说,这已经决定,并且在董事会上,
同样在某些公司中,Kubernetes有两个方面,云方和开发人员方面,我们(开发人员)不午餐Kubernetes,而是我们在这里午餐。

我从哪里开始的?

我在Stackoverflow上问了两个问题,因为首先对我来说还不清楚该怎么办,并且有很多建议,我只是提到:

注意:不幸的是,我无法提供有关问题的链接,尽管他们受到了好评,但主持人删除了它们ðä

我还找到并提供了我的答案,我遵循了它,我认为这教会了我很多东西,而且没有错,但是对于这种情况而言,它的解决方案还不够好。

解决方案不够好!

要在K8S集群中制作资源,您应该谨慎对待其优先级,

首先要制作的是秘密和配置地图,因为它们不依赖任何东西,但一切都可以取决于它们!

最后一件事是路线,猜猜为什么?因为它们取决于服务,但没有任何取决于它们!

因此,优先级是:

  • 秘密和configmaps
  • 状态
  • 部署
  • 服务
  • 路线

您可能不需要直接移动POD,因为它们通常是由其他资源(例如
)制造和控制的 部署或状态群体。

遵循的步骤:

  • 登录到第一个集群:
oc login --token="your-token-for-first-server" --server="your-first-server"
  • 导出您的资源:
oc get -o yaml cm > configmaps.yaml
oc get -o yaml secrets > secrets.yaml
...

也有一些默认的configmaps和秘密您不需要复制,您可以从生成的yaml文件中删除它们。

  • 登录到第二个集群:
oc login --token="your-token-for-second-server" --server="your-second-server"

如果您忘记了此步骤,则可能会遇到一个说明resource already exists的错误,但请注意不要忘记此步骤。

  • 将资源加载到第二个集群
oc create -f configmaps.yaml
oc create -f secrets.yaml
...

更好的解决方案

有一个更好的解决方案,我们可以使用Templates并为不同的群集,环境或名称空间进行处理。

此外,将它们与CI/CD管道结合使用,可以通过更改一些变量来帮助我们移动资源!

Helm效果更好!我个人更喜欢掌舵而不是基本模板。

我改善了我们的CI/CD管道和掌舵(使用的掌舵)我们的应用程序,以更轻松,清洁和无缝部署。

那DB呢?

db也是这里的另一个重要且长期的讨论,但数据库应用程序本身不是我们可以轻松创建的,但是我们该如何处理数据?数据就是一切!

在我的情况下,它们是两种情况:

  • 生产
  • 阶段(测试环境 - 伪造数据生产)

在生产中,我们拥有一个由DBA团队控制和拥有的托管数据库,我们只有URL可以访问它,这已经足够了。

因此,在您访问外部数据库中的数据(从集群之外)中,您不需要任何额外的工作。

但是,在舞台上,我们的数据存储在由状态填充控制的POD上的PVC中。

注意:我们有mysql,您可能还有其他东西,但是这个家伙几乎是一样的。

遵循的步骤:

步骤1:登录和波特向前

登录第一个OpenShift群集:

oc login --token=<YOUR-TOKEN> --server=<YOUR-SERVER>

列出所有POD,然后选择您的DB POD(如果复制,请选择Master(0))并复制它:

oc get pods

对您本地计算机进行端口范围:

oc port-forward <MYSQL-POD-NAME> <desired-local-port>:<mysql-on-server-port>

因此,您的服务器数据库现在(喜欢)您的本地数据库!并且您在服务器上想要的任何更改都可以在localhost上完成。

对于所有数据库和应用程序,此方法都是相同的。


步骤2:工具

安装mysql命令行工具(如果安装了它们,请跳过此步骤)。
具体来说,我们需要mysqldumpmysql命令。

这样做,在MacOS运行中:

brew install mysql-client

我需要将它们添加到路径(通常是自动发生的),在下面运行命令,然后将/opt/homebrew/opt/mysql-client/bin添加到文件末尾:

sudo nano /etc/paths 

可以使用其他编辑器,例如VSCODE(type in terminal中的code)代替纳米。

有关更多信息,请阅读herehere


步骤3:垃圾场

mysqldump --column-statistics=0 --no-create-info -P <local-port> -h 127.0.0.1 -u <YOUR-USERNAME> -p "YOUR-DATABASE-NAME" > file_name.sql

然后,要求您输入数据库密码。

就我而言,我以前运行了迁移脚本,所以我不希望我的转储包含CREATE TABLE...查询,所以我添加了--no-create-info参数,但是您可能需要删除它。

另外,我正在面对Unknown table 'COLUMN_STATISTICS' in information_schema (1109)错误,所以我添加了--column-statistics=0参数。
有关更多信息,请阅读herehere

关于主机IP,请勿使用localhost,它可能是按套接字连接的,而不是端口。


步骤4:加载转储

现在,登录到第二个群集,制作状态满集,并如前所述,端口向前其数据库,
(您可以在此类似于本地的数据库上运行迁移脚本,并且也将在集群上完成)

然后,将转储带有以下命令:

mysql -P <local-port> -h 127.0.0.1 -u <YOUR-USERNAME> -p -f "YOUR-DATABASE-NAME" < file_name.sql

就我而言,我有一些不重要的错误,我通过了-f参数来跳过它们,但是在使用此参数时要小心,因为它迫使数据库遵循您在file_name.sql上定义的简介。

结论

TechStories是我真正的工作经历,因为它们包含了许多信息和其他文章的链接,因此它们可能会令人困惑,这就是我的意思!我们(开发人员)不以人们在通常的文章和教程中看到的方式工作,因此我想在教授许多不同的技巧旁边分享我的知识。

我希望你喜欢! ð¥³ð¼