kubernetes
  • Introduction
  • 安装
    • 组件端口
    • 二进制安装
    • Kubeadm
      • 安装单Master集群
      • 安装高可用集群(手动分发证书)
      • 安装高可用集群(自动上传证书)
      • 安装ETCD集群
      • 安装高可用集群(外部ETCD)
    • 启动参数解析
      • ETCD相关参数
  • 负载均衡
    • Service
    • Ingress
    • 安装MetalLB
    • Nginx-ingress-controller
      • 转发TCP与UDP服务
      • 启动参数
      • 自定义Nginx模板
  • 存储
    • Volume
    • PV与PVC
    • StorageClass
    • Local-PV
      • Static-Provisioner
    • 实践
      • Ceph-RBD
      • NFS
  • 有状态服务
    • Mysql实践
    • Operator
      • Etcd
      • Zookeeper
      • Mysql
  • 认证与授权
    • 认证
      • 实践
    • 授权
  • Helm
    • 安装
    • Chart
      • 依赖
    • Helm命令
    • Repository
  • 日志
  • 监控
    • Prometheus体系
      • Prometheus
        • 内置函数
        • 配置
          • 规则文件
        • PromQL
      • Exporter
        • Metrics
      • Grafana
        • 配置
      • AlertManager
        • 配置
    • 容器监控
      • Cadvisor的指标
      • k8s中部署Prom与Cadvisor
  • Istio
  • 资源预留
    • imagefs与nodefs
    • 总结
  • 集群联邦
    • 联邦DNS原理
    • 联邦DNS安装
    • 安装federation-v1
  • Other
    • ImagePullSecret
    • QOS
    • Apiserver的代理
    • 资源配额
Powered by GitBook
On this page
  • 前置条件
  • 安装kubefed-v2的控制平面
  • 卸载
  • 下载kubefedctl二进制文件
  • 添加集群到联邦
  • 删除集群
  • 发布一个资源
  • FAQ
  • Reference

Was this helpful?

集群联邦

本文将介绍如何安装federation-v2。注意:本文要参考https://github.com/kubernetes-sigs/kubefed/blob/v0.0.10/docs/userguide.md,不要参考https://github.com/kubernetes-sigs/kubefed/blob/master/docs/userguide.md

前置条件

准备三个kubernetes集群,它们的用处分别为

  • f-cluster:用来部署kubefed的组件, 192.168.2.103

  • a-cluster:联邦下的一个集群 192.168.2.101

  • b-cluster:联邦下的一个集群 192.168.2.102

版本信息如下:

  • k8s版本:federation-v2要求kubernetes的版本在v1.11或以上,本教程使v1.14.0版本。

  • 集群安装方法:kubeadm安装

  • helm:f-cluster集群中已安装好tiller,本教程使用的helm的版本为v2.13.1

在f-cluster主机上配置好KUBECONFIG,使kubectl、kubefed2能连接到其他两个集群,内容如下:

在f-cluster主机上执行命令kubectl config get-clusters查看集群信息

$ kubectl config get-clusters
NAME
b-cluster
f-cluster
a-cluster

执行kubectl config get-contexts查看上下文信息

$ kubectl config get-contexts
CURRENT   NAME        CLUSTER     AUTHINFO   NAMESPACE
          a-context   a-cluster   a-admin    
          b-context   b-cluster   b-admin    
*         f-context   f-cluster   f-admin

安装kubefed-v2的控制平面

这里我们使用helm来安装。下载chart,链接为https://github.com/kubernetes-sigs/federation-v2/releases,这里我们选择最新的v0.0.10版本(这就是为什么文章一开始说要参考v0.0.10版本的文档而不要参考最新的文档,因为有很多不一样),下载后文件名为federation-v2-0.0.10.tgz。然后执行以下的命令安装:

$ helm install federation-v2-0.0.10.tgz --name federation --namespace federation-system

