One-liner Kubernetes Deployment in China aka OKDC v1.1

該v1.1版本,我使用起來挺好; 卻是新版本無所適從了,總是沒法使用。 該版本源碼,這裏保留一份。node

#!/bin/sh

VERSION=v1.1
GPG_FILE=RPM-GPG-KEY-k8s
ARCH=$(uname -m)
OS=$(lsb_release -is)
OS_VERSION=$(rpm -q --queryformat '%{VERSION}' centos-release 2>/dev/null)
MEM=$(cat /proc/meminfo |grep MemTotal|awk '{print $2}')
ADMIN_CONF=/etc/kubernetes/admin.conf
KUBELET_DROPLET=/etc/systemd/system/kubelet.service.d/99-kubelet-droplet.conf
OKDC_BASE=https://raw.githubusercontent.com/kubeup/okdc/master


# User tweakable vars
REPO=${REPO:-https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el$OS_VERSION-$ARCH}
REGISTRY_PREFIX=${REGISTRY_PREFIX:-registry.aliyuncs.com/archon}
DOCKER_MIRROR=${DOCKER_MIRROR:-$(python -c 'import json; d=json.load(open("/etc/docker/daemon.json")); print d.get("registry-mirrors",[])[0]' 2>/dev/null)}
K8S_VERSION=${K8S_VERSION:-v1.6.2}
PAUSE_IMG=${PAUSE_IMG:-$REGISTRY_PREFIX/pause-amd64:3.0}
HYPERKUBE_IMG=${HYPERKUBE_IMG:-$REGISTRY_PREFIX/hyperkube-amd64:$K8S_VERSION}
ETCD_IMG=${ETCD_IMG:-$REGISTRY_PREFIX/etcd:3.0.17}
KUBE_ALIYUN_IMG=${KUBE_ALIYUN_IMG:-registry.aliyuncs.com/kubeup/kube-aliyun}
POD_IP_RANGE=${POD_IP_RANGE:-10.244.0.0/16}
TOKEN=${TOKEN:-$(python -c 'import random,string as s;t=lambda l:"".join(random.choice(s.ascii_lowercase + s.digits) for _ in range(l));print t(6)+"."+t(16)')}

# Only required for node mode
MASTER=${MASTER}

readtty() {
	read "$@" </dev/tty
}

intro() {
cat <<-END
OKDC $VERSION by kubeup
One-liner Kubernetes Deployment in China
http://github.com/kubeup/okdc

END

if [ -z "$MASTER" ]; then
cat <<-END
This will help you provision Kubernetes $K8S_VERSION master on this machine. 

The following mirrors will be used due to inaccessibility of official resources.
$REPO
$HYPERKUBE_IMG
$ETCD_IMG

You will be prompted to input custom docker hub mirror and preferred network layer.

END

else
cat <<-END
This will help you provision Kubernetes $K8S_VERSION node on this machine.

The following mirrors will be used due to inaccessibility of official resources.
$REPO
$HYPERKUBE_IMG

Master: $MASTER
Token: $TOKEN

You will be prompted to input custom docker hub mirror

END
fi
}

pause() {
	readtty -p "Are you sure to continue? (y/N) " INPUT 
	[ "$INPUT" != "y" ] && echo "Abort" && exit 0
}

install_calico_with_etcd() {
	[ -z "$DOCKER_MIRROR" ] && echo "Can't install Calico without a docker mirror. Abort" && exit 3
	if [ $MEM -lt 1500000 ]; then
		readtty -n1 -p "Your memory is not really enough for running k8s master with Calico. This will result in serious performance issues. Are you sure? (y/N) " INPUT
		[ "$INPUT" != "y" ] && echo "Abort" && exit 3
	fi
	wget -O /tmp/calico.yaml http://docs.projectcalico.org/v2.1/getting-started/kubernetes/installation/hosted/kubeadm/1.6/calico.yaml
	sed -i "s/gcr\.io\/google_containers\/etcd:2\.2\.1/$ETCD_IMG/g" /tmp/calico.yaml
	sed -i "s/quay\.io\///g" /tmp/calico.yaml
	kubectl --kubeconfig=$ADMIN_CONF apply -f /tmp/calico.yaml
}

install_flannel() {
	wget -O /tmp/flannel.yaml https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
	sed -i "s/quay\.io\/coreos/${REGISTRY_PREFIX//\//\\/}/g" /tmp/flannel.yaml
	kubectl --kubeconfig=$ADMIN_CONF apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel-rbac.yml
	kubectl --kubeconfig=$ADMIN_CONF apply -f /tmp/flannel.yaml
}

