编辑推荐: |
本文主要介绍了如何使用 K8s 实现跨集群管理:背景、安装、集群操作及跨集群同步资源。
本文来自于微信公众号高效运维,由Linda编辑、推荐。 |
|
一、背景
集群联邦(Federation)的目的是实现单一集群统一管理多个Kubernetes集群的机制,这些集群可能是跨地区(Region),也可能是在不同公有云供应商上,或者是公司内部自行建立的集群。
一但集群进行联邦后,就可以利用 Federation API资源来统一管理多个集群的Kubernetes
API资源,如定义Deployment如何部署到不同集群上,其集群所需的副本数等。
通过集群联邦,我们可以:
简化管理多个集群的Kubernetes 组件,如Deployment, Service 等
在多个集群之间分散工作负载,以提升应用的可靠性
跨集群的资源编排,依据编排策略在多个集群进行应用部署
在不同集群中,能更快速更容易地迁移应用
跨集群的服务发现,服务可以实现地理位置感知,以降低延迟(不一定必须用kubefed实现)
实践多云(Multi-cloud)或混合云(Hybird Cloud)的部署
使用场景
跨集群同步资源:正如您所料,同步资源是那些部署联合或分布式Kubernetes集群的人面临的核心挑战。Kubernetes中的机制可以自动同步运行在本地或远程系统,云而非云上的多个集群上的部署。
跨集群服务发现:这解决了自动配置DNS服务器和负载均衡器的功能。
这篇文章主要记录跨集群资源同步的内容,跨集群服务发现的开新的文章记录。
二、安装
Federation v2 的安装分两个部分,一是 Controller Plan 和 kubefedctl。其中
Controller Plan是基于 helm 安装的,所以我们先安装helm。
helm 安装
可自行查找文档安装。
Controller Plan
Controller Plan 可以使用 Helm 部署(目前 Helm 还是使用 v2 版本),参考官方安装文档:https://github.com/kubernetes-sigs/kubefed/blob/master/charts/kubefed/README.md
添加源
$ helm repo
add kubefed-charts https://raw.githubusercontent.com/kubernetes-sigs/kubefed/master/charts |
搜索
$ helm search
repo kubefed |
安装
$
helm --namespace kube-federation-system upgrade
-i kubefed kubefed-charts/kubefed --version=0.6.1
--create-namespace
Release "kubefed"
does not exist. Installing it now.
NAME: kubefed
LAST DEPLOYED: Wed Aug 5 16:03:46
2020
NAMESPACE: kube-federation-system
STATUS: deployed
REVISION: 1
TEST SUITE: None |
kubefedctl
kubefedctl 是一个二进制程序,可以在 Github 的 Release 页面找到最新版本的下载地址:https://github.com/kubernetes-sigs/kubefed/releases
$ wget https://github.com/kubernetes-sigs/kubefed/releases/download/v0.6.1/kubefedctl-0.6.1-linux-amd64.tgz
$ tar -zxvf kubefedctl-0.6.1-linux-amd64.tgz
$ mv kubefedctl /usr/local/bin/ |
三、集群操作
在主集群上设置从集群context信息
参考我先前的文章 《kubernetes switch context》
kubectl
config get-contexts
kubectl config use-context
n1
kubectl config use-context
context-cluster1-admin |
从集群加入主集群
基本使用方式为:
kubefedctl join
<集群名称CLUSTER> --cluster-context <要接入集群的
context NAME> --host-cluster-context <HOST
集群的 context name> |
例如:
kubefedctl
join n1 --cluster-context n1 --host-cluster-context
context-cluster1-admin --v=2
kubefedctl join n2 --cluster-context
n2 --host-cluster-context context-cluster1-admin
--v=2 |
从集群解绑
kubefedctl unjoin
n2 --cluster-context n2 --host-cluster-context
context-cluster1-admin --v=2
|
获得集群信息
Kubefed 是利用 CRD 来存储自己所需要的数据,因此当使用 kubefedctl join
后,可以在 host cluster 查看到集群信息:
$ kubectl -n
kube-federation-system get kubefedclusters |
kubefedctl join 命令只是将 Kubeconfig 里的配置转化为 KubeFedCluster
自定义资源存储到 kube-federation-system 命名空间中。
kubectl -n kube-federation-system
get kubefedclusters -oyaml n1 |
四、跨集群同步资源
启用资源联邦化
对于 KubeFed 来说,资源管理分两类,一是资源的类型管理,另一个是被联邦(federated)的资源管理。
对于资源类型,kubefedctl 提供了 enable 来使新的资源可以被联邦管理:
kubefedctl enable
<target kubernetes API type> |
其中可以使用以下的描述:
类型,即 Kind (比如 Deployment)
复数名词 (比如 deployments)
带 api group 的复数资源名词 (比如 deployment.apps)
缩写 (比如 deploy)
因为 Kubefed 是通过 CRD 管理资源,因此,当 enable 执行之后可以看到 Host
Cluster 中新增了一种名为 federatedvirtualservices 的 CRD:
$ kubectl get
crd | grep federated
|
默认已启用的联邦资源:
也可以对自定义CRD资源启用联邦。kubefedctl enable 完成了资源类型的管理,对于需要被联邦的资源管理编辑基于新创建的
CRD 展开的。
不过要部署资源之前,需要先创建 federatednamespaces ,多集群的资源只会部署到被
kubefed 管理的 namespace 中。
资源操作示例
使用官方的demo,可以快速体验示例:https://github.com/kubernetes-sigs/kubefed/tree/master/example/sample1
创建ns
kubectl apply
-f example/sample1/namespace.yaml -f example/sample1/federatednamespace.yaml
|
创建测试资源
kubectl apply
-R -f example/sample1
|
注意,官方特地留了一个资源让我们手动enable,运行上面命令后会出现如下提示:
unable to recognize
"example/sample1/federated<type>.yaml":
no matches for kind "Federated<type>"
in version "types.kubefed.io/v1beta1",
|
需要对ClusterRoleBinding 类型启用联邦化。
kubefedctl enable
ClusterRoleBinding |
kubectl apply
-R -f example/sample1 |
最后在n1 n2集群上运行结果如下:
确认正常运行:
常用命令备忘
helm list --all-namespaces
// 安装集群
helm --namespace kube-federation-system-666
upgrade -i kubefed kubefed --version=0.3.0 --create-namespace
kubefedctl join <cluster name> --cluster-context
<context name> --host-cluster-context
<context name> --v=2
// context
kubectl config get-contexts
kubectl config use-context n1
kubectl config use-context context-cluster1-admin
// get cluster
kubectl -n kube-federation-system get kubefedclusters
// 获得集群信息
kubectl api-resources | grep kubefed // 查看集群得api信息
$ helm --namespace kube-federation-system upgrade
-i kubefed kubefed-charts/kubefed --version=0.6.1
--create-namespace
kubefedctl unjoin n1 --cluster-context n1 --host-cluster-context
m1 --v=2
kubectl config get-contexts
// 卸载集群
kubectl -n kube-federation-system delete FederatedTypeConfig
--all
helm --namespace kube-federation-system uninstall
kubefed |
|