超详细~使用shell脚本完成用kubeadm工具对k8s集群的搭建

这篇具有很好参考价值的文章主要介绍了超详细~使用shell脚本完成用kubeadm工具对k8s集群的搭建。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

1.环境规划

2.my_ssh.sh脚本:

1.修改/etc/hosts文件部分:

2.生成本地ssh公钥部分:

3.复制ssh公钥部分:

4.复制本地的hosts文件部分:

5.完整脚本:

3.my_env.sh脚本:

1.尝试连接主机部分:

2.升级内核部分

3.关闭防火墙,禁止使用selinux部分:

4.配置chrony服务器部分:

5.禁用swap分区等部分:

6.完整脚本:

4.my_k8,.sh脚本:

1.尝试连接主机部分:

2.安装docker部分:

3.安装k8s组件部分:

4.准备集群镜像部分:

5.集群初始化部分:

6.安装网络插件:

7.完整脚本:


1.环境规划

本脚本使用一主多从的场景,脚本创建在manager节点,是对k8s集群的远程操作

节点 IP地址 操作系统 配置
manager 192.168.178.52 centos7.9 1G1核
master 192.168.178.102 centos7.9 2G2核
node1 192.168.178.152 centos7.9 2G2核
node2 192.168.178.202 centos7.9 2G2核

2.my_ssh.sh脚本:

工作:完成域名的添加,公钥的创建,公钥的复制

脚本中的ssh_hosts和ssh_networkname数组的第一个元素是主服务器的IP地址或域名

1.修改/etc/hosts文件部分:

