Menu

  • Home
  • Work
    • Cloud
      • Virtualization
      • IaaS
      • PaaS
    • Java
    • Go
    • C
    • C++
    • JavaScript
    • PHP
    • Python
    • Architecture
    • Others
      • Assembly
      • Ruby
      • Perl
      • Lua
      • Rust
      • XML
      • Network
      • IoT
      • GIS
      • Algorithm
      • AI
      • Math
      • RE
      • Graphic
    • OS
      • Linux
      • Windows
      • Mac OS X
    • BigData
    • Database
      • MySQL
      • Oracle
    • Mobile
      • Android
      • IOS
    • Web
      • HTML
      • CSS
  • Life
    • Cooking
    • Travel
    • Gardening
  • Gallery
  • Video
  • Music
  • Essay
  • Home
  • Work
    • Cloud
      • Virtualization
      • IaaS
      • PaaS
    • Java
    • Go
    • C
    • C++
    • JavaScript
    • PHP
    • Python
    • Architecture
    • Others
      • Assembly
      • Ruby
      • Perl
      • Lua
      • Rust
      • XML
      • Network
      • IoT
      • GIS
      • Algorithm
      • AI
      • Math
      • RE
      • Graphic
    • OS
      • Linux
      • Windows
      • Mac OS X
    • BigData
    • Database
      • MySQL
      • Oracle
    • Mobile
      • Android
      • IOS
    • Web
      • HTML
      • CSS
  • Life
    • Cooking
    • Travel
    • Gardening
  • Gallery
  • Video
  • Music
  • Essay

Kubefed学习笔记

26
Feb
2020

Kubefed学习笔记

By Alex
/ in PaaS
/ tags K8S
0 Comments
简介
联邦简介

集群联邦(Federation)的目的是实现单一集群统一管理多个Kubernetes集群的机制,这些集群可能是跨地区(Region),也可能是在不同公有云供应商上,亦或者是公司内部自行建立的集群。一但集群进行联邦后,就可以利用Federation API资源来统一管理多个集群的Kubernetes API资源,如定义Deployment如何部署到不同集群上,其集群所需的副本数等。

通过集群联邦,你可以:

  1. 简化管理多个集群的Kubernetes 组件,如Deployment, Service 等
  2. 在多个集群之间分散工作负载,以提升应用的可靠性
  3. 跨集群的资源编排,依据编排策略在多个集群进行应用部署
  4. 在不同集群中,能更快速更容易地迁移应用
  5. 跨集群的服务发现,服务可以实现地理位置感知,以降低延迟
  6. 实践多云(Multi-cloud)或混合云(Hybird Cloud)的部署
V1简介

Federation v1在Kubernetes v1.3左右时,就已经着手设计,并在Kubernetes v1.6时,进入了Beta阶段。之后一直没有发展,并在1.11被废弃。

V1在架构上有很多问题,包括:

  1. 控制平面组件会因为发生问题,而影响整体集群效率
  2. 无法兼容新的Kubernetes API 资源
  3. 无法有效的在多个集群管理权限,如不支持RBAC
  4. 联邦层级的设定与策略依赖API 资源的Annotations

Federation v1的控制平面类似于K8S,包括组件:

  1. federation-apiserver:提供Federation API资源,只支持部分Kubernetes API resources
  2. federation-controller-manager:协调不同集群之间的状态,如同步Federated资源与策略
  3. etcd:储存Federation的状态

Federation v1的API Server通过k8s.io/apiserver套件开发,这种是采用API Aggregation方式来扩充Kubernetes API。

Federation v1写死了K8S资源版本,例如extensions/v1beta1的Deployment,写成apps/v1的Deployment则不支持。内置支持(管理的)K8S资源类型很少,如果想新增,必须在Federation types新增对应的Adapter,然后通过Code Generator产生API的client-go组件给Controller Manager操作API使用,最后重新建构一版本来更新API Server与Controller Manager以提供对其他资源与版本的支持,非常麻烦。

Federation v1在设计之初未考虑RBAC与CRD,这也是致命缺点。

V2简介

Federation v2也叫Kubernetes Cluster Federation,或者KubeFed。和V1比起来,优势包括:

  1. 简化扩展Federated API过程
  2. 加强跨集群服务发现与编排的功能
  3. 模块化、可定制化,可以随着K8S生态一起演进
  4. 移除了API Server,通过CRD机制来完成Federated Resources的扩充。这些资源由KubeFed Controller管理

利用Kubefed(Kubernetes Cluster Federation)你可以用宿主集群(Host Cluster)中的单套API来协调多个K8S集群的配置。Kubefed刻意提供了低级别的API,用来应用复杂部署场景,包括跨地理位置应用部署、灾难恢复。

