k8s集群内的pod连接集群外部的mysql, k8s集群内部服务如何连接集群外部mysql? 一文搞明白

一、为什么不将mysql服务部署到k8s集群中使用呢?

1.有状态服务在K8s中的管理比较复杂,特别是持久化存储的问题。虽然K8s有StatefulSet和PV/PVC,但配置和维护起来需要更多工作,同时以下问题仍需解决:-存储可靠性:如果使用本地存储(如 hostPath),节点故障可能导致数据丢失;若用网络存储(如云盘),需确保性能和延迟满足数据库需求。 -备份与恢复:需额外配置定期备份工具(如 mysqldump、Percona XtraBackup),并验证恢复流程的可靠性。-数据库版本升级或迁移(如从 MySQL 5.7 到 8.0)在 Kubernetes 中可能涉及复杂的 StatefulSet 滚动更新策略,风险较高。2.网络和性能问题,比如存储I/O延迟,可能影响数据库性能。若应用和数据库部署在同一集群内,虽然网络延迟较低,但多副本数据库(如主从架构)跨节点通信可能引入额外延迟。高可用性和数据一致性也是挑战,需要配置主从复制、故障转移等。

二、什么情况下可以考虑在 Kubernetes 中部署 MySQL?

1.开发或测试环境快速迭代需求:在开发环境中,使用 Kubernetes 部署 MySQL 可以快速启停实例,配合 CI/CD 流水线实现自动化测试。
低成本验证架构:验证 Kubernetes 有状态服务管理能力时,可通过轻量级 MySQL 实例进行技术预研。2.本地化部署需求:在边缘节点(如工厂、物联网设备)中,若无法连接云端数据库,可在本地 Kubernetes 集群中部署 MySQL。
数据主权合规:某些行业要求数据必须存储在本地,此时需在私有 Kubernetes 集群中运行数据库。3.特殊版本或插件依赖:如果业务依赖特定 MySQL 版本或自定义插件(如自研的存储引擎),且云服务不兼容,可选择自建。
4.与 Kubernetes 生态深度集成:例如,需要将数据库日志直接接入集群内的 Elasticsearch,或通过 Service Mesh(如 Istio)实现数据库流量治理。

解决方案:在 Kubernetes 集群内部接入外部 MySQL 数据库,可以通过以下步骤实现。这里提供两种常见方法:使用 Service 资源直接指向外部地址通过 Endpoints 手动配置

实验开始前注意:

只要宿主机可以通讯,那么pod内也是可以直接通过宿主机的IP访问集群之外的服务。因为虽然是pod发出的请求,实际上经过转发,出去的时候是以宿主机的IP进行访问的,所以我们授权的时候,保证运行pod的宿主机能登录数据库就行了,并不是对pod的IP进行授权。

方法 1:使用 ExternalName 类型的 Service

适用于外部 MySQL 有固定域名的情况(如云服务商提供的数据库域名)。

1. 创建 ExternalName Service

[root@master ~]# mysql-external.yaml
apiVersion: v1
kind: Service
metadata:name: mysql-external  # 集群内通过该名称访问
spec:type: ExternalNameexternalName: your-mysql-hostname.example.com  # 外部MySQL的域名如:阿里云的RDSports:- port: 3306        # Service 暴露的端口targetPort: 3306  # 外部MySQL的实际端口

应用配置:

[root@master ~]# kubectl apply -f mysql-external.yaml
2. 应用程序连接方式

在应用中配置数据库主机为 mysql-external(Service 名称),端口为 3306。Kubernetes DNS 会自动将 mysql-external 解析为外部域名。

方法 2:手动指定 Endpoints(适用于IP直连)

如果外部 MySQL 是固定 IP 且无域名,可以手动创建 Service 和 Endpoints。

1.首先先登陆外部数据库创建一个普通用户并相应的授权设置为允许远程登陆。
[root@mysql-master ~]# mysql -uroot -p'Mysql@123!'
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 4
Server version: 5.7.44-log MySQL Community Server (GPL)Copyright (c) 2000, 2023, Oracle and/or its affiliates.Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.mysql> grant all on *.* to jack@'%' identified by 'Mysql@1233!';
Query OK, 0 rows affected, 1 warning (0.03 sec)mysql> flush privileges;
Query OK, 0 rows affected (0.01 sec)mysql>

