不同k8s集群间服务如何相互访问实现详解

目录
  • 1 | 春天来了一个需求
    • 1.1 | 现状
    • 1.2 | 需求
  • 2 | 方案有挺多的
  • 3 | 展开来讲讲
    • 3.1 | 场景 1
    • 3.2 | 场景 2
  • 4 | 说点非技术的

1 | 春天来了一个需求

1.1 | 现状

  • 不同工程团队有各自的 k8s 开发集群, 负责的服务部署在各自的集群上
  • 但是这些服务之间存在调用关系(单项或者双向的)
  • 不同 k8s 集群之间内网是联通的
  • 其中一个集群要作为流量入口,面向用户

1.2 | 需求

  • 实现服务跨集群访问
  • 服务之间只能通过内网调用
  • 统一的外部流量接入控制

2 | 方案有挺多的

跨集群访问,应该是一个比较普遍的需求,市面上有很多各种各样的方案。比如:

  • 跨集群的注册发现服务 比如使用 nacos 作为跨集群的注册发现中间件,所有在不同集群里的服务都注册到 nacos 上,由 nacos 来进行服务的注册发现以及负载均衡。
  • 配置集群内网SLB 每一个集群各自配置一个自己的内网 SLB 地址,通过 ingress 的 path 配置不同的路由转发。
  • 使用ExternalName Service 在 请求发起方集群 配置 跨集群服务 在 本集群的 service,type 为 ExternalName 的headless service。
方案 优点 缺点
跨集群的注册发现服务 无需额外运维要求 要求所有服务使用同一套注册发现服务,限制比较强,且注册发现服务不一定满足不同技术栈的团队,比如 nacos 就没有官方支持的 go sdk
配置集群内网SLB 对调用方友好,无需在调用方做额外运维配置,只需要正常业务代码内调用即可 对集群运维要求较高,需要有一定的运维知识,且如果没有现成的 SLB 组件,还需要自建,成本较高
使用ExternalName Service 适用范围最广,使用最灵活,可以在任何阶段进行配置改造,对跨集群服务支持的调用方式兼容性好(支持 ClusterIP, NodePort 以及域名调用) 对本方集群运维能力要求高

以上三种方案,都可以实现跨集群的服务调用。然而,方案三却是目前最符合现状且能推进下去的。所以,下面就方案三展开来说。

3 | 展开来讲讲

方案三用到了 k8s 的 ExternalName Service(这里不展开讲这是什么,感兴趣可以点击查看)。主要讲怎么用。下面分几个场景来讲解:

3.1 | 场景 1

假设:k8s2 集群有个服务 s2, 对外以 Ingress 方式提供服务,访问地址是: abc.com 调用方集群创建一个 service :

apiVersion: v1
kind: Service
metadata:
  name: k8s2-s2
  namespace: prod
spec:
  type: ExternalName
  externalName: abc.com
  ports:
  - name: http
    port: 80
    protocol: TCP
    targetPort: 80

那么, 在调用方集群内的服务,就可以通过本集群的服务名(k8s2-s2.prod.svc.cluster.local)去访问跨集群的服务。

3.2 | 场景 2

假设:k8s3 集群有个服务 s3, 对外以 NodePort 方式提供服务,访问地址是:192.168.0.199:30099 按照场景 1 的配置生成一个 service,可以用么?

apiVersion: v1
kind: Service
metadata:
  name: k8s3-s3
  namespace: prod
spec:
  type: ExternalName
  externalName: 192.168.0.199
  ports:
  - name: http
    port: 80
    protocol: TCP
    targetPort: 30099

可以用,但是有问题。在 nginx 的日志里会疯狂打印一个错误:找不到 192.168.0.199 这个域名对应的 ip。原因是,在集群看来, externalName 字段是一个域名,是需要做 dns 解析成 ip 的。如果我们直接填一个 ip 的字段,虽然能用,但是会疯狂输出日志,冲掉正常 nginx 请求的日志。

那既然这样,改成域名调用呗。那么问题来了,对方给我一个 ip,我上哪去变一个域名呢?修改 hosts,准确的说,修改 k8s coredns 服务的 hosts:

