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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)