设为首页 收藏本站
查看: 680|回复: 0

[经验分享] 一键部署Kubernetes高可用集群

[复制链接]

尚未签到

发表于 2018-1-4 11:14:21 | 显示全部楼层 |阅读模式
# vim k8s-deploy.sh  #!/bin/bash
  set -x
  set -e
  HTTP_SERVER=172.60.0.43:8000
  KUBE_HA=true
  KUBE_REPO_PREFIX=gcr.io/google_containers
  KUBE_ETCD_IMAGE=quay.io/coreos/etcd:v3.0.15
  root=$(id -u)
  if [ "$root" -ne 0 ] ;then
  echo must run as root
  exit 1
  fi
  kube::install_docker()
  {
  set +e
  docker info> /dev/null 2>&1
  i=$?
  set -e
  if [ $i -ne 0 ]; then
  curl -L http://$HTTP_SERVER/rpms/docker.tar.gz > /tmp/docker.tar.gz
  tar zxf /tmp/docker.tar.gz -C /tmp
  yum localinstall -y /tmp/docker/*.rpm
  systemctl enable docker.service && systemctl start docker.service
  kube::config_docker
  fi
  echo docker has been installed
  rm -rf /tmp/docker /tmp/docker.tar.gz
  }
  kube::config_docker()
  {
  setenforce 0 > /dev/null 2>&1 && sed -i -e 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
  sysctl -w net.bridge.bridge-nf-call-iptables=1
  sysctl -w net.bridge.bridge-nf-call-ip6tables=1
  cat <<EOF >>/etc/sysctl.conf
  net.bridge.bridge-nf-call-ip6tables = 1
  net.bridge.bridge-nf-call-iptables = 1
  EOF
  mkdir -p /etc/systemd/system/docker.service.d
  cat <<EOF >/etc/systemd/system/docker.service.d/10-docker.conf
[Service]

  ExecStart=
  ExecStart=/usr/bin/dockerd -s overlay --selinux-enabled=false
  EOF
  systemctl daemon-reload && systemctl restart docker.service
  }
  kube::load_images()
  {
  mkdir -p /tmp/k8s
  images=(
  kube-apiserver-amd64_v1.5.1
  kube-controller-manager-amd64_v1.5.1
  kube-scheduler-amd64_v1.5.1
  kube-proxy-amd64_v1.5.1
  pause-amd64_3.0
  kube-discovery-amd64_1.0
  kubedns-amd64_1.9
  exechealthz-amd64_1.2
  kube-dnsmasq-amd64_1.4
  dnsmasq-metrics-amd64_1.0
  etcd_v3.0.15
  flannel-amd64_v0.7.0
  )
  for i in "${!images[@]}"; do
  ret=$(docker images | awk 'NR!=1{print $1"_"$2}'| grep $KUBE_REPO_PREFIX/${images[$i]} | wc -l)
  if [ $ret -lt 1 ];then
  curl -L http://$HTTP_SERVER/images/${images[$i]}.tar o /tmp/k8s/${images[$i]}.tar
  docker load -i /tmp/k8s/${images[$i]}.tar
  fi
  done
  rm /tmp/k8s* -rf
  }
  kube::install_bin()
  {
  set +e
  which kubeadm > /dev/null 2>&1
  i=$?
  set -e
  if [ $i -ne 0 ]; then
  curl -L http://$HTTP_SERVER/rpms/k8s.tar.gz > /tmp/k8s.tar.gz
  tar zxf /tmp/k8s.tar.gz -C /tmp
  yum localinstall -y  /tmp/k8s/*.rpm
  rm -rf /tmp/k8s*
  systemctl enable kubelet.service && systemctl start kubelet.service && rm -rf /etc/kubernetes
  fi
  }
  kube::wait_apiserver()
  {
  until curl http://127.0.0.1:8080; do sleep 1; done
  }
  kube::disable_static_pod()
  {
  # remove the waring log in kubelet
  sed -i 's/--pod-manifest-path=\/etc\/kubernetes\/manifests//g' /etc/systemd/system/kubelet.service.d/10-kubeadm.conf
  systemctl daemon-reload && systemctl restart kubelet.service
  }
  kube::get_env()
  {
  HA_STATE=$1
[ $HA_STATE == "MASTER" ] && HA_PRIORITY=200 || HA_PRIORITY=`expr 200 - ${RANDOM} / 1000 + 1`

  KUBE_VIP=$(echo $2 |awk -F= '{print $2}')
  VIP_PREFIX=$(echo ${KUBE_VIP} | cut -d . -f 1,2,3)
  #dhcp和static地址的不同取法
  VIP_INTERFACE=$(ip addr show | grep ${VIP_PREFIX} | awk -F 'dynamic' '{print $2}' | head -1)
[ -z ${VIP_INTERFACE} ] && VIP_INTERFACE=$(ip addr show | grep ${VIP_PREFIX} | awk -F 'global' '{print $2}' | head -1)

  ###
  LOCAL_IP=$(ip addr show | grep ${VIP_PREFIX} | awk -F / '{print $1}' | awk -F ' ' '{print $2}' | head -1)
  MASTER_NODES=$(echo $3 | grep -o '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}')
  MASTER_NODES_NO_LOCAL_IP=$(echo "${MASTER_NODES}" | sed -e 's/'${LOCAL_IP}'//g')
  }
  kube::install_keepalived()
  {
  kube::get_env $@
  set +e
  which keepalived > /dev/null 2>&1
  i=$?
  set -e
  if [ $i -ne 0 ]; then
  ip addr add ${KUBE_VIP}/32 dev ${VIP_INTERFACE}
  curl -L http://$HTTP_SERVER/rpms/keepalived.tar.gz > /tmp/keepalived.tar.gz
  tar zxf /tmp/keepalived.tar.gz -C /tmp
  yum localinstall -y  /tmp/keepalived/*.rpm
  rm -rf /tmp/keepalived*
  systemctl enable keepalived.service && systemctl start keepalived.service
  kube::config_keepalived
  fi
  }
  kube::config_keepalived()
  {
  echo "gen keepalived configuration"
  cat <<EOF >/etc/keepalived/keepalived.conf
  global_defs {
  router_id LVS_k8s
  }
  vrrp_script CheckK8sMaster {
  script "curl http://127.0.0.1:8080"
  interval 3
  timeout 9
  fall 2
  rise 2
  }
  vrrp_instance VI_1 {
  state ${HA_STATE}
  interface ${VIP_INTERFACE}
  virtual_router_id 61
  priority ${HA_PRIORITY}
  advert_int 1
  mcast_src_ip ${LOCAL_IP}
  nopreempt
  authentication {
  auth_type PASS
  auth_pass 378378
  }
  unicast_peer {
  ${MASTER_NODES_NO_LOCAL_IP}
  }
  virtual_ipaddress {
  ${KUBE_VIP}
  }
  track_script {
  CheckK8sMaster
  }
  }
  EOF
  modprobe ip_vs
  systemctl daemon-reload && systemctl restart keepalived.service
  }
  kube::save_master_ip()
  {
  set +e
  # 应该从$2里拿到etcd集群的 --endpoints, 这里默认走的127.0.0.1:2379
[ ${KUBE_HA} == true ] && etcdctl mk ha_master ${LOCAL_IP}

  set -e
  }
  kube::copy_master_config()
  {
  local master_ip=$(etcdctl get ha_master)
  mkdir -p /etc/kubernetes
  scp -r root@${master_ip}:/etc/kubernetes/* /etc/kubernetes/
  systemctl start kubelet
  }
  kube::set_label()
  {
  until kubectl get no | grep `hostname`; do sleep 1; done
  kubectl label node `hostname` kubeadm.alpha.kubernetes.io/role=master
  }
  kube::master_up()
  {
  shift
  kube::install_docker
  kube::load_images
  kube::install_bin
[ ${KUBE_HA} == true ] && kube::install_keepalived "MASTER" $@

  # 存储master_ip,master02和master03需要用这个信息来copy配置
  kube::save_master_ip
  # 这里一定要带上--pod-network-cidr参数,不然后面的flannel网络会出问题
  kubeadm init --use-kubernetes-version=v1.5.1 --pod-network-cidr=10.244.0.0/16 $@
  # 使master节点可以被调度
  # kubectl taint nodes --all dedicated-
  echo -e "\033[32m 注意记录下token信息,node加入集群时需要使用!\033[0m"
  # install flannel network
  kubectl apply -f http://$HTTP_SERVER/network/kube-flannel.yaml --namespace=kube-system
  # show pods
  kubectl get pod --all-namespaces
  }
  kube::replica_up()
  {
  shift
  kube::install_docker
  kube::load_images
  kube::install_bin
  kube::install_keepalived "BACKUP" $@
  kube::copy_master_config
  kube::set_label
  }
  kube::node_up()
  {
  kube::install_docker
  kube::load_images
  kube::install_bin
  kube::disable_static_pod
  kubeadm join $@
  }
  kube::tear_down()
  {
  systemctl stop kubelet.service
  docker ps -aq|xargs -I '{}' docker stop {}
  docker ps -aq|xargs -I '{}' docker rm {}
  df |grep /var/lib/kubelet|awk '{ print $6 }'|xargs -I '{}' umount {}
  rm -rf /var/lib/kubelet && rm -rf /etc/kubernetes/ && rm -rf /var/lib/etcd
  yum remove -y kubectl kubeadm kubelet kubernetes-cni
  if [ ${KUBE_HA} == true ]
  then
  yum remove -y keepalived
  rm -rf /etc/keepalived/keepalived.conf
  fi
  rm -rf /var/lib/cni
  ip link del cni0
  }
  main()
  {
  case $1 in
  "m" | "master" )
  kube::master_up $@
  ;;
  "r" | "replica" )
  kube::replica_up $@
  ;;
  "j" | "join" )
  shift
  kube::node_up $@
  ;;
  "d" | "down" )
  kube::tear_down
  ;;
  *)
  echo "usage: $0 m[master] | r[replica] | j[join] token | d[down] "
  echo "       $0 master to setup master "
  echo "       $0 replica to setup replica master "
  echo "       $0 join   to join master with token "
  echo "       $0 down   to tear all down ,inlude all data! so becarefull"
  echo "       unkown command $0 $@"
  ;;
  esac
  }
  main $@

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-431462-1-1.html 上篇帖子: 确实,k8s的时代,ingress负载用traefik比nginx方便啊 下篇帖子: Docker集群管理工具
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表