1. 程式人生 > 實用技巧 >自動化一鍵部署kubernetes叢集

自動化一鍵部署kubernetes叢集

如果一件事情你需要做不止一遍,每一遍至少花費你十分鐘以上,那麼就值得你為它做一個自動化流程。

前面寫了兩個使用kubeadm搭建k8s叢集的文章,一篇使用的是docker,一篇是用的containerd,最近由於學習使用,各種版本反反覆覆搭建了好幾次,感覺弄一個自動化部署指令碼比較合適

前兩篇文章路標:

docker篇:https://www.cnblogs.com/codenoob/p/14073585.html

containerd篇:https://www.cnblogs.com/codenoob/p/14098539.html

操作步驟:

1. vi /usr/bin/kubestart

將以下內容複製進去

#! /bin/bash
###############################################
##       Simple Install Your K8S
##         Author : codenoob4
###############################################

kube_pod_subnet="10.244.0.0/16"
kube_version="1.19.5"
kube_image_server="registry.cn-hangzhou.aliyuncs.com/google_containers"
crictl_url="http://39.106.40.190/cmds/"
crictl_name="cri-containerd-1.3.3.linux-amd64.tar.gz"

function init-env-disable-selinux()
{
    setenforce 0
    sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
}

function init-env-disable-firewalld()
{
  systemctl stop firewalld
  systemctl disable --now firewalld
}

function init-env-repository()
{
  yum install -y yum-utils device-mapper-persistent-data lvm2
  yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
  echo -e "[kubernetes] \nname=Kubernetes - \$basearch \nbaseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-\$basearch/ \nenabled=1 \ngpgcheck=0 \nrepo_gpgcheck=0 \ngpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg" > /etc/yum.repos.d/kubernetes.repo
  yum install centos-release-openstack-rocky -y
}

function init-docker()
{
  yum install -y wget docker-ce kubeadm-${kube_version} kubectl-${kube_version} kubelet-${kube_version} openvswitch* certbot
  systemctl start docker
  systemctl enable docker
  systemctl enable kubelet
}

