您的位置:首页 > 运维架构 > Shell

Shell脚本快速部署Kubernetes集群系统

2016-01-26 22:10 971 查看
本文紧跟上节所讲的手动部署Kubernetes管理Docker篇所写,本篇主要内容利用Shell脚本完成快速部署Kubernetes集群。上节博文看过的朋友也能感觉到部署过程相对比较简单,那么,出于简化工作流程,推进运维自动化角度来说,于是花了2/3天时间写这个部署Kubernetes脚本。
运维工作中,常常会遇到部署各种各样的服务,建议:常规部署都应该尽量使用脚本完成,一方面提高自身脚本编写能力,另一方面推进运维自动化。
详细部署说明文档:/article/4398419.html
提醒:即使按照本篇文章一步一步做,也不一定部署成功。原因你懂得!如果失败,也建议你仔细看看脚本内容,从中寻找解决办法。同时,相信你也会从脚本中获取到其他有价值的信息。
实验环境:
操作系统:Ubuntu14.04_x64
master:192.168.1.150
minion01 : 192.168.1.151 容器网段:172.17.1.0/24
minion02 : 192.168.1.152 容器网段:172.17.2.0/24
安装包下载:

etcd:http://pan.baidu.com/s/1c1wITMwkubernetes:http://pan.baidu.com/s/1kUoxgYb相关脚本下载:http://pan.baidu.com/s/1o7nEaca脚本说明:config_ssh_root_remote.sh #配置root SSH登录(默认ubuntu系统禁止root SSH登录)
ssh_keypair_auth.sh #配置master主机与minion主机SSH免交互认证
kubernetes-install.sh #安装kubernetes的master端与minion端
config_gre_channel.sh #配置两台Docker主机容器实现跨主机访问(OVS)