使用Kubefed你需要提供两类配置信息:

  1. Type配置:声明Kubefed需要处理的API类型
  2. Cluster配置:声明Kubefed需要管理的目标集群

术语 Propagation 表示将资源分发到对应集群的机制。

Type配置包含三个基本要素:

  1. Templates 定义资源在所有集群中共同的部分
  2. Placement 定义资源应该出现在哪些集群中
  3. Overrides 定义集群对Template字段的覆盖

高层API基于这些基本要素:

  1. Status:收集被分发到所有集群的资源的状态
  2. Policy:决定一个资源应当被分发到联邦集群的什么子集中
  3. Scheduling:决定工作负载如何跨越不同集群分布
术语
术语 说明
Federate 将若干K8S集群联邦起来,提供一套公共接口,可以针对这个集群池操作,从而跨越多个K8S集群部署应用程序
KubeFed Kubefed是v2版本的K8S集群联邦,让用户联合多个K8S集群,实现:资源分发、服务发现、跨集群高可用
Host Cluster 一个用于暴露KubeFed API、运行KubeFet控制平面的集群
Cluster Registration 一个K8S集群可以通过 kubefedctl join加入到Host Cluster(加入到联邦)
Member Cluster

一个集群通过KubeFed API注册并加入到联邦,则成为成员,KubeFed控制器在此之后获得该集群的访问凭证

Host Cluster是Member Cluster

ServiceDNSRecord 一个关联到1-N个K8S Service的、包含了这些Service访问方式的资源。这种资源中还包括构造Service的DNS记录的Scheme
IngressDNSRecord 一个关联到1-N个K8S Ingress的、包含了这些Ingress访问方式的资源。这种资源中还包括构造Ingress的DNS记录的Scheme
DNSEndpoint 包装Endpoint资源的CRD
Endpoint 表示DNS资源记录的资源
安装和配置
安装
kubefedctl

直接到:https://github.com/kubernetes-sigs/kubefed/releases 下载即可。

控制平面

KubeFed可以在kind、Minikube、GKE等多种K8S环境下运行。你可以通过Chart方式来安装:

Shell
1
2
3
4
5
helm repo add kubefed  https://raw.githubusercontent.com/kubernetes-sigs/kubefed/master/charts
 
helm install  kubefed/kubefed --name kubefed  --namespace kube-federation-system \
  --set controllermanager.replicaCount=1 \
  --set controllermanager.repository=docker.gmem.cc/kubernetes-multicluster
卸载

卸载时可能导致命名空间一直处于Terminating状态。根因是FederatedTypeConfig类型的CR上具有finalizer core.kubefed.io/federated-type-config。此finalizer导致CRD卡死在InstanceDeletionInProgress状态。

相关Issue:https://github.com/kubernetes/kubernetes/issues/60538

联邦成员管理
加入联邦

可以通过kubefedctl来将集群加入到联邦,你需要将所有集群的配置信息收集到KUBECONFIG中,分别作为一个context。

Shell
1
2
3
# 你需要修改默认的context名称,因为其中的@是特殊字符,会导致报错
kubefedctl join k8s  --cluster-context k8s  --host-cluster-context k8s --v=2
kubefedctl join kind --cluster-context kind --host-cluster-context k8s --v=2
查看成员列表
Shell
1
2
3
4
5
kubectl -n kube-federation-system get kubefedclusters
# NAME   AGE    READY
# k8s    117m   True
# 如果READY不为True,则提示联邦控制平面无法访问到该成员的API Server
# kind   117m  
踢出联邦
Shell
1
kubefedctl unjoin kind --cluster-context=kind --host-cluster-context=k8s
联邦API配置

你可以启用任何K8S API类型的联邦支持,包括CRD。只有启用了联邦支持的API,才能够由联邦控制平面管理,分发给成员集群。

启用内置API联邦

ClusterRole、Configmap、Deployment、Ingress、Job、Namespace、ReplicaSet、Secrets、ServiceAccount、Service默认情况下已经启用。

指定API组

假设你有一个API名为deployment.k8s.gmem.cc,由于它和内置的Deployment资源同名,在启用它的联邦时,你需要指定一个组名:

Shell
1
kubefedctl enable deployments.gmem.cc --federated-group kubefed.gmem.cc

原因是deployment.types.kubefed.io这个名字已经被占用。

启用CRD联邦

要支持你的自定义资源(CR)的联邦,必须启用customresourcedefinitions(CRD)的联邦:

Shell
1
kubefedctl enable customresourcedefinitions

上述命令执行后,会创建一个CRD:federatedcustomresourcedefinitions.types.kubefed.io。并且,在在Kubefed的控制平面所在命名空间,会创建一个federatedtypeconfigs.core.kubefed.io:

