KubeFed部署联邦应用

KubeFed通过定义CRD资源对Kubernetes资源进行联邦管理,如FederatedNamespace、FederatedDeployment等,下面创建一个联邦命名空间,将联邦Deployment资源部署至所有成员集群。

在主集群运行以下命令创建一个联邦命名空间go-demo。命名空间go-demo的编排如下所示。

$ cat go-demo-ns.yaml
apiVersion: v1
kind: Namespace
metadata:
  name: go-demo

使用kubefedctl federate命令,基于go-demo-ns.yaml生成federated-go-demo-ns.yaml。

$ kubefedctl federate -f go-demo-ns.yaml  > federated-go-demo-ns.yaml

查看并更新federated-go-demo-ns.yaml的内容。

$ cat federated-go-demo-ns.yaml
---
apiVersion: types.kubefed.io/v1beta1
kind: FederatedNamespace
metadata:
  name: go-demo
  namespace: go-demo
spec:
  placement:
    clusters:
    - name: cluster01
    - name: cluster02

用户也可以为指定的成员集群打标签,然后在FederatedNamespace资源的声明中使用clusterSelector过滤目标集群。使用以下命令为成员集群打标签federation-enabled=true。

$ kubectl -n kube-federation-system label kubefedclusters cluster01 federation-enabled=true
kubefedcluster.core.kubefed.io/cluster01 labeled

$ kubectl -n kube-federation-system label kubefedclusters cluster02 federation-enabled=true
kubefedcluster.core.kubefed.io/cluster02 labeled

编辑并更新federated-go-demo-ns.yaml的内容。

$ cat federated-go-demo-ns.yaml
---
apiVersion: types.kubefed.io/v1beta1
kind: FederatedNamespace
metadata:
  name: go-demo
  namespace: go-demo
spec:
  placement:
    clusterSelector:
      matchLabels:
        federation-enabled: "true"

创建联邦命名空间。

$ kubectl apply -f go-demo-ns.yaml -f federated-go-demo-ns.yaml
namespace/go-demo created
federatednamespace.types.kubefed.io/go-demo created

检查集群联邦中所有成员集群是否都已经成功创建命名空间go-demo。

$ for c in `kubectl config get-contexts --no-headers=true -o name`;
do echo ---- $c ----;kubectl get ns --context=$c |grep go-demo ; done
---- cluster01 ----
go-demo                    Active   2m1s
---- cluster02 ----
go-demo                    Active   85s

以同样的方式部署go-demo的Deployment和Service资源,在部署go-demo的联邦Deployment资源之前,我们想要在cluster01中部署go-demo的版本1,在cluster02中部署go-demo的版本2,那么federated-go-demo-deployment.yaml内容如下。

$ cat federated-go-demo-deployment.yaml
---
apiVersion: types.kubefed.io/v1beta1
kind: FederatedDeployment
metadata:
  name: go-demo
spec:
  placement:
    clusters:
      - name: cluster01
      - name: cluster02
  template:
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: go-demo
      template:
        metadata:
          labels:
            app: go-demo
        spec:
          containers:
          - image: registry.cn-hangzhou.aliyuncs.com/haoshuwei24/go-demo:v1
            imagePullPolicy: Always
            name: go-demo
            ports:
            - containerPort: 8080
  overrides:
    - clusterName: cluster02
      clusteroverrides:
        - path: "/spec/template/spec/containers/0/image"
          value: "registry.cn-hangzhou.aliyuncs.com/haoshuwei24/go-demo:v2"

部署go-demo并检查成员集群中是否都已成功部署。

$ kubectl -n go-demo apply -f federated-go-demo-deployment.yaml
federateddeployment.types.kubefed.io/go-demo created

$ for c in `kubectl config get-contexts --no-headers=true -o name`;
do echo ---- $c ----;kubectl -n go-demo get po --context=$c; done
---- cluster01 ----
NAME                       READY   STATUS               RESTARTS   AGE
go-demo-55cfc8d46d-vt4g9   1/1     Running   0          4m1s
---- cluster02 ----
NAME                       READY   STATUS    RESTARTS   AGE
go-demo-6bd5649445-7w7gr   1/1     Running   0          4m1s

以同样的方式部署federated-go-demo-service.yaml。

$ cat federated-go-demo-service.yaml
---
apiVersion: types.kubefed.io/v1beta1
kind: FederatedService
metadata:
  name: go-demo
spec:
  placement:
    clusters:
      - name: cluster01
      - name: cluster02
  template:
    spec:
      ports:
      - name: go-demo
        port: 80
        targetPort: 8080
      selector:
        app: go-demo
      type: ClusterIP

$ kubectl -n go-demo apply -f federated-go-demo-service.yaml
federatedservice.types.kubefed.io/go-demo created

分别访问cluster01和cluster02集群中的go-demo服务,验证联邦应用是否已按照我们的预期完成部署。首先在cluster01-master节点上访问go-demo的版本1。

$ kubectl -n go-demo get svc
NAME      TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)   AGE
go-demo   ClusterIP   10.96.173.8   <none>        80/TCP    20m
# curl 10.96.173.8
Version: v1

然后在cluster02-master节点上访问go-demo的版本2。

$ kubectl -n go-demo get svc
NAME      TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
go-demo   ClusterIP   10.96.177.180   <none>        80/TCP    92s
$ curl 10.96.177.180
Version: v2

posted @ 2023-01-25 11:37  muzinan110  阅读(134)  评论(0编辑  收藏  举报