安装好之后,f-cluster中会有如下两个Pod在运行:

$ kubectl get pod -n federation-system -o wide
NAME                                             READY   STATUS    RESTARTS   AGE
federation-controller-manager-7b4d48c9f5-cljsc   1/1     Running   0          11s
federation-controller-manager-7b4d48c9f5-xtbx7   1/1     Running   0          11s

同时,里面会有一系列的CRD资源生成:

$ kubectl get crd | grep federation.k8s.io
clusterpropagatedversions.core.federation.k8s.io            2019-05-16T03:29:28Z
dnsendpoints.multiclusterdns.federation.k8s.io              2019-05-16T03:29:28Z
domains.multiclusterdns.federation.k8s.io                   2019-05-16T03:29:28Z
federatedclusterroles.types.federation.k8s.io               2019-05-16T03:29:28Z
federatedclusters.core.federation.k8s.io                    2019-05-16T03:29:28Z
federatedconfigmaps.types.federation.k8s.io                 2019-05-16T03:29:28Z
federateddeployments.types.federation.k8s.io                2019-05-16T03:29:28Z
federatedingresses.types.federation.k8s.io                  2019-05-16T03:29:28Z
federatedjobs.types.federation.k8s.io                       2019-05-16T03:29:28Z
federatednamespaces.types.federation.k8s.io                 2019-05-16T03:29:29Z
federatedreplicasets.types.federation.k8s.io                2019-05-16T03:29:29Z
federatedsecrets.types.federation.k8s.io                    2019-05-16T03:29:29Z
federatedserviceaccounts.types.federation.k8s.io            2019-05-16T03:29:29Z
federatedservices.types.federation.k8s.io                   2019-05-16T03:29:29Z
federatedservicestatuses.core.federation.k8s.io             2019-05-16T03:29:29Z
federatedtypeconfigs.core.federation.k8s.io                 2019-05-16T03:29:29Z
federationconfigs.core.federation.k8s.io                    2019-05-16T03:29:29Z
ingressdnsrecords.multiclusterdns.federation.k8s.io         2019-05-16T03:29:29Z
propagatedversions.core.federation.k8s.io                   2019-05-16T03:29:29Z
replicaschedulingpreferences.scheduling.federation.k8s.io   2019-05-16T03:29:29Z
servicednsrecords.multiclusterdns.federation.k8s.io         2019-05-16T03:29:29Z

以及FederatedTypeConfig

$ kubectl get FederatedTypeConfig -n federation-system
NAME                                     AGE
clusterroles.rbac.authorization.k8s.io   101s
configmaps                               101s
deployments.apps                         101s
ingresses.extensions                     101s
jobs.batch                               101s
namespaces                               101s
replicasets.apps                         101s
secrets                                  101s
serviceaccounts                          101s
services                                 101s

卸载

如果要卸载控制平面,首先删除FederatedTypeConfig

$ kubectl delete FederatedTypeConfig --all -n kube-federation-system

然后删除所有关于联邦的CRD

$ kubectl get crd | grep federation.k8s.io | awk '{print $1}' | xargs kubectl delete crd

然后删除release

$ helm delete --purge federation

下载kubefedctl二进制文件

下载kubefedctl客户端工具,链接为https://github.com/kubernetes-sigs/federation-v2/releases,由于上面federation的控制平台我们安装的是0.0.10,所以我们也下载这个版本的客户端。下载下来后是一个kubefedctl.tgz,解压并核实版本信息:

$ tar xzvf kubefedctl.tgz
$ ./kubefedctl version
kubefedctl version: version.Info{Version:"v0.0.10-dirty", GitCommit:"71d233ede685707df554ef653e06bf7f0229415c", GitTreeState:"dirty", BuildDate:"2019-05-06T22:30:31Z", GoVersion:"go1.11.2", Compiler:"gc", Platform:"linux/amd64"}

添加集群到联邦

