在Azure上部署Kamaji多租户Kubernetes管理平台
前言
Kamaji是一个创新的Kubernetes管理平台,它允许你在单个管理集群上运行多个租户集群的控制平面。本文将详细介绍如何在Microsoft Azure云平台上部署Kamaji,并创建完整的租户Kubernetes集群。
准备工作
环境要求
在开始之前,请确保准备好以下资源:
- 引导机器:用于执行部署操作的本地或云主机
- 管理集群:运行Kamaji和租户控制平面的AKS集群
- 工作节点:运行租户工作负载的虚拟机
工具安装
引导机器上需要安装以下工具:
- kubectl:Kubernetes命令行工具
- kubeadm:Kubernetes集群引导工具
- helm:Kubernetes包管理器
- jq:JSON处理工具
- Azure CLI:Azure命令行工具
Azure环境配置
登录Azure
首先使用Azure CLI登录你的订阅:
az account set --subscription "你的订阅名称"
az login
创建资源组和网络
设置环境变量并创建基础网络资源:
# 设置环境变量
export KAMAJI_RG="kamaji-rg"
export KAMAJI_REGION="eastus"
export KAMAJI_VNET_NAME="kamaji-vnet"
export KAMAJI_VNET_ADDRESS="10.0.0.0/16"
export KAMAJI_SUBNET_NAME="kamaji-subnet"
export KAMAJI_SUBNET_ADDRESS="10.0.0.0/24"
# 创建资源组
az group create --name $KAMAJI_RG --location $KAMAJI_REGION
# 创建虚拟网络和子网
az network vnet create \
--resource-group $KAMAJI_RG \
--name $KAMAJI_VNET_NAME \
--location $KAMAJI_REGION \
--address-prefix $KAMAJI_VNET_ADDRESS
az network vnet subnet create \
--resource-group $KAMAJI_RG \
--name $KAMAJI_SUBNET_NAME \
--vnet-name $KAMAJI_VNET_NAME \
--address-prefixes $KAMAJI_SUBNET_ADDRESS
创建管理集群
使用AKS作为Kamaji的管理集群:
# 获取子网ID
KAMAJI_SUBNET_ID=$(az network vnet subnet show \
--resource-group ${KAMAJI_RG} \
--vnet-name ${KAMAJI_VNET_NAME} \
--name ${KAMAJI_SUBNET_NAME} \
--query id --output tsv)
# 创建AKS集群
az aks create \
--resource-group $KAMAJI_RG \
--name kamaji-cluster \
--location $KAMAJI_REGION \
--vnet-subnet-id $KAMAJI_SUBNET_ID \
--zones 1 2 3 \
--node-count 3 \
--nodepool-name kamaji-nodepool
获取集群凭证并验证连接:
az aks get-credentials --resource-group $KAMAJI_RG --name kamaji-cluster
kubectl cluster-info
安装Kamaji
安装Cert Manager
Kamaji依赖Cert Manager进行证书管理:
kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.10.1/cert-manager.yaml
安装Kamaji控制器
使用Helm安装Kamaji:
helm repo add clastix https://clastix.github.io/charts
helm install kamaji clastix/kamaji -n kamaji-system --create-namespace
创建租户集群
配置租户控制平面
创建租户控制平面的YAML配置文件:
apiVersion: kamaji.clastix.io/v1alpha1
kind: TenantControlPlane
metadata:
name: tenant-01
namespace: tenant-01
spec:
dataStore: default
controlPlane:
deployment:
replicas: 3
service:
serviceType: LoadBalancer
annotations:
service.beta.kubernetes.io/azure-load-balancer-internal: "true"
kubernetes:
version: v1.25.0
kubelet:
cgroupfs: systemd
networkProfile:
port: 6443
serviceCidr: 10.96.0.0/12
podCidr: 192.168.0.0/16
dnsServiceIPs:
- 10.96.0.10
应用配置创建租户控制平面:
kubectl apply -f tenant-controlplane.yaml
配置外部访问
为租户控制平面创建外部负载均衡器:
apiVersion: v1
kind: Service
metadata:
name: tenant-01-public
namespace: tenant-01
annotations:
service.beta.kubernetes.io/azure-dns-label-name: tenant-01
spec:
ports:
- port: 443
protocol: TCP
targetPort: 6443
selector:
kamaji.clastix.io/name: tenant-01
type: LoadBalancer
获取租户kubeconfig
kubectl get secrets -n tenant-01 tenant-01-admin-kubeconfig -o json \
| jq -r '.data["admin.conf"]' \
| base64 --decode \
> tenant-01.kubeconfig
kubectl --kubeconfig=tenant-01.kubeconfig config \
set-cluster tenant-01 \
--server https://tenant-01.eastus.cloudapp.azure.com
添加工作节点
创建虚拟机规模集
az network vnet subnet create \
--resource-group $KAMAJI_RG \
--name tenant-subnet \
--vnet-name $KAMAJI_VNET_NAME \
--address-prefixes 10.0.1.0/24
az vmss create \
--name tenant-workers \
--resource-group $KAMAJI_RG \
--image UbuntuLTS \
--vnet-name $KAMAJI_VNET_NAME \
--subnet tenant-subnet \
--computer-name-prefix tenant- \
--load-balancer "" \
--instance-count 3
准备节点加入
获取加入命令:
TENANT_ADDR=$(kubectl -n tenant-01 get svc tenant-01 -o json | jq -r ."spec.loadBalancerIP")
JOIN_CMD=$(echo "sudo kubeadm join ${TENANT_ADDR}:6443 ")$(kubeadm --kubeconfig=tenant-01.kubeconfig token create --print-join-command |cut -d" " -f4-)
在所有工作节点上执行加入命令:
VMIDS=($(az vmss list-instances --resource-group $KAMAJI_RG --name tenant-workers --query [].instanceId --output tsv))
for VMID in ${VMIDS[@]}; do
az vmss run-command create \
--name join-tenant-control-plane \
--vmss-name tenant-workers \
--resource-group $KAMAJI_RG \
--instance-id ${VMID} \
--script "${JOIN_CMD}"
done
安装网络插件
部署Calico网络插件:
curl https://raw.githubusercontent.com/projectcalico/calico/v3.24.1/manifests/calico.yaml -O
# 修改calico.yaml中的以下配置:
# CLUSTER_TYPE="k8s"
# CALICO_IPV4POOL_IPIP="Never"
# CALICO_IPV4POOL_VXLAN="Always"
kubectl --kubeconfig=tenant-01.kubeconfig apply -f calico.yaml
清理资源
完成测试后,可以删除整个资源组:
az group delete --name $KAMAJI_RG --yes --no-wait
总结
通过本文,我们完成了在Azure上部署Kamaji多租户Kubernetes管理平台的全过程。Kamaji的创新架构允许你在单个管理集群上运行多个租户集群的控制平面,显著降低了资源消耗和管理复杂度。这种方案特别适合需要运行多个独立Kubernetes集群的中大型企业或云服务提供商。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



