kubernetes集群怎么访问外部的服务mysql,redis

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了kubernetes集群怎么访问外部的服务mysql,redis相关的知识,希望对你有一定的参考价值。

k8s访问集群外独立的服务最好的方式是采用Endpoint方式(可以看作是将k8s集群之外的服务抽象为内部服务),以mysql服务为例:
创建mysql-endpoints.yaml
apiVersion: v1
kind: Endpoints
metadata:
name: mysql-test
namespace: default
subsets:
- addresses: - ip: 10.1.0.32 ports:
- port: 3306多个端口的话可以在此处列出123456789101112

创建mysql-service.yaml
apiVersion: v1kind: Servicemetadata:
name: mysql-testspec:
ports:
- port: 3306同样多端口需要列出
参考技术A 虽然 kubernetes 社区一直在努力使得有状态应用成为一等公民,也推出了 statefulset 控制器支持 pod 的顺序部署,稳定的域名访问和存储访问。但鉴于 MySQL 部署运维的多样性和复杂性,在 kubernetes 上部署 MySQL 仍然要面临众多挑战。
1、业务流量入口的配置方式
传统虚拟机环境下,我们通过虚IP的方式,让业务应用都配置事先定义的一个虚IP为链接数据库的地址,然后由高可用服务保证虚IP始终能被路由到master数据库。在kubernetes中,出现了一层网络插件屏蔽了底层网络拓扑,高可用服务管理虚IP的方式需要随之适应调整,比如通过service结合标签完成虚IP的漂移,但service本身是kubernetes提供的一项功能,其可靠性和性能都取决于kubernetes服务的稳定。以性能来说,service是kubeproxy组件通过配置iptables实现的,当iptables规则较多时不可避免的会产生时延,需要我们针对性的解决。
2、容器隔离带来的监控视野问题
在 kubernetes 中,如果将 MySQL 制作为 container 运行在一个 pod 中,container 会将 MySQL 进程和运行环境隔离在一个单独的 namespace 中。监控组件在获取 MySQL 的一些 metirc 时,可能不得不进入与 MySQL 同一个 namespace 中,在部署和设计监控组件时需要考虑到这些限制。
3、存储在 kubernetes 中,支持配置各种不同的存储。
如果使用本地存储 local persistent volume,则需要绑定 MySQL 在一个固定的节点,这就完全浪费了 kubernetes 灵活调度的天然优势;而如果使用远程共享存储,确实是将 MySQL 进程与其存储完全解耦,使得 MySQL 进程可以在任意节点调度,然而考虑到高 I/O 吞吐量的情况,就不是那么美好了。设计时需要考量远程存储是否能够满足 MySQL 的带宽要求。
4、高可用/备份恢复
kubernetes 提供的 statefulset 控制器只能提供最基本的部署,删除功能,无法实现完善的 MySQL 集群高可用/备份恢复操作。对于有状态应用的部署,仍需要定制开发,所以多数公司提供了定制的 operator 来完成应用容器的管理。比如 etcd operator,MySQL operator,后文将为大家详述我测试使用 MySQL operator 的一些记录。

从外部访问有状态的无头 Kubernetes?

【中文标题】从外部访问有状态的无头 Kubernetes?【英文标题】:Access stateful headless kubernetes externally? 【发布时间】:2019-02-27 19:05:44 【问题描述】:

我在 AWS 上创建了 Cassandra 有状态/无头集群,它在集群内运行良好。唯一的问题是我无法从集群外部访问它。我尝试了 Kubernetes 文档或 *** 参考资料中的大部分内容,但仍然无法解决。

我有一个来自 AWS 的工作安全组。 这是我的服务和 statefulset yaml 文件。

api版本:v1 种类:服务 元数据: 名称:卡桑德拉 规格: externalTrafficPolicy:本地 端口: - 节点端口:30000 端口:30000 协议:TCP 目标端口:9042 选择器: 应用程序:卡桑德拉 类型:节点端口 apiVersion:“应用程序/v1” 种类:StatefulSet 元数据: 名称:卡桑德拉 规格: 服务名称:cassandra 复制品:2 选择器: 匹配标签: 应用程序:卡桑德拉 模板: 元数据: 标签: 角色:卡珊德拉 应用程序:卡桑德拉 规格: 终止GracePeriodSeconds:10 容器: - 环境: - 名称:MAX_HEAP_SIZE 价值:1024M - 名称:HEAP_NEWSIZE 价值:1024M - 名称:CASSANDRA_SEEDS 值:“cassandra-0.cassandra.default.svc.cluster.local” - 名称:CASSANDRA_CLUSTER_NAME 值:“SetuCassandra” - 名称:CASSANDRA_DC 值:“DC1-SetuCassandra” - 名称:CASSANDRA_RACK 值:“Rack1-SetuCassandra” - 名称:CASSANDRA_SEED_PROVIDER 值:io.k8s.cassandra.KubernetesSeedProvider - 名称:POD_IP 值来自: 字段参考: 字段路径:status.podIP 图片:图书馆/卡桑德拉:3.11 名称:卡桑德拉 卷装: - 安装路径:/cassandra-storage 名称:cassandra-storage 端口: - 容器端口:9042 名称:cql volumeClaim模板: - 元数据: 名称:cassandra-storage 规格: 访问模式: - 读写一次 资源: 要求: 存储:320Gi

感谢您对此提供的任何帮助。

【问题讨论】:

请提供有关网络的更多详细信息 - 您无法从哪里访问该服务?你能在 Kubernetes 节点上 SSH 并检查你是否可以使用节点的 IP 和来自 NodePort (30000) 的端口访问 cassandra 【参考方案1】:

为有状态集创建的无头服务并不意味着该服务的用户可以访问。据我了解,它的主要目的是在给定 STS 的 pod 之间进行内部 sts 通信(在它们之间形成集群)。例如,如果您有 3 个节点的 mongodb 集群(作为 STS),mongodb-0 会希望与 mongodb-1 和 mongodb-2 交换集群信息/数据。

如果您想以用户身份访问此服务,则您对 mongodb-0/1/2 不感兴趣(或关心),但作为服务更是如此。典型的方法是创建一个 headful 服务(如果需要,可能使用 nodeport)并访问它。

基本上创建两个服务,一个是无头服务(并与 STS 一起使用),另一个是常规服务。两个服务的 pod 选择器可以相同。

【讨论】:

【参考方案2】:

没有足够的关于 AWS 安全组的详细信息。但我的猜测是,您集群中的安全组不允许来自安全组的流量或来自其他集群的 IP 地址。像这样的:

【讨论】:

以上是关于kubernetes集群怎么访问外部的服务mysql,redis的主要内容,如果未能解决你的问题,请参考以下文章

如何从外部访问托管在 kubernetes 集群上的 mongodb 副本集?

关于Kubernetes中如何优雅的访问集群外服务的一些笔记

关于Kubernetes中如何优雅的访问集群外服务的一些笔记

Kubernetes——对外服务之Ingress

如何在kubernetes上构建kafka集群后公开kafka以进行外部访问?

另辟蹊径打入kubernetes网络内访问服务