address_hosts(){
hosts_num=0
for name in ${ssh_networkname[*]};do
	hosts_num=$(($hosts_num+`grep -c ''"${name}"'$' /etc/hosts`))
done
# 判断hosts文件中的域名行是否为ssh_hosts的长度
if [ ${hosts_num} -eq ${#ssh_networkname[*]} ];then
	echo "/etc/hosts已经配置!"
	return
fi
echo "本地开始修改地址映射"
cat << eof > /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
eof
for ((i=0;i<${#ssh_hosts[*]};i++));do
	sed -i '$a\'"${ssh_hosts[$i]}"' '"${ssh_networkname[$i]}"'' /etc/hosts
done
}
address_hosts

2.生成本地ssh公钥部分:

create_ssh_pub(){
echo "生成本地ssh公钥"
/usr/bin/expect << eof
# 设置捕获字符串后,期待回复的超时时间
set timeout 30

spawn ssh-keygen -t rsa -b 1024

## 开始进连续捕获
expect	{
        ".ssh/id_rsa)"      { send "\n";  exp_continue }
        "Overwrite (y/n)?"  { send "y\n"; exp_continue }
        "no passphrase):"   { send "\n";  exp_continue }
        "passphrase again:" { send "\n";  exp_continue }
}
eof
}
if [ ! -f /root/.ssh/id_rsa.pub ];then
	create_ssh_pub
fi

3.复制ssh公钥部分:

copy_ssh(){
echo "复制公钥到对应的主机上"
/usr/bin/expect << eof
# 设置捕获字符串后,期待回复的超时时间
set timeout 30

spawn ssh-copy-id -i /root/.ssh/id_rsa.pub $1@$2

## 开始进连续捕获
expect	{
        "connecting (yes/no)?" { send "yes\n";  exp_continue }
        "s password:"          { send "${ssh_passwd}\n"; exp_continue }
}
eof
}
for ((j=0;j<${#ssh_networkname[*]};j++));do
	timeout 5 ssh root@${ssh_networkname[$j]} "echo ${ssh_networkname[$j]}: 'This is success!'"
	if [ $? -ne 0 ];then
		echo "复制文件到: ${ssh_networkname[$j]}"
		copy_ssh root ${ssh_networkname[$j]} > /dev/null
	fi
	
done

4.复制本地的hosts文件部分:

scp /etc/hosts root@${ssh_networkname[$j]}:/etc

5.完整脚本:

#! /bin/bash

# 控制主机和被控主机的IP数组,第一个元素是控制主机的IP地址
ssh_hosts=(192.168.178.101 192.168.178.151 192.168.178.201)
# 控制主机和被控主机的IP数组,第一个元素是控制主机的域名地址
ssh_networkname=(master node1 node2)
ssh_passwd=110119

# 定义修改/etc/hosts文件的方法
address_hosts(){
hosts_num=0
for name in ${ssh_networkname[*]};do
	hosts_num=$(($hosts_num+`grep -c ''"${name}"'$' /etc/hosts`))
done
# 判断hosts文件中的域名行是否为ssh_hosts的长度
if [ ${hosts_num} -eq ${#ssh_networkname[*]} ];then
	echo "/etc/hosts已经配置!"
	return
fi
echo "本地开始修改地址映射"
cat << eof > /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
eof
for ((i=0;i<${#ssh_hosts[*]};i++));do
	sed -i '$a\'"${ssh_hosts[$i]}"' '"${ssh_networkname[$i]}"'' /etc/hosts
done
}
address_hosts

expect -v &> /dev/null
if [ `echo $?` -ne 0 ];then
	echo "没有expect,安装expect命令"
	yum install -y expect
fi 

create_ssh_pub(){
echo "生成本地ssh公钥"
/usr/bin/expect << eof
# 设置捕获字符串后,期待回复的超时时间
set timeout 30

spawn ssh-keygen -t rsa -b 1024

## 开始进连续捕获
expect	{
        ".ssh/id_rsa)"      { send "\n";  exp_continue }
        "Overwrite (y/n)?"  { send "y\n"; exp_continue }
        "no passphrase):"   { send "\n";  exp_continue }
        "passphrase again:" { send "\n";  exp_continue }
}
eof
}
if [ ! -f /root/.ssh/id_rsa.pub ];then
	create_ssh_pub
fi


# 定义复制ssh公钥方法
copy_ssh(){
echo "复制公钥到对应的主机上"
/usr/bin/expect << eof
# 设置捕获字符串后,期待回复的超时时间
set timeout 30

spawn ssh-copy-id -i /root/.ssh/id_rsa.pub $1@$2

## 开始进连续捕获
expect	{
        "connecting (yes/no)?" { send "yes\n";  exp_continue }
        "s password:"          { send "${ssh_passwd}\n"; exp_continue }
}
eof
}
for ((j=0;j<${#ssh_networkname[*]};j++));do
	timeout 5 ssh root@${ssh_networkname[$j]} "echo ${ssh_networkname[$j]}: 'This is success!'"
	if [ $? -ne 0 ];then
		echo "复制文件到: ${ssh_networkname[$j]}"
		copy_ssh root ${ssh_networkname[$j]} > /dev/null
	fi
	scp /etc/hosts root@${ssh_networkname[$j]}:/etc
done

3.my_env.sh脚本:

工作:完成k8s环境的初始化配置,最终重启主机

1.尝试连接主机部分:

# 尝试连接主机
for name in ${ssh_networkname[*]};do
	echo "${name} 尝试连接中"
	if [ "`ssh root@${name} 'pwd'`" != "/root" ];then
		echo "${name}连接失败"
		exit
	fi
done

2.升级内核部分

# 升级内核
for name in ${ssh_networkname[*]};do
	echo "${name} 升级内核"
	ssh root@${name} "yum install -y wget &> /dev/null"
	ssh root@${name} "cd /etc/yum.repos.d && rm -rf *"
	ssh root@${name} "wget -O ~/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo &> /dev/null"
	ssh root@${name} "yum clean all &> /dev/null && yum makecache &> /dev/null"
	ssh root@${name} "yum upgrade -y &> /dev/null"
done

3.关闭防火墙,禁止使用selinux部分:

# 关闭防火墙,禁止使用selinux
for name in ${ssh_networkname[*]};do
	echo "${name} 禁止防火墙,禁止使用selinux"
	ssh root@${name} "sed -i 's/SELINUX=.*/SELINUX=disabled/' /etc/selinux/config"
	ssh root@${name} "systemctl stop firewalld && systemctl disable firewalld &> /dev/null"
	ssh root@${name} "systemctl stop iptables &> /dev/null && systemctl disable iptables &> /dev/null"
done

4.配置chrony服务器部分:

# 节点开始配置chrony
for name in ${ssh_networkname[*]};do
	echo "开始配置 ${name}"
	ssh root@${name} "systemctl restart chronyd"
	if [ $? -ne 0 ];then
		echo "${name} 安装chrony"
		ssh root@${name} "yum install -y chrony &> /dev/null && systemctl restart chronyd"
		if [ $? -ne 0 ];then
			echo "安装失败,请排错!"
		fi
	fi
	if [ ${name} == ${ssh_networkname[0]} ];then
		echo "${name}配置chrony"
		ssh root@${name} "sed -i '/^server/d' /etc/chrony.conf"
		ssh root@${name} "sed -i '2a\server ntp.aliyun.com iburst\' /etc/chrony.conf"
		ssh root@${name} "sed -i 's/#allow 192.168.0.0\/16/allow '"${allows_hosts}"'\/'"${allows_mask}"'/' /etc/chrony.conf"
		ssh root@${name} "sed -i 's/#local stratum 10/local stratum 10/' /etc/chrony.conf"
		sleep 2
		ssh root@${name} "systemctl restart chronyd && systemctl enable chronyd &> /dev/null"
		sleep 5
		ssh root@${name} "timedatectl set-ntp true && chronyc sources -v | sed -n '/^\^\*/p'"
	else
		echo "${name}配置chrony"
		ssh root@${name} "sed -i '/^server/d' /etc/chrony.conf;sed -i '2a\server '"${ssh_networkname[0]}"' iburst\' /etc/chrony.conf"
		ssh root@${name} "systemctl restart chronyd && systemctl enable chronyd &> /dev/null"
		sleep 5
		ssh root@${name} "timedatectl set-ntp true && chronyc sources -v | sed -n '/^\^\*/p'"
	fi
done

5.禁用swap分区等部分:

echo "开始禁用swap分区,修改linux的内核参数"
for name in ${ssh_networkname[*]};do
	# 开始禁用swap分区
	ssh root@${name} "sed -i 's/\/dev\/mapper\/centos-swap/#\/dev\/mapper\/centos-swap/' /etc/fstab"
	
	# 修改linux的内核参数
	ssh root@${name} "cat <<eof > /etc/sysctl.d/kubernetes.conf 
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
eof"
	ssh root@${name} "sysctl -p && modprobe br_netfilter"
done
echo "开始配置ipvs功能"
for name in ${ssh_networkname[*]};do
	#配置ipvs功能
	ssh root@${name} "yum install -y ipset ipvsadm &> /dev/null"
	ssh root@${name} "cat <<eof > /etc/sysconfig/modules/ipvs.modules
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
eof"
	ssh root@${name} "chmod +x /etc/sysconfig/modules/ipvs.modules && /bin/bash /etc/sysconfig/modules/ipvs.modules"
	echo "${name} 重启主机"
	ssh root@${name} "reboot"
done

6.完整脚本:

#! /bin/bash

allows_hosts=192.168.178.0
allows_mask=24
ssh_manager=192.168.178.52
ssh_networkname=(master node1 node2)

# 尝试连接主机
for name in ${ssh_networkname[*]};do
	echo "${name} 尝试连接中"
	if [ "`ssh root@${name} 'pwd'`" != "/root" ];then
		echo "${name}连接失败"
		exit
	fi
done

# 升级内核
for name in ${ssh_networkname[*]};do
	echo "${name} 升级内核"
	ssh root@${name} "yum install -y wget &> /dev/null"
	ssh root@${name} "cd /etc/yum.repos.d && rm -rf *"
	ssh root@${name} "wget -O ~/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo &> /dev/null"
	ssh root@${name} "yum clean all &> /dev/null && yum makecache &> /dev/null"
	ssh root@${name} "yum upgrade -y &> /dev/null"
done
# 关闭防火墙,禁止使用selinux
for name in ${ssh_networkname[*]};do
	echo "${name} 禁止防火墙,禁止使用selinux"
	ssh root@${name} "sed -i 's/SELINUX=.*/SELINUX=disabled/' /etc/selinux/config"
	ssh root@${name} "systemctl stop firewalld && systemctl disable firewalld &> /dev/null"
	ssh root@${name} "systemctl stop iptables &> /dev/null && systemctl disable iptables &> /dev/null"
done

# 节点开始配置chrony
for name in ${ssh_networkname[*]};do
	echo "开始配置 ${name}"
	ssh root@${name} "systemctl restart chronyd"
	if [ $? -ne 0 ];then
		echo "${name} 安装chrony"
		ssh root@${name} "yum install -y chrony &> /dev/null && systemctl restart chronyd"
		if [ $? -ne 0 ];then
			echo "安装失败,请排错!"
		fi
	fi
	if [ ${name} == ${ssh_networkname[0]} ];then
		echo "${name}配置chrony"
		ssh root@${name} "sed -i '/^server/d' /etc/chrony.conf"
		ssh root@${name} "sed -i '2a\server ntp.aliyun.com iburst\' /etc/chrony.conf"
		ssh root@${name} "sed -i 's/#allow 192.168.0.0\/16/allow '"${allows_hosts}"'\/'"${allows_mask}"'/' /etc/chrony.conf"
		ssh root@${name} "sed -i 's/#local stratum 10/local stratum 10/' /etc/chrony.conf"
		sleep 2
		ssh root@${name} "systemctl restart chronyd && systemctl enable chronyd &> /dev/null"
		sleep 5
		ssh root@${name} "timedatectl set-ntp true && chronyc sources -v | sed -n '/^\^\*/p'"
	else
		echo "${name}配置chrony"
		ssh root@${name} "sed -i '/^server/d' /etc/chrony.conf;sed -i '2a\server '"${ssh_networkname[0]}"' iburst\' /etc/chrony.conf"
		ssh root@${name} "systemctl restart chronyd && systemctl enable chronyd &> /dev/null"
		sleep 5
		ssh root@${name} "timedatectl set-ntp true && chronyc sources -v | sed -n '/^\^\*/p'"
	fi
done

# 禁用swap分区,修改linux的内核参数,配置ipvs功能,重启linux服务
echo "开始禁用swap分区,修改linux的内核参数"
for name in ${ssh_networkname[*]};do
	# 开始禁用swap分区
	ssh root@${name} "sed -i 's/\/dev\/mapper\/centos-swap/#\/dev\/mapper\/centos-swap/' /etc/fstab"
	
	# 修改linux的内核参数
	ssh root@${name} "cat <<eof > /etc/sysctl.d/kubernetes.conf 
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
eof"
	ssh root@${name} "sysctl -p && modprobe br_netfilter"
done
echo "开始配置ipvs功能"
for name in ${ssh_networkname[*]};do
	#配置ipvs功能
	ssh root@${name} "yum install -y ipset ipvsadm &> /dev/null"
	ssh root@${name} "cat <<eof > /etc/sysconfig/modules/ipvs.modules
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
eof"
	ssh root@${name} "chmod +x /etc/sysconfig/modules/ipvs.modules && /bin/bash /etc/sysconfig/modules/ipvs.modules"
	echo "${name} 重启主机"
	ssh root@${name} "reboot"
done

4.my_k8,.sh脚本:

工作:完成对应Docker的安装,kubeadm等工具的下载,集群镜像的下载,master节点的集群初始化,节点加入集群的操作,网络插件的安装文章来源地址https://www.toymoban.com/news/detail-421361.html

1.尝试连接主机部分:

for name in ${ssh_networkname[*]};do
	echo "${name} 尝试连接中"
	if [ "`ssh root@${name} 'pwd'`" != "/root" ];then
		echo "${name}连接失败"
		exit
	fi
done

2.安装docker部分:

for name in ${ssh_networkname[*]};do
	if [ ! -n `ssh root@master 'docker -v' | grep -o ''"${docker_version}"''` ];then
		echo "${name} 卸载之前的docker"
		ssh root@${name} "yum remove -y docker* &> /dev/null"
		echo "${name} 安装docker"
		ssh root@${name} "wget -O /etc/yum.repos.d/docker-ce.repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo &> /dev/null"
		ssh root@${name} "yum install -y --setopt=obsoletes=0 docker-ce-${docker_version} &> /dev/null && docker -v"
		ssh root@${name} "mkdir /etc/docker &> /dev/null"
		ssh root@${name} 'cat <<eof > /etc/docker/daemon.json
{
"storage-driver": "devicemapper",
"exec-opts": ["native.cgroupdriver=systemd"],
"registry-mirrors": ["https://ja9e22yz.mirror.aliyuncs.com"]
}
eof'
		ssh root@${name} "mkdir /etc/docker &> /dev/null"
		ssh root@${name} "cat <<eof > /etc/sysconfig/docker
OPTIONS='--selinux-enabled --log-driver=journald --signature-verification=false'
eof"
		ssh root@${name} "systemctl restart docker;systemctl enable docker &> /dev/null"
	fi
done

3.安装k8s组件部分:

for name in ${ssh_networkname[*]};do
	ssh root@${name} "systemctl restart kubelet &> /dev/null"
	if [ $? -ne 0 ];then
		echo "${name} 安装k8s组件"
		ssh root@${name} "cat <<eof > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
eof"
		ssh root@${name} "yum install --setopt=obsoletes=0 kubeadm-${kubelet_vesion} kubelet-${kubelet_vesion} kubectl-${kubelet_vesion} -y &> /dev/null"
		ssh root@${name} "cat <<eof > /etc/sysconfig/kubelet
KUBELET_CGROUP_ARGS="--cgroup-driver=systemd"
KUBE_PROXY_MODE="ipvs"
eof"
		ssh root@${name} "systemctl enable kubelet &> /dev/null"
	fi
done

4.准备集群镜像部分:

for name in ${ssh_networkname[*]};do
	echo "$name准备集群镜像"
	for imageName in ${images[*]};do
		ssh root@${name} "docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName &> /dev/null"
		ssh root@${name} "docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName k8s.gcr.io/$imageName &> /dev/null"
		ssh root@${name} "docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName &> /dev/null"
	done
done

5.集群初始化部分:

for ((i=0;i<${#ssh_networkname[*]};i++));do
	echo "${ssh_networkname[$i]} 集群初始化"
	if [ ${ssh_networkname[$i]} == ${ssh_networkname[0]} ];then
		ssh root@${ssh_networkname[$i]} "kubeadm init \
--kubernetes-version=v${kubernetes_version} \
--pod-network-cidr=10.244.0.0/16 \
--service-cidr=10.96.0.0/12 \
--apiserver-advertise-address=${ssh_hosts[$i]}" &> /dev/null
		token_arry=(`ssh root@${ssh_networkname[$i]} "kubeadm token create --ttl 0 --print-join-command"`)
		k8s_token=`echo ${token_arry[*]} | awk '{print $(NF-2)}'`
		k8s_hash=`echo ${token_arry[*]} | awk '{print $NF}'`
		if [ ! -n "${k8s_hash}" ];then
			echo "集群初始化有误,请注意内存和处理器核数!"
			exit
		fi
		is_join=`ssh root@${ssh_networkname[0]} 'kubectl get nodes' | awk '{print $1}' | grep -o ''"${ssh_networkname[$i]}"''`
		if [ ! -n "${is_join}" ];then
			echo "${ssh_networkname[$i]} 将加入到集群中"
			ssh root@${ssh_networkname[$i]} "kubeadm join ${ssh_hosts[0]}:6443 --token ${k8s_token} --discovery-token-ca-cert-hash ${token_hash}" &> /dev/null
	     	ssh root@${ssh_networkname[$i]} "mkdir -p $HOME/.kube"
/usr/bin/expect << eof
spawn ssh root@${ssh_networkname[$i]} "cp -i /etc/kubernetes/admin.conf $HOME/.kube/config"
expect	{
        ".kube/config’?"      { send "y\n";  exp_continue }
}
eof
	     	ssh root@${ssh_networkname[$i]} "chown $(id -u):$(id -g) $HOME/.kube/config"
		fi
	else
		if [ ! -n "${k8s_hash}" ];then
			echo "集群初始化有误,请注意内存和处理器核数!"
			exit
		fi
		is_join=`ssh root@${ssh_networkname[0]} 'kubectl get nodes' | awk '{print $1}' | grep -o ''"${ssh_networkname[$i]}"''`
		if [ ! -n "${is_join}" ];then
			echo "${ssh_networkname[$i]} 将加入到集群中"
			ssh root@${ssh_networkname[$i]} "kubeadm join ${ssh_hosts[0]}:6443 --token ${k8s_token} --discovery-token-ca-cert-hash ${k8s_hash} &> /dev/null"
		fi

	fi
done

6.安装网络插件:

ssh root@${ssh_networkname[0]} "wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml &> /dev/null"
sleep 2
is_flannel=`ssh root@${ssh_networkname[0]} "find ./ -type f -name 'kube-flannel.yml'"`
if [ ! -n "${is_flannel}" ];then
	echo "下载失败"
	exit
fi
ssh root@${ssh_networkname[0]} "kubectl apply -f kube-flannel.yml &> /dev/null"

7.完整脚本:

#! /bin/bash

ssh_manager=192.168.178.52
ssh_hosts=(192.168.178.101 192.168.178.151 192.168.178.201)
ssh_networkname=(master node1 node2)
kubernetes_version=1.17.4
kubelet_vesion=${kubernetes_version}-0
docker_version=18.06.3.ce
dockerce_version=${docker_version}-3.el7
images=(kube-apiserver:v1.17.4 kube-controller-manager:v1.17.4 kube-scheduler:v1.17.4 kube-proxy:v1.17.4 pause:3.1 etcd:3.4.3-0 coredns:1.6.5)

# 尝试连接主机
for name in ${ssh_networkname[*]};do
	echo "${name} 尝试连接中"
	if [ "`ssh root@${name} 'pwd'`" != "/root" ];then
		echo "${name}连接失败"
		exit
	fi
done

# 安装docker
for name in ${ssh_networkname[*]};do
	if [ ! -n `ssh root@master 'docker -v' | grep -o ''"${docker_version}"''` ];then
		echo "${name} 卸载之前的docker"
		ssh root@${name} "yum remove -y docker* &> /dev/null"
		echo "${name} 安装docker"
		ssh root@${name} "wget -O /etc/yum.repos.d/docker-ce.repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo &> /dev/null"
		ssh root@${name} "yum install -y --setopt=obsoletes=0 docker-ce-${docker_version} &> /dev/null && docker -v"
		ssh root@${name} "mkdir /etc/docker &> /dev/null"
		ssh root@${name} 'cat <<eof > /etc/docker/daemon.json
{
"storage-driver": "devicemapper",
"exec-opts": ["native.cgroupdriver=systemd"],
"registry-mirrors": ["https://ja9e22yz.mirror.aliyuncs.com"]
}
eof'
		ssh root@${name} "mkdir /etc/docker &> /dev/null"
		ssh root@${name} "cat <<eof > /etc/sysconfig/docker
OPTIONS='--selinux-enabled --log-driver=journald --signature-verification=false'
eof"
		ssh root@${name} "systemctl restart docker;systemctl enable docker &> /dev/null"
	fi
done


# 安装k8s组件
for name in ${ssh_networkname[*]};do
	ssh root@${name} "systemctl restart kubelet &> /dev/null"
	if [ $? -ne 0 ];then
		echo "${name} 安装k8s组件"
		ssh root@${name} "cat <<eof > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
eof"
		ssh root@${name} "yum install --setopt=obsoletes=0 kubeadm-${kubelet_vesion} kubelet-${kubelet_vesion} kubectl-${kubelet_vesion} -y &> /dev/null"
		ssh root@${name} "cat <<eof > /etc/sysconfig/kubelet
KUBELET_CGROUP_ARGS="--cgroup-driver=systemd"
KUBE_PROXY_MODE="ipvs"
eof"
		ssh root@${name} "systemctl enable kubelet &> /dev/null"
	fi
done

# 判断集群是否已经完整配置
Ready_num=`ssh root@${ssh_networkname[0]} 'kubectl get nodes' | awk '{print $2}' | grep -o 'Ready' | wc -l`
if [ ${Ready_num} -eq ${#ssh_networkname[*]} ];then
	echo "....集群已配置完毕!"
	exit
fi

# 准备集群镜像
for name in ${ssh_networkname[*]};do
	echo "$name准备集群镜像"
	for imageName in ${images[*]};do
		ssh root@${name} "docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName &> /dev/null"
		ssh root@${name} "docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName k8s.gcr.io/$imageName &> /dev/null"
		ssh root@${name} "docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName &> /dev/null"
	done
done

# 集群初始化
for ((i=0;i<${#ssh_networkname[*]};i++));do
	echo "${ssh_networkname[$i]} 集群初始化"
	if [ ${ssh_networkname[$i]} == ${ssh_networkname[0]} ];then
		ssh root@${ssh_networkname[$i]} "kubeadm init \
--kubernetes-version=v${kubernetes_version} \
--pod-network-cidr=10.244.0.0/16 \
--service-cidr=10.96.0.0/12 \
--apiserver-advertise-address=${ssh_hosts[$i]}" &> /dev/null
		token_arry=(`ssh root@${ssh_networkname[$i]} "kubeadm token create --ttl 0 --print-join-command"`)
		k8s_token=`echo ${token_arry[*]} | awk '{print $(NF-2)}'`
		k8s_hash=`echo ${token_arry[*]} | awk '{print $NF}'`
		if [ ! -n "${k8s_hash}" ];then
			echo "集群初始化有误,请注意内存和处理器核数!"
			exit
		fi
		is_join=`ssh root@${ssh_networkname[0]} 'kubectl get nodes' | awk '{print $1}' | grep -o ''"${ssh_networkname[$i]}"''`
		if [ ! -n "${is_join}" ];then
			echo "${ssh_networkname[$i]} 将加入到集群中"
			ssh root@${ssh_networkname[$i]} "kubeadm join ${ssh_hosts[0]}:6443 --token ${k8s_token} --discovery-token-ca-cert-hash ${token_hash}" &> /dev/null
	     	ssh root@${ssh_networkname[$i]} "mkdir -p $HOME/.kube"
/usr/bin/expect << eof
spawn ssh root@${ssh_networkname[$i]} "cp -i /etc/kubernetes/admin.conf $HOME/.kube/config"
expect	{
        ".kube/config’?"      { send "y\n";  exp_continue }
}
eof
	     	ssh root@${ssh_networkname[$i]} "chown $(id -u):$(id -g) $HOME/.kube/config"
		fi
	else
		if [ ! -n "${k8s_hash}" ];then
			echo "集群初始化有误,请注意内存和处理器核数!"
			exit
		fi
		is_join=`ssh root@${ssh_networkname[0]} 'kubectl get nodes' | awk '{print $1}' | grep -o ''"${ssh_networkname[$i]}"''`
		if [ ! -n "${is_join}" ];then
			echo "${ssh_networkname[$i]} 将加入到集群中"
			ssh root@${ssh_networkname[$i]} "kubeadm join ${ssh_hosts[0]}:6443 --token ${k8s_token} --discovery-token-ca-cert-hash ${k8s_hash} &> /dev/null"
		fi

	fi
done
sleep 2
ssh root@${ssh_networkname[0]} "kubectl get nodes"

# 安装网络插件
ssh root@${ssh_networkname[0]} "wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml &> /dev/null"
sleep 2
is_flannel=`ssh root@${ssh_networkname[0]} "find ./ -type f -name 'kube-flannel.yml'"`
if [ ! -n "${is_flannel}" ];then
	echo "下载失败"
	exit
fi
ssh root@${ssh_networkname[0]} "kubectl apply -f kube-flannel.yml &> /dev/null"

到了这里,关于超详细~使用shell脚本完成用kubeadm工具对k8s集群的搭建的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【高效、实用】k8s运行状态自动检测shell脚本

    学习本章,您将获得轻松管理500台虚机和物理机搭建的k8s集群的方法 。 掌握两种技能: 1.分清哪些是k8s集群需要重点关注的信息 2.如何量身定制k8s集群的shell脚本,让您的集群如虎添翼的安全、稳定、强大 提示:有些朋友的环境与我的环境不一样,执行可能显示不一样,要

    2023年04月08日
    浏览(41)
  • K8S系列文章之 Shell批处理脚本应用

    1、批处理脚本介绍 命令批处理脚本:/usr/shell/all.sh 文件批量分发脚本:/usr/shell/scp.sh 2、 批处理命令脚本原理 读取/usr/shell/hosts文件中的ip列表 使用$*接收脚本所有参数 for循环遍历hosts文件中的ip地址 通过ssh host cmd 实现目的ip命令 eval命令判断并打印命令执行结果 for循环遍历

    2024年02月13日
    浏览(42)
  • Kubeadm高可用部署K8S 1.24版本---保姆级超详细!!!

    目录 一、前言 二、基础环境部署 1)前期准备(所有节点) 1、修改主机名和配置 hosts 2、配置 ssh 互信 3、时间同步 4、关闭防火墙 5、关闭 swap 6、禁用 SELinux 7、允许 iptables 检查桥接流量(可选,所有节点) 2)安装容器 docker(所有节点) 3)配置 k8s yum 源(所有节点) 4)

    2023年04月14日
    浏览(44)
  • 【云原生】使用kubeadm搭建K8S

    服务器 IP 配置 master(2C/4G,cpu核心数要求大于2) 192.168.243.107 docker、kubeadm、kubelet、kubectl、flannel node01(2C/2G) 192.168.243.108 docker、kubeadm、kubelet、kubectl、flannel node02(2C/2G) 192.168.243.109 docker、kubeadm、kubelet、kubectl、flannel master02 192.168.243.110 docker、kubeadm、kubelet、kubectl、flann

    2024年02月14日
    浏览(48)
  • Kubernetes(K8s)使用 kubeadm 方式搭建多 master 高可用 K8s 集群

    本篇主要针对上篇文章的单 master 节点的 K8s 集群上搭建多 master 节点集群 和 LB 负载均衡服务器。 Kubernetes(K8S)集群搭建基础入门教程 虚拟机 IP 地址: IP 操作系统 主机名称 192.168.2.121 centos7.9 k8s-master01 192.168.2.124 centos7.9 k8s-master02 192.168.2.125 centos7.9 k8s-node01 192.168.2.126 centos

    2023年04月26日
    浏览(52)
  • 使用kubeadm快速部署一个K8s集群

    kubeadm是官方社区推出的一个用于快速部署kubernetes集群的工具。 这个工具能通过两条指令完成一个kubernetes集群的部署: 在开始之前,部署Kubernetes集群机器需要满足以下几个条件: 一台或多台机器,操作系统 CentOS7.x-86_x64 硬件配置:2GB或更多RAM,2个CPU或更多CPU,硬盘30GB或更

    2024年02月09日
    浏览(62)
  • Kubeadm 部署 k8s 使用国内镜像源

    Kubernetes官方文档的安装过程中,有些地方需要使用国内的镜像源才能完成 这篇文章整合了所有需要替换国内镜像的地方,供参考 操作系统:Rocky 9(最小安装) 容器运行时:containerd k8s阿里云源 docker-ce阿里云源 安装containerd时需要,实测输入这一行命令就可以了

    2024年02月11日
    浏览(45)
  • 使用kubeadm方式快速部署一个K8S集群

    目录 一、环境准备 二、环境初始化  三、在所有主机上安装相关软件 1、安装docker 2、配置k8s的yum源 3、安装kubelet、kubeadm、kubectl 四、部署Kubernetes Master 五、加入Kubernets Node 六、部署CNI网络插件 七、测试k8s集群 我的是CentOS7系统,然后准备三台虚拟主机 一台master,和两台no

    2024年02月11日
    浏览(64)
  • 使用kubeadm安装和设置Kubernetes(k8s)

    kubeadm是官方社区推出的一个用于快速部署kubernetes集群的工具。 这个工具能通过两条指令完成一个kubernetes集群的部署: 使用kubeadm方式搭建K8s集群主要分为以下几步 准备三台虚拟机,同时安装操作系统CentOS 7.x 对三个安装之后的操作系统进行初始化操作 在三个节点安装 dock

    2024年02月12日
    浏览(43)
  • Ubuntu 使用Kubeadm 离线安装k8s

    K8S离线部署的方案 离线包,自己可以跟着下面步骤自己下载。 https://download.csdn.net/download/u010952056/86748944 万字长文详解 PaaS toB 场景下 K8s 离线部署方案 Item Language 离线部署支持情况 kops Golang 不支持 kubespray Ansible 支持,需自行构建安装包 kubeasz Ansible 支持,需自行构建安装包

    2024年02月05日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包