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

1         Kubernetes联邦介绍

1.1         管理多個kubernetes集群

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

1.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可以跨集群、透明的解析服务。

1.3     跨集群调度

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

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

l 跨kubernetes集群均匀的调度任务负载

l 将各个kubernetes集群的工作负载进行最大化,如果当前kubernetes集群超出了承受能力,那麽将额外的工作负载路由到另一个比较空闲的kubernetes集群中

l 根据应用地理区域需求,调度工作负载到不同的kubernetes集群中,对于不同的终端用户,提供更高的带宽和更低的延迟。

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

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

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

2.1     系统环境及初始化

2.2     安装前准备

2.2.1      准备kubernetes组件镜像

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

具体镜像列表如下:

2.2.2      安装Docker 1.12

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

2.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使修改生效。

在/etc/hostname中修改各节点的hostname,在/etc/hosts设置hostname对应ip:

192.168.5.13 test01.example.com

192.168.5.14 test02.example.com

关闭防火墙服务与禁用开机启动项

systemctl stop firewalld

systemctl disable firewalld

关闭SELINUX选项

setenforce 0

sed -i 's/SELINUX=enforcing/SELINUX=disabled/g'/etc/sysconfig/selinux

2.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

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

3         安装kubernetes集群

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

3.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 init执行成功后输出下面的信息:

You can now join any number of machines by running the following on each node

as root:

kubeadm join --token e7986d.e440de5882342711 192.168.5.13:6443

请保存好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

3.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

如下图:

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

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

3.3     安装联邦集群组件

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.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.3       添加kubernetes从节点

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

kubeadm join --token e7986d.e440de5882342711 192.168.5.13:6443

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

kubectl get nodes

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

3.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

3.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.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

4         Q&A

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组件出现故障时并不会直接影响到下面各个集群自身的已经在运行的服务。

Kubernetes使用集群联邦实现多集群管理的更多相关文章

  1. Kubernetes集群搭建之Etcd集群配置篇

    介绍 etcd 是一个分布式一致性k-v存储系统,可用于服务注册发现与共享配置,具有以下优点. 简单 : 相比于晦涩难懂的paxos算法,etcd基于相对简单且易实现的raft算法实现一致性,并通过g ...

  2. kubernetes (一)使用Rancher搭建集群

    目录 如何快速高效部署K8s集群 Rancher是什么 为什么是Rancher 1.0.安装Rancher 1.1.环境 1.2.选择Rancher版本 1.3.拉取镜像 2.0.容器启动高级选项 2 ...

  3. Kubernetes v1.12/v1.13 二进制部署集群(HTTPS+RBAC)

    官方提供的几种Kubernetes部署方式 minikube Minikube是一个工具,可以在本地快速运行一个单点的Kubernetes,尝试Kubernetes或日常开发的用户使用.不能用于生产环 ...

  4. 在 Kubernetes 上快速测试 Citus 分布式 PostgreSQL 集群(分布式表,共置,引用表,列存储)

    准备工作 这里假设,你已经在 k8s 上部署好了基于 Citus 扩展的分布式 PostgreSQL 集群. 查看 Citus 集群(kubectl get po -n citus),1 个 Coor ...

  5. 分布式缓存技术redis学习系列(四)——redis高级应用(集群搭建、集群分区原理、集群操作)

    本文是redis学习系列的第四篇,前面我们学习了redis的数据结构和一些高级特性,点击下面链接可回看 <详细讲解redis数据结构(内存模型)以及常用命令> <redis高级应用( ...

  6. redis 集群环境搭建-redis集群管理

    集群架构 (1)所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽. (2)节点的fail是通过集群中超过半数的节点检测失效时才生效. (3)客户端与redi ...

  7. 分布式缓存技术redis学习(四)——redis高级应用(集群搭建、集群分区原理、集群操作)

    本文是redis学习系列的第四篇,前面我们学习了redis的数据结构和一些高级特性,点击下面链接可回看 <详细讲解redis数据结构(内存模型)以及常用命令> <redis高级应用( ...

  8. Spring+quartz集群配置,Spring定时任务集群,quartz定时任务集群

    Spring+quartz集群配置,Spring定时任务集群,quartz定时任务集群 >>>>>>>>>>>>>> ...

  9. 在Hadoop集群上,搭建HBase集群

    (1)下载Hbase包,并解压:这里下载的是0.98.4版本,对应的hadoop-1.2.1集群 (2)覆盖相关的包:在这个版本里,Hbase刚好和Hadoop集群完美配合,不需要进行覆盖. 不过这里 ...

随机推荐

  1. 用IBM WebSphere DataStage进行数据整合: 第 1 部分 分类: H2_ORACLE 2013-08-23 11:20 688人阅读 评论(0) 收藏

    转自:http://www.ibm.com/developerworks/cn/data/library/techarticles/dm-0602zhoudp/ 引言 传统的数据整合方式需要大量的手工 ...

  2. js中ajax连接服务器open函数的另外两个默认参数get请求和默认异步(open的post方式send函数带参数)(post请求和get请求区别:get:快、简单 post:安全,量大,不缓存)(服务器同步和异步区别:同步:等待服务器响应当中浏览器不能做别的事情)(ajax和jquery一起用的)

    js中ajax连接服务器open函数的另外两个默认参数get请求和默认异步(open的post方式send函数带参数)(post请求和get请求区别:get:快.简单 post:安全,量大,不缓存)( ...

  3. jquery获取元素坐标获取鼠标坐标

    获取页面某一元素的绝对X,Y坐标,可以用offset()方法: var X = $('#DivID').offset().top; var Y = $('#DivID').offset().left; ...

  4. JavaScript实现form表单的多文件上传

    form表单的多文件上传,具体内容如下 formData对象可以使用一系列的键值对来模拟一个完整的表单,然后使用Ajax来发送这个表单 使用<form>表单初始化FormData对象的方式 ...

  5. 一起学Python:TCP简介

    TCP介绍 TCP协议,传输控制协议(英语:Transmission Control Protocol,缩写为 TCP)是一种面向连接的.可靠的.基于字节流的传输层通信协议,由IETF的RFC 793 ...

  6. 数字图像处理原理与实践(MATLAB版)勘误表

    本文系<数字图像处理原理与实践(MATLAB版)>一书的勘误表. [内容简单介绍]本书全面系统地介绍了数字图像处理技术的理论与方法,内容涉及几何变换.灰度变换.图像增强.图像切割.图像去噪 ...

  7. [转]Redis 与Mysql通信

    http://blog.csdn.net/hpb21/article/details/7852934 找了点资料看了下.学习心得如下: 1 Mysql更新Redis Mysql更新Redis借鉴mem ...

  8. 简洁常用权限系统的设计与实现(五):不维护节点的深度level,手动计算level,构造树

     这种方式,与第三篇中介绍的类似.不同的是,数据库中不存储节点的深度level,增加和修改时,也不用维护.而是,在程序中,实时去计算的. 至于后面的,按照level升序排序,再迭代所有的节点构造树,与 ...

  9. c++ try catch 问题(没有throw就会被删除,加上/EHa这样就不会被删除)

    以前都是用try{} catch(…){}来捕获C++中一些意想不到的异常, 今天看了Winhack的帖子才知道,这种方法在VC中其实是靠不住的.例如下面的代码: 以前都是用try{} catch(… ...

  10. react中属性默认值是true?

    看到项目代码中 return ( <MyWebView state="Login" title="登录app" ref="login" ...