install_network() {
	while :; do
		echo "Available network layer:"
		echo "1) Flannel"
		echo "2) Calico (mem>1.5G && requires a docker mirror)"
		echo "3) Skip "
		readtty -n1 -p "Choose one to install: " INPUT
		case $INPUT in
			1)
				install_flannel
				;;
			2)
				install_calico_with_etcd
				;;
			3)
				echo -e "\nSkipped."
				;;
			*)
				echo -e "\nHuh??"
				continue
		esac
		break
	done
	echo
}

setup_aliyun() {
#readtty -n 1 -p "Deploy kube-aliyun as well? (to enable SLB, Routes and Volumes support) (Y/n)? " ENABLE_KUBE_ALIYUN
#[ -z $ENABLE_KUBE_ALIYUN ] && ENABLE_KUBE_ALIYUN=y
#
#if [ "$ENABLE_KUBE_ALIYUN" = "y" ]; then
#  [ -n "$ALIYUN_ACCESS_KEY" ] && KEY_DEFAULT="(default: $ALIYUN_ACCESS_KEY)"
#  readtty -p "Aliyun Access Key?$KEY_DEFAULT " INPUT
#  ALIYUN_ACCESS_KEY=${INPUT:-$ALIYUN_ACCESS_KEY}
#  [ -z "$ALIYUN_ACCESS_KEY" ] && echo "Can't proceed without it" && exit 2
#
#  unset KEY_DEFAULT
#  [ -n "$ALIYUN_ACCESS_KEY_SECRET" ] && KEY_DEFAULT="(default: $ALIYUN_ACCESS_KEY_SECRET)"
#  readtty -p "Aliyun Access Key Secret?$KEY_DEFAULT " INPUT
#  ALIYUN_ACCESS_KEY_SECRET=${INPUT:-$ALIYUN_ACCESS_KEY_SECRET}
#  [ -z "$ALIYUN_ACCESS_KEY_SECRET" ] && echo "Can't proceed without it" && exit 2
#fi
	echo
}

update_yum() {
	# Update yum repo
	cat >/etc/pki/rpm-gpg/$GPG_FILE <<-END
	-----BEGIN PGP PUBLIC KEY BLOCK-----
	Version: GnuPG v1

	mQENBFWKtqgBCADmKQWYQF9YoPxLEQZ5XA6DFVg9ZHG4HIuehsSJETMPQ+W9K5c5
	Us5assCZBjG/k5i62SmWb09eHtWsbbEgexURBWJ7IxA8kM3kpTo7bx+LqySDsSC3
	/8JRkiyibVV0dDNv/EzRQsGDxmk5Xl8SbQJ/C2ECSUT2ok225f079m2VJsUGHG+5
	RpyHHgoMaRNedYP8ksYBPSD6sA3Xqpsh/0cF4sm8QtmsxkBmCCIjBa0B0LybDtdX
	XIq5kPJsIrC2zvERIPm1ez/9FyGmZKEFnBGeFC45z5U//pHdB1z03dYKGrKdDpID
	17kNbC5wl24k/IeYyTY9IutMXvuNbVSXaVtRABEBAAG0Okdvb2dsZSBDbG91ZCBQ
	YWNrYWdlcyBSUE0gU2lnbmluZyBLZXkgPGdjLXRlYW1AZ29vZ2xlLmNvbT6JATgE
	EwECACIFAlWKtqgCGy8GCwkIBwMCBhUIAgkKCwQWAgMBAh4BAheAAAoJEPCcOUw+
	G6jV+QwH/0wRH+XovIwLGfkg6kYLEvNPvOIYNQWnrT6zZ+XcV47WkJ+i5SR+QpUI
	udMSWVf4nkv+XVHruxydafRIeocaXY0E8EuIHGBSB2KR3HxG6JbgUiWlCVRNt4Qd
	6udC6Ep7maKEIpO40M8UHRuKrp4iLGIhPm3ELGO6uc8rks8qOBMH4ozU+3PB9a0b
	GnPBEsZdOBI1phyftLyyuEvG8PeUYD+uzSx8jp9xbMg66gQRMP9XGzcCkD+b8w1o
	7v3J3juKKpgvx5Lqwvwv2ywqn/Wr5d5OBCHEw8KtU/tfxycz/oo6XUIshgEbS/+P
	6yKDuYhRp6qxrYXjmAszIT25cftb4d4=
	=/PbX
	-----END PGP PUBLIC KEY BLOCK-----
	END

	cat >/etc/yum.repos.d/k8s.repo <<-END
	[kubernetes]																									
	name=Kubernetes Repo
	baseurl=$REPO
	enabled=1
	gpgkey=file:///etc/pki/rpm-gpg/$GPG_FILE						 
	gpgcheck=1
	END

	# Install stuff
	yum updateinfo
	yum install -y kubectl kubernetes-cni docker kubelet kubeadm
}

