【kubernetes/k8s概念】多集群联邦 kubefed 用户向导

1. Federated API types

   查看已经注册的 API 可类型,执行命令 kubectl get FederatedTypeConfig -nkube-federation-system

# kubectl get FederatedTypeConfig -nkube-federation-system
NAME                                            AGE
applications.app.k8s.io                         15h
clusterrolebindings.rbac.authorization.k8s.io   15h
clusterroles.rbac.authorization.k8s.io          15h
configmaps                                      15h
configs.notification.kubesphere.io              15h
deployments.apps                                15h
globalrolebindings.iam.kubesphere.io            15h
globalroles.iam.kubesphere.io                   15h
groupbindings.iam.kubesphere.io                 15h
groups.iam.kubesphere.io                        15h
ingresses.extensions                            15h
jobs.batch                                      15h
limitranges                                     15h
namespaces                                      15h
persistentvolumeclaims                          15h
receivers.notification.kubesphere.io            15h
replicasets.apps                                15h
secrets                                         15h
serviceaccounts                                 15h
services                                        15h
statefulsets.apps                               15h
users.iam.kubesphere.io                         15h
workspacerolebindings.iam.kubesphere.io         15h
workspaceroles.iam.kubesphere.io                15h
workspaces.tenant.kubesphere.io                 15h

   1.1 开启 Federated API types

    可以使用 kubefedctl 命令开启任何 Kubernetes API 类型(包括 CRD)的联邦,如下所示。注意:CRD 的联邦需要启用 CRD Kubernetes 类型(customresourcedefinitions),然后联邦成员集群上的任何自定义 CRD。 如果 CRD Kubernetes 类型未启用且其 Federated 等效的 CRD 也未联邦,则向该集群的 propagation 将失败。

kubefedctl enable customresourcedefinitions
kubefedctl federate crd <target kubernetes API type>  # <target kubernetes API type> = mytype.mygroup.mydomain.io

    <target kubernetes API type>  可以是下列中的:

  • the Kind (e.g. Deployment)
  • plural name (e.g. deployments)
  • group-qualified plural name (e.g deployment.apps), or
  • short name (e.g. deploy)

    对于预期的目标 API 类型。

    注意:要专门针对某个类型的某个 API 组,可以在 deployment.apps 中附加该组的名称。 对于 Pod 或 Service 等核心 Kubernetes 类型,这是不行的,因为没有分配给它们的特定 API 组。 因此,核心类型始终优先于来自另一个 API 组的其他同名类型。 有关可能命名冲突的影响的更多信息,请参阅使用非默认 API 组启用 API 类型部分。

    kubefedctl 命令将会创建:

  • 以 Federated<Kind> 命名联邦类型的 CRD
  • 在 KubeFed 系统命名空间具有目标类型的组限定复数名称的 FederatedTypeConfig

    FederatedTypeConfig 将联邦类型 CRD 与目标 kubernetes 类型相关联,从而能够将给定类型的联合资源 propaga 到成员集群。

    用于命名 FederatedTypeConfig 的格式为 <target kubernetes API type name>.<group name>,但 kubernetes core group types 使用的名称格式为 <target kubernetes API type name>。

    您还可以使用以下命令将 yaml 输出到 stdout,而不是将其应用到 API Server。

kubefedctl enable <target API type> --output=yaml

    注意:API 类型的联邦要求 API 类型安装在所有成员集群上。 如果 API 类型未安装在成员集群上,则 propagation 到该集群将失败。 

   1.2 在所有成员集群上确认 API 类型的安装

# kubectl --context=kubernetes-admin api-resources --api-group=types.kubefed.io

   1.3 在非默认的API Group 启用API Type

    当 kubefedctl enable 用于启用复数名称(例如 deployments.example.com 和 deployments.apps)匹配的类型时,生成的联邦类型的 crd 名称也将匹配(例如 deployments.types.kubefed.io)。

    kubefedctl enable --federated-group string 指定用于生成的联邦类型的 API 组的名称。 默认是 types.kubefed.io。 如果使用非默认组启用某种联邦类型,则需要更新 KubeFed 控制器管理器的 RBAC 权限以包含新组的权限。

    例如,作为 KubeFed 控制平面部署的一部分,deployments.apps 默认启用。 要启用 deployments.example.com,应该:

kubefedctl enable deployments.example.com --federated-group kubefed.example.com
kubectl patch clusterrole kubefed-role --type='json' -p='[{"op": "add", "path": "/rules/1", "value": {
            "apiGroups": [
                "kubefed.example.com"
            ],
            "resources": [
                "*"
            ],
            "verbs": [
                "get",
                "watch",
                "list",
                "update"
            ]
        }
}]'

2. 联邦一个目标资源

    除了启用和禁用上一节中指定的传播类型外,kubefedctl 还可用于联邦 API 类型的目标资源。 我们在这里定义了术语 federate,并在 kudefedctl 中使用了具有类似含义的命令关键字 federate。

    kubefedctl federate 从 kubernetes 资源创建联邦资源。 联邦资源将嵌入 kubernetes 资源作为其模板,其 placement 将选择所有集群。

