#!/usr/bin/env bash
# 文件: k8s-1.23.17-install.sh
# 功能: 快速安装Kubernetes集群

# 终端颜色定义
txtbld=$(tput bold)             # Bold
bldred=${txtbld}$(tput setaf 1) # red
bldgre=${txtbld}$(tput setaf 2) # green
bldylw=${txtbld}$(tput setaf 3) # yellow
txtrst=$(tput sgr0)             # Reset
err=${bldred}ERROR${txtrst}
info=${bldgre}INFO${txtrst}
warn=${bldylw}WARNING${txtrst}

k8s_version=1.23.17
k8s_image_repository="registry.aliyuncs.com/google_containers"
k8s_api_domain="kube-api.gitee.local"
k8s_api_port=6443
node_port_range="1-65535"
etcd_data_dir=/data/etcd
pod_cidr="10.244.0.0/16"
svc_cidr="100.88.48.0/22"
cluster_proxy_mode=ipvs
k8s_api_vip="169.254.88.48"
cluster_cert_token="5oh4an.lgojdqqcmb8nbjsv"
master_node_tainted=false
install_dir=/usr/local/src
local_addr=$(hostname -i)
helm_pkg_url=http://dl.vqiu.cn/package/helm/helm-v3.11.3-linux-amd64.tar.gz

grep "${k8s_api_domain}" /etc/hosts >/dev/null
if [[ "$?" -ne "0" ]]
then
    echo "1.1.1.1  ${k8s_api_domain}" >> /etc/hosts
    sed -i "s/1.1.1.1/${local_addr}/" /etc/hosts
fi

test -e kubernetes-1.23-include-docker-rhel7.amd64.run || wget "http://su.bcebos.com/gitee-suzhou/qiush/kubernetes-1.23-include-docker-rhel7.amd64.run?authorization=bce-auth-v1%2Fe731f3de4eda45308412c57e6f1225f7%2F2024-04-02T16%3A14%3A52Z%2F-1%2F%2F330faf01d154bcf98972977caec6b7b8aef5027d729014e43f4696a68c9188fd" -O ${install_dir}/kubernetes-1.23-include-docker-rhel7.amd64.run

printf "$info: 安装Kubernetes & Docker... | ${bldgre}√${txtrst}\n"
bash ${install_dir}/kubernetes-1.23-include-docker-rhel7.amd64.run >/dev/null 2>/dev/null

cat > /tmp/kubeadm-init.yaml<<EOF
apiVersion: kubeadm.k8s.io/v1beta2
kind: ClusterConfiguration
kubernetesVersion: ${k8s_version}
imageRepository: "${k8s_image_repository}"
controlPlaneEndpoint: "${k8s_api_domain}:${k8s_api_port}"
apiServer:
  extraArgs:
    service-node-port-range: "${node_port_range}"
#  certSANs:
#  - ${k8s_api_domain}
#  - ${k8s_api_vip}
etcd:
  local:
    dataDir: "${etcd_data_dir}"
    extraArgs:
      quota-backend-bytes: "8589934592"
      auto-compaction-retention: "24h"
      auto-compaction-mode: "periodic"

networking:
  serviceSubnet: "${svc_cidr}"
  podSubnet: "${pod_cidr}"

---

apiVersion: kubeadm.k8s.io/v1beta2
kind: InitConfiguration
bootstrapTokens:
- token: "${cluster_cert_token}"
  description: "default kubeadm bootstrap token"
  ttl: "24h"
#localAPIEndpoint:
#  advertiseAddress: 192.168.96.151
#  bindPort: 6443
#nodeRegistration:
#  criSocket: /run/containerd/containerd.sock
#  taints:
#  - effect: PreferNoSchedule
#    key: node-role.kubernetes.io/master

---

apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
cgroupDriver: systemd
failSwapOn: false

---

apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: ${cluster_proxy_mode}
ipvs:
  excludeCIDRs:
  - ${k8s_api_vip}/32
EOF

printf "$info: Kubernetes集群初始化中... | " && kubeadm init --config /tmp/kubeadm-init.yaml --ignore-preflight-errors=Swap --upload-certs > /tmp/kubeadm-init.log 2>/tmp/kubeadm-init.log && printf "${bldgre}√${txtrst}\n"

# 复制凭证
mkdir -p $HOME/.kube
cp -rf /etc/kubernetes/admin.conf $HOME/.kube/config

cat >/etc/profile.d/kubectl.sh<<EOF
alias k=kubectl
source <(kubectl completion bash | sed s/kubectl/k/g)
alias kcd='kubectl config set-context $(kubectl config current-context) --namespace'
KUBE_EDITOR=/usr/bin/vim
EOF

# 是否去除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

# 安装插件
kubectl apply -f http://dl.vqiu.cn/yaml/calico/calico-v3.24.6.yaml >/dev/null &&  printf "$info: 安装calico网络插件... | ${bldgre}√${txtrst}\n"
kubectl apply -f http://dl.vqiu.cn/yaml/metrics-server/metrics-server-v0.6.2.yaml >/dev/null && printf "$info: 安装metrics插件... | ${bldgre}√${txtrst}\n"
kubectl apply -f http://dl.vqiu.cn/yaml/local-path-provisioner.yaml >/dev/null && printf "$info: 安装local-path插件... | ${bldgre}√${txtrst}\n"

# 安装Helm
if [[ ! -e /usr/bin/helm ]]
then
    wget ${helm_pkg_url} -O ${install_dir}/${helm_pkg_url##*/} >/dev/null 2>/dev/null
    if [[ "$?" -eq "0" ]]
    then
        tar axvf ${install_dir}/${helm_pkg_url##*/} -C /usr/bin >/dev/null 2>/dev/null
        chmod +x /usr/bin/helm
    
        printf "$info: 安装helm... | ${bldgre}√${txtrst}\n"
    else
        printf "$err: 安装helm... | ${bldgre}x${txtrst}\n"
        exit 67
    fi
fi
