#!/bin/bash ############################################################## # File Name: k8s.sh # Version: V1.1 # Author: sanshi # Organization: https://www.9133w.cn # Created Time : 2019-09-14 20:37:13 # Description: ############################################################## # base env [[ $EUID -ne 0 ]] && echo 'root needed!' && exit 0 remove() { kubeadm reset -f modprobe -r ipip lsmod rm -rf ~/.kube/ rm -rf /etc/kubernetes/ rm -rf /etc/systemd/system/kubelet.service.d rm -rf /etc/systemd/system/kubelet.service rm -rf /usr/bin/kube* rm -rf /etc/cni rm -rf /opt/cni rm -rf /var/lib/etcd rm -rf /var/etcd yum -y remove kubeadm* kubectl* kubelet* docker* } echo 'If k8s has been installed, you need remove it and reboot first.' read -p 'remove k8s from your system? (y/n) ' answer case $answer in y|Y|YES|yes) remove ;; *) clear echo 'install k8s now!' esac echo '--------swapoff---------' swapoff -a && \ sed -ri '/swap/s/(.*)/#\1/' /etc/fstab clear echo '-------kernel args------' [ -f /proc/sys/net/bridge/bridge-nf-call-iptables ] || modprobe br_netfilter sleep 3 echo 1 > /proc/sys/net/bridge/bridge-nf-call-iptables echo 1 > /proc/sys/net/bridge/bridge-nf-call-ip6tables echo '-----repo download-----' [[ -f /etc/yum.repos.d/kubernetes.repo ]] || \ cat > /etc/yum.repos.d/kubernetes.repo << EOF [kubernetes] name=Kubernetes baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/ enabled=1 gpgcheck=0 #repo_gpgcheck=1 #gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg EOF clear echo '-----docker depend-----' yum install -y bash-completion net-tools gcc yum-utils device-mapper-persistent-data lvm2 yum-config-manager -y --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo yum clean all && yum makecache clear echo '-----install tools-----' rpm -q docker-ce &>/dev/null || yum install -y docker-ce rpm -q ansible ntpdate pssh socat wget sshpass | \ grep -oP '(?<=package )\S+' | \ xargs -r yum install -y [ -d /etc/docker ] || mkdir -p /etc/docker [ -d /data/docker ] || mkdir -p /data/docker cat > /etc/docker/daemon.json << EOF { "registry-mirrors": ["https://0quel0z8.mirror.aliyuncs.com"], "exec-opts": ["native.cgroupdriver=systemd"], "graph": "/data/docker" } EOF command -v kubeadm &>/dev/null && \ echo "kubeadm exists,please remove it first" && exit 1 clear echo '------kubeadm install--' echo 'Input version of kubernetes(1.23.0/1.22.3?...) [default newest version]:' read -t 360 kube_version if [ -z "$kube_version" ] then rpm -q kubectl kubeadm kubelet | \ grep -oP '(?<=package )\S+' | \ xargs -r yum install -y elif ! yum list kubeadm --showduplicates|grep kubeadm | awk '{print $2}' | grep -q "$kube_version" then echo "kubeadm version not exist in repos." exit 1 else yum install -y kubectl-$kube_version kubeadm-$kube_version kubelet-$kube_version fi systemctl daemon-reload systemctl restart docker systemctl enable docker kubelet #grep -q KUBELET_CGROUP_ARGS /usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf || \ #sed -i '/\[service\]/a Environment="KUBELET_CGROUP_ARGS=--cgroup-driver=cgroupfs"' /usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf clear echo '-----init kube-------' k_ver=`kubeadm version | grep -oP '(?<=GitVersion:"v)[0-9.]+' | awk -F. '{print $1"."$2".0"}'` main_ver=`echo $k_ver | awk -F. '{print $1}'` check_ver=`echo $k_ver | awk -F. '{print $2}'` if [ ${check_ver:-1} -ge 24 -o ${main_ver:-1} -gt 1 ]; then rm -f /etc/containerd/config.toml && systemctl restart containerd fi k8s_init() { kubeadm init --kubernetes-version=v$k_ver \ --pod-network-cidr=10.244.0.0/16 \ --service-cidr=10.96.0.0/12 \ --ignore-preflight-errors=Swap \ --image-repository registry.aliyuncs.com/google_containers } k8s_init if [ $? -ne 0 ] then if ! docker images | grep -q coredns then coredns_ver=`kubeadm config images list |grep -oP '(?<=coredns:v).*'` docker pull "coredns/coredns:$coredns_ver" [ $? -ne 0 ] && echo "$line download failure." && exit 1 docker tag coredns/coredns:$coredns_ver registry.aliyuncs.com/google_containers/coredns:v$coredns_ver docker tag coredns/coredns:$coredns_ver registry.aliyuncs.com/google_containers/coredns/coredns:v$coredns_ver k8s_init if [ $? -ne 0 ] then echo "k8s init failure,please check images with command 'kubeadm config images list'." && exit 1 fi else echo "k8s init failure,please check images with command 'kubeadm config images list'." && exit 1 fi fi mkdir -p $HOME/.kube && \ /bin/cp /etc/kubernetes/admin.conf $HOME/.kube/config chown $(id -u):$(id -g) $HOME/.kube/config grep -q 'kubectl completion bash' ~/.bashrc || \ echo 'source <(kubectl completion bash)' >> ~/.bashrc echo 'source <(helm completion bash)' >> ~/.bashrc #source ~/.bashrc clear echo '-----network--------' sleep 60 && \ #kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml & kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml clear echo '-----dashboard-----' kubectl apply -f https://9133w.cn/sources/k8s-dashboard.yaml sleep 30 dashboard_port=`kubectl get service -n kubernetes-dashboard | awk '/^kubernetes/{split($5,t,"[:/]");print t[2]}'` if [ -n "$dashboard_port" ] then echo -e "dashboard access address:\nhttps://`hostname -I | awk '{print $1}'`:$dashboard_port" > dashboard.info fi echo -e "token:\n" >> dashboard.info secret_dashboard=`kubectl get secret -n kubernetes-dashboard | grep dashboard-token | awk '{print $1}'` if [ -n "$secret_dashboard" ] then kubectl get secret -n kubernetes-dashboard $secret_dashboard -o jsonpath={.data.token} | base64 -d >> dashboard.info echo -e '\n' >> dashboard.info else echo '==============dashboard token in $(kubectl describe secret -n kubernetes-dashboard)==========' fi clear echo '-----nodes join-----' echo 'Input nodes hosts. split with space:' read n_ip if ! grep -q '\[k8s\]' /etc/ansible/hosts then echo '[k8s]' >> /etc/ansible/hosts for ip_n in $n_ip do echo $ip_n >> /etc/ansible/hosts done fi [[ -f $HOME/.ssh/id_rsa ]] || \ echo -e "\n" | ssh-keygen -t rsa -N "" -q for key_sync in $n_ip do if ! pssh -H $key_sync -O stricthostkeychecking=no -l root "echo" &> /dev/null then echo "Input $key_sync password of root:" read -t 60 key_pass key_pass=${key_pass:-111111} export SSHPASS=$key_pass sshpass -e ssh-copy-id -i ~/.ssh/id_rsa.pub root@$key_sync -o StrictHostKeyChecking=no [ $? -ne 0 ] && echo "$key_sync add public key failure" >> /var/log/messages fi done k8s_version=`kubeadm version | grep -oP '(?<=GitVersion:"v)[\d+.]+'` echo '!#/bin/bash' > k8s.token kubeadm token create --ttl 0 --print-join-command >> k8s.token cat > nodes.yaml << EOF --- - hosts: '{{ hosts }}' vars: pkgs: - docker-ce - ntpdate - socat - kubectl-$k8s_version - kubeadm-$k8s_version - kubelet-$k8s_version tasks: - name: set kernel args shell: modprobe br_netfilter - name: set kernel args shell: echo 1 > /proc/sys/net/bridge/bridge-nf-call-iptables - name: set kernel args shell: echo 1 > /proc/sys/net/bridge/bridge-nf-call-ip6tables - name: copy docker repo copy: src=/etc/yum.repos.d/docker-ce.repo dest=/etc/yum.repos.d/ - name: copy k8s repo copy: src=/etc/yum.repos.d/kubernetes.repo dest=/etc/yum.repos.d/ - name: swapoff shell: swapoff -a - name: install k8s pkgs yum: name={{ pkgs }} state=present - name: set images source copy: src=/etc/docker/daemon.json dest=/etc/docker/ - name: daemon reload shell: systemctl daemon-reload - name: start docker service: name=docker state=restarted - name: shell shell: ntpdate ntp1.aliyun.com - name: shell shell: systemctl enable docker kubelet - name: join k8s cluster script: k8s.token EOF clear && sleep 2 ansible-playbook nodes.yaml -e 'hosts=k8s' && \ echo 'nodes join success' || \ echo 'nodes join failure' clear echo '-----install helm------' echo "Input helm version like v3.6.3....: " read -t 30 helm_version wget https://9133w.cn/sources/helm.sh wget https://9133w.cn/sources/tiller.yaml : ${helm_version:=v3.6.3} sh helm.sh -v $helm_version && \ kubectl apply -f tiller.yaml && \ sleep 10 && \ helm repo add stable https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts exit 0