在添加集群前,要先在f-cluster中创建命名空间kube-multicluster-public

$ kubectl create namespace kube-multicluster-public

然后在f-cluster上执行如下命令添加a-cluster至联邦中

$ ./kubefedctl join a-cluster --cluster-context a-context --host-cluster-context f-context --add-to-registry --v=2

然后查看a-cluster的状态,应该是Ready,如果不是请查看两个Podfederation-controller-manager-xxxxxxxxxx-yyyy的日志(见FAQ)

$ kubectl get federatedcluster -n federation-system
NAME        READY   AGE
a-cluster   True    40s

添加成功后会有a-cluster中自动创建一个命名空间federation-system。

接着我们继续添加b集群

$ ./kubefedctl join b-cluster --cluster-context b-context --host-cluster-context f-context --add-to-registry --v=2

确定两个集群都添加成功

$ kubectl get federatedcluster -n federation-system
NAME        READY   AGE
a-cluster   True    79s
b-cluster   True    18s

删除集群

如果有需要,可以使用以下的命令来删掉一个集群

$ ./kubefedctl unjoin b-cluster --cluster-context b-context --host-cluster-context f-context --remove-from-registry --v=2

发布一个资源

接下来我们发布一个FederatedDeployment。首先创建好该资源所属的命名空间test-namespace:

$ kubectl create namespace test-namespace

然后创建FederatedNamespace,让federation-controller-manager在a-cluster与b-cluster中也创建命名空间test-namespace

$ kubectl apply -f federatednamespace.yaml

federatednamespace.yaml文件内容如下:

验证在三个集群中都已存在test-namespace这个命名空间。

然后,我们创建一个FederatedDeployment

$ kubectl apply -f federateddeployment.yaml

federateddeployment.yaml的内容如下,它的意思是:在a-cluster与b-cluster中发布一个Deployment,每个集群的副本数都为1

接下来,我们查看a集群与b集群上命名空间test-namespace下的Deployment,发现与期望的一致

$ kubectl get deploy -n test-namespace --context a-context
NAME              READY   UP-TO-DATE   AVAILABLE   AGE
test-deployment   1/1     1            1           93s

$ kubectl get deploy -n test-namespace --context b-context
NAME              READY   UP-TO-DATE   AVAILABLE   AGE
test-deployment   1/1     1            1           109s

FAQ

Q:执行命令kubectl get federatedcluster -n federation-system发现a-cluster不是Ready状态?

A:查看Podfederation-controller-manager-7779795856-wvbfq的日志如下,说连不上a-cluster的apiserver

E0429 07:51:39.060715       1 clusterclient.go:122] Failed to list nodes while getting zone names: Get https://192.168.1.101:6443/api/v1/nodes: dial tcp 192.168.1.101:6443: i/o timeout
W0429 07:51:39.060788       1 controller.go:216] Failed to get zones and region for cluster a-cluster: Get https://192.168.1.101:6443/api/v1/nodes: dial tcp 192.168.1.101:6443: i/o timeout

进入到该Pod中去ping 192.168.1.101发现也不通,于是开始解决网络问题。由于federation-controller-manager-7779795856-wvbfq的IP是172.26.0.18,当它去访问192.168.1.101时并没有做SNAT,所以导致包去了回不来,我们在192.168.1.101上有抓包为证:

$ tcpdump -i ens33 icmp
...
04:27:47.244546 IP 172.26.0.18 > peng01: ICMP echo request, id 8192, seq 0, length 64

这个与calico的配置有关,这里我们先在f-cluster上执行如下的命令暂时解决这个问题

$ iptables -t nat -I POSTROUTING -s 172.26.0.0/16 ! -d 172.26.0.0/16 -j MASQUERADE

Reference

Previous总结Next联邦DNS原理

Last updated 5 years ago

Was this helpful?

https://github.com/kubernetes-sigs/kubefed/blob/v0.0.10/docs/userguide.md