update_kubelet() {
	# Kubelet droplet
	mkdir -p $(dirname $KUBELET_DROPLET)
	cat >$KUBELET_DROPLET <<-END
	[Unit]
	Wants=flexv.service
	After=flexv.service
	[Service]
	Environment="KUBELET_NETWORK_ARGS=--network-plugin=kubenet"
	Environment="KUBELET_EXTRA_ARGS=--pod-infra-container-image=$PAUSE_IMG --cgroup-driver=systemd"
	END
	chmod +x $KUBELET_DROPLET
}

patch_kubelet() {
	# Due to an issue of kubeadm, we need to switch to cni network after kubeadm is done. #43815
	sed -i "/kubenet/d" $KUBELET_DROPLET 
	systemctl daemon-reload
}

restart_kubelet() {
	systemctl restart kubelet
}

set_accelerator() {
	if [ -n "$DOCKER_MIRROR" ]; then
		readtty -p "Docker registry mirror, ex. Aliyun accelerator? (default: $DOCKER_MIRROR) " INPUT
		[ -z "$INPUT" ] && echo "No changes made to registry mirror" && return
		DOCKER_MIRROR=$INPUT
	else
		readtty -p "Docker registry mirror, ex. Aliyun accelerator? (empty to skip) " DOCKER_MIRROR
	fi

# Docker accelerator
	if [ -n "$DOCKER_MIRROR" ]; then
		mkdir -p /etc/docker
		cat >/etc/docker/daemon.json <<-END
		{
		"registry-mirrors": ["$DOCKER_MIRROR"]
		}
		END
	fi
}

run_kubeadm() {
	# Kubeadm config
	cat >/tmp/kubeadm.conf <<-END
	apiVersion: kubeadm.k8s.io/v1alpha1
	kind: MasterConfiguration
	networking:
		podSubnet: $POD_IP_RANGE
	kubernetesVesion: $K8S_VERSION
	token: $TOKEN
	END

	KUBE_HYPERKUBE_IMAGE=$HYPERKUBE_IMG KUBE_ETCD_IMAGE=$ETCD_IMG KUBE_REPO_PREFIX=$REGISTRY_PREFIX kubeadm init --skip-preflight-checks --config /tmp/kubeadm.conf |tee /tmp/kubeadm.log
	MASTER_IP=$( grep "kubeadm join" /tmp/kubeadm.log|awk '{print $5}' )
}

run_kubeadm_node() {
	KUBE_HYPERKUBE_IMAGE=$HYPERKUBE_IMG KUBE_REPO_PREFIX=$REGISTRY_PREFIX kubeadm join --token $TOKEN $MASTER
}

enable_services() {
# Disable SELinux 
	setenforce 0

# Enable services
	systemctl daemon-reload
	systemctl enable docker && systemctl start docker
	systemctl enable kubelet && systemctl start kubelet
}

show_node_cmd() {
	[ -z "$MASTER_IP" ] && exit 3
  [ -n "$DOCKER_MIRROR" ] && TMP_MIRROR=" DOCKER_MIRROR=$DOCKER_MIRROR"
	echo
	echo Run the following command on your nodes to join the cluster
	echo
	echo "curl -s $OKDC_BASE/okdc-centos.sh|TOKEN=$TOKEN MASTER=$MASTER_IP$TMP_MIRROR sh"
}

check_env() {
	if [ "$OS" != "CentOS" ]; then
		echo "This script only works on CentOS" 1>&2
		exit 1
	fi

	if [ "$(id -u)" != "0" ]; then
		 echo "This script must be run as root" 1>&2
		 exit 1
	fi
}

check_node_prerequisite() {
  [ -z "$MASTER" ] && echo "MASTER is required but not defined" && exit 4
  [ -z "$TOKEN" ] && echo "TOKEN is required but not defined" && exit 4
}

run_master() {
	intro

  check_env
	pause

	update_yum
	set_accelerator
	update_kubelet
	enable_services
	run_kubeadm
	patch_kubelet
  restart_kubelet
	install_network
	
	show_node_cmd
  echo "Done"
}

run_node() {
	intro

  check_env
  check_node_prerequisite
	pause

	update_yum
	set_accelerator
	update_kubelet
  patch_kubelet
	enable_services
	run_kubeadm_node
	
  echo "Done"
}

if [ -n "$MASTER" ]; then
  run_node
else
  run_master
fi
相關文章
相關標籤/搜索