精华内容
下载资源
问答
  • 随着容器技术发展,Kubernetes逐渐崭露头角,本次分享跟大家交流Kubernetes使用集群联邦实现多集群管理的相关问题,以及我们实践中如何在Kubernetes使用集群联邦进行多集群管理。 一、 Kubernetes集群联邦介绍 二...

    来自:

     

    image.png

    随着容器技术发展,Kubernetes逐渐崭露头角,本次分享跟大家交流Kubernetes使用集群联邦实现多集群管理的相关问题,以及我们实践中如何在Kubernetes使用集群联邦进行多集群管理。

    • 一、 Kubernetes集群联邦介绍
    • 二、 Kubernetes使用集群联邦实现多集群管理

    Kubernetes在1.3版本之后,增加了“集群联邦”Federation的功能。这个功能使企业能够快速有效的、低成本的跨区跨域、甚至在不同的云平台上运行集群。这个功能可以按照地理位置创建一个复制机制,将多个kubernetes集群进行复制,即使遇到某个区域连接中断或某个数据中心故障,也会保持最关键的服务运行。在1.7版以后支持本地多个集群联邦管理,不需要使用依赖云平台。

    一、Kubernetes集群联邦介绍

    1、管理多個kubernetes集群

    “集群联邦”在架构上同kubernetes集群很相似。有一个“集群联邦”的API server提供一个标准的Kubernetes API,并且通过etcd来存储状态。不同的是,一个通常的Kubernetes只是管理节点计算,而“集群联邦”管理所有的kubernetes集群。

    K8s集群

    2、跨集群服务发现

    Kubernetes有一个标准的插件:kube-dns,这个插件可以在集群内部提供DNS服务,通过DNS解析service名字来访问kubernetes服务。Kubernetes服务是由一组kubernetesPOD组成的,这些POD是一些已经容器化了的应用,这些POD前面使用到了负载均衡器。假如我们有一个kubernetes集群,这个集群裡面有一个服务叫做mysql,这个服务是由一组mysql POD组成的。在这个kubernetes集群中,其他应用可以通过DNS来访问这个mysql服务。
    集群联邦federation/v1beta1 API扩展基于DNS服务发现的功能。利用DNS,让POD可以跨集群、透明的解析服务。

    集群发现

    3、跨集群调度

    为了追求高可用性和更高的性能,集群联邦能够把不同POD指定给不同的Kubernetes集群中。集群联邦调度器将决定如何在不同kubernetes集群中分配工作负载。

    通过跨集群调度,我们可以:

    • 跨kubernetes集群均匀的调度任务负载
    • 将各个kubernetes集群的工作负载进行最大化,如果当前kubernetes集群超出了承受能力,那麽将额外的工作负载路由到另一个比较空闲的kubernetes集群中
    • 根据应用地理区域需求,调度工作负载到不同的kubernetes集群中,对于不同的终端用户,提供更高的带宽和更低的延迟。

    4、集群高可用,故障自动迁移

    集群联邦可以跨集群冗馀部署,当某个集群所在区域出现故障时,并不影响整个服务。集群联邦还可以检测集群是否为不可用状态,如果发现某个集群为不可用状态时,可以将失败的任务重新分配给集群联邦中其他可用状态的集群上。

    二、Kubernetes使用集群联邦实现多集群管理

    1、系统环境及初始化

    1.1 系统环境

    系统环境

    1.2 安装前准备

    1.2.1 准备kubernetes组件镜像

    Kubernetes1.7版本的集群与联邦集群功能的安装方式均为镜像安装,所有组件功能都使用官方提供的镜像来实现,由于官方镜像国内无法正常下载,需要提前准备好镜像或科学上网。
    具体镜像列表如下:

    镜像列表

    1.2.2 安装Docker 1.12

    Kubernetes 1.7还没有针对docker 1.13上做测试和验证,所以这里安装Kubernetes官方推荐的Docker 1.12版本。

    1.2.3 修改系统配置

    创建/etc/sysctl.d/k8s.conf文件,添加如下内容:
    net.bridge.bridge-nf-call-ip6tables = 1
    net.bridge.bridge-nf-call-iptables = 1
    执行sysctl -p /etc/sysctl.d/k8s.conf使修改生效。

    1.2.4 安装Kuberadm与Kubelet

    注意:该yum源需要科学才能正常安装
    在每个节点安装kubeadm和kubelet,首先是添加kubernetes的YUM源:

    cat <<EOF > /etc/yum.repos.d/kubernetes.repo
    [kubernetes]
    name=Kubernetes
    baseurl=http://yum.kubernetes.io/repos/kubernetes-el7-x86_64
    enabled=1
    gpgcheck=1
    repo_gpgcheck=1
    gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg
           https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
    EOF
    
    #安装kubeadm, kubelet, kubectl, kubernets-cni
    yum install -y kubelet kubeadm kubectl kubernetes-cni
     
    #kubelet服务设置开机启动
    systemctl enable kubelet.service
    

    以上安装完成后,初始化环境的准备就完成了。

    2、安装kubernetes集群

    首先在一个节点上安装kubernetes作为master节点,将master节点参与集群调度.然后在该节点上安装联邦集群功能,作为联邦集群的控制平面。

    2.1 初始化集群

    使用kubeadm初始化集群,选择node1作为Master

    在node1上执行下面的命令:
    注:因为我们选择flannel作为Pod网络插件,所以命令指定--pod-network-cidr=10.240.0.0/16

    kubeadm init --kubernetes-version=v1.7.0 --pod-network-cidr=10.240.0.0/16 --apiserver-advertise-address=192.168.5.13
    

    请保存好kubeadm join 的信息,后续节点加入集群需要使用该命令.

    为了使用kubectl访问apiserver,在~/.bash_profile中追加下面的环境变量:

    echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> /etc/profile
    source /etc/profile
    

    此时kubectl命令在master node上就可以用了,查看一下当前机器中的Node,看到node0状态为Ready:

    kubectl get nodes
      NAME      STATUS     AGE       VERSION
      node0     Ready     3m         v1.7.0
    

    2.2 安装Pod网络组件

    接下来安装flannel network add-on,首先下载需要的yaml文件:

    wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel-rbac.yml 
    wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
    

    目前需要在kube-flannel.yml中使用--iface参数指定集群主机内网网卡的名称,否则可能会出现dns无法解析。需要将kube-flannel.yml下载到本地,flanneld启动参数加上--iface=<iface-name>

    vi kube-flannel.yml
    
       command: [ "/opt/bin/flanneld", "--ip-masq", "--kube-subnet-mgr", "--iface=eth1" ]   //--iface=eth1
    

    改为本机网卡名称

    部署网络组件:

    kubectl create -f kube-flannel-rbac.yml
    kubectl apply -f kube-flannel.yml
    

    确保所有的Pod都处于Running状态。

    kubectl get pod --all-namespaces -o wide
    

    如下图:

    Pod状态

    使用下面的命令使Master Node参与工作负载:

    kubectl taint nodes --all  node-role.kubernetes.io/master-
    

    3、安装联邦集群组件

    3.1安装前配置修改

    修改etcd与apiserver的监听端口,修改前先停止kubelet服务

    vi /etc/kubernetes/manifests/etcd.yaml
       - --listen-client-urls=http://0.0.0.0:2379
       - --advertise-client-urls=http://0.0.0.0:2379
    
    vi /etc/kubernetes/manifests/kube-apiserver.yaml
       - --insecure-port=8080
       - --insecure-bind-address=0.0.0.0
    

    重启kubelet服务让etcd与apiserver监听端口生效

    systemctl restart kubelet
    

    3.2安装helm工具部署Coredns

    curl https://raw.githubusercontent.com/kubernetes/helm/master/scripts/get > get_helm.sh
    
    chmod 700 get_helm.sh
    
    ./get_helm.sh
    

    修改RBAC临时访问权限(这是比较关键的地方,没有这步后面会失败)

    kubectl create clusterrolebinding add-on-cluster-admin --clusterrole=cluster-admin --serviceaccount=kube-system:default
    

    创建coredns键值文件

    cat <<EOF > /opt/Values.yaml
    isClusterService: false
    serviceType: "NodePort"
    middleware:
      kubernetes:
        enabled: false
      etcd:
        enabled: true
        zones:
        - "example.com."
        endpoint: "http://192.168.5.13:2379"
    EOF
    

    新建coredns配置文件

    vi /root/coredns-provider.conf
    [Global]
    etcd-endpoints = http://192.168.0.51:2379
    zones = example.com.
    

    3.3添加kubernetes从节点

    在kubernetes工作节点上初始安装后执行以下命令,就可以加入集群

    kubeadm join --token e7986d.e440de5882342711 192.168.5.13:6443
    

    在master节点查看节点状态,添加之后可以在master上执行这个查看是否添加成功

    kubectl get nodes
    

    重复上述步骤创建多个kubernetes集群,为联邦集群添加集群节点做准备。

    3.4初始化联邦集群

    执行这个进行联邦的初始化,在控制平面的master节点上执行:

    kubefed init fellowship \
        --host-cluster-context=kubernetes-admin@kubernetes \
        --dns-provider="coredns" \
        --dns-zone-name="example.com." \
        --dns-provider-config="/root/coredns-provider.conf" \
        --apiserver-enable-basic-auth=true \
        --apiserver-enable-token-auth=true \
        --apiserver-arg-overrides="--anonymous-auth=false,--v=4" \
        --api-server-service-type="NodePort" \
        --api-server-advertise-address="192.168.5.13" \
    --etcd-persistent-storage=false
    

    初始化完成后集群联邦会在federation-system命名空间中创建两个POD

    集群中的pod

    3.5其他kubernetes集群加入联邦集群

    选择集群的context

    kubectl config use-context fellowship   //fellowship为联邦初始化时创建的名称
    

    添加联邦集群文件

    集群1
    cat /home/tmp/c1.yaml 
       apiVersion: federation/v1beta1
       kind: Cluster
       metadata:
     name: c1
       spec:
     serverAddressByClientCIDRs:
     - clientCIDR: 0.0.0.0/0
       serverAddress: http://192.168.15.53:8080
    
    集群2
       cat /home/tmp/c2.yaml 
       apiVersion: federation/v1beta1
       kind: Cluster
       metadata:
     name: c2
       spec:
    serverAddressByClientCIDRs:
    - clientCIDR: 0.0.0.0/0
      serverAddress: http://192.168.8.12:8080
    

    执行添加这2个集群到联邦

    kubectl create -f c1.yaml
    kubectl create -f c2.yaml
    

    查看联邦集群状态,状态为Ready就是成功了。

    [root@test01 ~]# kubectl get cluster
    NAME      STATUS     AGE
    c1        Ready      2d
    c2        Ready      2d
    

    3.6通过联邦集群部署应用

    通过联邦集群部署应用,需要在联邦集群控制平面的节点上,切换到联邦的context

    kubectl config use-context fellowship   //fellowship为联邦初始化时创建的名称
    

    配置应用在分布在2个集群中:

    # vi tomcat.yaml
    apiVersion: exensions/v1beta1
    kind: ReplicaSet
    metadata:
      name: tomcat
      lables:
        app: tomcat
      annotaions:
        federation.kubernetes.io/replica-set-preferences:
            {
           "rebalance": true,
           "clusters": {
              "c1": {
          "weight": 1
       },
              "c2": {
          "weight": 1
       }
        }
    }
    spec:
      replicas: 4
      template:
        metadata:
          labels:
            #region: tomcat
    app: tomcat
        spec:
          containers:
            - name: fed-tomcat
      image: 192.168.18.250:5002/admin/tomcat:v0.0.5
      resourcces:
        requests:
          cpu: 200M
          memory: 500Mi
      ports:
      - containerPort: 80
    

    通过以上编排创建应用在联邦,应用的4个实例按比例分布到2个集群中

    集群

    目前集群联邦只支持以下几种类型资源的创建:

    • Cluster
    • ConfigMap
    • DaemonSets
    • Deployment
    • Events
    • Ingress
    • Namespaces
    • ReplicaSets
    • Secrets
    • Services

    问答:
    https://shimo.im/doc/IZJtw0gvons6MOAr?r=LD952/

    Q:node机器推荐命名规则与生成使用经验
    A:推荐使用“地理位置+机房编号+机柜号+应用名称”的缩写字母来命名,这样便于运维人员后续的管理和维护。

    Q:为什么要修改etcd与apiserver的监听端口?
    A:修改etcd监听IP为0.0.0.0是为了防止出现监听了lo网卡的127.0.0.1的IP,出现不能连接的情况。apiserver则是开启8080端口用于接收http请求,这样是为了测试时方便不用使用CA证书认证。

    Q:请问docker 源怎么弄,国内一般不好连接,下载不了?另外还有1.6要升级到1.7怎么做?
    A:建议使用科学上网方式,这样就不需要改动配置。1.6升级到1.7,先停止kubelet服务,然后下载1.7版本的kubernetes-server-linux-amd64.tar.gz包,解压替换/usr/bin目录下的同名文件,然后再把kubelet服务启动

    Q:在联邦集群中部署服务,可以将服务只部署在一个集群中么?
    A:可以只部署服务在一个集群中,通过编排文件中federation.kubernetes.io/replica-set-preference来控制副本分布在哪个集群。

    Q:联邦集群的几个组件现在有支持高可用么?没有的话,我们应该怎么避免联邦组件的bug导致的服务不可用?
    A:联邦集群的Federation组目录没有支持高可用,但联邦功能主要是为了调度管理k8s集群的,所以联邦集群Federation组件出现故障时并不会直接影响到下面各个集群自身的已经在运行的服务。



    作者:bobozhangshao
    链接:https://www.jianshu.com/p/7725eb3e3812

    展开全文
  • kubeSphere多集群联邦 KubeSphere v3.0.0进行了重大升级,其中多集群管理功能是重要更新之一。 使用KubeSphere,用户可以管理下面的基础架构,例如添加或删除集群。可以以统一的方式管理部署在任何基础架构(例如...

    kubeSphere多集群联邦

    KubeSphere v3.0.0进行了重大升级,其中多集群管理功能是重要更新之一。

    使用KubeSphere,用户可以添加或删除集群。可以以统一的方式管理部署在任何基础架构(例如Amazon EKS和Google Kubernetes Engine)上的异构集群。KubeSphere的中央控制平面通过两种有效的管理方法使之成为可能。

    1. Solo,可以在KubeSphere容器平台中一起维护和管理独立部署的Kubernetes集群。
    2. Federation,多个Kubernetes集群可以聚合在一起作为Kubernetes资源池。当用户部署应用程序时,副本可以部署在池中的不同Kubernetes群集上。在这方面,跨区域和群集实现了高可用性。

    多集群高可用

    KubeSphere允许用户跨集群部署应用程序。更重要的是,还可以将应用程序配置为在特定群集上运行。此外,多集群功能与行业领先的应用程序管理平台OpenPitrix配合使用,使用户可以在整个生命周期(包括发行,删除和分发)中管理应用程序。

    用户可以使用全局VIP或DNS将请求发送到相应的后端群集,从而在多个群集上部署工作负载。当群集发生故障或无法处理请求时,可以将VIP或DNS记录传输到运行状况群集。
    在这里插入图片描述

    多集群故障隔离

    故障隔离。通常,与大型群集相比,多个小型群集隔离故障要容易得多。如果出现断电,网络故障,资源不足或其他可能导致的问题,则可以将故障隔离在某个群集中,而不会扩展到其他群集。

    业务隔离。尽管Kubernetes提供了名称空间作为应用程序隔离的解决方案,但此方法仅代表逻辑上的隔离。这是因为通过网络连接了不同的名称空间,这意味着资源抢占问题仍然存在。为了实现进一步的隔离,用户需要创建其他网络隔离策略或设置资源配额。使用多个群集可以实现完全的物理隔离,这比通过名称空间进行隔离更加安全可靠。例如,当企业内的不同部门使用多个集群来部署开发,测试或生产环境时,这非常有效。

    在这里插入图片描述
    多集群功能实现

    使用多集群功能之前,需要创建一个主机集群(以下称为Host Cluster集群),它实际上是启用了多集群功能的KubeSphere集群。

    Host Cluster集群管理的所有集群都称为成员集群(以下称为Member Cluster群集)。它们是未启用多集群功能的常见KubeSphere集群。

    Host Cluster集群只能存在一个,而Member Cluster集群可以同时存在多个。

    在多群集体系结构中,Host Cluster集群和Member Cluster集群之间的网络可以直接连接,也可以通过代理连接。Member Cluster集群之间的网络可以完全隔离。

    **在这里插入图片描述**

    快速部署kubeSphere多集群联邦

    多集群联邦要求每个kubernetes集群都要部署kubeSphere,下面准备3个节点每个节点都以all-in-one方式同时部署kubernetes和kubeSphere。

    准备3个节点至少4核8G配置,每个节点都执行以下操作:

    安装kubernetes集群部署工具kubekey

    wget https://github.com/kubesphere/kubekey/releases/download/v1.0.0/kubekey-v1.0.0-linux-amd64.tar.gz
    tar -zxvf kubekey-v1.0.0-linux-amd64.tar.gz
    mv kk /usr/local/bin/
    

    安装相关依赖

    yum install -y socat conntrack
    

    部署kubernetes和kubesphere

    kk create cluster --with-kubernetes v1.18.6 --with-kubesphere v3.0.0
    

    查看每个节点集群部署情况,每个节点模拟一个集群(实际部署时每个集群应参考官方文档规划为高可用集群,这里仅作为演示):

    [root@cluster1 ~]# kubectl get nodes -o wide
    NAME       STATUS   ROLES           AGE   VERSION   INTERNAL-IP     EXTERNAL-IP   OS-IMAGE                KERNEL-VERSION                CONTAINER-RUNTIME
    cluster1   Ready    master,worker   69m   v1.18.6   192.168.1.123   <none>        CentOS Linux 7 (Core)   3.10.0-1127.18.2.el7.x86_64   docker://19.3.8
    
    [root@cluster2 ~]# kubectl get nodes -o wide
    NAME       STATUS   ROLES           AGE   VERSION   INTERNAL-IP     EXTERNAL-IP   OS-IMAGE                KERNEL-VERSION                CONTAINER-RUNTIME
    cluster2   Ready    master,worker   71m   v1.18.6   192.168.1.124   <none>        CentOS Linux 7 (Core)   3.10.0-1127.18.2.el7.x86_64   docker://19.3.8
    
    [root@cluster3 ~]# kubectl get nodes -o wide
    NAME       STATUS   ROLES           AGE   VERSION   INTERNAL-IP     EXTERNAL-IP   OS-IMAGE                KERNEL-VERSION                CONTAINER-RUNTIME
    cluster3   Ready    master,worker   71m   v1.18.6   192.168.1.125   <none>        CentOS Linux 7 (Core)   3.10.0-1127.18.2.el7.x86_64   docker://19.3.8
    

    启用host集群

    登录第一个集群kubesphere UI,默认密码admin/P@88w0rd

    http://192.168.1.123:30880
    

    选择左侧自定义资源CRD,搜索clusterConfiguration

    在这里插入图片描述
    点击进入,选择ks-installer右侧编辑配置文件,修改clusterRole为host

    multicluster:
      clusterRole: host
    

    保存后查看部署日志

    kubectl logs -n kubesphere-system $(kubectl get pod -n kubesphere-system -l app=ks-install -o jsonpath='{.items[0].metadata.name}') -f
    

    确认multicluster集群启用成功:

    ......
    [22:27:51]Start installing monitoring
    [22:27:51]Start installing multicluster
    [22:27:51]**************************************************
    [22:27:51]task monitoring status is running
    [22:27:51]task multicluster status is successful
    [22:27:51]total: 2     completed:1
    [22:27:51]**************************************************
    [22:27:51]task monitoring status is successful
    [22:27:51]task multicluster status is successful
    [22:27:51]total: 2     completed:2
    ......
    

    查看部署的kubefed组件

    [root@cluster1 ~]# helm ls -A | grep kubefed
    kubefed                 kube-federation-system          1               2020-10-13 22:26:22.252226967 +0800 CST deployed        kubefed-0.3.0 
    
    [root@cluster1 ~]# kubectl -n kube-federation-system  get pods
    NAME                                          READY   STATUS    RESTARTS   AGE
    kubefed-admission-webhook-66bbdff47d-zxhsm    1/1     Running   0          30m
    kubefed-controller-manager-54b459dfc4-s26bp   1/1     Running   0          30m                     
    

    重新登录kubeSphere,可以看到集群已经变更为host集群:

    在这里插入图片描述

    启用member集群

    获取host cluster的jwtSecret

    [root@cluster1 ~]# kubectl -n kubesphere-system get cm kubesphere-config -o yaml | grep -v "apiVersion" | grep jwtSecret
          jwtSecret: "V4kcSF2Ai7z9duNT9k0xAUJ85dWWtFH3"
    

    登录第二个及第三个集群UI,同样方式修改clusterConfiguration,配置jwtSecret并修改集群角色:

    authentication:
      jwtSecret: V4kcSF2Ai7z9duNT9k0xAUJ85dWWtFH3
      
    multicluster:
      clusterRole: member
    

    保存后查看部署日志

    kubectl logs -n kubesphere-system $(kubectl get pod -n kubesphere-system -l app=ks-install -o jsonpath='{.items[0].metadata.name}') -f
    

    member集群启用完成后还需要在host集群执行手动导入操作。

    导入member集群

    登录host cluster,选择添加集群

    在这里插入图片描述
    配置基本信息,cluster2作为开发环境

    在这里插入图片描述
    在集群2 master节点获取kubeconfig,注意修改 server: https://lb.kubesphere.local:6443为节点IP地址,确保host cluster能够与member cluster正常连通:

    [root@cluster2 ~]# cat /root/.kube/config 
    

    复制粘贴kubeconfig内容,点击导入

    在这里插入图片描述
    同样方式导入cluster3作为生产环境。

    导入完成后点击左上角平台管理,集群管理,可以看到host集群已经纳管了开发集群和生产集群:

    在这里插入图片描述

    选择任意集群进入,点击集群管理可以在任意集群间快速切换:

    在这里插入图片描述

    部署跨集群应用

    选择平台管理,访问控制,创建企业空间时可勾选可用的集群:

    在这里插入图片描述

    在多集群企业空间中可以创建多集群项目,创建多集群项目意味着每个k8s集群都会创建一个同名的命名空间:

    在这里插入图片描述
    首先在高级设置中开启每个集群外网访问网关

    在这里插入图片描述
    在多集群项目中部署工作负载或服务,可在部署位置中选择跨集群部署应用副本,这里以跨每个集群部署2副本的nginx为例:

    在这里插入图片描述
    支持差异化配置,同一个应用可以在不同集群使用不同镜像:
    在这里插入图片描述

    创建完成后查看部署的跨集群应用:

    在这里插入图片描述
    点击查看详情

    在这里插入图片描述
    编辑配置文件查看yaml信息,可以看到创建的资源类型为FederatedDeployment,也就是在多集群项目中创建的所有资源都以Federatedxxx开头,包括创建的存储卷,密钥和配置,并且都会在每个集群分发一份。

    apiVersion: types.kubefed.io/v1beta1
    kind: FederatedDeployment
    ...
    

    选择服务,进入服务选择服务访问,由于选择nodePort暴露服务,任意集群节点加nodePort即可访问应用,也可以考虑在node节点前加负载均衡

    在这里插入图片描述
    使用nodeport访问示例:
    在这里插入图片描述

    解绑集群

    选择集群设置,可执行解绑集群
    在这里插入图片描述

    备注:
    除了纳管本地kubeadm部署的kubernetes集群,kubesphere也支持纳管Aliyun ACK、AWS EKS等集群类型。

    展开全文
  • ES多集群间数据同步

    万次阅读 2018-05-16 17:49:02
    ES多集群间数据同步1.引言 自己在google上搜了一下,自己总结了一下集群中某节点要访问远程集群节点中的数据,并保证数据的一致性和稳定性。举个例子,现有三个集群分别是:集群A、集群B和集群C,每个集群对应的有...

    ES多集群间数据同步


    1.引言

       自己在google上搜了一下,自己大概总结了一下集群中某节点要访问远程集群节点中的数据,并保证数据的一致性和稳定性。举个例子,现有三个集群分别是:集群A、集群B和集群C,每个集群对应的有三个节点,一共是九个节点;集群A中的node1中的业务数据需要从集群C中node1中某索引中获取(意思是说:集群A需要的一部分数据被分割在其他两个集群中),这时就需要考虑同步远程集群数据啦啦啦啦。我这里用的是es5.6


    2.正题

        这里提供了两种方式,tribe节点(部落),Cross cluster search(跨集群搜索,稳定性待测),tribe有两个缺陷问题:如果集群数和节点数很多回导致瓶颈,多个集群下如果有相同索引index的话,他会在多集群中选择一个。而Cross cluster search恰好解决了tribe出现的问题。这两种方式主要都是通过配置文件来实现

           

    3.自动发现机制

    自动发现(Disovery)

    该模块主要负责集群中节点的自动发现和Master节点的选举。节点之间使用p2p的方式进行直接通信,不存在单点故障的问题。Elasticsearch中,Master节点维护集群的全局状态,比如节点加入和离开时进行shard的重新分配。

    1.      Azure discovery 插件方式,多播

    2.      EC2 discovery 插件方式,多播

    3.      Google Compute Engine (GCE)discovery 插件方式多播

    4.      zen discovery默认实现 多播/单播

    多播配置下,节点向集群发送多播请求,其他节点收到请求后会做出响应。配置参数如下:

        discovery.zen.ping.multicast.group:224.2.2.4  组地址  
        discovery.zen.ping.multicast.port:54328  端口  
        discovery.zen.ping.multicast.ttl:3 广播消息ttl  
        discovery.zen.ping.multicast.address:null绑定的地址,null表示绑定所有可用的网络接口  
        discovery.zen.ping.multicast.enabled:true 多播自动发现禁用开关  

    单播配置下,节点向指定的主机发送单播请求,配置如下:

    discovery.zen.ping.unicast.hosts:host1:port1,host2,:port2   


    3.tribe方式

        当我们的数据节点因为写入压力过大时, 可能会使节点之间的心跳通信超过这个时间, 那么可能会引起重新选举master的可能. 这次将新增三个实例分布到这三台服务器上, 做master节点.下面是master节点的主要配置:

    cluster.name: eagleye_es node.name: "eagleye_es_xx_master"
    node.master: true node.data: false #ping 其它节点的超时时间 
    discovery.zen.ping_timeout: 30s 
    #心跳timeout设为2分钟,超过6次心跳没有回应,则认为该节点脱离master,每隔20s发送一次心跳。 
    discovery.zen.fd.ping_timeout: 120s 
    discovery.zen.fd.ping_retries: 6 
    .zen.fd.ping_interval: 20s 
    #要选出可用master, 最少需要几个master节点 
    discovery.zen.minimum_master_nodes: 2 
    path.logs: /var/log/es_master 
    #不使用交换区 
    bootstrap.mlockall: true 
    transport.tcp.port: 8309 
    transport.tcp.compress: true 
    http.port: 8209
    
    tribe:
      t1:
        cluster.name:   cluster_one
      t2:
        cluster.name:   cluster_two
        network.host:   10.1.2.3 
    tribe:
      hot: 
       cluster.name: eagleye_es
     blocks: 
      write: true
    metadata: true 
    on_conflict: prefer_hot 
    
    
    threadpool: 
        search: 
          tyep: fixed 
          size: 24 
    #用来保存请求的队列 
          queue_size: 100
    

    这里的on_conflict设置,当多个集群内,索引名称有冲突的时候,tribe节点默认会把请求轮询转发到各个集群上,这显然是不可以的。索引设置了一个优先级,在索引名冲突的时候,偏向于转发给某一个集群。

    最后我们在查询程序中, 就不能指定集群的名字了, 而是直接通过tribe节点进行检索,如下:


    4.Cross cluster search方式


        elasticsearch。跨集群搜索节点的yml配置文件只需要列出应该连接到的远程集群,例如:

    search:
        remote:
            cluster_one: 
                seeds: 127.0.0.1:9300
            cluster_two: 
                seeds: 127.0.0.1:9301
    cluster_one和cluster_two是表示连接到每个集群的任意集群别名。这些名称随后用于区分本地索引和远程索引。

    使用集群设置API为集群中的所有节点添加远程集群的等效示例如下:


    PUT _cluster/settings
    {
      "persistent": {
        "search": {
          "remote": {
            "cluster_one": {
              "seeds": [
                "127.0.0.1:9300"
              ]
            },
            "cluster_two": {
              "seeds": [
                "127.0.0.1:9301"
              ]
            }
          }
        }
      }
    }

    通过将其种子设置为null,可以从集群设置中删除远程集群:

    PUT _cluster/settings
    {
      "persistent": {
        "search": {
          "remote": {
            "cluster_one": {
              "seeds": null 
            }
          }
        }
      }
    }

    要在远程集群cluster_1上搜索twitter索引,必须使用由:字符分隔的群集别名来前缀索引名称:

    POST /cluster_one:twitter,twitter/tweet/_search
    {
      "query": {
        "match_all": {}
      }
    }


    二.最终采用的方式ReIndex

    重新入库 Reindex

    POST _reindex{
    "conflicts": "proceed",//有冲突继续,默认是有冲突终止
    "size":1000,//设定条数 "source": { "index": "twitter" //也可以为 ["twitter", "blog"]
    "type": "tweet", // 或["type1","type2"] //红字限制范围 ,非必须 限制文档
    "query": { "term": { "user": "kimchy" } },//添加查询来限制文档
    "sort": { "date": "desc" } //排序
    "_source": ["user", "tweet"],//指定字段
    "size": 100,//滚动批次1000更改批处理大小:

    }, "dest": { "index": "new_twitter"
    "op_type": "create" //设置将导致_reindex只在目标索引中创建丢失的文档,create 只插入没有的数据
    "version_type": "external",//没有设置 version_type或设置为internal 将覆盖掉相同id的数据,设置为external 将更新相同ID文档当version比较后的时候
    "routing": "=cat" ,//将路由设置为cat
    "pipeline": "some_ingest_pipeline",//指定管道来使用Ingest节点特性
    },
    "script": { // 执行脚本
    "source": "if (ctx._source.foo == 'bar') {ctx._version++; ctx._source.remove('foo')} ",
    "lang": "painless"
    }}



    Reindex支持从远程的弹性搜索集群中进行索引:
    远程拷贝:
    需要配置目标es 白名单 :reindex.remote.whitelist: ["10.10.10.130:8400"]

    从远程服务器上的转换使用的是on-heap缓冲区,默认值为100mb的最大大小。如果远程索引包含非常大的文档,则需要使用较小的批处理大小。下面的示例设置了非常非常小的批处理大小10。

    POST _reindex{ "source": { "remote": { "host": "http://otherhost:9200", "username": "user", "password": "pass",
    "socket_timeout": "1m", //设定超时时间,默认为30秒 "connect_timeout": "10s"//连接超时设置为10秒 }, "index": "source",
    "size": 10, "query": { "match": { "test": "data" } } }, "dest": { "index": "dest" }}


    URL参数
    Reindex API还支持刷新、wait_for_completion、wait_for_active_shards、timeout和requests_per_second。
    Response body
    The JSON response looks like this:
    { "took" : 639, //从开始到结束整个操作的毫秒数 "updated": 0,//成功更新的文档数。 "created": 123,//成功创建的文档数 "batches": 1,//滚动响应的数量被重新索引所拉回 "version_conflicts": 2,//重新索引命中的版本冲突的数量 "retries": { "bulk": 0,//重试的批量操作的数量 "search": 0 //批量是重试的批量操作的数量 } "throttled_millis": 0,//请求休眠的毫秒数,以符合requests_per_second "failures" : [ ]//所有索引失败的数组。如果这不是空的,那么请求就会因为这些失败而中止}


    使用Task API获取所有运行的reindex请求的状态:
    GET _tasks?detailed=true&actions=*reindex
    根据id直接查找任务:
    GET /_tasks/taskId:1
    取消任务
    POST _tasks/task_id:1/_cancel
    更改requests_per_second参数的值:
    POST _reindex/task_id:1/_rethrottle?requests_per_second=-1







    例子:
    在集群的es配置文件中配置好reindex.remote.whitelist:(端口为http协议端口号)


    _reindex' -H 'Content-Type:application/json' -d '

    并行化执行reindex操作
    1、手动并行化
    如下是两个slices的手动并行化reindex:

    POST _reindex  
    {  
      "source": {  
        "index": "my_index_name",  
        "slice": {   // 第一slice执行操作  
          "id": 0,  
          "max": 2  
        }  
      },  
      "dest": {  
        "index": "my_index_name_new"  
      }  
    }  
    POST _reindex  
    {  
      "source": {  
        "index": "my_index_name",  
        "slice": {   // 第二slice执行操作  
          "id": 1,  
          "max": 2  
        }  
      },  
      "dest": {  
        "index": "my_index_name_new"  
      }  

    可以通过以下命令查看执行的结果:
    GET _refresh  
    POST my_index_name/_search?size=0&filter_path=hits.total  

    2、自动并行化
    如下是自动划分的n个slices,只是将需要手动划分的过程自动化处理,将一个操作拆分为多个子操作并行化处理,其他查询方式等都一样
    POST _reindex?slices=5&refresh  
    {  
      "source": {  
        "index": "my_index_name"  
      },  
    "dest": {  
        "index": "my_index_name_new"  
      }  
    }   

    3、slices数量设置要求
            数量不能过大,比如500可能出现CPU问题;
            查询性能角度看,设置slices为源索引的分片的倍数是比较合适的,一倍是最有效的;
            索引性能角度看,应该随着可用资源的数量线性地扩展;
            然而索引或查询性能是否在此过程中占据主导,取决于许多因素,比如重新索引的文档和重新索引的集群。

    注意:remote reindex不能使用并行化处理,即不能使用slices参数,这一点官方文档上没有明确指出,但是在使用的时候会报错,去掉即可。


    4. 数据量大、无删除操作、有更新时间
    数据量较大且无删除操作时,可以使用滚动迁移的方式,减小停止写服务的时间。滚动迁移需要有一个类似于更新时间的字段代表新数据的写时序。可以在数据迁移完成后,再停止写服务,快速更新一次。即可切换到新集群,恢复读写。
    {
    "source": {
    "remote": {
    "host": "'${oldClusterHost}'",
    "username": "'${oldClusterUser}'",
    "password": "'${oldClusterPass}'"
    },
    "index": "'${indexName}'",
    "query": {
    "bool": {
    "must_not": {
    "exists": {
    "field": "'${timeField}'"
    }
    }
    }
    }
    },
    "dest": {
    "index": "'${indexName}'"
    }
    }

    使用java的reindex API每天将增量数据同步到dev等集群环境中 

    <dependency>  
    <span style="white-space:pre;"> </span><groupId>org.elasticsearch.module</groupId>  
        <artifactId>reindex</artifactId>  
        <version>2.4.6</version>  
    </dependency>  

    由于在项目中使用了es的date字段,所以只需要每天安装开始和结束时间获取数据并进行remote reindex即可:
    /**
    * 根据每天的开始和结束时间同步增量数据
    * 时间格式为"yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"
    * @param start 开始时间
    * @param end 结束时间
    */
    private void reindexGeleevrFromProToDevByDay(String start, String end) {
    StringBuilder queryString = new StringBuilder(512);
    queryString.append("{")
    .append("\"range\" : {")
    .append("\"orderTime\" : {")
    .append("\"from\" : \"").append(start).append("\",")
    .append("\"to\" : \"").append(end).append("\",")
    .append("\"include_lower\" : true,")
    .append("\"include_upper\" : true,")
    .append("\"boost\" : 1.0")
    .append("}")
    .append("}")
    .append("}");
    RemoteInfo remoteInfo = getRemoteInfo(queryString.toString());
    TransportClient client = ESClient.me();
    builder = ReindexAction.INSTANCE.newRequestBuilder(client);
    BulkByScrollResponse response = builder.source(ESConfig.COMPANY)
    .setRemoteInfo(remoteInfo)
    .destination(ESConfig.COMPANY)
    .abortOnVersionConflict(true)
    .get(/*TimeValue.timeValueHours(1)*/);
    // builder.source().setScroll("20m").setRouting("candycane");
    long updated = response.getUpdated();
    int failed = response.getBulkFailures().size();
    logger.info("reindex geleevr on {} updated = {} failed = {}" , date, updated, failed);
    }
    private static RemoteInfo getRemoteInfo() {
    return new RemoteInfo("http", "192.168.10.20", 9200, new BytesArray("{\"match_all\":{}}"), null, null,
    Collections.emptyMap(), RemoteInfo.DEFAULT_SOCKET_TIMEOUT, RemoteInfo.DEFAULT_CONNECT_TIMEOUT);
    }
    private static RemoteInfo getRemoteInfo(String query) {
    return new RemoteInfo("http", "192.168.10.20", 9200, new BytesArray(query), null, null,
    null, RemoteInfo.DEFAULT_SOCKET_TIMEOUT, RemoteInfo.DEFAULT_CONNECT_TIMEOUT);
    }




    参考:

    点击打开链接https://www.elastic.co/guide/en/elasticsearch/reference/5.6/modules-cross-cluster-search.html#_using_cross_cluster_search

    https://www.elastic.co/guide/en/elasticsearch/reference/5.6/modules-tribe.html




    展开全文
  • Kubernetes 使用 kubeconfig 文件组织集群访问 Kubernetes 配置对多集群的访问
    展开全文
  • Lsf多集群系统简介

    千次阅读 2018-01-21 09:38:11
    如何管理各种各样的计算...由platform公司开发的lsf 多集群系统使多个异构的计算机能够通过局域网或广域网共享计算资源,并能够为用户提供对资源的透明访问。 AD: 如何管理各种各样的计算资源
  • k8s配置多集群访问

    千次阅读 2018-05-16 17:19:29
    k8s配置多集群访问 kubernetes的配置文件描述了集群、用户名和上下文的关系。 通过命令 kubectl config view 可以查看k8s所有的配置文件信息。 命令 kubectl config view --minify --kubeconfig=config-...
  • kubectl 多集群访问配置

    千次阅读 2019-08-09 10:23:41
    配置 KUBECONFIG 环境...假如我们有两个集群:A 和 B,A 集群的 config 文件为:$HOME/.kube/config,B 集群的 config 文件为:$HOME/.kube/config-local。要配置 kubectl 随时在两个集群间切换,只需要设置 KUBE...
  • kafka多集群部署

    千次阅读 2018-04-30 16:40:34
    一个中心的kafka集群做中央调度,对应个本地的kafka集群。【变种是一个关键的kafka集群对应一个非关键的跟随者】优点:只有本地用到的数据就在本地使用,个数据中心需要用到的数据就放在中央,从本地同步到远程...
  • 一文带你了解Kubernetes多集群技术发展的历史、现状与未来。
  • Redis+twemproxy(nutcracker)实现Redis多集群方案   通过twemproxy(redis-proxy)构建Redis多集群方案,实现Redis的横向扩展。   测试环境: 三台机器: A:IP:192.168.154.100 安装twemproxy B:IP:192...
  • Kubernetes的多集群管理实践

    千次阅读 2017-11-13 00:00:00
    这个功能可以按照地理位置创建一个复制机制,将个Kubernetes集群进行复制,即使遇到某个区域连接中断或某个数据中心故障,也会保持最关键的服务运行。在1.7版以后支持本地集群联邦管理,不需要使用依赖云平台...
  • prometheus学习4:多集群高可用

    万次阅读 2019-05-07 14:29:32
    在默认情况下,用户只需要部署套Prometheus,采集相同的Targets即可实现基本的HA。 当然本地存储也带来了一些不好的地方,首先就是数据持久化的问题,特别是在像Kubernetes这样的动态集群环境下,如果Promthues的...
  • 宣言Wayne是由360搜索云平台团队开发的,一个通用的、基于Web的Kubernetes多集群一站式可视化管理平台。内置了丰富多样的功能,满足企业的通用需求,同时插件化...
  • k8s多集群切换

    千次阅读 2018-05-08 10:37:38
    kubeconfig文件类如: current-context: federal-context apiVersion: v1 clusters: - cluster: api-version: v1 ... name: cow-cluster ...contexts定义集群环境,包括使用的user以及进入的cluster,用name来标识。
  • 你的团队遵循微服务架构,并拥有由个Kubernetes集群组成的广泛基础设施。 由于微服务分布在集群中,你需要设计一个解决方案来集中管理所有微服务。幸运的是,你正在使用Istio,提供这个解决方案只不过是另一个...
  • Spring Boot整合ElasticSearch单个集群集群案例分享,本文涉及内容: 导入spring boot elasticsearch starter 单个es集群案例 个es集群案例 本文内容适合于: spring boot 1.x,2.x elasticsearch 1.x...
  • 第八部分 Istio多集群部署方案

    千次阅读 2019-05-05 15:36:10
    Istio 是一个服务Mesh,其基本属性是监控和管理个服务。服务Mesh的本质就是将一组单独的微服务组合成单个可控的复合应用程序。对于特定大小的应用,组成应用程序的所有的微服务都可以在单个编排平台上运行(例如 ...
  • 现在互联网行业发展越来越迅速,大数据大家都听过,那么大数据行业的同学肯定都...使用Windows的同学应该知道Xshell,使用这款工具,我们就可以同时打开个ssh会话,并对不同的ssh会话按集群或者组分类,那么在ma...
  • 概述 kubectl命令访问集群时,默认情况下在$HOME/.kube目录下寻找名为config的配置文件,配置文件中包含集群ip地址、...在实际应用中,往往需要同时使用套环境如开发、测试、显示、生产等。一个kubectl客户端需要...
  • 滴滴 Elasticsearch 多集群架构实践

    千次阅读 2018-12-17 16:19:29
    滴滴 Elasticsearch 平台多集群的架构已经演进了一年半时间,这期间也遇到一些多集群架构带来的挑战。 tribenode 稳定性挑战: 随着集群数量越来越多,前面提到的 tribenode 不足越来越明显,比如初始化的...
  • ActiveMQ(六)_多集群的负载均衡

    千次阅读 2016-11-29 11:42:33
     1、集群一包含3个队列:Amq1、Amq2、Amq3;集群二包含2个队列:Bmq1、Bmq2  2、生产者一生产的消息可以同时发送到群集1、集群2,生产者二也一样  3、消费者一可以同时从集群1、集群2消费消息,消费者二也一样...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 64,328
精华内容 25,731
关键字:

多集群