Shell
1
2
kubectl -n kube-federation-system get federatedtypeconfigs.core.kubefed.io
# federatedcustomresourcedefinitions.types.kubefed.io   2020-05-27T11:10:59Z
执行CRD实例的联邦

执行下面的命令执行某种CRD的联邦:

Shell
1
kubefedctl federate crd envoyfilters.networking.istio.io

上述命令会执行类型为CRD的,名字为envoyfilters.networking.istio.io的资源的联邦。它会创建一个federatedcustomresourcedefinitions.types.kubefed.io资源,在其中描述如何在联邦中分发这个CRD:

YAML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
apiVersion: types.kubefed.io/v1beta1
kind: FederatedCustomResourceDefinition
metadata:
  finalizers:
  - kubefed.io/sync-controller
  name: envoyfilters.networking.istio.io
spec:
  # 需要分发到哪些集群
  placement:
    clusterSelector:
      matchLabels: {}
  # 模板,即EnvoyFilter这个CRD的内容
  template:
    metadata:
      labels:
        app: istio-pilot
        chart: istio
    spec:
      conversion:
        strategy: None
      group: networking.istio.io
      names:
        categories:
        - istio-io
        - networking-istio-io
        kind: EnvoyFilter
status:
  # 已经分发的集群列表
  clusters:
  - name: kind
  - name: k8s

如果一切顺利,你应该很快在kind、k8s这两个集群中,看到名为envoyfilters.networking.istio.io的CRD。

启用CR联邦

执行了CRD的联邦了,CRD就可以分发到成员集群了。在此前提下,你可以启用对应CR的联邦:

Shell
1
kubefedctl enable envoyfilters.networking.istio.io

上述命令会:

  1. 创建一个名为federatedenvoyfilters.types.kubefed.io的CRD
  2. 在Kubefed控制平面所在命名空间,创建一个名为envoyfilters.networking.istio.io的FederatedTypeConfig

FederatedTypeConfig负责将联邦类型和目标类型关联启用,启用联邦资源(转换为目标类型)传播(到成员集群):

YAML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
apiVersion: core.kubefed.io/v1beta1
kind: FederatedTypeConfig
metadata:
  finalizers:
  - core.kubefed.io/federated-type-config
  name: envoyfilters.networking.istio.io
  namespace: kube-federation-system
spec:
  # 联邦类型
  federatedType:
    group: types.kubefed.io
    kind: FederatedEnvoyFilter
    pluralName: federatedenvoyfilters
    scope: Namespaced
    version: v1beta1
  # 是否启用分发
  propagation: Enabled
  # 目标类型
  targetType:
    group: networking.istio.io
    kind: EnvoyFilter
    pluralName: envoyfilters
    scope: Namespaced
    version: v1alpha3
status:
  observedGeneration: 1
  propagationController: Running
  statusController: NotRunning
执行CR的联邦

到这里,你就可以执行某个EnvoyFilter的联邦了 —— 指定哪些资源,需要分发到哪些集群中,各集群如何覆盖资源的某些字段。

这是最关键的主题,我们在下一章详细学习。

禁用传播

要禁止某一类API资源的分发,需要将FederatedTypeConfig的propagation设置为false:

Shell
1
2
kubectl patch --namespace kube-federation-system federatedtypeconfigs envoyfilters.networking.istio.io \
    --type=merge -p '{"spec": {"propagation": "Disabled"}}'

这样SyncController就会停止 envoyfilters的分发。

如果要永久的禁用联邦,则可以执行disable命令:

Shell
1
kubefedctl disable envoyfilters.networking.istio.io

对应的FederatedTypeConfig资源会被删除。 

MCIDNS配置

这里我们以CoreDNS(启用Etcd插件)作为ExternalDNS的DNS Provider,利用MetalLB来提供LoadBalancer类型的Service,来试验MCIDNS功能。

CoreDNS、Etcd、ExternalDNS、MetalLB的安装步骤这里不详述,可以参考上段文字中的连接。本文强调一下用在Kubefed场景下差异化的部分。

ExternalDNS安装时,使用如下配置:

Shell
1
2
3
4
5
6
7
8
9
helm install bitnami/external-dns --name kubefed-external-dns --namespace=kube-federation-system \
  --set global.imageRegistry=docker.gmem.cc \
  --set global.imagePullSecrets[0]=gmemregsecret  \
  --set provider=coredns \
  --set coredns.etcdEndpoints=http://kubefed-etcd:2379 \
  --set sources={crd} \
  --set crd.apiversion=multiclusterdns.kubefed.io/v1alpha1 \
  --set crd.kind=DNSEndpoint \
  --set logLevel=debug
执行联邦

执行某个资源的联邦就是:修改某个的资源模板,为某些成员集群应用差异化的模板变量,然后分发到这些成员集群中。其前提条件是启用该资源类型的联邦支持,在上一章我们已经讨论如何做到这一点。