在k8s集群中

1. 创建 Service 和 Endpoints

[root@master ~]# mkdir test/mysql -p 
[root@master ~]# cd test/mysql/
[root@master mysql]# kubectl create ns test #创建一个名称空间
[root@master mysql]# cat mysql-external-svc.yml
apiVersion: v1
kind: Service
metadata:name: mysql-externalnamespace: test
spec:ports:- port: 3306targetPort: 3306clusterIP: None #表示这是一个 headless service,直接通过 Endpoint 连接
---
apiVersion: v1
kind: Endpoints
metadata:namespace: testname: mysql-external #此名字需要于service中定义的name字段一致
subsets:
- addresses:- ip: 192.168.209.141 #定义外部mysql机器的ip地址ports:- port: 3306
当我们创建headless service时也会为service分配域名
service_name.namespace.svc.cluster.local我们可以通过dig或者nslookup 命令来解析查看dns是否解析成功。dns 为coredns负责解析

应用配置:

[root@master mysql]# kubectl apply -f mysql-external-svc.yml 
service/mysql-external created
endpoints/mysql-external created
[root@master mysql]# kubectl get svc,ep -n test 
NAME                     TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)    AGE
service/mysql-external   ClusterIP   None         <none>        3306/TCP   4m16sNAME                       ENDPOINTS              AGE
endpoints/mysql-external   192.168.209.141:3306   4m16s
2. 应用程序连接方式

在代码中配置数据库主机为 mysql-external(Service名称),端口 3306


关键注意事项

1. 网络连通性
  • 确保集群节点能访问外部MySQL:检查防火墙、安全组是否放行 Kubernetes 节点到 MySQL 的 3306 端口。

  • 测试连接

    1.创建一个centos的pod
    [root@master mysql]# cat test-mysql.yml 
    apiVersion: v1
    kind: Pod
    metadata:name: centos7-podnamespace: test
    spec:nodeName: node-1containers:- name: centos7-containerimage: registry.cn-hangzhou.aliyuncs.com/testpm-k8s/centos:7command:- sleep- "3600"[root@master mysql]# kubectl get pod -n test
    NAME          READY   STATUS    RESTARTS   AGE
    centos7-pod   1/1     Running   0          7s[root@master mysql]# kubectl exec -it centos7-pod -n test -- /bin/bash
    [root@centos7-pod /]# yum install -y mysql
    [root@centos7-pod /]# mysql -ujack -p'Mysql@1233!' -h mysql-external
    Welcome to the MariaDB monitor.  Commands end with ; or \g.
    Your MySQL connection id is 14
    Server version: 5.7.44-log MySQL Community Server (GPL)Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.MySQL [(none)]> \q
    Bye在pod里面ping service的域名
    [root@centos7-pod /]# ping mysql-external
    PING mysql-external.test.svc.cluster.local (192.168.209.141) 56(84) bytes of data.
    64 bytes from 192-168-209-141.mysql-external.test.svc.cluster.local (192.168.209.141): icmp_seq=1 ttl=63 time=0.669 ms
    64 bytes from 192-168-209-141.mysql-external.test.svc.cluster.local (192.168.209.141): icmp_seq=2 ttl=63 time=1.06 ms
    

    通过ping service的域名可以看到返回的值为mysql宿主机的ip。

2. 数据库权限

确保 MySQL 用户允许从 Kubernetes Pod 的 IP 范围连接。例如:

CREATE USER 'jack'@'%' IDENTIFIED BY 'Mysql@1233!';
GRANT ALL PRIVILEGES ON *.* TO 'jack'@'%';

总结

  • 推荐方法:优先使用 ExternalName Service(有域名时)或手动配置 Endpoints(直接使用 IP)。
  • 调试工具:通过临时 Pod 执行 telnetmysql-client 命令验证连接。
  • 安全实践:始终通过 Secret 管理凭证,并启用 SSL 加密敏感数据传输。

