通过 Karmada 分发 CRD
在本节中,我们将引导您完成以下内容:
- 安装 Karmada 控制平面。
- 将 CRD 分发到多个集群。
- 在特定集群中自定义 CRD。
启动 Karmada 集群
想要启动 Karmada,您可以参考安装概述.
如果您只想尝试 Karmada,请使用 hack/local-up-karmada.sh 构建开发环境.
git clone https://github.com/karmada-io/karmada
cd karmada
hack/local-up-karmada.sh
分发 CRD
下面的步骤指导您如何分发 CRD Guestbook。
假设您在 Karmada 仓库的 guestbook 目录下。
cd samples/guestbook
使用 Karmada 配置设置 KUBECONFIG 环境变量。
export KUBECONFIG=${HOME}/.kube/karmada.config
- 在 Karmada 的控制平 面上创建 Guestbook CRD
kubectl apply -f guestbooks-crd.yaml 
此 CRD 应该被应用到 karmada-apiserver。
- 创建 ClusterPropagationPolicy,将 Guestbook CRD 分发到 member1
kubectl apply -f guestbooks-clusterpropagationpolicy.yaml
# guestbooks-clusterpropagationpolicy.yaml
apiVersion: policy.karmada.io/v1alpha1
kind: ClusterPropagationPolicy
metadata:
  name: example-policy
spec:
  resourceSelectors:
    - apiVersion: apiextensions.k8s.io/v1
      kind: CustomResourceDefinition
      name: guestbooks.webapp.my.domain
  placement:
    clusterAffinity:
      clusterNames:
        - member1
根据 ClusterPropagationPolicy 中定义的规则,此 CRD 将分发到成员集群。
注意:在这里我们只能使用 ClusterPropagationPolicy 而不是 PropagationPolicy。 更多详细信息,请参考 FAQ PropagationPolicy and ClusterPropagationPolicy
- 在 Karmada 控制平面上创建名为 guestbook-sample的 Guestbook CR
kubectl apply -f guestbook.yaml
- 创建 PropagationPolicy,将 guestbook-sample分发到 member1
kubectl apply -f guestbooks-propagationpolicy.yaml
# guestbooks-propagationpolicy.yaml
apiVersion: policy.karmada.io/v1alpha1
kind: PropagationPolicy
metadata:
  name: example-policy
spec:
  resourceSelectors:
    - apiVersion: webapp.my.domain/v1
      kind: Guestbook
  placement:
    clusterAffinity:
      clusterNames:
        - member1
- 检查 Karmada 中 guestbook-sample的状态
kubectl get guestbook -oyaml
输出类似于以下内容:
apiVersion: webapp.my.domain/v1
kind: Guestbook
metadata:
  annotations:
    kubectl.kubernetes.io/last-applied-configuration: |
      {"apiVersion":"webapp.my.domain/v1","kind":"Guestbook","metadata":{"annotations":{},"name":"guestbook-sample","namespace":"default"},"spec":{"alias":"Name","configMapName":"test","size":2}}
  creationTimestamp: "2022-11-18T06:56:24Z"
  generation: 1
  labels:
    propagationpolicy.karmada.io/name: example-policy
    propagationpolicy.karmada.io/namespace: default
  name: guestbook-sample
  namespace: default
  resourceVersion: "682895"
  uid: 2f8eda5f-35ab-4ac3-bcd4-affcf36a9341
spec:
  alias: Name
  configMapName: test
  size: 2
自定义 CRD
- 创建 OverridePolicy,将覆盖 member1 中 guestbook-sample 的 size 字段。
kubectl apply -f guestbooks-overridepolicy.yaml
# guestbooks-overridepolicy.yaml
apiVersion: policy.karmada.io/v1alpha1
kind: OverridePolicy
metadata:
  name: guestbook-sample
spec: 
  resourceSelectors: 
  - apiVersion: webapp.my.domain/v1 
    kind: Guestbook
  overrideRules: 
  - targetCluster: 
      clusterNames:
      - member1
    overriders:
      plaintext:
      - path: /spec/size
        operator: replace
        value: 4
      - path: /metadata/annotations
        operator: add
        value: {"OverridePolicy":"test"}
- 检查来自成员集群的 guestbook-sample的 size 字段
kubectl --kubeconfig=${HOME}/.kube/members.config config use-context member1
kubectl --kubeconfig=${HOME}/.kube/members.config get guestbooks -o yaml
如果按预期工作,则 .spec.size 将被覆盖为 4:
apiVersion: webapp.my.domain/v1
kind: Guestbook
metadata:
  annotations:
    OverridePolicy: test
    kubectl.kubernetes.io/last-applied-configuration: |
      {"apiVersion":"webapp.my.domain/v1","kind":"Guestbook","metadata":{"annotations":{},"name":"guestbook-sample","namespace":"default"},"spec":{"alias":"Name","configMapName":"test","size":2}}
    resourcebinding.karmada.io/name: guestbook-sample-guestbook
    resourcebinding.karmada.io/namespace: default
    resourcetemplate.karmada.io/uid: 2f8eda5f-35ab-4ac3-bcd4-affcf36a9341
  creationTimestamp: "2022-11-18T06:56:37Z"
  generation: 2
  labels:
    propagationpolicy.karmada.io/name: example-policy
    propagationpolicy.karmada.io/namespace: default
    resourcebinding.karmada.io/key: 6849fdbd59
    work.karmada.io/name: guestbook-sample-6849fdbd59
    work.karmada.io/namespace: karmada-es-member1
  name: guestbook-sample
  namespace: default
  resourceVersion: "430024"
  uid: 8818e33d-10bf-4270-b3b9-585977425bc9
spec:
  alias: Name
  configMapName: test
  size: 4