环境配置
集群:
ClusterA
ClusterB
其中ClusterA作为Host集群;
两个集群均为虚拟机创建的实体集群,并非kind创建的模拟集群。
两个集群的master节点网络可达(可以互相ping通)
集群配置:
ClusterA Karmada v1.31 Kubernetes v1.25.0
ClusterB Kubernetes v1.25.0
集群配置文件
Kubernetes的集群配置文件一般在$HOME/.kube/config
这里给出一个config文件的示例:
apiVersion: v1
clusters:
- cluster:
certificate-authority-data: certificate-code
server: ServerIP:ServerPort
name: cluster-name
contexts:
- context:
cluster: cluster-name
user: user-name
name: context-name
current-context: current-context-name
kind: Config
preferences: {}
users:
- name: user-name
user:
client-certificate-data: client-certificate-code
tvwklodmiclient-key-data: client-key-code
config主要分为几个部分:
apiVersion : 也就是api的版本,不用管
clusters:集群部分,此字段下用于记录集群的配置部分,如果有多个集群,此处应该有多个 -cluster 的配置信息。
-cluster:此字段下是一个集群的配置信息,其中包括认证方式、服务地址以及集群名字。认证方式有很多种,其中包括token、证书等,此示例中所演示的 certificate-authority-data 代表的是证书的认证方式。certifacate-code 是具体的数据。server指代的是集群的apiserver的地址和端口。name是集群的名字。
contexts:上下文部分。此字段下用于记录集群的上下文配置内容,同理,如果有多个集群,此处应该有多个 -context 的配置信息。
-context:此字段下是一个集群的上下文配置信息,其中包括集群名字,用户以及上下文的名字。集群名字主要是用于和上文的集群进行匹配,用户名字用于指定此上下文的拥有者,上下文名字用于标识此上下文,同时也是在切换上下文时使用的名字。
current-context:用于标识当前所在的上下文,其值就是配置中的上下文名字中的一个。
preference:首选项,暂时用不到。
users: 客户端认证的具体配置。如果有多个集群,此处也会有多个条目。
-name:此处应该是context中的user name,用于和context匹配,此时便完成了cluster-context-user的匹配。
user:此部分内容是认证文件的具体内容,如果是证数,此处便是证数的内容,如果是token,此处便是token的内容。
多集群的连接
此时你应该拥有两个集群的配置文件, 可以通过手动复制或者scp的方式将配置文件复制到想要配置的集群中,这里假设已经将ClusterB的配置文件复制到了集群A中,并重命名。clusterA和clusterB的文件目录如下:
$HOME/.kube/configA
$HOME/.kube/configB
执行以下命令自动合并文件:
cd $HOME/.kube/config
KUBECONFIG=config1:config2 kubectl config view --flatten > $HOME/.kube/config
或者手动更改config文件
gedit $HOME/.kube/config
根据前文所述,将对应的字段,填写到对应的位置即可,需要填写的内容有:
-cluster:
-contex:
-name:
user:
配置完成后,config文件大概长这样:
apiVersion: v1
clusters:
- cluster:
certificate-authority-data: certificate-codeA
server: ServerIPA:ServerPortA
name: cluster-nameA
- cluster:
certificate-authority-data: certificate-codeB
server: ServerIPB:ServerPortB
name: cluster-nameB
contexts:
- context:
cluster: cluster-nameA
user: user-nameA
name: context-nameA
- context:
cluster: cluster-nameB
user: user-nameB
name: context-nameB
current-context: current-context-nameB
kind: Config
preferences: {}
users:
- name: user-nameA
user:
client-certificate-data: client-certificate-codeA
tvwklodmiclient-key-data: client-key-codeA
- name: user-nameB
user:
client-certificate-data: client-certificate-codeB
tvwklodmiclient-key-data: client-key-codeB
需要注意,每个集群的名字和上下文的名字不要重名。名字都可以自己修改。
查看集群:
kubectl config get-clusters
查看上下文:
kubectl config get-contexts
查看当前上下文:
kubectl config current-context
切换上下文:
kubectl config use-context context-name
Host集群安装Karmada
加入Karmada集群
以v1.3.2版本为例,
wget https://github.com/karmada-io/karmada/releases/download/v1.3.2/kubectl-karmada-linux-amd64.tgz
tar -zxf kubectl-karmada-linux-amd64.tgz
sudo chmod +x ./kubectl-karmada
sudo mv ./kubectl-karmada /usr/local/bin
验证安装:
kubectl karmada version
输出示例,
kubectl karmada version: version.Info{GitVersion:"v1.3.2", GitCommit:"1fe31b182a6d251e09528530ec51de8adb42d202", GitTreeState:"clean", BuildDate:"2022-11-24T09:34:36Z", GoVersion:"go1.18.3", Compiler:"gc", Platform:"linux/amd64"}
执行安装:
国内环境镜像比较难获取,建议指定镜像:
镜像的版本可查看karmada github 源码中相应的yaml文件来获取。
kubectl karmada init --etcd-image registry.aliyuncs.com/google_containers/etcd:3.5.4-0 --karmada-apiserver-image registry.aliyuncs.com/google_containers/kube-apiserver:v1.25.2 --karmada-kube-controller-manager-image registry.aliyuncs.com/google_containers/kube-controller-manager:v1.25.2
前提条件:
Host集群的config已经配置好,集群已经连接。
context-name只能由字母、数字 和 - 组成,不能包含其他字符,开头和结尾只能是字母和数字,例如 cluster1context、123-abc等
Host集群已经安装Karmada
Push模式
执行以下命令将集群加入Karmada:
kubectl karmada --kubeconfig /etc/karmada/karmada-apiserver.config join context-name --cluster-kubeconfig=$HOME/.kube/config
context-name替换成需要加入的集群的上下文名字。
其他的路径分别是karmada的配置文件的路径以及kubernetes的配置文件的路径,也就是上文配置的config的文件,一般情况下不用更改。
出现以下显示加入成功(此处加入的上下文名字是cluster3-context):
查看已经加入的集群:
kubectl --kubeconfig /etc/karmada/karmada-apiserver.config get clusters
Pull模式:
要求:
Member集群可以访问到Host集群,Host集群和Member集群都已经安装Karmada。
Pull模式并不需要配置多集群的连接部分内容。
载host的karmada控制平面,获取token以及加入命令。
kubectl karmada token create --print-register-command --kubeconfig /etc/karmada/karmada-apiserver.config
注意,这里获取命令的方式有多种,上述命令的Karmada是通过kubectl-karmada插件安装的,安装时执行的命令是kubectl karmada init。
如果是通过karmadactl init方式安装的,则相应的执行下列命令
karmadactl token create --print-register-command --kubeconfig /etc/karmada/karmada-apiserver.config
将获取的命令在Member集群中执行:
执行完成后,在Host集群中进行查看:
kubectl --kubeconfig /etc/karmada/karmada-apiserver.config get clusters
报错修改:
/etc/karmada/pki/ca.crt already exists
找到对应的路径,删除文件。