function init-containerd()
{
  yum install -y wget containerd.io kubeadm-${kube_version} kubectl-${kube_version} kubelet-${kube_version} openvswitch* certbot
  if [[ ! -d "/etc/kubernetes" ]]
  then
    mkdir -p /etc/containerd
  fi

  cd /home
  wget $crictl_url$crictl_name
  tar zxvf $crictl_name
  cp -r etc/* /etc/
  cp -r opt/* /opt/
  cp -r usr/* /usr/

  rm -rf $crictl_name
  rm -rf etc
  rm -rf opt
  rm -rf usr
 
  echo "overlay" > /etc/modules-load.d/containerd.conf  
  echo "br_netfilter" >> /etc/modules-load.d/containerd.conf  

  modprobe overlay
  modprobe br_netfilter

  echo "net.bridge.bridge-nf-call-iptables  = 1" > /etc/sysctl.d/99-kubernetes-cri.conf 
  echo "net.ipv4.ip_forward                 = 1" >> /etc/sysctl.d/99-kubernetes-cri.conf 
  echo "net.bridge.bridge-nf-call-ip6tables = 1" >> /etc/sysctl.d/99-kubernetes-cri.conf 
 
  sysctl --system

  containerd config default > /etc/containerd/config.toml

  sed -i 's/k8s.gcr.io\/pause:3.1/registry.cn-hangzhou.aliyuncs.com\/google_containers\/pause:3.2/g' /etc/containerd/config.toml

  systemctl start containerd
  systemctl enable containerd
 
  echo "KUBELET_EXTRA_ARGS=--cgroup-driver=systemd" > /etc/default/kubelet 

  echo "runtime-endpoint: unix:///run/containerd/containerd.sock" > /etc/crictl.yaml
  echo "image-endpoint: unix:///run/containerd/containerd.sock" >> /etc/crictl.yaml
  echo "timeout: 10" >> /etc/crictl.yaml
  echo "debug: false" >> /etc/crictl.yaml

  systemctl enable kubelet
}

function init-env-kubeconfig()
{
  if [[ ! -d "/etc/kubernetes" ]]
  then
    mkdir /etc/kubernetes
  fi
  echo -e "apiVersion: kubeadm.k8s.io/v1beta2" > /etc/kubernetes/kubeadm.yaml
  echo -e "kind: InitConfiguration" >> /etc/kubernetes/kubeadm.yaml
  echo -e "bootstrapTokens:" >> /etc/kubernetes/kubeadm.yaml
  echo -e "  - ttl: \"0\"" >> /etc/kubernetes/kubeadm.yaml
  echo -e "---" >> /etc/kubernetes/kubeadm.yaml
  echo -e "apiVersion: kubeadm.k8s.io/v1beta2" >> /etc/kubernetes/kubeadm.yaml
  echo -e "kind: ClusterConfiguration" >> /etc/kubernetes/kubeadm.yaml
  echo -e "networking:" >> /etc/kubernetes/kubeadm.yaml
  echo -e "  podSubnet: \"${kube_pod_subnet}\"" >> /etc/kubernetes/kubeadm.yaml
  echo -e "kubernetesVersion: \"v${kube_version}\"" >> /etc/kubernetes/kubeadm.yaml
  echo -e "imageRepository: \"${kube_image_server}\"" >> /etc/kubernetes/kubeadm.yaml
}

function init-env-kubecomp()
{
  # default calico cni
  echo -e "https://docs.projectcalico.org/archive/v3.17/manifests/calico.yaml" > /etc/kubernetes/kubeenv.list
  # flannel: cni config url
  # echo -e "https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml" > /etc/kubernetes/kubeenv.list
}

function init-env()
{
  init-env-disable-selinux
  init-env-disable-firewalld
  init-env-repository
  if [[ -z $2 ]]
  then
    init-containerd
  elif [[ $2 == "docker" ]]
  then
    init-docker
  elif [[ $2 == "containerd" ]]
  then
    init-containerd
  else
    echo "only support docker or containerd"
    exit 1
  fi
  init-env-kubeconfig
  init-env-kubecomp
}

function run-kube()
{
  swapoff -a
  systemctl restart kubelet

  echo "1" > /proc/sys/net/bridge/bridge-nf-call-iptables
  echo "1" > /proc/sys/net/ipv4/ip_forward 
 
  kubeadm init --config /etc/kubernetes/kubeadm.yaml  

  rm -rf $HOME/.kube
  mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config
  iptables -P FORWARD ACCEPT
  
  while read line
  do
    kubectl apply -f $line
  done  < /etc/kubernetes/kubeenv.list

}

function help()
{
  echo -e "Commands:"
  echo -e "  init-env      :\t(Init): Initialize the environment configuration, simplify configuring node, such as disable selinux, install docker or containerd..."
  echo -e "  run-kube      :\t(Init): deploy Kubernetes as your want by editing /etc/kubernetes/kubeenv.list. Now it includes calico, flannel"
}

case $1 in
  "init-env")
    init-env $*
    ;;
  "run-kube")
    run-kube $*
    ;;
  "--help")
    help
    ;;
  *)
  help
  ;;
esac

2. sudo chmod 777 /usr/bin/kubestart

3.然後你就可以使用以下兩條命令去建立你的k8s叢集了

# 初始化各種環境配置
kubestart init-env
# 啟動叢集,應用cni
kubestart run-kube
# 幫助命令
kubestart help

指令碼說明:

指令碼開頭的幾個引數,是關於你想使用的 k8s 版本以及 crictl 安裝包,想要使用其他版本的可以在開頭改一下。

kubestart init-env 命令後面還可以新增其他引數,選擇容器執行時,可以使用 docker 或者 containerd,預設是 containerd。

執行 kubeadm init 命令使用的是 /etc/kubernetes/kubeadm.yaml 配置檔案啟動的,如果有特殊需要,在執行完 init-env 命令後去修改這個檔案內容就可以,其實啟動叢集的方式就是這條命令:

kubeadm init --config /etc/kubernetes/kubeadm.yaml

預設使用的是 calico 作為 cni 應用,你如果想使用其他的,去修改一下腳本里面的 init-env-kubecomp 函式即可。