命令

kubefedctl federate命令负责执行联邦,它会以一个现有的目标资源为模板(Template),创建对应的联邦资源,默认情况下以所有成员集群为分发(Placement)目标。命令格式如下:

Shell
1
2
3
4
5
6
7
8
9
10
11
kubefedctl federate <target kubernetes API type> <target resource> [flags]
 
# 可用标记
# -c, --contents      仅当联邦命名空间时有意义,如果指定,则在联邦完命名空间后,
#                     联邦其中的资源
# -s, --skip-api-resources
#                     -c时,需要跳过的资源类型
# --dry-run           不发起API请求
# -f, --filename      从文件中读取需要联邦的资源列表,并且仅仅是将联邦后的结果输出到标准输出
# -n, --namespa       目标资源所在命名空间
# -o, --output        输出到标准输出,而非创建联邦资源
联邦一个资源

下面的例子,联邦了位于my-namespace中的ConfigMap my-configmap:

Shell
1
kubefedctl federate configmaps my-configmap -n my-namespace
联邦命名空间

联邦命名空间时,你可以选择将其中的所有/部分类型资源都进行联邦:

Shell
1
kubefedctl federate namespace my-namespace --contents --skip-api-resources "configmaps,apps"
查看传播状态 

要了解联邦资源分发的进度,你需要查看联邦资源的状态:

YAML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
apiVersion: types.kubefed.io/v1beta1
kind: FederatedNamespace
metadata:
  name: myns
  namespace: myns
spec:
  placement:
    clusterSelector: {}
status:
  conditions:
  - type: Propagation
    # True意味着分发已经完毕
    status: True
    lastTransitionTime: "2019-05-08T01:23:20Z"
    lastUpdateTime: "2019-05-08T01:23:20Z"
  # 下面两个集群已经接收到最新的myns
  clusters:
  - name: cluster1
  - name: cluster2

如果Propagation的Status为False,则Reason会说明分发未完成的原因:

原因 说明
CheckClusters

一个或多个集群不在期望状态。这种情况下,clusters.status字段会显示具体原因:

YAML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
apiVersion: types.kubefed.io/v1beta1
kind: FederatedNamespace
metadata:
  name: myns
  namespace: myns
spec:
  placement:
    clusters:
    - name: cluster1
status:
  conditions:
  - type: Propagation
    status: False
    reason: CheckClusters
    lastTransitionTime: "2019-05-08T01:23:20Z"
    lastUpdateTime: "2019-05-08T01:23:20Z"
  clusters:
  - name: cluster1
  - name: cluster2
    status: DeletionFailed 
ClusterRetrievalFailed 无法获取成员集群
ComputePlacementFailed 计算Placement时出错
NamespaceNotFederated 包含资源的命名空间没有被联邦

除了CheckClusters,其它原因都会产生一个K8S事件。

CheckClusters时,可能出现的某个集群错误status包括:

Status 说明
AlreadyExists 目标资源已经存在于集群,但是由于adoptResources被禁用,无法收养(adopted)
ApplyOverridesFailed 向模板覆盖字段时出错
CachedRetrievalFailed 提取缓存的目标资源时出错
ClientRetrievalFailed 创建目标成员集群的API客户端时出错
ClusterNotReady 目标集群的健康检查失败
ComputeResourceFailed 生成资源在目标集群中应有形式时失败
CreationFailed 创建目标资源失败
CreationTimedOut 创建目标资源超时
DeletionFailed 删除失败
DeletionTimedOut 删除超时
FieldRetentionFailed Retain一个或多个字段时出错,例如Service的clusterIP
LabelRemovalFailed 移除KubeFed标签失败
LabelRemovalTimedOut 移除KubeFed标签超时
ManagedLabelFalse 无法管理具有kubefed.io/managed: false标签的资源
RetrievalFailed 无法从目标集群检索资源
UpdateFailed 更新失败
UpdateTimedOut 更新超时
VersionRetrievalFailed 无法获取最新版本的资源
WaitingForRemoval 目标资源已经被标记为正在删除,等待垃圾回收器
删除策略

由Sync Controller管理的联邦资源,具有Finalizer:kubefed.io/sync-controller。此Finalizer阻止资源的删除,直到Sync Controller有机会执行前置清理操作。

前置清理操作,就是要从受管成员集群中移除联邦资源对应的目标资源。

如果想在删除联邦资源后,仍然保留目标资源,则需要在执行删除操作之前,给联邦资源加上注解: kubefed.io/orphan: true,你可以通过命令完成:

Shell
1
2
3
4
5
6
# 启用孤儿化
kubefedctl orphaning-deletion enable <federated type> <name>
# 查看孤儿化状态
kubefedctl orphaning-deletion status <federated type> <name>
# 禁用孤儿化
kubefedctl orphaning-deletion disable <federated type> <name>
Placement配置

