微服务模式:部署NC Cloud进行资源池主机接入脚本intall_agent.sh内容详解

已邀请:

#!/bin/sh
# status 0代表正常执行环节,-1代表执行环节失败,脚本退出,1代表所有环节完成,脚本退出

function select_ip()
{
local ip_str=$(ip add | grep inet | grep -v inet6 |grep -E -v "127.0.0.1|172.17.0.1|0.0.0.0" | awk '{print $2}' | cut -d "/" -f 1)
local ip_array=($ip_str)

local ip_count=${#ip_array[@]}

if [ $ip_count -le 1 ]
then
local ip=$ip_str
else
let local n=1;
for item in ${ip_array[*]}
do
echo " ${n}) - $item"
let n=$n+1
done

echo -n "Please select an ip addreess for the agent, please input number [1-$ip_count]: "

while read num
do
if [[ "$num" =~ ^[1-9]+$ ]]; then
# if [[ "$num" =~ ^[1-2]+$ ]]
if [ $num -le $ip_count -a $num -ge 1 ]
then
local ip=${ip_array[$num-1]}
break;
else
echo "Wrong input '$num'."
echo -n "Choose ip address to use, please input number [1-$ip_count]: "
fi
else
echo "Wrong input '$num'."
echo -n "Choose an ip address for agent, please input number [1-$ip_count]: "
fi
done
fi
selected_ip_address=$ip
}

# 安装部署node信息采集
function promenode(){
curl $base_url/download/prome/node-exporter-install.sh -o /tmp/node-exporter-install.sh && bash /tmp/node-exporter-install.sh $base_url $selected_ip_address $CONSUL_SERVER
}

# 安装部署cadvisor容器信息采集
function promeadvisor(){
curl $base_url/download/prome/cadvisor-exporter-install.sh -o /tmp/cadvisor-exporter-install.sh && bash /tmp/cadvisor-exporter-install.sh $base_url $selected_ip_address $CONSUL_SERVER
}
# 向k8s集群添加主机节点
function addK8sNode(){
curl -sS ${base_url}/download/k8s/node-installer.tar.gz -o /tmp/node-installer.tar.gz
tar -xzvf /tmp/node-installer.tar.gz -C /tmp/

k8s_domain=`curl -sS ${base_url}/res-pool-manager/v1/resource_env/api?poolid=$poolid`
getca_url=${service_url}"/v1/resource_nodes/getca?baseapi="${k8s_domain}"&type="
ca=`curl -sS ${getca_url}ca`
clientcrt=`curl -sS ${getca_url}client_crt`
clientkey=`curl -sS ${getca_url}client_key`
token=`curl -sS ${getca_url}token`

baseapi=https://${k8s_domain}:8443
typeset -l ip_l=$selected_ip_address
sed -i "s#%ip%#$ip_l#g" /tmp/node-installer/etc/kubernetes/kubelet
sed -i "s#%ip%#$ip_l#g" /tmp/node-installer/etc/kubernetes/proxy
sed -i "s#%baseapi%#$baseapi#g" /tmp/node-installer/etc/kubernetes/kubelet.kubeconfig
sed -i "s#%ca%#$ca#g" /tmp/node-installer/etc/kubernetes/kubelet.kubeconfig
sed -i "s#%clientcrt%#$clientcrt#g" /tmp/node-installer/etc/kubernetes/kubelet.kubeconfig
sed -i "s#%clientkey%#$clientkey#g" /tmp/node-installer/etc/kubernetes/kubelet.kubeconfig
sed -i "s#%clientcrt%#$clientcrt#g" /tmp/node-installer/etc/kubernetes/kube-proxy.kubeconfig
sed -i "s#%clientkey%#$clientkey#g" /tmp/node-installer/etc/kubernetes/kube-proxy.kubeconfig
sed -i "s#%baseapi%#$baseapi#g" /tmp/node-installer/etc/kubernetes/kube-proxy.kubeconfig
sed -i "s#%ca%#$ca#g" /tmp/node-installer/etc/kubernetes/kube-proxy.kubeconfig
cp -f /tmp/node-installer/bin/* /usr/bin/
cp -rf /tmp/node-installer/etc/* /etc/
cp -f /tmp/node-installer/services/* /usr/lib/systemd/system/

yum -y install conntrack

curl -X POST -d @- $service_url/v1/resource_message/addmessage <<EOF
{
"userid":"$userid",
"authid":"$authid",
"status":0,
"hostname":"$selected_ip_address",
"message":"正在启动服务"
}
EOF

chmod +x /usr/bin/kube*
mkdir -p /var/lib/kubelet
mkdir -p /var/lib/kube-proxy
systemctl enable kubelet
systemctl restart kubelet
systemctl enable kube-proxy
systemctl restart kube-proxy
}
#检查当前接入主机是否已经接入与k8s平台之中
function checkInstallNodeHasInPlatformNodes() {
hasKubelet=`command -v kubectl|grep kubectl`
if [[ -n $hasKubelet ]];then
node=`kubectl get node -o wide 2>/dev/null|grep -w "$selected_ip_address"|grep system`
if [[ -z $node ]];then
node=`kubectl get nodes -o wide --kubeconfig=/etc/kubernetes/kubelet.kubeconfig 2>/dev/null|grep -w "$selected_ip_address"|grep system`
fi
if [[ -n $node ]];then
echo -e "当前主机IP: $selected_ip_address 为平台系统节点,已经存在于平台的kubernetes集群中"
includeK8s=1
fi
fi
}

# 检查当前接入主机与安装器主机的时间是否超过容忍阈值
function checkTime(){
time_threshold=60
if [ `curl -sS -w %{http_code} $installerUrl/api/info/datetime -o /tmp/checkTime` -eq 200 ];then
serverTime=`sed -n '$p' /tmp/checkTime`
now=`date +%s`
((time_diff=$now-$serverTime))
time_diff=${time_diff#-}
echo -e "安装器时间戳:$serverTime, 当前主机时间戳:$now,预设时差容忍阈值:$time_threshold"
if [[ $time_diff -gt $time_threshold ]];then
msg="当前主机与安装器时差:$time_diff秒,大于预设容忍阈值:$time_threshold秒, 请校准时间后重新执行本接入脚本"
curl -X POST -d @- $service_url/v1/resource_message/addmessage <<EOF
{
"userid":"$userid",
"authid":"$authid",
"status":-1,
"hostname":"$selected_ip_address",
"message":"$msg"
}
EOF
echo -e "$msg\n\c"
exit 1
else
echo -e "当前主机与安装器时差:$time_diff秒,小于预设容忍阈值:$time_threshold秒, 可以接入资源池"
fi
else
echo -e "调用底座接口获取安装器时间失败,跳过时间校验"
fi
}

# 检查当前接入主机的hostname是否与已经接入K8S集群的主机hostname冲突或非法
function checkHostname(){
local_hostname=`hostname`
upper_local_hostname=`echo $local_hostname|tr 'a-z' 'A-Z'`
if [[ $local_hostname == $upper_local_hostname ]];then
msg="禁止使用大写的主机名:$invalide_hostname"
curl -X POST -d @- $service_url/v1/resource_message/addmessage <<EOF
{
"userid":"$userid",
"authid":"$authid",
"status":-1,
"hostname":"$selected_ip_address",
"message":"$msg"
}
EOF
echo -e "$msg\n\c"
exit 2
fi
invalide_hostnames=("localhost")

for ((i=0;i<${#invalide_hostnames[@]};i++))
do
if [[ ${invalide_hostnames[$i]} == $local_hostname ]];then
msg="禁止使用${invalide_hostnames[$i]}作为主机名接入平台集群,请修改主机名后重新接入"
curl -X POST -d @- $service_url/v1/resource_message/addmessage <<EOF
{
"userid":"$userid",
"authid":"$authid",
"status":-1,
"hostname":"$selected_ip_address",
"message":"$msg"
}
EOF
echo -e "$msg\n\c"
exit 2
fi
done
if [ `curl -sS -w %{http_code} $installerUrl/api/info/hostname -o /tmp/hostnamelist` -eq 200 ];then
while read remote_hostnameAndIp
do
hostnameAndIp=(`echo ${remote_hostnameAndIp}|awk '{print $1,$2}'`)

remote_hostname=${hostnameAndIp[0]}
remote_hostip=${hostnameAndIp[1]%%/*}
if [[ ${remote_hostname} == ${local_hostname} && ${remote_hostip} != ${selected_ip_address} ]];then
msg="hostname:$remote_hostname 对应的主机: $remote_hostip 已接入平台集群,请勿重复使用该主机名"
curl -X POST -d @- $service_url/v1/resource_message/addmessage <<EOF
{
"userid":"$userid",
"authid":"$authid",
"status":-1,
"hostname":"$selected_ip_address",
"message":"$msg"
}
EOF
echo -e "$msg\n\c"
exit 2
fi
done < /tmp/hostnamelist
else
echo -e "调用底座接口获取k8s集群hostname列表失败,跳过hostname重复性校验"
fi
}

# 接入脚本主语句
userid=$1
authid=$2
poolid=$3
selected_ip_address=$4
includeK8s=0

base_url=http://192.168.0.84:80
docker_registry=reg.yyuap.io:81
CONSUL_SERVER=192.168.0.22:8500
service_url=${base_url}/res-pool-manager
installerUrl=${base_url}/api-station

if [[ -z $selected_ip_address ]];then
select_ip
else
echo "进入静默接入状态"
fi

#检查主机是否已经接入资源池
result=$(curl -sS $service_url/api/host?hostip=$selected_ip_address)

if [ -z "`echo $result|grep error_code`" ]; then
curl -X POST -d @- $service_url/v1/resource_message/addmessage <<EOF
{
"userid":"$userid",
"authid":"$authid",
"status":-1,
"hostname":"$selected_ip_address",
"message":"相同ip的主机已存在,主机添加失败"
}
EOF
echo -e "\n\c"
exit 3
fi

curl -X POST -d @- $service_url/v1/resource_message/addmessage <<EOF
{
"userid":"$userid",
"authid":"$authid",
"status":0,
"hostname":"$selected_ip_address",
"message":"正在下载资源"
}
EOF

echo "主机节点创建中......"

checkInstallNodeHasInPlatformNodes

if [[ $includeK8s -eq 0 ]];then
checkTime
checkHostname
addK8sNode
fi

n=0
while true
do
result=$(kubectl get nodes --kubeconfig="/etc/kubernetes/kubelet.kubeconfig")
if [ -z "`echo $result|grep -w "$selected_ip_address"`" -a $n -lt 9 ] ; then
sleep 5
echo "waiting $selected_ip_address add to k8s..."
else
break
fi
let "n=n+1"
done
if [[ $includeK8s -eq 0 ]];then
command='kubectl label nodes '$selected_ip_address' '$poolid'='$userid' node-role.kubernetes.io/resource_node= --overwrite --kubeconfig=/etc/kubernetes/kubelet.kubeconfig'
else
command='kubectl label nodes '$selected_ip_address' '$poolid'='$userid' node-role.kubernetes.io/resource_node= --overwrite'
fi
result=`$command`
if [ -z "`echo $result|grep labeled`" ] || [[ `systemctl is-active kube-proxy` -ne "active" ]]
then
echo "主机节点创建失败"
curl -X POST -d @- $service_url/v1/resource_message/addmessage <<EOF
{
"userid":"$userid",
"authid":"$authid",
"status":-1,
"hostname":"$selected_ip_address",
"message":"服务接入失败"
}
EOF

exit 4
fi


curl -X POST -d @- $service_url/v1/resource_message/addmessage <<EOF
{
"userid":"$userid",
"authid":"$authid",
"status":0,
"hostname":"$selected_ip_address",
"message":"服务接入成功"
}
EOF

echo -e "主机节点创建成功\n\c"

if [[ $includeK8s -eq 0 ]];then
echo -e "正在安装监控\n\c"
curl -X POST -d @- $service_url/v1/resource_message/addmessage <<EOF
{
"userid":"$userid",
"authid":"$authid",
"status":0,
"hostname":"$selected_ip_address",
"message":"正在安装监控"
}
EOF
promenode
promeadvisor
echo "监控安装完毕"
curl -X POST -d @- $service_url/v1/resource_message/addmessage <<EOF
{
"userid":"$userid",
"authid":"$authid",
"status":0,
"hostname":"$selected_ip_address",
"message":"监控安装完毕"
}
EOF
fi

echo -e "\n\c"

echo "启动命令下发服务"
curl -sS $base_url/download/runner/runner.sh|sh

if [[ $includeK8s -eq 0 ]];then
echo "部署定时清理脚本"
curl ${base_url}/download/tools/clean_log/deployClean.sh|sh
fi
num_of_cores=`cat /proc/cpuinfo| grep "processor"| wc -l`
mem_size=`cat /proc/meminfo |grep MemTotal |grep -Eo "[0-9]+"`
((mem_size=$mem_size/1024))
mac=`ip addr | grep -E "eth|ens|eno" | grep ether | awk NR==1'{print $2}'`

result=$(curl -X POST -d @- $service_url/api/addhost <<EOF
{
"status":1,
"userid":"$userid",
"authid":"$authid",
"name":"$selected_ip_address",
"ip":"$selected_ip_address",
"mac":"$mac",
"cpu":$num_of_cores,
"memory":$mem_size,
"storage":-1,
"restype":"k8s"
}
EOF
)

echo $result

if [ ! -z "`echo $result|grep error_code`" ]; then
curl -X POST -d @- $service_url/v1/resource_message/addmessage <<EOF
{
"userid":"$userid",
"authid":"$authid",
"status":-1,
"hostname":"$selected_ip_address",
"message":"主机添加失败"
}
EOF
if [[ $includeK8s -eq 0 ]];then
kubectl delete nodes $selected_ip_address --kubeconfig=/etc/kubernetes/kubelet.kubeconfig
fi
echo "主机添加失败"
exit 5
fi

curl -X POST -d @- $service_url/v1/resource_message/addmessage <<EOF
{
"userid":"$userid",
"authid":"$authid",
"status":1,
"hostname":"$selected_ip_address",
"message":"主机添加成功"
}
EOF
echo -e "主机添加成功\n\c"

要回复问题请先登录注册