# kubectl -n kube-system edit cm coredns
apiVersion: v1
data:
  Corefile: |
    .:53 {
        ...
        hosts {
            192.168.0.199 s3.k8s3
            fallthrough
        }
        ...
    }
kind: ConfigMap
metadata:
  name: coredns
  namespace: kube-system

然后修改 service

apiVersion: v1
kind: Service
metadata:
  name: k8s3-s3
  namespace: prod
spec:
  type: ExternalName
  externalName: s3.k8s3
  ports:
  - name: http
    port: 80
    protocol: TCP
    targetPort: 30099

此时,在调用方集群内的服务,就可以通过本集群的服务名(k8s3-s3.prod.svc.cluster.local)去访问跨集群的服务。

4 | 说点非技术的

  • 技术上的最优解,不一定是方案上的最优解,要考虑人的因素
  • 一个和尚挑水吃,两个和尚抬水吃,三个和尚没水吃
  • 如果改变不了周围,就勇敢改变自己

以上就是不同k8s集群间服务如何相互访问实现详解的详细内容,更多关于k8s 集群间服务相互访问的资料请关注我们其它相关文章!

(0)

相关推荐

  • k8s Service 实现服务发现和负载均衡

    目录 前言 Service 介绍 Service 的四种类型及使用方式 Service 的定义和使用 通过命令创建服务 查看创建的服务情况 不指定 Selectors 的服务 Headless 服务 Service 工作原理及原理图 Ingress 讲解 集群外部如何访问服务 总结 前言 本文将介绍 Kubernetes 的资源对象 Service,内容包括 Service 介绍.Service 的四种类型及使用方式.不指定 Selectors 的服务.Headless 服务.Service 工

  • K8S之StatefulSet有状态服务详解

    目录 一.概念 二.实例 一.概念 1.1.无状态和有状态的区别 主要从网络和存储来对比 无状态不考虑存储和网络,可以任意漂移,每个副本是一样的,如Nginx 有状态应用需要考虑存储和网络,每个副本是不对等的,具有唯一的ID,如etcd.mysql 1.2.StatefulSet的特点 专为部署有状态服务而生 解决Pod独立生命周期,保持Pod启动顺序和唯一性 应用场景:分布式应用.数据库集群 稳定,唯一的网络标识符,持久存储有序,优雅的部署和扩展.删除.终止有序,滚动更新 1.3.Headle

  • mongodb 集群重构和释放磁盘空间实例详解

    MongoDB集群重构,释放磁盘空间 由于mongodb删除了一部分数据后,不会回收相应的磁盘空间,所以这里通过重建数据目录的方式释放磁盘空间. 一 实验环境 配置了一个副本集,该副本集由以下三个节点组成: 10.192.203.201:27017 PRIMARY 10.192.203.202:27017 SECONDARY 10.192.203.202:10001  ARBITER 二 实验步骤 2.1 模拟环境 use dba; for(var i=0;i<1000000;i++)db.c.

  • Quartz集群原理以及配置应用的方法详解

    1.Quartz任务调度的基本实现原理 Quartz是OpenSymphony开源组织在任务调度领域的一个开源项目,完全基于Java实现.作为一个优秀的开源调度框架,Quartz具有以下特点: (1)强大的调度功能,例如支持丰富多样的调度方法,可以满足各种常规及特殊需求: (2)灵活的应用方式,例如支持任务和调度的多种组合方式,支持调度数据的多种存储方式: (3)分布式和集群能力,Terracotta收购后在原来功能基础上作了进一步提升.本文将对该部分相加阐述. 1.1 Quartz 核心元素

  • Centos7 安装部署Kubernetes(k8s)集群实现过程

    目录 一.系统环境 二.前言 三.Kubernetes 3.1 概述 3.2 Kubernetes 组件 3.2.1 控制平面组件 3.2.2 Node组件 四.安装部署Kubernetes集群 4.1 环境介绍 4.2 配置节点的基本环境 4.3 节点安装docker,并进行相关配置 4.4 安装kubelet,kubeadm,kubectl 4.5 kubeadm初始化 4.6 添加worker节点到k8s集群 4.7 部署CNI网络插件calico 4.8 配置kubectl命令tab键自

  • C#使用Consul集群进行服务注册与发现

    前言 我个人觉得,中间件的部署与使用是非常难记忆的:也就是说,如果两次使用中间件的时间间隔比较长,那基本上等于要重新学习使用. 所以,我觉得学习中间件的文章,越详细越好:因为,这对作者而言也是一份珍贵的备忘资料. Consul简介 Consul一个什么,我想大家通过搜索引擎一定可以搜索到:所以,我就不在重复他的官方描述了. 这里,我为大家提供一个更加好理解的描述. Consul是什么? Consul本质上是一个Socket通信中间件. 它主要实现了两个功能,服务注册与发现与自身的负载均衡的集群.

  • Docker+K8S 集群环境搭建及分布式应用部署

    1.安装docker yum install docker #启动服务 systemctl start docker.service systemctl enable docker.service #测试 docker version 2.安装etcd yum install etcd -y #启动etcd systemctl start etcd systemctl enable etcd #输入如下命令查看 etcd 健康状况 etcdctl -C http://localhost:2379

  • centos7系统部署k8s集群详细介绍

    目录 1 版本.规划 1.1 版本信息: 1.2集群规划 2.部署 1.关闭防火墙 2.关闭selinux 3.关闭swap 4.添加主机名和IP对应关系 5.将桥接的IPV4流量传递给iptables的链 6.安装docker 安装: 7.添加阿里云yum软件源 8.安装kubeadm.kubelet.kubectl 9.初始化master节点 10.安装pod网络插件(CNI) 11.node节点加入集群 1 版本.规划 1.1 版本信息: 名称 版本号 内核 3.10.0-1160.el7

  • 关于Rancher部署并导入K8S集群的问题

    Rancher 的部署可以有三种架构: 高可用 Kubernetes 安装: 建议使用 Kubernetes 程序包管理器 Helm 在专用的 Kubernetes 集群上安装 Rancher.在 RKE 集群中,需要使用三个节点以实现高可用性.在 K3s 集群(轻量级kubernetes)中,仅需要两个节点即可. 单节点 Kubernetes 安装: 另一个选择是在 Kubernetes 集群上使用 Helm 安装 Rancher,仅在集群中使用单个节点.虽然在这种情况下的 Rancher S

  • Ansible部署K8s集群的方法

    目录 检查网络:k8s-check.yaml检查k8s各主机的网络是否可达; 检查k8s各主机操作系统版本是否达到要求: 配置k8s集群dns解析:k8s-hosts-cfg.yaml 配置yum源:k8s-yum-cfg.yaml 时钟同步:k8s-time-sync.yaml 禁用iptable.firewalld.NetworkManager服务 禁用SElinux.swap:k8s-SE-swap-disable.yaml 修改内核:k8s-kernel-cfg.yaml 配置ipvs:

  • Hyper-V下搭建K8S集群安装docker的方法步骤

    如果你安装了win10系统,想做k8s集群,win10自带的hyper-v也是一个很适合的虚拟机环境.在上一节中,我们安装了两台虚拟机,这一节,都安装上docker. master: 192.168.137.2 node1:  192.168.137.3 root密码:123456 1. 使用ssh登录虚拟机 有了ssh,在win10 host中就可以直接连接虚拟机了 ssh root@192.168.137.2 2.关闭安全配置 vi /etc/selinux/config 3.关闭防火墙 s

  • 部署k8s集群的超详细实践步骤

    目录 1.部署k8s的两种方式: 2.环境准备 3.初始化配置 3.1.安装环境准备:下面的操作需要在所有的节点上执行. 3.2.安装 Docker.kubeadm.kubelet[所有节点] 4.部署k8s-master[master执行] 4.1.kubeadm部署(需要等上一会) 4.2.拷贝k8s认证文件 5.配置k8s的node节点[node节点操作] 5.1.向集群添加新节点,执行在kubeadm init输出的kubeadm join命令 6.部署容器网络 (master执行) 7

随机推荐