要指定某个联邦资源需要分发到哪些集群,只需要设置联邦资源的spec.placement:

Shell
1
2
3
4
5
6
7
8
9
spec:
  placement:
    # 根据集群名字
    clusters:
    - name: cluster1
    # 根据集群标签
    # 这样打标签:kubectl label kubefedclusters -n kube-federation-system cluster1 foo=bar
    clusterSelector:
      foo: bar

一旦设置,已经分发到cluster2的资源,会自动删除。 

如果placement设置为 {}则不分发到任何集群。

Overrides配置

在分发资源给目标集群时,你可以进行差异化的修改。修改在联邦资源的spec.overrides中进行,语法是jsonpatch的子集:

  1. op 定义执行的操作:
    1. replace 替换,默认
    2. add 添加到对象或数组
    3. remove 从对象或数组移除
  2. path 定义需要操作的字段所在路径,必须以/开始:
    1. 例如 /spec/replicas
    2. 索引语法  /spec/template/spec/containers/0/image
  3. value 定义字段的值。对于remove操作,忽略

下面是一个例子:

YAML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
kind: FederatedDeployment
...
spec:
  ...
  overrides:
    # 针对cluster1的Override
    - clusterName: cluster1
      clusterOverrides:
        # 设置副本数为5
        - path: "/spec/replicas"
          value: 5
        # 设置第一个容器的镜像
        - path: "/spec/template/spec/containers/0/image"
          value: "nginx:1.17.0-alpine"
        # 确保注解存在
        - path: "/metadata/annotations"
          op: "add"
          value:
            foo: bar
        # 确保注解删除
        - path: "/metadata/annotations/foo"
          op: "remove"
        # 插入第一个容器命令参数
        - path: "/spec/template/spec/containers/0/args/0"
          op: "add"
          value: "-q"
覆盖保留字段

在计算目标集群中,联邦资源应该生成的形态时,使用如下算法:

  1. 从Template 计算出新的资源
  2. 如果该资源已经存在于目标集群,应当保留(retention)的字段,被保留
  3. 执行override
  4. 设置受管labels
本地值保留

目标集群中资源的大部分字段,都会被从联邦资源生成的最新版本代替,例外如下:

资源类型 字段 保留策略 说明
All metadata.annotations Always 期望被成员集群中某些控制器管理的注解
All metadata.finalizers Always 期望被成员集群中某些控制器管理的Finazlier
All metadata.resourceVersion Always 用于并发控制
Scalable spec.replicas Conditional HPA控制器可能负责管理该字段
Service spec.clusterIP
spec.ports
Always 某个控制器可能负责修改这些字段 
ServiceAccount secrets Conditional 某个控制器可能负责修改这些字段 
高级特性

利用Kubefed提供的底层FederatedXxx API(具有template、placement、override字段),以及关联的控制器,我们可以构建出高级别的API。Kubefed自身提供了一些高级别API。

MCIDNS

多集群Ingress DNS(Multi-Cluster Ingress DNS)提供以编程方式管理K8S Ingress资源的DNS记录的能力。MCIDNS的目的不是替换CoreDNS这样的DNS Provider,而是通过集成ExternalDNS,来在支持DNS Provider(例如一些云服务商的DNS服务)中管理外部DNS记录。

工作流程

MCIDNS的工作流程图:

ingressdns-with-externaldns

 

典型的工作流说明:

  1. 用户创建FederatedDeployment、FederatedService、FederatedIngress资源
  2. Kubefed的Sync Controller将对应的目标资源传播到成员K8S集群中
  3. 用户创建一个IngressDNSRecord资源,此资源标识期望的DNS名,以及可选的DNS记录参数
  4. MCIDNS的Ingress DNS Controller监控IngressDNSRecord,用匹配(成员集群中命名空间、名字与IngressDNSRecord一致的)的Ingress资源的IP地址(这个地址由Ingress Controller填充)来更新IngressDNSRecord的Status
  5. MCIDNS的DNS Endpoint Controller监控IngressDNSRecord,创建对应的DNSEndpoint
  6. DNSEndpoint包含必要的信息,外部DNS系统(例如ExternalDNS)负责监控此对象,利用其中的信息,在DNS Provider中创建DNS记录
如何启用