通过以上步骤,Kubernetes 集群内的应用即可安全、稳定地访问外部 MySQL 数据库。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/22532.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JAVAweb-标签选择器,盒模型,定位,浮动

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>标签</title><style type"text/css&q…

计算机视觉:主流数据集整理

第一章&#xff1a;计算机视觉中图像的基础认知 第二章&#xff1a;计算机视觉&#xff1a;卷积神经网络(CNN)基本概念(一) 第三章&#xff1a;计算机视觉&#xff1a;卷积神经网络(CNN)基本概念(二) 第四章&#xff1a;搭建一个经典的LeNet5神经网络(附代码) 第五章&#xff1…

二级公共基础之数据结构与算法篇(五)树和二叉树

目录 前言 一、树的基本概念 1.父结点和根节点 2.子节点和叶子节点 3.度和深度 4.子树 二、二叉树及其基本性质 1. 二叉树的定义 2. 二叉树的基本性质 性质1 性质2 性质3 性质4 性质5 性质6 三、二叉树的存储结构 四、二叉树的遍历 1.遍历二叉树的概念 1. 前…

自制操作系统学习第七天

今天要做什么&#xff1f; 实现HLT&#xff0c;不让计算机处于HALT&#xff08;HLT&#xff09;.用C语言实现内存写入&#xff08;错误&#xff0c;需要分析&#xff09; 一:使用HLT&#xff0c;让计算机处于睡眠状态 写了下面这个程序&#xff0c;naskfunc.nas 函数名叫io_h…

Python Django系列—入门实例(二)

数据库配置 现在&#xff0c;打开 mysite/settings.py 。这是个包含了 Django 项目设置的 Python 模块。 默认情况下&#xff0c;​ DATABASES 配置使用 SQLite。如果你是数据库新手&#xff0c;或者只是想尝试 Django&#xff0c;这是最简单的选择。SQLite 包含在 Python 中…

DeepSeek接入Siri(已升级支持苹果手表)完整版硅基流动DeepSeek-R1部署

DeepSeek接入Siri&#xff08;已升级支持苹果手表&#xff09;完整版硅基流动DeepSeek-R1部署 **DeepSeek** 是一款专注于深度学习和人工智能的工具或平台&#xff0c;通常与人工智能、机器学习、自动化分析等领域有关。它的主要功能可能包括&#xff1a;深度学习模型搜索&…

抗辐照加固CAN FD芯片的商业航天与车规级应用解析

在工业自动化、智能汽车、航空航天及国防装备等关键领域&#xff0c;数据传输的安全性、可靠性与极端环境适应能力是技术升级的核心挑战。国科安芯推出全新一代CANFD&#xff08;Controller Area Network Flexible Data Rate&#xff09;芯片&#xff0c;以高安全、高可靠、断电…

Java数据结构第十二期:走进二叉树的奇妙世界(一)

专栏&#xff1a;数据结构(Java版) 个人主页&#xff1a;手握风云 目录 一、树型结构 1.1. 树的定义 1.2. 树的基本概念 1.3. 树的表示形式 二、二叉树 2.1. 概念 2.2. 两种特殊的二叉树 2.3. 二叉树的性质 2.4. 二叉树的存储 三、二叉树的基本操作 一、树型结构 1.…

nginx 反向代理 配置请求路由

nginx | 反向代理 | 配置请求路由 nginx简介 Nginx&#xff08;发音为“Engine-X”&#xff09;是一款高性能、开源的 Web 服务器和反向代理服务器&#xff0c;同时也支持邮件代理和负载均衡等功能。它由俄罗斯程序员伊戈尔西索夫&#xff08;Igor Sysoev&#xff09;于 2004…

ath9k(Atheros芯片)开源驱动之wifi连接

