精华内容
下载资源
问答
  • kubeSphere部署kubernetes多集群联邦

    千次阅读 2020-10-14 16:43:44
    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等集群类型。

    展开全文
  • kubectl 多集群访问配置

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

    配置 KUBECONFIG 环境变量,是 kubectl 工具支持的变量,变量内容是冒号分隔的 kubernetes config 认证文件路径。假如我们有两个集群:A 和 B,A 集群的 config 文件为:$HOME/.kube/config,B 集群的 config 文件为:$HOME/.kube/config-local。要配置 kubectl 随时在两个集群间切换,只需要设置 KUBECONFIG 环境变量为:$HOME/.kube/config:$HOME/.kube/config-local

    export KUBECONFIG=$HOME/.kube/config:$HOME/.kube/config-local
    

    当进行上面配置后,使用 kubectl config view 查看 kubectl 配置时,结果为两个文件的合并。
    当需要切换集群时,使用 kubectl config use-context <context 名称>

    参考文档:
    https://kubernetes.io/docs/tasks/access-application-cluster/configure-access-multiple-clusters/

    展开全文
  • 一文带你了解Kubernetes多集群技术发展的历史、现状与未来。

    引子

    随着云原生技术的普及,越来越多的企业使用Kubernetes来管理应用,并且集群规模也呈爆发式增长,企业也亟需应对随集群规模增长而带来的各种挑战。同时,为了更好地提供高可用、弹性伸缩的应用,企业也对容器混合云解决方案产生了极大的兴趣。

    纵观容器混合云市场,主要的云服务提供商纷纷推出了自家的解决方案,例如华为云的MCP、Google的Anthos、Vmware的 Tanzu、IBM的 Cloud Pak、Red Hat的ACM for K8s等等。可以说,当前容器混合云市场纷繁嘈杂、百家争鸣,尽管各厂商不遗余力地鼓吹自家解决方案,但有个不争的事实是在容器混合云领域暂未出现领军产品。

    混合云市场的乱象源于两点,一是各厂商均嗅到了商机,发现了这一广阔的蓝海市场,急于在这场竞争中抢占先机C位出道;二是开源界暂无统一的事实标准。根据历史规律,后者是解决这一乱象的关键所在,正像Kubernetes终结容器编排领域的纷争一模一样。

    在开源领域,致力于混合云领域的项目数量与广阔的市场相比,显得极不相称。目前只有Rancher的Fleet、SAP公司力推的Gardener、以及Kubernetes社区的Kubefed。Fleet和Gardener要么缺乏创新,要么格局较低,难成大气,最有可能形成标准的便是被寄予厚望的、也是当前Kubernetes社区唯一的官方项目Kubefed。

    K8s多集群历史

    Kubernetes社区早在2015年便发布了集群联邦技术白皮书,并成立了“SIG-Federation”(后更名为SIG-Multicluster)特别兴趣小组致力于多集群领域的研究,该兴趣小组由华为领衔,同时也吸引了包括Google、Redhat在内的一线大厂。

    SIG-Federation于2016年正式推出官方项目Federation,并在此基础上发展出了Kubefed项目,而且技术架构也发生了较大的变化,因此Federation项目常常被称为Federation V1,而Kubefed则被称为Federation V2。

    Federation V1架构

    第一代架构中,引入了Federated API Server,用于增加集群相关API,屏蔽集群差异,统一请求入口,同时提供一个Cluster Controller用于管理多个集群状态、集群级别对象创建,并且Service Controller用来实现跨集群服务发现。整体架构如下图所示:

    V1架构兼容K8S原生API,从单集群到多集群演进可以变得很自然,但它也有几个不得不面对的缺陷。

             集群信息嵌入原生API的Annotation中(如下图所示),会导致原生API体积膨胀而丑陋;

             没有集群生命周期管理特有API,导致其生命周期管理能力无法扩展;

             无法提供API对象版本控制,比如Deployment在K8S为GA,但在Federation中可能仍是Beta;

    Federation V2架构

    在第二代架构中,利用CRD来提供独立的API对象,新的API来封装K8S原生对象,同时也可以方便的对新增API提供版本管理。
    整体架构如下图所示:

    随架构升级,Federation项目也更名为Kubefed。在新的架构中,Kubefed提供两种配置类型:

             Type configuration(类型配置): 定义Kubefed接管的K8S的资源类型

             Cluster configuration(集群配置): 定义Kubefed接管的K8S集群

    在类型配置中有三个关键的概念,用于控制资源向拖管集群分发策略:

             Templates(模版):定义一个原生的K8S资源类型;

             Placement(安置):定义资源将分发的集群;

             Overrides(修正):针对集群自由修正资源;

    一个典型的Secret配置如下图所示:

    apiVersion: types.kubefed.io/v1beta1
    
    kind: FederatedSecret
    
    metadata:
    
      name: test-secret
    
      namespace: test-namespace
    
    spec:
    
      template:
    
        data:
    
          A: YWxhIG1hIGtvdGE=
    
        type: Opaque
    
      placement:
    
        clusters:
    
        - name: cluster2
    
        - name: cluster1
    
      overrides:
    
      - clusterName: cluster2
    
        clusterOverrides:
    
        - path: /data
    
          value:
    
            A: null

    上述配置中,通过template指定原生资源属性,通过placement指定资源将分发到cluster1 和 cluster2集群,最后overrides指示了分发到cluster2集群时,消除Secret的data信息。

    K8s多集群现状

    KubeFed的问题

    Kubernetes社区当前已将Federation (v1)项目关闭,着重发展Kubefed,但该项目尚停留在beta阶段,社区开发几乎停滞,作为社区官方项目在该领域中的领导地位也在逐渐减弱。

    Kubefed项目最大的问题是使用了非Kubernetes原生API来管理用户应用部署,用户必须先改造既有的工作流程才可迁移到Kubefed提供的API,这不仅抬高了使用门槛,而且Kubefed为每种资源类型均提供了CRD API,种类繁多的API也增加了用户的学习成本。某位社区致力于多集群管理的架构师坦言:“Kubefed项目强制用户使用非原生API,这个错误的决定很大程度上导致了它的发展不如预期。”

    另外,多集群管理场景中,应用的多集群分发与监控应该是最基本的诉求,而Kubefed只完成了应用分发,对于应用的运行状态缺乏监管。用户使用Kubefed分发应用只能看到应用是否分发成功,对于应用运行状态,用户仍需要遍历集群分别获取。对用户使用造成了极大的不便。

    K8s多集群管理标准化工作

    当前Kubernetes社区针对Kubefed相关问题已经进行了多次讨论,目前多集群管理相关标准制定工作主要围绕在跨集群服务发现和工作负载配置管理,这两块也是实现多集群应用管理最基础的功能部分。

    l  多集群Service API

    在多集群应用背景下,用户已经习惯于将应用分发到多个集群,但对于Service应用而言,集群是个硬性障碍,运行于集群中的工作负载无法高效地访问其他集群中暴露的服务。多集群Service API旨在提供解决这个问题的标准,它主要包括:

    Ø  定义一组API支持跨集群的Service服务发现和消费;

    Ø  集群中应用跨集群访问Service行为与本集群一致;

    该Service API提供ServiceExport对象表示单个集群中需要暴露到多集群的Service:

    // ServiceExport declares that the associated service should be exported to
    // other clusters.
    type ServiceExport struct {
            metav1.TypeMeta `json:",inline"`
            // +optional
            metav1.ObjectMeta `json:"metadata,omitempty"`
            // +optional
            Status ServiceExportStatus `json:"status,omitempty"`
    }

    每个需要暴露给其他集群的Service均对应一个ServiceExport对象。

    此外,Service API还提供了ServiceImport对象,表示跨集群的Service定义:

    // ServiceImport describes a service imported from clusters in a supercluster.
    type ServiceImport struct {
      metav1.TypeMeta `json:",inline"`
      // +optional
      metav1.ObjectMeta `json:"metadata,omitempty"`
      // +optional
      Spec ServiceImportSpec `json:"spec,omitempty"`
      // +optional
      Status ServiceImportStatus `json:"status,omitempty"`
    }

    该Service API 提案已被社区接纳,该提案只定义了跨集群Service的声明方式,并没有对其实现细节进行约束,可以想见,将来会有多种具体的解决方案被提出。

    l  多集群工作负载模型

    关于联邦应用如何在多集群中分发,SIG-Multicluster也在进行尝试一种与现有Kubefed不同的处理思路。Kubefed当前从一系列FederatedXXX配置中剥离出Kubernetes原生应用分发到多集群,而新的尝试是提供一个通用的ManifestWork对象封装所有的应用,如下API设计:

    // ManifestWork represents a manifests workload that hub wants to deploy on the managed cluster.
    // A manifest workload is defined as a set of kubernetes resources.
    // ManifestWork must be created in the cluster namespace on the hub, so that agent on the
    // corresponding managed cluster can access this resource and deploy on the managed
    // cluster.
    type ManifestWork struct {
       metav1.TypeMeta   `json:",inline"`
       metav1.ObjectMeta `json:"metadata,omitempty"`
       // Spec represents a desired configuration of work to be deployed on the managed cluster.
       Spec ManifestWorkSpec `json:"spec"`
       // Status represents the current status of work
       // +optional
       Status ManifestWorkStatus `json:"status,omitempty"`
    }

    与Kubefed为每种应用类型均提供一个FederatedXXX 类型相比,这种新型的工作负载API则显得更加简单和通用。

    未来展望

    K8s多集群技术是容器混合云/多云解决方案的核心技术领域,涉及到资源、应用、数据、流量多个层面,以及统一配置、注册、可视化、自动弹性等多个功能领域。目前开源业界包括K8s社区的KubeFed项目、以及现有市面上的各种产品与解决方案都没有能够覆盖完整的多集群技术领域。

    华为云MCP容器多云平台在K8s多集群技术领域属于较早也是实现较为全面的产品,而同时华为云作为KubeFed社区项目的发起者与领导者,将在未来致力于完善现有KubeFed的功能集,并且实现K8s多集群技术的标准化。下图描述了K8s多集群技术的全景,目前华为云已经在KubeFed自身以及周边关联的多个技术领域开展了相关工作。

     

    展开全文
  • 随着容器技术发展,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

    展开全文
  • 第八部分 Istio多集群部署方案

    千次阅读 2019-05-05 15:36:10
    Istio 是一个服务Mesh,其基本属性是监控和管理个服务。服务Mesh的本质就是将一组单独的微服务组合成单个可控的复合应用程序。对于特定大小的应用,组成应用程序的所有的微服务都可以在单个编排平台上运行(例如 ...
  • (三) KubeSphere 3.0 启用多集群

    千次阅读 2020-08-20 14:08:50
    启用多集群 1. 概述 多集群功能涉及到多个集群之间的网络连通,了解集群之前的网络拓扑有助于减少接下来的工作量。 多集群功能需要创建一个 Host Cluster,实际即是一个开启了多集群功能的 KubeSphere 集群,简称 H ...
  • Spring Boot整合ElasticSearch单个集群集群案例分享,本文涉及内容: [list] [*]导入spring boot elasticsearch starter [*]单个es集群案例 [*]个es集群案例 [/list] 本文内容适合于: [list] [*]...
  • Kubernetes Federation(联邦) 目的是希望实现单一集群统一管理个Kubernetes集群,这些集群可能是跨地区(Region),也可能是在不同公有云供应商(Cloud Provider)上,亦或者是公司内部自行建立的集群。 安装 ...
  • kafka多集群部署

    千次阅读 2018-04-30 16:40:34
    一个中心的kafka集群做中央调度,对应个本地的kafka集群。【变种是一个关键的kafka集群对应一个非关键的跟随者】优点:只有本地用到的数据就在本地使用,个数据中心需要用到的数据就放在中央,从本地同步到远程...
  • 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命令访问集群时,默认情况下在$HOME/.kube目录下寻找名为config的配置文件,配置文件中包含集群ip地址、...在实际应用中,往往需要同时使用套环境如开发、测试、显示、生产等。一个kubectl客户端需要...
  • prometheus学习4:多集群高可用

    万次阅读 2019-05-07 14:29:32
    在默认情况下,用户只需要部署套Prometheus,采集相同的Targets即可实现基本的HA。 当然本地存储也带来了一些不好的地方,首先就是数据持久化的问题,特别是在像Kubernetes这样的动态集群环境下,如果Promthues的...
  • 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,提供这个解决方案只不过是另一个...
  • ES多集群间数据同步

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

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

    千次阅读 2016-11-29 11:42:33
     1、集群一包含3个队列:Amq1、Amq2、Amq3;集群二包含2个队列:Bmq1、Bmq2  2、生产者一生产的消息可以同时发送到群集1、集群2,生产者二也一样  3、消费者一可以同时从集群1、集群2消费消息,消费者二也一样...
  • 有关可能命名冲突的影响的更信息,请参阅使用非默认 API 组启用 API 类型部分。 kubefedctl 命令将会创建: 以 Federated 命名联邦类型的 CRD 在 KubeFed 系统命名空间具有目标类型的组限定复数名称的 ...
  • 1特性 兼容 K8s 原生 API 零变化升级,从单集群到多集群 无缝整合现有的 K8s 工具链 开箱即用 内置一系列场景的策略集合,包括 Active-active、远程灾难恢复、地理冗余等等 跨集群应用的自动扩展、故障转移和...
  • 针对于ES的集群和单机节点的搭建的教程,以及小编最后的总结感受~
  • 11月4日,在腾讯数字生态大会上,腾讯宣布了云原生领域一项重磅开源进展—— K8s 多集群管理项目 Clusternet 正式开源。 Clusternet 由腾讯联合多点生活、QQ音乐、富途证券、微众银行、酷狗音乐、三七互娱等共同发起...
  • 背景 中国移动一级业务支撑系统是整个中国移动的集中管理和一点对外的门户...但随着系统X86化逐步推进,项目集群中分别管理的主机、网络、存储等资源数量成几何级数增长,对项目建设、运维开发等各个流程都带来颠覆
  • 台服务器搭建Nacos集群

    千次阅读 2020-07-01 16:48:54
    cd /usr/local/nacos/conf #进入路劲 首先找到任意一个可以连接mysql的服务器,可以是阿里云,什么云都ok,一个就行,这个mysql是用来给nacos搭建集群用的 nano application.properties #编辑application....
  • 想要模拟高并发用户访问的场景,用Jmeter5实现的话,单靠一台PC机,资源是不够的,包括单机的内存、使用端口数量等,所以最好是通过台PC机组成几个集群来对服务器进行压测。 本文目录:1.软硬件配置2.配置系统...
  • 本章介绍如何跨个数据中心、可用性`zones`或区域使用 Akka 集群。 了解使用 Akka 集群时数据中心边界的原因是,与同一数据中心中的节点之间的通信相比,跨数据中心的通信通常具有更高的延迟和更高的故障率。 ...
  • 导读:如何解决租户集群的安全隔离问题是企业上云的一个关键问题,本文主要介绍 Kubernetes 租户集群的基本概念和常见应用形态,以及在企业内部共享集群的业务场景下,基于 Kubernetes 原生和 ACK 集群现有安全...
  • 用户数据隔离 使用hdfs权限管理及数据加密区 参考:http://hadoop.apache.org/docs/r2.7.3/hadoop-project-dist/hadoop-hdfs/HdfsPermissionsGuide.html ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 724,076
精华内容 289,630
关键字:

多集群