安装步骤(请按照步骤做):
1)在minion主机root权限开启root允许SSH远程登录
操作命令:$ sudo bash config_ssh_root_remote.sh
脚本内容:$ cat config_ssh_root_remote.sh
#!/bin/bash
# Description: configuration root account ssh remote login
if [ $USER != "root" ]; then
echo "Please use root account operation or sudo!"
exit 1
fi
function color_echo() {
if [ $1 == "green" ]; then
echo -e "\033[32;40m$2\033[0m"
elif [ $1 == "red" ]; then
echo -e "\033[31;40m$2\033[0m"
fi
}
function check_pkg() {
if ! $(dpkg -l $PKG_NAME >/dev/null 2>&1); then
echo no
else
echo yes
fi
}
function install_pkg() {
local PKG_NAME=$1
if [ $(check_pkg $PKG_NAME) == "no" ]; then
apt-get install $PKG_NAME -y
if [ $(check_pkg $PKG_NAME) == "no" ]; then
color_echo green "$PKG_NAME installation failure! Try to install again."
apt-get autoremove && apt-get update
apt-get install $PKG_NAME --force-yes -y
[ $(check_pkg $PKG_NAME) == "no" ] && color_echo red "The $PKG_NAME installation failure!" && exit 1
fi
fi
}
install_pkg expect
# modify ssh config file
sed -r -i 's/(PermitRootLogin).*/\1 yes/' /etc/ssh/sshd_config
service ssh restart >/dev/null
# set root account password
echo "------------------------------------------------------>"
while true; do
read -p "Please enter you want to set the root account password: " ROOT_PASS
if [ -n "$ROOT_PASS" ]; then
break
else
color_echo red "Password cannot be empty!"
continue
fi
done
expect -c "
spawn passwd root
expect {
\"Enter new UNIX password:\" {send \"$ROOT_PASS\r\"; exp_continue}
\"Retype new UNIX password:\" {send \"$ROOT_PASS\r\"}
}
expect eof
" >/dev/null
color_echo green "The root account password is: $ROOT_PASS"
2)在master主机切换到root用户执行脚本与minion主机root用户建立SSH免交互登录
操作命令:# bash ssh_keypair_auth.sh root@192.168.1.151-152@123
脚本内容:# cat ssh_keypair_auth.sh
#!/bin/bash
# Description: configuration local host and remote host ssh keypair authentication, Support Ubuntu and CentOS operation system.
function color_echo() {
if [ $1 == "green" ]; then
echo -e "\033[32;40m$2\033[0m"
elif [ $1 == "red" ]; then
echo -e "\033[31;40m$2\033[0m"
fi
}
function os_version() {
local OS_V=$(cat /etc/issue |awk 'NR==1{print $1}')
if [ $OS_V == "\S" -o $OS_V == "CentOS" ]; then
echo "CentOS"
elif [ $OS_V == "Ubuntu" ]; then
echo "Ubuntu"
fi
}
function check_ssh_auth() {
if $(grep "Permission denied" $EXP_TMP_FILE >/dev/null); then
color_echo red "Host $IP SSH authentication failure! Login password error."
exit 1
elif $(ssh $INFO 'echo yes >/dev/null'); then
color_echo green "Host $IP SSH authentication successfully."
fi
rm $EXP_TMP_FILE >/dev/null
}
function check_pkg() {
local PKG_NAME=$1
if [ $(os_version) == "CentOS" ]; then
if ! $(rpm -ql $PKG_NAME >/dev/null 2>&1); then
echo no
else
echo yes
fi
elif [ $(os_version) == "Ubuntu" ]; then
if ! $(dpkg -l $PKG_NAME >/dev/null 2>&1); then
echo no
else
echo yes
fi
fi
}
function install_pkg() {
local PKG_NAME=$1
if [ $(os_version) == "CentOS" ]; then
if [ $(check_pkg $PKG_NAME) == "no" ]; then
yum install $PKG_NAME -y
if [ $(check_pkg $PKG_NAME) == "no" ]; then
color_echo green "The $PKG_NAME installation failure! Try to install again."
yum makecache
yum install $PKG_NAME -y
[ $(check_pkg $PKG_NAME) == "no" ] && color_echo red "The $PKG_NAME installation failure!" && exit 1
fi
fi
elif [ $(os_version) == "Ubuntu" ]; then
if [ $(check_pkg $PKG_NAME) == "no" ]; then
apt-get install $PKG_NAME -y
if [ $(check_pkg $PKG_NAME) == "no" ]; then
color_echo green "$PKG_NAME installation failure! Try to install again."
apt-get autoremove && apt-get update
apt-get install $PKG_NAME --force-yes -y
[ $(check_pkg $PKG_NAME) == "no" ] && color_echo red "The $PKG_NAME installation failure!" && exit 1
fi
fi
fi
}
function generate_keypair() {
if [ ! -e ~/.ssh/id_rsa.pub ]; then
color_echo green "The public/private rsa key pair not exist, start Generating..."
expect -c "
spawn ssh-keygen
expect {
\"ssh/id_rsa):\" {send \"\r\";exp_continue}
\"passphrase):\" {send \"\r\";exp_continue}
\"again:\" {send \"\r\";exp_continue}
}
" >/dev/null 2>&1
if [ -e ~/.ssh/id_rsa.pub ]; then
color_echo green "Generating public/private rsa key pair successfully."
else
color_echo red "Generating public/private rsa key pair failure!"
exit 1
fi
fi
}
EXP_TMP_FILE=/tmp/expect_ssh.tmp
if [[ $1 =~ ^[a-z]+@[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}@.* ]]; then
install_pkg expect ; generate_keypair
for i in $@; do
USER=$(echo $i|cut -d@ -f1)
IP=$(echo $i|cut -d@ -f2)
PASS=$(echo $i|cut -d@ -f3)
INFO=$USER@$IP
expect -c "
spawn ssh-copy-id $INFO
expect {
\"(yes/no)?\" {send \"yes\r\";exp_continue}
\"password:\" {send \"$PASS\r\";exp_continue}
}
" > $EXP_TMP_FILE  # if login failed, login error info append temp file
check_ssh_auth
done
elif [[ $1 =~ ^[a-z]+@[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}-[0-9]{1,3}@.* ]]; then
install_pkg expect ; generate_keypair
START_IP_NUM=$(echo $1|sed -r 's/.*\.(.*)-(.*)@.*/\1/')
END_IP_NUM=$(echo $1|sed -r 's/.*\.(.*)-(.*)@.*/\2/')
for ((i=$START_IP_NUM;i<=$END_IP_NUM;i++)); do
USER=$(echo $1|cut -d@ -f1)
PASS=$(echo $1|cut -d@ -f3)
IP_RANGE=$(echo $1|sed -r 's/.*@(.*\.).*/\1/')
IP=$IP_RANGE$i
INFO=$USER@$IP_RANGE$i
expect -c "
spawn ssh-copy-id $INFO
expect {
\"(yes/no)?\" {send \"yes\r\";exp_continue}
\"password:\" {send \"$PASS\r\";exp_continue}
}
" > $EXP_TMP_FILE
check_ssh_auth
done
else
echo "Example1: $0 <root@192.168.1.10-15@password>"
echo "Example2: $0 <root@192.168.1.10@password>"
echo "Example3: $0 [root@192.168.1.10@password root@192.168.1.11@password root@192.168.1.12@password ...]"
fi
3)在master主机root权限执行脚本安装master端服务
操作命令:$ sudo bash kubernetes-install.sh master
脚本内容:$ cat kubernetes-install.sh
#!/bin/bash
# Description: Installation Kubernetes1.1.3
# Etcd Download: https://github.com/coreos/etcd/releases/download/v2.2.2/etcd-v2.2.2-linux-amd64.tar.gz # K8S Download: https://storage.googleapis.com/kubernetes-release/release/v1.1.3/kubernetes.tar.gz . /lib/lsb/init-functions
if [ $(cat /etc/issue |awk '{print $1}') != "Ubuntu" ]; then
echo "Only support ubuntu operating system!"
exit 1
fi
if [ $USER != "root" ]; then
echo "Please use root account operation!"
exit 1
fi
function color_echo() {
if [ $1 == "green" ]; then
echo -e "\033[32;40m$2\033[0m"
elif [ $1 == "red" ]; then
echo -e "\033[31;40m$2\033[0m"
fi
}
function check_install_pkg() {
if [ ! -e $ETCD_FILE -a ! -e $K8S_FILE ]; then
color_echo red "$ETCD_FILE and $K8S_FILE file not exist!"
exit 1
elif [ ! -e $ETCD_FILE ]; then
color_echo red "$ETCD_FILE file not exist!"
exit 1
elif [ ! -e $K8S_FILE ]; then
color_echo red "$K8S_FILE file not exist!"
exit 1
fi
}
function local_ip() {
local NUM ARRAY_LENGTH
NUM=0
for NIC_NAME in $(ls /sys/class/net|grep -vE "lo|docker0"); do
NIC_IP=$(ifconfig $NIC_NAME |awk -F'[: ]+' '/inet addr/{print $4}')
if [ -n "$NIC_IP" ]; then
NIC_IP_ARRAY[$NUM]="$NIC_NAME:$NIC_IP"
let NUM++
fi
done
ARRAY_LENGTH=${#NIC_IP_ARRAY[*]}
if [ $ARRAY_LENGTH -eq 1 ]; then
LOCAL_IP=${NIC_IP_ARRAY[0]#*:}
return 0
elif [ $ARRAY_LENGTH -eq 0 ]; then
color_echo red "No available network card!"
exit 1
else
# multi network card select
for NIC in ${NIC_IP_ARRAY[*]}; do
echo $NIC
done
while true; do
read -p "Please enter local use to network card name: " INPUT_NIC_NAME
for NIC in ${NIC_IP_ARRAY[*]}; do
NIC_NAME=${NIC%:*}
if [ $NIC_NAME == "$INPUT_NIC_NAME" ]; then
LOCAL_IP=${NIC_IP_ARRAY[0]#*:}
return 0
fi
done
echo "Not match! Please input again."
done
fi
}
function check_ip() {
local IP=$1
VALID_CHECK=$(echo $IP|awk -F. '$1<=255&&$2<=255&&$3<=255&&$4<=255{print "yes"}')
if echo $IP|grep -E "^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$" >/dev/null; then
if [ ${VALID_CHECK:-no} == "yes" ]; then
return 0
else
echo "IP $IP not available!"
return 1
fi
else
echo "IP format error!"
return 1
fi
}
function cluster_ip() {
if [ $1 == "master" ]; then
while true; do
read -p "Please enter master IP: " MASTER_IP
check_ip $MASTER_IP
[ $? -eq 0 ] && break
done
elif [ $1 == "minion" ]; then
while true; do
local MINION_NUM
read -p "Please enter cluster minion node number: " MINION_NUM
if [[ $MINION_NUM =~ ^[0-9]+$ ]]; then
break
else
color_echo red "Format error!"
fi
done
NUM=1
while [ $NUM -le $MINION_NUM ]; do
local MINION_IP
read -p "Please enter minion host $NUM IP: " MINION_IP
check_ip $MINION_IP
if [ $? -eq 0 ]; then
let NUM++
MINION_IP_ARRAY+=($MINION_IP)
fi
done
fi
}
function modify_init_script() {
if [ $1 == "master" ]; then
cd $MASTER_MODULE_INIT_SCRIPT_DIR
elif [ $1 == "minion" ]; then
cd $MINION_MODULE_INIT_SCRIPT_DIR
fi
for MODULE_INIT_SCRIPT in $(ls|grep -v etcd); do
if [ -x $MODULE_INIT_SCRIPT ]; then
sed -r -i '/\/sbin\/initctl/{s/(if)(.*)/\1 false \&\&\2/}' $MODULE_INIT_SCRIPT
fi
done
}
function check_service_status() {
sleep 1
if [ $(ps -ef |grep -v grep|grep -c "$BIN_DIR/$MODULE_INIT_SCRIPT") -eq 1 ]; then
log_begin_msg "Starting $MODULE_INIT_SCRIPT"
log_end_msg 0 # 0 is the right command execution status
else
log_failure_msg "$(color_echo red "Starting $MODULE_INIT_SCRIPT")"
log_end_msg 1 # 1 is the wrong command execution status
fi
}
function check_exec_status() {
if [ $? -ne 0 ]; then
color_echo green "Please try to run the script!"
exit 1
fi
}
BASE_DIR=$PWD
ETCD_FILE=$BASE_DIR/etcd-v2.2.2-linux-amd64.tar.gz
K8S_FILE=$BASE_DIR/kubernetes.tar.gz
BIN_DIR=/opt/bin
INIT_SCRIPT_DIR=/etc/init.d
OPTS_FILE_DIR=/etc/default
MODULE_BIN_DIR=$BASE_DIR/kubernetes/server/bin
MASTER_MODULE_INIT_SCRIPT_DIR=$BASE_DIR/kubernetes/cluster/ubuntu/master/init_scripts
MINION_MODULE_INIT_SCRIPT_DIR=$BASE_DIR/kubernetes/cluster/ubuntu/minion/init_scripts
case $1 in
master)
check_install_pkg
pkill etcd ; pkill kube
cluster_ip minion
# Create binary file directory
[ ! -d $BIN_DIR ] && mkdir $BIN_DIR
# Installation storage system etcd
log_action_msg "Unzip the $ETCD_FILE"
tar zxf $ETCD_FILE ; check_exec_status
cp $BASE_DIR/etcd-v2.2.2-linux-amd64/etc* $BIN_DIR ; check_exec_status
echo "
ETCD_OPTS=\"\
--listen-client-urls http://0.0.0.0:4001 \
--advertise-client-urls http://0.0.0.0:4001 \
--data-dir /var/lib/etcd/default.etcd\"
" > $OPTS_FILE_DIR/etcd
# Installation module kube-apiserver kube-scheduler and kube-controller-manager
log_action_msg "Unzip the $K8S_FILE"
tar zxf $BASE_DIR/kubernetes.tar.gz ; check_exec_status
tar zxf $BASE_DIR/kubernetes/server/kubernetes-server-linux-amd64.tar.gz ; check_exec_status
cd $MODULE_BIN_DIR && cp -a kubectl kube-apiserver kube-scheduler kube-controller-manager $BIN_DIR ; check_exec_status
# Configure init scripts
modify_init_script master
cp -a etcd kube-* $INIT_SCRIPT_DIR ; check_exec_status
sed -i '63s/.*/"/' $INIT_SCRIPT_DIR/etcd  #Remove the append log file,Otherwise etcd may cannot be started
# Module Configure option
log_action_msg "Create $OPTS_FILE_DIR/kube-apiserver startup options file ..."
echo "
KUBE_APISERVER_OPTS=\"\
--insecure-bind-address=0.0.0.0 \
--insecure-port=8080 \
--service-cluster-ip-range=10.0.0.0/16 \
--etcd_servers=http://127.0.0.1:4001 \
--logtostderr=true\"
" > $OPTS_FILE_DIR/kube-apiserver
check_exec_status
log_action_msg "Create $OPTS_FILE_DIR/kube-controller-manager startup options file ..."
echo "
KUBE_CONTROLLER_MANAGER_OPTS=\"\
--master=127.0.0.1:8080 \
--logtostderr=true\"
" > $OPTS_FILE_DIR/kube-controller-manager
log_action_msg "Create $OPTS_FILE_DIR/kube-scheduler startup options file ..."
echo "
KUBE_SCHEDULER_OPTS=\"\
--master=127.0.0.1:8080 \
--logtostderr=true\"
" > $OPTS_FILE_DIR/kube-scheduler
# Starting module
for MODULE_INIT_SCRIPT in $(ls $INIT_SCRIPT_DIR|grep -E "(etcd|kube.*)"); do
service $MODULE_INIT_SCRIPT start >/dev/null
check_service_status
done
# set variable
echo "export PATH=$PATH:$BIN_DIR" >> /etc/profile
. /etc/profile
# Copy module kubelet and kube-proxy to minion
SSH_OPTS="-o ConnectTimeout=1 -o ConnectionAttempts=3"
cd $MODULE_BIN_DIR
for MINION_IP in ${MINION_IP_ARRAY[*]}; do
log_action_msg "Copy module to $MINION_IP:$BIN_DIR ..."
ssh $SSH_OPTS root@$MINION_IP "mkdir $BIN_DIR 2>/dev/null" ; check_exec_status
scp $SSH_OPTS kubelet kube-proxy root@$MINION_IP:$BIN_DIR
done
# Copy module init scripts to minion
modify_init_script minion
cd $MINION_MODULE_INIT_SCRIPT_DIR
for MINION_IP in ${MINION_IP_ARRAY[*]}; do
log_action_msg "Copy module init scripts to $MINION_IP:$INIT_SCRIPT_DIR ..."
scp $SSH_OPTS kubelet kube-proxy root@$MINION_IP:$INIT_SCRIPT_DIR ; check_exec_status
done
color_echo green "Kubernetes master installation complete."
;;
minion)
cluster_ip master # Notice input master ip
local_ip
pkill kube
# Install Docker
if ! $(dpkg -l docker-engine >/dev/null 2>&1) && ! $(docker info >/dev/null 2>&1); then
log_action_msg "Start the installation Docker ..."
apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D >/dev/null 2>&1
[ $? -ne 0 ] && echo "Docker source secret key register failure!"
DOCKER_U_SOURCE=/tmp/docker_source.tmp
echo "
deb https://apt.dockerproject.org/repo ubuntu-precise main
deb https://apt.dockerproject.org/repo ubuntu-trusty main
deb https://apt.dockerproject.org/repo ubuntu-vivid main
deb https://apt.dockerproject.org/repo ubuntu-wily main
" > $DOCKER_U_SOURCE
OS_CODE_V=$(lsb_release -cs)
DOKER_SOURCE=$(grep $OS_CODE_V $DOCKER_U_SOURCE)
echo "$DOKER_SOURCE" > /etc/apt/sources.list.d/docker.list
rm $DOCKER_U_SOURCE
apt-get update
apt-get install docker-engine  -y
if $(dpkg -l docker-engine >/dev/null) && $(docker info >/dev/null); then
color_echo green "Docker installation successfully."
else
apt-get remove ; apt-get install docker-engine --force-yes -y
if ! $(dpkg -l docker-engine >/dev/null) && ! $(docker info >/dev/null); then
color_echo red "Docker installation failure!"
exit 1
fi
fi
fi
# Module Configure option
log_action_msg "Create $OPTS_FILE_DIR/kubelet startup options file ..."
echo "
KUBELET_OPTS=\"\
--address=0.0.0.0 \
--port=10250 \
--hostname_override=$LOCAL_IP \
--api_servers=http://$MASTER_IP:8080 \
--pod-infra-container-image=docker.io/kubernetes/pause:latest \
--logtostderr=true\"
" > $OPTS_FILE_DIR/kubelet
log_action_msg "Create $OPTS_FILE_DIR/kube-proxy startup options file ..."
echo "
KUBE_PROXY_OPTS=\"\
--master=http://$MASTER_IP:8080 \
--proxy-mode=iptables \
--logtostderr=true\"
" > $OPTS_FILE_DIR/kube-proxy
# Starting module
for MODULE_INIT_SCRIPT in $(ls $INIT_SCRIPT_DIR|grep kube.*); do
service $MODULE_INIT_SCRIPT start >/dev/null
check_service_status
done
color_echo green "Kubernetes minion installation complete."
;;
*)
echo "Usage: $0 {master|minion}"
exit 1
;;
esac
4)在minion主机root权限执行脚本安装minion端服务
操作命令:$ sudo bash kubernetes-install.sh minion
脚本内容:同上
5)在minion主机root权限执行脚本创建GRE通道
操作命令:$ sudo bash config_gre_channel.sh
脚本内容:$ cat config_gre_channel.sh
#!/bin/bash
# Description: configuration docker host between GRE Channel
if [ $(cat /etc/issue |awk '{print $1}') != "Ubuntu" ]; then
echo "Only support ubuntu operating system!"
exit 1
fi
if [ $USER != "root" ]; then
echo "Please use root account operation!"
exit 1
fi
function color_echo() {
if [ $1 == "green" ]; then
echo -e "\033[32;40m$2\033[0m"
elif [ $1 == "red" ]; then
echo -e "\033[31;40m$2\033[0m"
fi
}
function check_ip() {
local IP=$1
local VALID_CHECK=$(echo $IP|awk -F. '$1<=255&&$2<=255&&$3<=255&&$4<=255{print "yes"}')
if echo $IP|grep -E "^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$" >/dev/null; then
if [ ${VALID_CHECK:-no} == "yes" ]; then
return 0
else
echo "IP $IP not available!"
return 1
fi
else
echo "IP format error!"
return 1
fi
}
function docker_host_ip() {
color_echo green "Notice: Only support two Docker host configuration GRE Channel!"
NUM=1
while [ $NUM -le 2 ]; do
local DOCKER_IP
read -p "Please enter Docker host $NUM IP: " DOCKER_HOST_IP
check_ip $DOCKER_HOST_IP
if [ $? -eq 0 ]; then
let NUM++
DOCKER_HOST_IP_ARRAY+=($DOCKER_HOST_IP)
fi
done
}
function local_nic_info() {
local NUM ARRAY_LENGTH
NUM=0
for NIC_NAME in $(ls /sys/class/net|grep -vE "lo|docker0"); do
NIC_IP=$(ifconfig $NIC_NAME |awk -F'[: ]+' '/inet addr/{print $4}')
if [ -n "$NIC_IP" ]; then
NIC_IP_ARRAY[$NUM]="$NIC_NAME:$NIC_IP"
let NUM++
fi
done
ARRAY_LENGTH=${#NIC_IP_ARRAY[*]}
if [ $ARRAY_LENGTH -eq 1 ]; then
LOCAL_NIC=${NIC_IP_ARRAY[0]%:*}
LOCAL_IP=${NIC_IP_ARRAY[0]#*:}
return 0
elif [ $ARRAY_LENGTH -eq 0 ]; then
color_echo red "No available network card!"
exit 1
else
# multi network card select
for NIC in ${NIC_IP_ARRAY[*]}; do
echo $NIC
done
while true; do
read -p "Please enter local use to network card name: " INPUT_NIC_NAME
for NIC in ${NIC_IP_ARRAY[*]}; do
NIC_NAME=${NIC%:*}
if [ $NIC_NAME == "$INPUT_NIC_NAME" ]; then
LOCAL_NIC=${NIC_IP_ARRAY[0]%:*}
LOCAL_IP=${NIC_IP_ARRAY[0]#*:}
return 0
fi
done
echo "Not match! Please input again."
done
fi
}
function check_pkg() {
if ! $(dpkg -l $PKG_NAME >/dev/null 2>&1); then
echo no
else
echo yes
fi
}
function install_pkg() {
local PKG_NAME=$1
if [ $(check_pkg $PKG_NAME) == "no" ]; then
apt-get install $PKG_NAME -y
if [ $(check_pkg $PKG_NAME) == "no" ]; then
color_echo green "The $PKG_NAME installation failure! Try to install again."
apt-get autoremove && apt-get update
apt-get install $PKG_NAME --force-yes -y
[ $(check_pkg $PKG_NAME) == "no" ] && color_echo red "The $PKG_NAME installation failure!" && exit 1
fi
fi
}
function config_gre_channel() {
install_pkg openvswitch-switch
install_pkg bridge-utils
if [ ${DOCKER_HOST_IP_ARRAY[0]} == "$LOCAL_IP" ]; then
REMOTE_HOST_IP=${DOCKER_HOST_IP_ARRAY[1]}  # remote host ip
REMOTE_DOCKER_IP="172.17.2.0/24"   # remote docker host default container ip range
LOCAL_DOCKER_IP="172.17.1.0"    # kbr0 gateway
elif [ ${DOCKER_HOST_IP_ARRAY[1]} == "$LOCAL_IP" ]; then
REMOTE_HOST_IP=${DOCKER_HOST_IP_ARRAY[0]}
REMOTE_DOCKER_IP="172.17.1.0/24"
LOCAL_DOCKER_IP="172.17.2.0"
else
echo "IP not match! Please input again."
exit 1
fi
ovs-vsctl add-br obr0 2>/dev/null
ovs-vsctl add-port obr0 gre0 -- set Interface gre0 type=gre options:remote_ip=$REMOTE_HOST_IP 2>/dev/null
brctl addbr kbr0 2>/dev/null
brctl addif kbr0 obr0 2>/dev/null
ip link set dev kbr0 up
if [ $(grep -cE "kbr0" /etc/network/interfaces) -ne 2 ]; then
echo "
auto kbr0
iface kbr0 inet static
address $(echo $LOCAL_DOCKER_IP|sed 's/0$/1/')
netmask 255.255.255.0
gateway $LOCAL_DOCKER_IP
bridge_ports obr0
" >> /etc/network/interfaces
fi
if $(ls /sys/class/net|grep docker0 >/dev/null); then
service docker stop >/dev/null
ip link set dev docker0 down
ip link delete dev docker0
echo "DOCKER_OPTS=\"-b=kbr0\"" > /etc/default/docker
service docker start >/dev/null
fi
ifdown kbr0 >/dev/null 2>&1;ifup kbr0 >/dev/null 2>&1
# reboot invalid
# ip route add $REMOTE_DOCKER_IP via $REMOTE_HOST_IP dev $LOCAL_NIC 2>/dev/null
# permanent valid
if ! $(grep "$REMOTE_DOCKER_IP via $REMOTE_HOST_IP" /etc/rc.local >/dev/null); then
sed -i "$i\ip route add $REMOTE_DOCKER_IP via $REMOTE_HOST_IP dev $LOCAL_NIC" /etc/rc.local
fi
}
# main
docker_host_ip
echo "--------------------------------------------"
local_nic_info
config_gre_channel
color_echo green "GRE Channel configuration complete."
brctl show
echo "-------------------------------------------------"
ovs-vsctl show
1、配置minion主机root SSH登录
先将config_gre_channel.sh、config_ssh_root_remote.sh和kubernetes-install.sh这三个文件上传各自的minion主机,以备后用。






说明:操作成功,root密码为123
2、配置master主机与minion主机SSH免交互认证
将kubernetes-install.sh、ssh_keypair_auth.sh和etcd-v2.2.2-linux-amd64.tar.gz、kubernetes.tar.gz安装包上传到master主机



3、安装master端






说明:先解压文件,在创建启动选项文件,再启动服务,最后将minion相关包通过scp工具拷贝过去。通过ps工具看到服务进程已经启动。
4、安装minion端















说明:Docker源秘钥注册失败,没关系,一般不会影响安装。当提示安装docker成功后才能继续,否则报错退出。通过ps 工具看到服务进程都已经启动。

5、配置GRE通道













说明:目前配置GRE通道脚本只支持两台Docker主机

6、查看集群是否配置成功
# 通过kubectl命令创建一个pod






说明:在master端可以看到两台minion端状态是Ready,并且创建的Pod已经成功运行。
注意:如果没有kubectl命令,先尝试执行source /etc/profile下看看,如果还没有,直接使用/opt/bin/kubectl

博客地址:http://lizhenliang.blog.51cto.com

脚本bug有待您的发现,欢迎留言!谢谢

本文出自 “李振良的技术博客” 博客,请务必保留此出处http://lizhenliang.blog.51cto.com/7876557/1738807
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: