#!/usr/bin/env bash
# 文件: k8s-master-init.sh

source $(realpath -m .)/.vars.conf

set -o pipefail

# 调整IPVS HASH表条目数
if [[ "${cluster_proxy_mode}" == "ipvs" ]]
then
    echo "options ip_vs conn_tab_bits=${ipvs_conn_table_bit}" > /etc/modprobe.d/ipvs.conf 
    ipvsadm -C && rmmod ip_vs_rr ip_vs_sh ip_vs_wrr ip_vs
fi

# 根据安装类型判断镜像仓库地址
if [[ "${offline}" == "true" ]]
then
    export image_registry="${image_hub}/base-platform"
    export google_image_registry="${image_registry}"
else
    export image_registry="registry.cn-shenzhen.aliyuncs.com/shuhui"
    export google_image_registry="registry.cn-hangzhou.aliyuncs.com/google_containers"
fi

# 创建YAML安装目录
[[ -d ${install_dir} ]] || install -d ${install_dir}

# 判断是否存在集群,不存在创建开始初始化
kubectl get node >/dev/null 2>/dev/null

if [[ "$?" -ne "0" ]]
then
    # 渲染 YAML 配置文件
    for yaml in kubeadm-init.yaml calico.yaml metrics-server.yaml local-path-provisioner.yaml
    do
        envsubst < $(realpath -m .)/yamls/${yaml} >${install_dir}/${yaml}
    done
    
    # 初始化集群
    printf "$info: Kubernetes集群初始化中..." && kubeadm init --config ${install_dir}/kubeadm-init.yaml --ignore-preflight-errors=Swap --upload-certs > /tmp/kubeadm-init.log 2>/tmp/kubeadm-init.log
    if [[ "$?" -eq "0" ]]; then
        printf " | ${bldgre}√${txtrst}\n"
    else
        printf " | ${bldred}×${txtrst}\n"
        exit 67
    fi
    
    # 复制凭证
    mkdir -p $HOME/.kube
    cp -rf /etc/kubernetes/admin.conf $HOME/.kube/config
    
    source <(kubectl completion bash)
    kubectl completion bash > /etc/bash_completion.d/kubectl
    
    # 是否去除master污点
    if [[ "${master_node_tainted}" == "false" ]]
    then
        printf "$info: 移除master节点污点配置... | ${bldgre}√${txtrst}\n"
        kubectl taint nodes --all node-role.kubernetes.io/master- >/dev/null 2>/dev/null
    fi

    # 延长集群证书周期
    bash scripts/update-kubeadm-cert.sh all >/dev/null  2>/dev/null
    
    printf "$info: 创建集群网络插件...\n"             && kubectl -n kube-system apply -f ${install_dir}/calico.yaml >/dev/null
    printf "$info: 创建监控指标资源...\n"             && kubectl -n kube-system apply -f ${install_dir}/metrics-server.yaml >/dev/null
    printf "$info: 创建local-path StorageClass...\n"  && kubectl -n kube-system apply -f ${install_dir}/local-path-provisioner.yaml >/dev/null

else
    printf "$err: 集群已存在,无需创建...\n"
    exit 67
fi