要启用MCIDNS,你首先需要创建Kubefed控制平面,并加入成员集群。然后:

  1. 如有必要,在DNS Provider创建一个域名,或者,将某个DNS子域代理给ExternalDNS。具体操作方式咨询你的DNS Provider
  2. 安装ExternalDNS,必须指定参数:
    Shell
    1
    2
    3
    4
    5
    --source=crd
    --crd-source-apiversion=multiclusterdns.kubefed.io/v1alpha1
    --crd-source-kind=DNSEndpoint
    --registry=txt
    --txt-prefix=cname
  3. 创建一个样例的联邦 Deployment+Service+Ingress来进行测试:

    1. Ingress的域名设置为第一步中提及的域名的子域名
    2. 等待Ingress Controller将Ingress的IP地址设置好
    3. 创建IngressDNSRecord资源,必须注意,hosts字段和FederatedIngress的host字段要匹配:
      YAML
      1
      2
      3
      4
      5
      6
      7
      8
      9
      apiVersion: multiclusterdns.kubefed.io/v1alpha1
      kind: IngressDNSRecord
      metadata:
        name: test-ingress
        namespace: test-namespace
      spec:
        hosts:
        - test.kubefed.gmem.cc
        recordTTL: 300
    4. DNS Endpoint Controller将会使用目标Ingress中的IP地址来生成DNSEndpoint的targets字段,例如:

      YAML
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      apiVersion: multiclusterdns.kubefed.io/v1alpha1
      kind: DNSEndpoint
      metadata:
        name: ingress-test-ingress
        namespace: test-namespace
      spec:
        endpoints:
        - dnsName: ingress.example.com
          recordTTL: 300
          recordType: A
          targets:
          - $CLUSTER1_INGRESS_IP
          - $CLUSTER2_INGRESS_IP
      status: {}
    5. ExternalDNS的控制器会监控DNSEndpoint对象,在DNS Provider中为每个目标Ingress创建A记录和TXT记录。例如:
      Shell
      1
      2
      3
      NAME                   TYPE  TTL    DATA
      test.kubefed.gmem.cc.  A     300    $CLUSTER1_INGRESS_IP,$CLUSTER2_INGRESS_IP
      test.kubefed.gmem.cc.  TXT   300    "heritage=external-dns,external-dns/owner=my-identifier" 
MCSDNS

和MCIDNS类似,区别:

  1. ServiceDNSRecord监控Service的IP地址,类似于IngressDNSRecord从Ingress同步IP地址信息
  2. DNSEndpoint控制器会创建3个A记录,格式分别为:
    Shell
    1
    2
    3
    <service>.<namespace>.<federation>.svc.<federation-domain>
    <service>.<namespace>.<federation>.svc.<region>.<federation-domain>
    <service>.<namespace>.<federation>.svc.<availability-zone>.<region>.<federation-domain>
如何启用

参考如下步骤:

  1. 准备Kubefed环境,需要支持LoadBalancer类型的服务
  2. Ingress的域名设置为第一步中提及的域名的子域名
  3. 安装ExternalDNS
  4. 创建一个样例的联邦 Deployment+Service(LoadBalancer)来进行测试:
    1. 服务的EXTERNAL-IP就绪后,创建Domain和ServiceDNSRecord:
      YAML
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      apiVersion: multiclusterdns.kubefed.io/v1alpha1
      kind: Domain
      metadata:
        # 对应DNS记录中的 <federation> 段
        name: test-domain
        # 运行 kubefed-controller-manager的命名空间
        namespace: kube-federation-system
      # 在DNS Provider中配置好的域名或子域名
      domain: kubefed.gmem.cc
       
      ---
       
      apiVersion: multiclusterdns.kubefed.io/v1alpha1
      kind: ServiceDNSRecord
      metadata:
        # 测试服务的名字
        name: test-service
        # 测试服务的命名空间
        namespace: test-namespace
      spec:
        # 引用Domain对象
        domainRef: test-domain
        recordTTL: 300
    2.  DNSEndpoint会自动创建3个A记录、3个TXT记录:

      Shell
      1
      2
      3
      4
      5
      6
      test-service.test-namespace.test-domain.svc.kubefed.gmem.cc.                      A     300    $CLUSTER1_SERVICE_IP,$CLUSTER2_SERVICE_IP
      test-service.test-namespace.test-domain.svc.kubefed.gmem.cc.                      TXT   300    "heritage=external-dns,external-dns/owner=my-identifier"
      test-service.test-namespace.test-domain.svc.us-west1.kubefed.gmem.cc.             A     300    $CLUSTER1_SERVICE_IP,$CLUSTER2_SERVICE_IP
      test-service.test-namespace.test-domain.svc.us-west1.kubefed.gmem.cc.             TXT   300    "heritage=external-dns,external-dns/owner=my-identifier"
      test-service.test-namespace.test-domain.svc.us-west1-b.us-west1.kubefed.gmem.cc.  A     300    $CLUSTER1_SERVICE_IP,$CLUSTER2_SERVICE_IP
      test-service.test-namespace.test-domain.svc.us-west1-b.us-west1.kubefed.gmem.cc.  TXT   300    "heritage=external-dns,external-dns/owner=my-identifier" 
ReplicaSchedulingPreference

