#!/bin/bash source ./common.sh echo "[INFO] === 初始化 Master 节点 ===" cat < kubeadm-config.yaml apiVersion: kubeadm.k8s.io/v1beta3 kind: ClusterConfiguration kubernetesVersion: v{{ cluster.kubernetes_version }} controlPlaneEndpoint: "{{ cluster.api_server_ip }}:6443" networking: podSubnet: "{{ cluster.pod_cidr }}" serviceSubnet: "{{ cluster.service_cidr }}" imageRepository: {{ registry.ip }}:{{ registry.port }} --- apiVersion: kubelet.config.k8s.io/v1beta1 kind: KubeletConfiguration cgroupDriver: systemd CFG # 预先检查 kubeadm init phase preflight --config kubeadm-config.yaml --ignore-preflight-errors=all # 正式初始化 # 注意:因为我们已经手动导入了镜像,不需要 kubeadm pull kubeadm init --config kubeadm-config.yaml --upload-certs | tee kubeadm-init.log mkdir -p $HOME/.kube cp -i /etc/kubernetes/admin.conf $HOME/.kube/config chown $(id -u):$(id -g) $HOME/.kube/config echo "[INFO] 部署网络插件 (Calico)..." kubectl apply -f "$BUNDLE_ROOT/manifests/calico.yaml" NAMESPACE="default" LOCAL_REGISTRY="{{ registry.ip }}:{{ registry.port }}" echo "[INFO] 5. 导入离线镜像..." if [ -d "$IMAGES_DIR" ]; then for tarfile in "$IMAGE_DIR"/*.tar; do [ -e "$tarfile" ] || continue echo "" echo ">>> Processing $tarfile" # 1️⃣ 导入镜像 ctr -n "$NAMESPACE" images import "$tarfile" # 2️⃣ 获取最新导入镜像(兼容老版本 ctr) ORIGIN_IMG=$(ctr -n "$NAMESPACE" images ls -q | head -n1) if [[ -z "$ORIGIN_IMG" ]]; then echo "❌ Failed to detect original image name, skipping..." continue fi echo "Original image: $ORIGIN_IMG" # 3️⃣ 根据 tar 文件名生成本地 registry 镜像名 # 文件名示例:docker.io_calico_cni_v3.26.1.tar BASENAME=$(basename "$tarfile" .tar) BASENAME=${BASENAME#*_} # 去掉 registry 前缀: calico_cni_v3.26.1 NAME_TAG=${BASENAME} NAME=${NAME_TAG%_*} # calico_cni TAG=${NAME_TAG##*_} # v3.26.1 NEW_IMG="${LOCAL_REGISTRY}/${NAME}:${TAG}" echo "Retag as: $NEW_IMG" # 4️⃣ 打 tag ctr -n "$NAMESPACE" images tag "$ORIGIN_IMG" "$NEW_IMG" # 5️⃣ 推送到本地 registry ctr -n "$NAMESPACE" images push --plain-http "$NEW_IMG" echo "✅ Done: $NEW_IMG" done fi echo "[INFO] 部署本地 Registry 容器..." mkdir -p /opt/registry-data ctr images import $IMAGES_DIR/registry_2.tar ctr container create \ --net-host \ --mount type=bind,src=/opt/registry-data,dst=/var/lib/registry,options=rbind:rw \ docker.io/library/registry:2 \ registry-local nohup ctr task start registry-local & echo "[INFO] 部署 Storage & Virtualization..." # 安装 Helm cp "$BUNDLE_ROOT/bin/helm" /usr/local/bin/ # NFS "$BUNDLE_ROOT/bin/helm" install nfs-subdir-provisioner "$BUNDLE_ROOT/charts/nfs-subdir-external-provisioner" \ --set nfs.server={{ storage.nfs_server }} \ --set nfs.path={{ storage.nfs_path }} \ --set storageClass.defaultClass=true # KubeVirt kubectl apply -f "$BUNDLE_ROOT/manifests/kubevirt-operator.yaml" kubectl apply -f "$BUNDLE_ROOT/manifests/kubevirt-cr.yaml" # Multus kubectl apply -f "$BUNDLE_ROOT/manifests/multus-daemonset.yaml" echo "[INFO] 生成 Worker 加入脚本..." kubeadm token create --print-join-command > ../../output/join_cluster.sh chmod +x ../../output/join_cluster.sh echo "Master 部署完成!请检查 kubectl get nodes"