kubefedctl federate <target kubernetes API type> <target resource> [flags]

    如果没有额外指定 --namespace,将根据客户端 kubeconfig 上下文在命名空间中搜索 <target resource>。 请注意,--namespace 标志在联邦命名空间本身时没有意义,即使指定也会被丢弃。 

    默认情况下,kubefedctl federate 在与目标资源相同的命名空间中创建联邦资源。 这要求目标类型已经为联邦启用(即通过 kubefedctl enable)。

    如果指定了 --output=yaml,并且目标类型尚未启用联邦,kubefedctl federate 将在生成联邦资源时采用联邦类型的默认形式。 这可能与以非默认方式启用联邦类型的 kubefed 控制平面不兼容(例如,联邦类型的组已设置为 types.kubefed.io 以外的其他内容)。

3. Propagation status

    当同步控制器协调联邦资源与成员集群时,传播状态将按照以下示例写入资源:

apiVersion: types.kubefed.io/v1beta1
kind: FederatedNamespace
metadata:
  name: myns
  namespace: myns
spec:
  placement:
    clusterSelector: {}
status:
  # The status True of the condition of type Propagation
  # indicates that the state of all member clusters is as
  # intended as of the last probe time.
  conditions:
  - type: Propagation
    status: True
    lastTransitionTime: "2019-05-08T01:23:20Z"
    lastUpdateTime: "2019-05-08T01:23:20Z"
  # The namespace 'myns' has been verified to exist in the
  # following clusters as of the lastUpdateTime recorded
  # in the 'Propagation' condition. Since that time, no
  # change has been detected to this resource or the
  # resources it manages.
  clusters:
  - name: cluster1
  - name: cluster2

Overrides

Using Cluster Selector 使用集群选择器

    除了通过联邦资源的 spec.placement.clusters 字段指定资源应该传播到的显式集群列表之外,还可以使用 spec.placement.clusterSelector 字段提供一个标签选择器来确定列表运行时的集群数量。

   下列命令给 kubeFedcluster 打上标签:

kubectl label kubefedclusters -n kube-federation-system cluster1 foo=bar

  Neither spec.placement.clusters nor spec.placement.clusterSelector is provided

   在这种情况下,您可以按上述方式设置 spec: {} 或从 plcacement 策略删除 spec 字段。 资源不会传播到成员集群。

spec:
  placement: {}

  Both spec.placement.clusters and spec.placement.clusterSelector are provided

   对于这种情况,spec.placement.clusterSelector 将被忽略,因为提供了 spec.placement.clusters。 这确保了运行时调度的结果优先于集群选择器的手动定义。

spec:
  placement:
    clusters:
      - name: cluster2
      - name: cluster1
    clusterSelector:
      matchLabels:
        foo: bar

   如果 spec.placement.clusters 提供但为空,spec.placement.clusterSelector 也将被忽略。 在以下示例中,不会选择任何集群:

spec:
  placement:
    clusters: []
    clusterSelector:
      matchLabels:
        foo: bar

 spec.placement.clusters is not provided, spec.placement.clusterSelector is provided but empty

    在这种情况下,资源将传播到所有成员集群。

spec:
  placement:
    clusterSelector: {}

  spec.placement.clusters is not provided, spec.placement.clusterSelector is provided and not empty

    在这种情况下,资源只会传播到标有 foo:bar 的成员集群。

spec:
  placement:
    clusterSelector:
      matchLabels:
        foo: bar

Scheduling

    KubeFed 提供了一种机制来将工作负载实例分散到不同的集群中,基于总副本数与集群的定义策略来将资源进行编排。编排策略是通过建立 ReplicaSchedulingPreference(RSP),由 KubeFed RSP Controller 监听与获取 RSP 资源来将工作负载实例建立到指定的集群上。

   ReplicaSchedulingPreference(RSP)

    ReplicaSchedulingPreference 提供了一种自动化机制,用于将 deployment 或 replicaset 基于联邦工作负载,其以总的副本书分配和维护到联合集群中。 这是基于用户给出的高级用户首选项。 这些首选项包括加权分布的语义和分布副本的限制(最小和最大)。 这些还包括允许动态重新分配副本的语义,以防某些副本 pod 在某些集群中保持未调度,例如由于该集群中的资源不足。

    RSP 控制器在同步循环中工作,观察 RSP 资源和匹配的命名空间/名称对,针对的资源FederatedDeployment 或 FederatedReplicaset。

    在所有可用集群分发所有副本

apiVersion: scheduling.kubefed.io/v1alpha1
kind: ReplicaSchedulingPreference
metadata:
  name: test-deployment
  namespace: test-ns
spec:
  targetKind: FederatedDeployment
  totalReplicas: 9
  clusters:
    "*":
      weight: 1

     按照权重属性分发所有副本

apiVersion: scheduling.kubefed.io/v1alpha1
kind: ReplicaSchedulingPreference
metadata:
  name: test-deployment
  namespace: test-ns
spec:
  targetKind: FederatedDeployment
  totalReplicas: 9
  clusters:
    A:
      weight: 1
    B:
      weight: 2

    以加权比例分发副本,还强制每个集群的副本限制。A获得4个,B获得5个副本。

apiVersion: scheduling.kubefed.io/v1alpha1
kind: ReplicaSchedulingPreference
metadata:
  name: test-deployment
  namespace: test-ns
spec:
  targetKind: FederatedDeployment
  totalReplicas: 9
  clusters:
    A:
      minReplicas: 4
      maxReplicas: 6
      weight: 1
    B:
      minReplicas: 4
      maxReplicas: 8
      weight: 2

参考:

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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值