RSP提供了一种机制,来自动化的机制来维护所有成员集群中、Deployment/Replicaset类型工作负载的副本总数。

在用户提供的偏好(RSP的某些字段)中,指定了集群的权重、副本数量最小、最大值。如果某些集群中Pod维持在unscheduled状态,还可以配置重新分发副本(给其它集群)。

RSP控制器负责监控RSP资源,以及namespace/name匹配的FederatedDeployment或(取决于spec.targetKind)FederatedReplicaset资源。如果目标资源存在,它会根据配置,将 spec.totalReplicas分发到当前健康成员集群中。如果没有设置针对单个集群的偏好,则均匀分发。

如果RSP对象存在,则匹配的FederatedXxx资源中的副本数声明被忽略。RSP控制器负责更新FederatedXxx中的副本Overrides,实际传播工作仍然由Sync Controller完成。

如果指定了spec.rebalance,则RSP控制器会进行副本数再平衡,即将无法调度的Pod(成员集群资源不足)调度到其它健康集群中。

均匀分布
YAML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
apiVersion: scheduling.kubefed.io/v1alpha1
kind: ReplicaSchedulingPreference
metadata:
  name: test-deployment
  namespace: test-ns
spec:
  targetKind: FederatedDeployment
  totalReplicas: 9
 
# 或者
 
apiVersion: scheduling.kubefed.io/v1alpha1
kind: ReplicaSchedulingPreference
metadata:
  name: test-deployment
  namespace: test-ns
spec:
  targetKind: FederatedDeployment
  totalReplicas: 9
  clusters:
    "*":
      weight: 1
权重分布
YAML
1
2
3
4
5
6
7
8
9
10
11
12
13
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
限制副本数范围 
YAML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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
参考资料
  1. https://github.com/kubernetes-sigs/kubefed
  2. https://www.kubernetes.org.cn/5702.html
← 限制Pod磁盘空间用量
通过ExternalDNS集成外部DNS服务 →

Leave a Reply Cancel reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">

Related Posts

  • 通过自定义资源扩展Kubernetes
  • Istio学习笔记
  • CSI学习笔记
  • 编写Kubernetes风格的APIServer
  • Envoy学习笔记

Recent Posts

  • Investigating and Solving the Issue of Failed Certificate Request with ZeroSSL and Cert-Manager
  • A Comprehensive Study of Kotlin for Java Developers
  • 背诵营笔记
  • 利用LangChain和语言模型交互
  • 享学营笔记
ABOUT ME

汪震 | Alex Wong

江苏淮安人,现居北京。目前供职于腾讯云,专注容器方向。

GitHub:gmemcc

Git:git.gmem.cc

Email:gmemjunk@gmem.cc@me.com

ABOUT GMEM

绿色记忆是我的个人网站,域名gmem.cc中G是Green的简写,MEM是Memory的简写,CC则是我的小天使彩彩名字的简写。

我在这里记录自己的工作与生活,同时和大家分享一些编程方面的知识。

GMEM HISTORY
v2.00:微风
v1.03:单车旅行
v1.02:夏日版
v1.01:未完成
v0.10:彩虹天堂
v0.01:阳光海岸
MIRROR INFO
Meta
  • Log in
  • Entries RSS
  • Comments RSS
  • WordPress.org
