当前位置:   article > 正文

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

shell脚本安装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地址操作系统配置
manager192.168.178.52centos7.91G1核
master192.168.178.102centos7.92G2核
node1192.168.178.152centos7.92G2核
node2192.168.178.202centos7.92G2核

2.my_ssh.sh脚本:

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

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

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

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

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

  1. create_ssh_pub(){
  2. echo "生成本地ssh公钥"
  3. /usr/bin/expect << eof
  4. # 设置捕获字符串后,期待回复的超时时间
  5. set timeout 30
  6. spawn ssh-keygen -t rsa -b 1024
  7. ## 开始进连续捕获
  8. expect {
  9. ".ssh/id_rsa)" { send "\n"; exp_continue }
  10. "Overwrite (y/n)?" { send "y\n"; exp_continue }
  11. "no passphrase):" { send "\n"; exp_continue }
  12. "passphrase again:" { send "\n"; exp_continue }
  13. }
  14. eof
  15. }
  16. if [ ! -f /root/.ssh/id_rsa.pub ];then
  17. create_ssh_pub
  18. fi

3.复制ssh公钥部分:

  1. copy_ssh(){
  2. echo "复制公钥到对应的主机上"
  3. /usr/bin/expect << eof
  4. # 设置捕获字符串后,期待回复的超时时间
  5. set timeout 30
  6. spawn ssh-copy-id -i /root/.ssh/id_rsa.pub $1@$2
  7. ## 开始进连续捕获
  8. expect {
  9. "connecting (yes/no)?" { send "yes\n"; exp_continue }
  10. "s password:" { send "${ssh_passwd}\n"; exp_continue }
  11. }
  12. eof
  13. }
  14. for ((j=0;j<${#ssh_networkname[*]};j++));do
  15. timeout 5 ssh root@${ssh_networkname[$j]} "echo ${ssh_networkname[$j]}: 'This is success!'"
  16. if [ $? -ne 0 ];then
  17. echo "复制文件到: ${ssh_networkname[$j]}"
  18. copy_ssh root ${ssh_networkname[$j]} > /dev/null
  19. fi
  20. done

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

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

5.完整脚本:

  1. #! /bin/bash
  2. # 控制主机和被控主机的IP数组,第一个元素是控制主机的IP地址
  3. ssh_hosts=(192.168.178.101 192.168.178.151 192.168.178.201)
  4. # 控制主机和被控主机的IP数组,第一个元素是控制主机的域名地址
  5. ssh_networkname=(master node1 node2)
  6. ssh_passwd=110119
  7. # 定义修改/etc/hosts文件的方法
  8. address_hosts(){
  9. hosts_num=0
  10. for name in ${ssh_networkname[*]};do
  11. hosts_num=$(($hosts_num+`grep -c ''"${name}"'$' /etc/hosts`))
  12. done
  13. # 判断hosts文件中的域名行是否为ssh_hosts的长度
  14. if [ ${hosts_num} -eq ${#ssh_networkname[*]} ];then
  15. echo "/etc/hosts已经配置!"
  16. return
  17. fi
  18. echo "本地开始修改地址映射"
  19. cat << eof > /etc/hosts
  20. 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
  21. ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
  22. eof
  23. for ((i=0;i<${#ssh_hosts[*]};i++));do
  24. sed -i '$a\'"${ssh_hosts[$i]}"' '"${ssh_networkname[$i]}"'' /etc/hosts
  25. done
  26. }
  27. address_hosts
  28. expect -v &> /dev/null
  29. if [ `echo $?` -ne 0 ];then
  30. echo "没有expect,安装expect命令"
  31. yum install -y expect
  32. fi
  33. create_ssh_pub(){
  34. echo "生成本地ssh公钥"
  35. /usr/bin/expect << eof
  36. # 设置捕获字符串后,期待回复的超时时间
  37. set timeout 30
  38. spawn ssh-keygen -t rsa -b 1024
  39. ## 开始进连续捕获
  40. expect {
  41. ".ssh/id_rsa)" { send "\n"; exp_continue }
  42. "Overwrite (y/n)?" { send "y\n"; exp_continue }
  43. "no passphrase):" { send "\n"; exp_continue }
  44. "passphrase again:" { send "\n"; exp_continue }
  45. }
  46. eof
  47. }
  48. if [ ! -f /root/.ssh/id_rsa.pub ];then
  49. create_ssh_pub
  50. fi
  51. # 定义复制ssh公钥方法
  52. copy_ssh(){
  53. echo "复制公钥到对应的主机上"
  54. /usr/bin/expect << eof
  55. # 设置捕获字符串后,期待回复的超时时间
  56. set timeout 30
  57. spawn ssh-copy-id -i /root/.ssh/id_rsa.pub $1@$2
  58. ## 开始进连续捕获
  59. expect {
  60. "connecting (yes/no)?" { send "yes\n"; exp_continue }
  61. "s password:" { send "${ssh_passwd}\n"; exp_continue }
  62. }
  63. eof
  64. }
  65. for ((j=0;j<${#ssh_networkname[*]};j++));do
  66. timeout 5 ssh root@${ssh_networkname[$j]} "echo ${ssh_networkname[$j]}: 'This is success!'"
  67. if [ $? -ne 0 ];then
  68. echo "复制文件到: ${ssh_networkname[$j]}"
  69. copy_ssh root ${ssh_networkname[$j]} > /dev/null
  70. fi
  71. scp /etc/hosts root@${ssh_networkname[$j]}:/etc
  72. done

3.my_env.sh脚本:

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

1.尝试连接主机部分:

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

2.升级内核部分

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

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

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

4.配置chrony服务器部分:

  1. # 节点开始配置chrony
  2. for name in ${ssh_networkname[*]};do
  3. echo "开始配置 ${name}"
  4. ssh root@${name} "systemctl restart chronyd"
  5. if [ $? -ne 0 ];then
  6. echo "${name} 安装chrony"
  7. ssh root@${name} "yum install -y chrony &> /dev/null && systemctl restart chronyd"
  8. if [ $? -ne 0 ];then
  9. echo "安装失败,请排错!"
  10. fi
  11. fi
  12. if [ ${name} == ${ssh_networkname[0]} ];then
  13. echo "${name}配置chrony"
  14. ssh root@${name} "sed -i '/^server/d' /etc/chrony.conf"
  15. ssh root@${name} "sed -i '2a\server ntp.aliyun.com iburst\' /etc/chrony.conf"
  16. ssh root@${name} "sed -i 's/#allow 192.168.0.0\/16/allow '"${allows_hosts}"'\/'"${allows_mask}"'/' /etc/chrony.conf"
  17. ssh root@${name} "sed -i 's/#local stratum 10/local stratum 10/' /etc/chrony.conf"
  18. sleep 2
  19. ssh root@${name} "systemctl restart chronyd && systemctl enable chronyd &> /dev/null"
  20. sleep 5
  21. ssh root@${name} "timedatectl set-ntp true && chronyc sources -v | sed -n '/^\^\*/p'"
  22. else
  23. echo "${name}配置chrony"
  24. ssh root@${name} "sed -i '/^server/d' /etc/chrony.conf;sed -i '2a\server '"${ssh_networkname[0]}"' iburst\' /etc/chrony.conf"
  25. ssh root@${name} "systemctl restart chronyd && systemctl enable chronyd &> /dev/null"
  26. sleep 5
  27. ssh root@${name} "timedatectl set-ntp true && chronyc sources -v | sed -n '/^\^\*/p'"
  28. fi
  29. done

5.禁用swap分区等部分:

  1. echo "开始禁用swap分区,修改linux的内核参数"
  2. for name in ${ssh_networkname[*]};do
  3. # 开始禁用swap分区
  4. ssh root@${name} "sed -i 's/\/dev\/mapper\/centos-swap/#\/dev\/mapper\/centos-swap/' /etc/fstab"
  5. # 修改linux的内核参数
  6. ssh root@${name} "cat <<eof > /etc/sysctl.d/kubernetes.conf
  7. net.bridge.bridge-nf-call-ip6tables = 1
  8. net.bridge.bridge-nf-call-iptables = 1
  9. net.ipv4.ip_forward = 1
  10. eof"
  11. ssh root@${name} "sysctl -p && modprobe br_netfilter"
  12. done
  13. echo "开始配置ipvs功能"
  14. for name in ${ssh_networkname[*]};do
  15. #配置ipvs功能
  16. ssh root@${name} "yum install -y ipset ipvsadm &> /dev/null"
  17. ssh root@${name} "cat <<eof > /etc/sysconfig/modules/ipvs.modules
  18. #!/bin/bash
  19. modprobe -- ip_vs
  20. modprobe -- ip_vs_rr
  21. modprobe -- ip_vs_wrr
  22. modprobe -- ip_vs_sh
  23. modprobe -- nf_conntrack_ipv4
  24. eof"
  25. ssh root@${name} "chmod +x /etc/sysconfig/modules/ipvs.modules && /bin/bash /etc/sysconfig/modules/ipvs.modules"
  26. echo "${name} 重启主机"
  27. ssh root@${name} "reboot"
  28. done

6.完整脚本:

  1. #! /bin/bash
  2. allows_hosts=192.168.178.0
  3. allows_mask=24
  4. ssh_manager=192.168.178.52
  5. ssh_networkname=(master node1 node2)
  6. # 尝试连接主机
  7. for name in ${ssh_networkname[*]};do
  8. echo "${name} 尝试连接中"
  9. if [ "`ssh root@${name} 'pwd'`" != "/root" ];then
  10. echo "${name}连接失败"
  11. exit
  12. fi
  13. done
  14. # 升级内核
  15. for name in ${ssh_networkname[*]};do
  16. echo "${name} 升级内核"
  17. ssh root@${name} "yum install -y wget &> /dev/null"
  18. ssh root@${name} "cd /etc/yum.repos.d && rm -rf *"
  19. ssh root@${name} "wget -O ~/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo &> /dev/null"
  20. ssh root@${name} "yum clean all &> /dev/null && yum makecache &> /dev/null"
  21. ssh root@${name} "yum upgrade -y &> /dev/null"
  22. done
  23. # 关闭防火墙,禁止使用selinux
  24. for name in ${ssh_networkname[*]};do
  25. echo "${name} 禁止防火墙,禁止使用selinux"
  26. ssh root@${name} "sed -i 's/SELINUX=.*/SELINUX=disabled/' /etc/selinux/config"
  27. ssh root@${name} "systemctl stop firewalld && systemctl disable firewalld &> /dev/null"
  28. ssh root@${name} "systemctl stop iptables &> /dev/null && systemctl disable iptables &> /dev/null"
  29. done
  30. # 节点开始配置chrony
  31. for name in ${ssh_networkname[*]};do
  32. echo "开始配置 ${name}"
  33. ssh root@${name} "systemctl restart chronyd"
  34. if [ $? -ne 0 ];then
  35. echo "${name} 安装chrony"
  36. ssh root@${name} "yum install -y chrony &> /dev/null && systemctl restart chronyd"
  37. if [ $? -ne 0 ];then
  38. echo "安装失败,请排错!"
  39. fi
  40. fi
  41. if [ ${name} == ${ssh_networkname[0]} ];then
  42. echo "${name}配置chrony"
  43. ssh root@${name} "sed -i '/^server/d' /etc/chrony.conf"
  44. ssh root@${name} "sed -i '2a\server ntp.aliyun.com iburst\' /etc/chrony.conf"
  45. ssh root@${name} "sed -i 's/#allow 192.168.0.0\/16/allow '"${allows_hosts}"'\/'"${allows_mask}"'/' /etc/chrony.conf"
  46. ssh root@${name} "sed -i 's/#local stratum 10/local stratum 10/' /etc/chrony.conf"
  47. sleep 2
  48. ssh root@${name} "systemctl restart chronyd && systemctl enable chronyd &> /dev/null"
  49. sleep 5
  50. ssh root@${name} "timedatectl set-ntp true && chronyc sources -v | sed -n '/^\^\*/p'"
  51. else
  52. echo "${name}配置chrony"
  53. ssh root@${name} "sed -i '/^server/d' /etc/chrony.conf;sed -i '2a\server '"${ssh_networkname[0]}"' iburst\' /etc/chrony.conf"
  54. ssh root@${name} "systemctl restart chronyd && systemctl enable chronyd &> /dev/null"
  55. sleep 5
  56. ssh root@${name} "timedatectl set-ntp true && chronyc sources -v | sed -n '/^\^\*/p'"
  57. fi
  58. done
  59. # 禁用swap分区,修改linux的内核参数,配置ipvs功能,重启linux服务
  60. echo "开始禁用swap分区,修改linux的内核参数"
  61. for name in ${ssh_networkname[*]};do
  62. # 开始禁用swap分区
  63. ssh root@${name} "sed -i 's/\/dev\/mapper\/centos-swap/#\/dev\/mapper\/centos-swap/' /etc/fstab"
  64. # 修改linux的内核参数
  65. ssh root@${name} "cat <<eof > /etc/sysctl.d/kubernetes.conf
  66. net.bridge.bridge-nf-call-ip6tables = 1
  67. net.bridge.bridge-nf-call-iptables = 1
  68. net.ipv4.ip_forward = 1
  69. eof"
  70. ssh root@${name} "sysctl -p && modprobe br_netfilter"
  71. done
  72. echo "开始配置ipvs功能"
  73. for name in ${ssh_networkname[*]};do
  74. #配置ipvs功能
  75. ssh root@${name} "yum install -y ipset ipvsadm &> /dev/null"
  76. ssh root@${name} "cat <<eof > /etc/sysconfig/modules/ipvs.modules
  77. #!/bin/bash
  78. modprobe -- ip_vs
  79. modprobe -- ip_vs_rr
  80. modprobe -- ip_vs_wrr
  81. modprobe -- ip_vs_sh
  82. modprobe -- nf_conntrack_ipv4
  83. eof"
  84. ssh root@${name} "chmod +x /etc/sysconfig/modules/ipvs.modules && /bin/bash /etc/sysconfig/modules/ipvs.modules"
  85. echo "${name} 重启主机"
  86. ssh root@${name} "reboot"
  87. done

4.my_k8,.sh脚本:

工作:完成对应Docker的安装,kubeadm等工具的下载,集群镜像的下载,master节点的集群初始化,节点加入集群的操作,网络插件的安装

1.尝试连接主机部分:

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

2.安装docker部分:

  1. for name in ${ssh_networkname[*]};do
  2. if [ ! -n `ssh root@master 'docker -v' | grep -o ''"${docker_version}"''` ];then
  3. echo "${name} 卸载之前的docker"
  4. ssh root@${name} "yum remove -y docker* &> /dev/null"
  5. echo "${name} 安装docker"
  6. 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"
  7. ssh root@${name} "yum install -y --setopt=obsoletes=0 docker-ce-${docker_version} &> /dev/null && docker -v"
  8. ssh root@${name} "mkdir /etc/docker &> /dev/null"
  9. ssh root@${name} 'cat <<eof > /etc/docker/daemon.json
  10. {
  11. "storage-driver": "devicemapper",
  12. "exec-opts": ["native.cgroupdriver=systemd"],
  13. "registry-mirrors": ["https://ja9e22yz.mirror.aliyuncs.com"]
  14. }
  15. eof'
  16. ssh root@${name} "mkdir /etc/docker &> /dev/null"
  17. ssh root@${name} "cat <<eof > /etc/sysconfig/docker
  18. OPTIONS='--selinux-enabled --log-driver=journald --signature-verification=false'
  19. eof"
  20. ssh root@${name} "systemctl restart docker;systemctl enable docker &> /dev/null"
  21. fi
  22. done

3.安装k8s组件部分:

  1. for name in ${ssh_networkname[*]};do
  2. ssh root@${name} "systemctl restart kubelet &> /dev/null"
  3. if [ $? -ne 0 ];then
  4. echo "${name} 安装k8s组件"
  5. ssh root@${name} "cat <<eof > /etc/yum.repos.d/kubernetes.repo
  6. [kubernetes]
  7. name=Kubernetes
  8. baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
  9. enabled=1
  10. gpgcheck=0
  11. repo_gpgcheck=0
  12. gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
  13. http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
  14. eof"
  15. ssh root@${name} "yum install --setopt=obsoletes=0 kubeadm-${kubelet_vesion} kubelet-${kubelet_vesion} kubectl-${kubelet_vesion} -y &> /dev/null"
  16. ssh root@${name} "cat <<eof > /etc/sysconfig/kubelet
  17. KUBELET_CGROUP_ARGS="--cgroup-driver=systemd"
  18. KUBE_PROXY_MODE="ipvs"
  19. eof"
  20. ssh root@${name} "systemctl enable kubelet &> /dev/null"
  21. fi
  22. done

4.准备集群镜像部分:

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

5.集群初始化部分:

  1. for ((i=0;i<${#ssh_networkname[*]};i++));do
  2. echo "${ssh_networkname[$i]} 集群初始化"
  3. if [ ${ssh_networkname[$i]} == ${ssh_networkname[0]} ];then
  4. ssh root@${ssh_networkname[$i]} "kubeadm init \
  5. --kubernetes-version=v${kubernetes_version} \
  6. --pod-network-cidr=10.244.0.0/16 \
  7. --service-cidr=10.96.0.0/12 \
  8. --apiserver-advertise-address=${ssh_hosts[$i]}" &> /dev/null
  9. token_arry=(`ssh root@${ssh_networkname[$i]} "kubeadm token create --ttl 0 --print-join-command"`)
  10. k8s_token=`echo ${token_arry[*]} | awk '{print $(NF-2)}'`
  11. k8s_hash=`echo ${token_arry[*]} | awk '{print $NF}'`
  12. if [ ! -n "${k8s_hash}" ];then
  13. echo "集群初始化有误,请注意内存和处理器核数!"
  14. exit
  15. fi
  16. is_join=`ssh root@${ssh_networkname[0]} 'kubectl get nodes' | awk '{print $1}' | grep -o ''"${ssh_networkname[$i]}"''`
  17. if [ ! -n "${is_join}" ];then
  18. echo "${ssh_networkname[$i]} 将加入到集群中"
  19. ssh root@${ssh_networkname[$i]} "kubeadm join ${ssh_hosts[0]}:6443 --token ${k8s_token} --discovery-token-ca-cert-hash ${token_hash}" &> /dev/null
  20. ssh root@${ssh_networkname[$i]} "mkdir -p $HOME/.kube"
  21. /usr/bin/expect << eof
  22. spawn ssh root@${ssh_networkname[$i]} "cp -i /etc/kubernetes/admin.conf $HOME/.kube/config"
  23. expect {
  24. ".kube/config’?" { send "y\n"; exp_continue }
  25. }
  26. eof
  27. ssh root@${ssh_networkname[$i]} "chown $(id -u):$(id -g) $HOME/.kube/config"
  28. fi
  29. else
  30. if [ ! -n "${k8s_hash}" ];then
  31. echo "集群初始化有误,请注意内存和处理器核数!"
  32. exit
  33. fi
  34. is_join=`ssh root@${ssh_networkname[0]} 'kubectl get nodes' | awk '{print $1}' | grep -o ''"${ssh_networkname[$i]}"''`
  35. if [ ! -n "${is_join}" ];then
  36. echo "${ssh_networkname[$i]} 将加入到集群中"
  37. ssh root@${ssh_networkname[$i]} "kubeadm join ${ssh_hosts[0]}:6443 --token ${k8s_token} --discovery-token-ca-cert-hash ${k8s_hash} &> /dev/null"
  38. fi
  39. fi
  40. done

6.安装网络插件:

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

7.完整脚本:

  1. #! /bin/bash
  2. ssh_manager=192.168.178.52
  3. ssh_hosts=(192.168.178.101 192.168.178.151 192.168.178.201)
  4. ssh_networkname=(master node1 node2)
  5. kubernetes_version=1.17.4
  6. kubelet_vesion=${kubernetes_version}-0
  7. docker_version=18.06.3.ce
  8. dockerce_version=${docker_version}-3.el7
  9. 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)
  10. # 尝试连接主机
  11. for name in ${ssh_networkname[*]};do
  12. echo "${name} 尝试连接中"
  13. if [ "`ssh root@${name} 'pwd'`" != "/root" ];then
  14. echo "${name}连接失败"
  15. exit
  16. fi
  17. done
  18. # 安装docker
  19. for name in ${ssh_networkname[*]};do
  20. if [ ! -n `ssh root@master 'docker -v' | grep -o ''"${docker_version}"''` ];then
  21. echo "${name} 卸载之前的docker"
  22. ssh root@${name} "yum remove -y docker* &> /dev/null"
  23. echo "${name} 安装docker"
  24. 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"
  25. ssh root@${name} "yum install -y --setopt=obsoletes=0 docker-ce-${docker_version} &> /dev/null && docker -v"
  26. ssh root@${name} "mkdir /etc/docker &> /dev/null"
  27. ssh root@${name} 'cat <<eof > /etc/docker/daemon.json
  28. {
  29. "storage-driver": "devicemapper",
  30. "exec-opts": ["native.cgroupdriver=systemd"],
  31. "registry-mirrors": ["https://ja9e22yz.mirror.aliyuncs.com"]
  32. }
  33. eof'
  34. ssh root@${name} "mkdir /etc/docker &> /dev/null"
  35. ssh root@${name} "cat <<eof > /etc/sysconfig/docker
  36. OPTIONS='--selinux-enabled --log-driver=journald --signature-verification=false'
  37. eof"
  38. ssh root@${name} "systemctl restart docker;systemctl enable docker &> /dev/null"
  39. fi
  40. done
  41. # 安装k8s组件
  42. for name in ${ssh_networkname[*]};do
  43. ssh root@${name} "systemctl restart kubelet &> /dev/null"
  44. if [ $? -ne 0 ];then
  45. echo "${name} 安装k8s组件"
  46. ssh root@${name} "cat <<eof > /etc/yum.repos.d/kubernetes.repo
  47. [kubernetes]
  48. name=Kubernetes
  49. baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
  50. enabled=1
  51. gpgcheck=0
  52. repo_gpgcheck=0
  53. gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
  54. http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
  55. eof"
  56. ssh root@${name} "yum install --setopt=obsoletes=0 kubeadm-${kubelet_vesion} kubelet-${kubelet_vesion} kubectl-${kubelet_vesion} -y &> /dev/null"
  57. ssh root@${name} "cat <<eof > /etc/sysconfig/kubelet
  58. KUBELET_CGROUP_ARGS="--cgroup-driver=systemd"
  59. KUBE_PROXY_MODE="ipvs"
  60. eof"
  61. ssh root@${name} "systemctl enable kubelet &> /dev/null"
  62. fi
  63. done
  64. # 判断集群是否已经完整配置
  65. Ready_num=`ssh root@${ssh_networkname[0]} 'kubectl get nodes' | awk '{print $2}' | grep -o 'Ready' | wc -l`
  66. if [ ${Ready_num} -eq ${#ssh_networkname[*]} ];then
  67. echo "....集群已配置完毕!"
  68. exit
  69. fi
  70. # 准备集群镜像
  71. for name in ${ssh_networkname[*]};do
  72. echo "$name准备集群镜像"
  73. for imageName in ${images[*]};do
  74. ssh root@${name} "docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName &> /dev/null"
  75. ssh root@${name} "docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName k8s.gcr.io/$imageName &> /dev/null"
  76. ssh root@${name} "docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName &> /dev/null"
  77. done
  78. done
  79. # 集群初始化
  80. for ((i=0;i<${#ssh_networkname[*]};i++));do
  81. echo "${ssh_networkname[$i]} 集群初始化"
  82. if [ ${ssh_networkname[$i]} == ${ssh_networkname[0]} ];then
  83. ssh root@${ssh_networkname[$i]} "kubeadm init \
  84. --kubernetes-version=v${kubernetes_version} \
  85. --pod-network-cidr=10.244.0.0/16 \
  86. --service-cidr=10.96.0.0/12 \
  87. --apiserver-advertise-address=${ssh_hosts[$i]}" &> /dev/null
  88. token_arry=(`ssh root@${ssh_networkname[$i]} "kubeadm token create --ttl 0 --print-join-command"`)
  89. k8s_token=`echo ${token_arry[*]} | awk '{print $(NF-2)}'`
  90. k8s_hash=`echo ${token_arry[*]} | awk '{print $NF}'`
  91. if [ ! -n "${k8s_hash}" ];then
  92. echo "集群初始化有误,请注意内存和处理器核数!"
  93. exit
  94. fi
  95. is_join=`ssh root@${ssh_networkname[0]} 'kubectl get nodes' | awk '{print $1}' | grep -o ''"${ssh_networkname[$i]}"''`
  96. if [ ! -n "${is_join}" ];then
  97. echo "${ssh_networkname[$i]} 将加入到集群中"
  98. ssh root@${ssh_networkname[$i]} "kubeadm join ${ssh_hosts[0]}:6443 --token ${k8s_token} --discovery-token-ca-cert-hash ${token_hash}" &> /dev/null
  99. ssh root@${ssh_networkname[$i]} "mkdir -p $HOME/.kube"
  100. /usr/bin/expect << eof
  101. spawn ssh root@${ssh_networkname[$i]} "cp -i /etc/kubernetes/admin.conf $HOME/.kube/config"
  102. expect {
  103. ".kube/config’?" { send "y\n"; exp_continue }
  104. }
  105. eof
  106. ssh root@${ssh_networkname[$i]} "chown $(id -u):$(id -g) $HOME/.kube/config"
  107. fi
  108. else
  109. if [ ! -n "${k8s_hash}" ];then
  110. echo "集群初始化有误,请注意内存和处理器核数!"
  111. exit
  112. fi
  113. is_join=`ssh root@${ssh_networkname[0]} 'kubectl get nodes' | awk '{print $1}' | grep -o ''"${ssh_networkname[$i]}"''`
  114. if [ ! -n "${is_join}" ];then
  115. echo "${ssh_networkname[$i]} 将加入到集群中"
  116. ssh root@${ssh_networkname[$i]} "kubeadm join ${ssh_hosts[0]}:6443 --token ${k8s_token} --discovery-token-ca-cert-hash ${k8s_hash} &> /dev/null"
  117. fi
  118. fi
  119. done
  120. sleep 2
  121. ssh root@${ssh_networkname[0]} "kubectl get nodes"
  122. # 安装网络插件
  123. ssh root@${ssh_networkname[0]} "wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml &> /dev/null"
  124. sleep 2
  125. is_flannel=`ssh root@${ssh_networkname[0]} "find ./ -type f -name 'kube-flannel.yml'"`
  126. if [ ! -n "${is_flannel}" ];then
  127. echo "下载失败"
  128. exit
  129. fi
  130. ssh root@${ssh_networkname[0]} "kubectl apply -f kube-flannel.yml &> /dev/null"

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号