自動化一鍵部署kubernetes叢集
阿新 • • 發佈:2020-12-15
如果一件事情你需要做不止一遍,每一遍至少花費你十分鐘以上,那麼就值得你為它做一個自動化流程。
前面寫了兩個使用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 函式即可。