Recent Posts
  • Investigating and Solving the Issue of Failed Certificate Request with ZeroSSL and Cert-Manager
    In this blog post, I will walk ...
  • A Comprehensive Study of Kotlin for Java Developers
    Introduction Purpose of the Study Understanding the Mo ...
  • 背诵营笔记
    Day 1 Find Your Greatness 原文 Greatness. It’s just ...
  • 利用LangChain和语言模型交互
    LangChain是什么 从名字上可以看出来,LangChain可以用来构建自然语言处理能力的链条。它是一个库 ...
  • 享学营笔记
    Unit 1 At home Lesson 1 In the ...
  • K8S集群跨云迁移
    要将K8S集群从一个云服务商迁移到另外一个,需要解决以下问题: 各种K8S资源的迁移 工作负载所挂载的数 ...
  • Terraform快速参考
    简介 Terraform用于实现基础设施即代码(infrastructure as code)—— 通过代码( ...
  • 草缸2021
    经过四个多月的努力,我的小小荷兰景到达极致了状态。

  • 编写Kubernetes风格的APIServer
    背景 前段时间接到一个需求做一个工具,工具将在K8S中运行。需求很适合用控制器模式实现,很自然的就基于kube ...
  • 记录一次KeyDB缓慢的定位过程
    环境说明 运行环境 这个问题出现在一套搭建在虚拟机上的Kubernetes 1.18集群上。集群有三个节点: ...
  • eBPF学习笔记
    简介 BPF,即Berkeley Packet Filter,是一个古老的网络封包过滤机制。它允许从用户空间注 ...
  • IPVS模式下ClusterIP泄露宿主机端口的问题
    问题 在一个启用了IPVS模式kube-proxy的K8S集群中,运行着一个Docker Registry服务 ...
  • 念爷爷
      今天是爷爷的头七,十二月七日、阴历十月廿三中午,老人家与世长辞。   九月初,回家看望刚动完手术的爸爸,发

  • 6 杨梅坑

  • liuhuashan
    深圳人才公园的网红景点 —— 流花山

  • 1 2020年10月拈花湾

  • 内核缺陷触发的NodePort服务63秒延迟问题
    现象 我们有一个新创建的TKE 1.3.0集群,使用基于Galaxy + Flannel(VXLAN模式)的容 ...
  • Galaxy学习笔记
    简介 Galaxy是TKEStack的一个网络组件,支持为TKE集群提供Overlay/Underlay容器网 ...
TOPLINKS
  • Zitahli's blue 91 people like this
  • 梦中的婚礼 64 people like this
  • 汪静好 61 people like this
  • 那年我一岁 36 people like this
  • 为了爱 28 people like this
  • 小绿彩 26 people like this
  • 彩虹姐姐的笑脸 24 people like this
  • 杨梅坑 6 people like this
  • 亚龙湾之旅 1 people like this
  • 汪昌博 people like this
  • 2013年11月香山 10 people like this
  • 2013年7月秦皇岛 6 people like this
  • 2013年6月蓟县盘山 5 people like this
  • 2013年2月梅花山 2 people like this
  • 2013年淮阴自贡迎春灯会 3 people like this
  • 2012年镇江金山游 1 people like this
  • 2012年徽杭古道 9 people like this
  • 2011年清明节后扬州行 1 people like this
  • 2008年十一云龙公园 5 people like this
  • 2008年之秋忆 7 people like this
  • 老照片 13 people like this
  • 火一样的六月 16 people like this
  • 发黄的相片 3 people like this
  • Cesium学习笔记 90 people like this
  • IntelliJ IDEA知识集锦 59 people like this
  • 基于Kurento搭建WebRTC服务器 38 people like this
  • Bazel学习笔记 37 people like this
  • PhoneGap学习笔记 32 people like this
  • NaCl学习笔记 32 people like this
  • 使用Oracle Java Mission Control监控JVM运行状态 29 people like this
  • Ceph学习笔记 27 people like this
  • 基于Calico的CNI 27 people like this
Tag Cloud
ActiveMQ AspectJ CDT Ceph Chrome CNI Command Cordova Coroutine CXF Cygwin DNS Docker eBPF Eclipse ExtJS F7 FAQ Groovy Hibernate HTTP IntelliJ IO编程 IPVS JacksonJSON JMS JSON JVM K8S kernel LB libvirt Linux知识 Linux编程 LOG Maven MinGW Mock Monitoring Multimedia MVC MySQL netfs Netty Nginx NIO Node.js NoSQL Oracle PDT PHP Redis RPC Scheduler ServiceMesh SNMP Spring SSL svn Tomcat TSDB Ubuntu WebGL WebRTC WebService WebSocket wxWidgets XDebug XML XPath XRM ZooKeeper 亚龙湾 单元测试 学习笔记 实时处理 并发编程 彩姐 性能剖析 性能调优 文本处理 新特性 架构模式 系统编程 网络编程 视频监控 设计模式 远程调试 配置文件 齐塔莉
Recent Comments
  • qg on Istio中的透明代理问题
  • heao on 基于本地gRPC的Go插件系统
  • 黄豆豆 on Ginkgo学习笔记
  • cloud on OpenStack学习笔记
  • 5dragoncon on Cilium学习笔记
  • Archeb on 重温iptables
  • C/C++编程:WebSocketpp(Linux + Clion + boostAsio) – 源码巴士 on 基于C/C++的WebSocket库
  • jerbin on eBPF学习笔记
  • point on Istio中的透明代理问题
  • G on Istio中的透明代理问题
  • 绿色记忆:Go语言单元测试和仿冒 on Ginkgo学习笔记
  • point on Istio中的透明代理问题
  • 【Maven】maven插件开发实战 – IT汇 on Maven插件开发
  • chenlx on eBPF学习笔记
  • Alex on eBPF学习笔记
  • CFC4N on eBPF学习笔记
  • 李运田 on 念爷爷
  • yongman on 记录一次KeyDB缓慢的定位过程
  • Alex on Istio中的透明代理问题
  • will on Istio中的透明代理问题
  • will on Istio中的透明代理问题
  • haolipeng on 基于本地gRPC的Go插件系统
  • 吴杰 on 基于C/C++的WebSocket库
©2005-2025 Gmem.cc | Powered by WordPress | 京ICP备18007345号-2