为什么会推荐这个wifi 驱动进行学习&#xff1f; ath9k&#xff08;Atheros芯片&#xff09;&#xff1a;代码结构清晰&#xff0c;适合学习实践 为什么我只在开篇写了一个wifi连接的操作&#xff1f; 先让一个开源驱动在你的硬件上跑起来&#xff0c;再逐步修改&#xff0c…

LLaMA-Factory|微调大语言模型初探索(4),64G显存微调13b模型

上篇文章记录了使用lora微调deepseek-7b&#xff0c;微调成功&#xff0c;但是微调llama3-8b显存爆炸&#xff0c;这次尝试使用qlora微调HQQ方式量化&#xff0c;微调更大参数体量的大语言模型&#xff0c;记录下来微调过程&#xff0c;仅供参考。 对过程不感兴趣的兄弟们可以直…

知识管理平台如何实现高效数据整合?

内容概要 现代知识管理平台通过架构化的四库体系&#xff08;资源库、规则库、模型库、知识库&#xff09;驱动数据智能整合进程。核心机制依托智能数据工具集对异构数据进行自动化清洗与语义标注&#xff0c;其跨源数据汇聚能力支持超过200种结构化与非结构化数据源的接入&am…

近10年气象分析(深度学习)

这是一个气象数据分析程序&#xff0c;主要用于分析和可视化气象数据。以下是该文件的主要功能&#xff1a; 1. 数据加载 在线数据&#xff1a;尝试从 GitHub 加载气象数据。 示例数据&#xff1a;如果无法加载在线数据&#xff0c;程序会自动生成示例数据。 2. 数据分析 …

DeepSeek最新开源动态:核心技术公布

2月21日午间&#xff0c;DeepSeek在社交平台X发文称&#xff0c;从下周开始&#xff0c;他们将开源5个代码库&#xff0c;以完全透明的方式与全球开发者社区分享他们的研究进展。并将这一计划定义为“Open Source Week”。 DeepSeek表示&#xff0c;即将开源的代码库是他们在线…

wps中zotero插件消失,解决每次都需要重新开问题

参考 查看zotero目录 D:\zotero\integration\word-for-windows 加载项点击 dotm即可 长期解决 把dom 复制到 C:\Users\89735\AppData\Roaming\kingsoft\office6\templates\wps\zh_CN还是每次都需要重新开的话 重新加载一下

洛谷B3629

B3629 吃冰棍 - 洛谷 代码区&#xff1a; #include<algorithm> #include<iostream>using namespace std; int main(){int n,ans;cin >> n;for(int in/2;i<n;i){int ti;ans0;while(t>3){t-3;ans3;t;}if(anst>n){cout << i;return 0;}}return…

VMware安装Centos 9虚拟机+设置共享文件夹+远程登录

一、安装背景 工作需要安装一台CentOS-Stream-9的机器环境&#xff0c;所以一开始的安装准备工作有&#xff1a; vmware版本&#xff1a;VMware Workstation 16 镜像版本&#xff1a;CentOS-Stream-9-latest-x86_64-dvd1.iso &#xff08;kernel-5.14.0&#xff09; …

[ProtoBuf] 介绍 | 保姆级win/linux安装教程

目录 一、序列化概念 二、ProtoBuf 是什么 三、ProtoBuf 的使用特点 ProtoBuf 在不同操作系统下的安装 一、ProtoBuf 在 Windows 下的安装 二、ProtoBuf 在 Linux 下的安装 三、检查是否安装成功 安装教程 可以直接目录跳转到后面 笔记参考&#xff1a;官方文档 一、序…

element ui的select选择框

我们首先先试一下&#xff0c;这个东西怎么玩的 <el-select v-model"select" change"changeSelect"><el-option value"香蕉"></el-option><el-option value"菠萝"></el-option><el-option value&quo…

51单片机学习之旅——定时器

打开软件 1与其它等于其它&#xff0c;0与其它等于0 1或其它等于1&#xff0c;0或其它等于其它 TMODTMOD&0xF0;//0xF01111 0000进行与操作&#xff0c;高四位保持&#xff0c;低四位清零&#xff0c;高四位定时器1&#xff0c;低四位定时器0 TMODTMOD|0x01;//0x010000 0…