脚本一键部署k8s集群

在开始之前,部署kubernetes集群机器需要满足以下几个条件:

  • 一台或多台机器,操作系统CentOS 7.x-86_x64
  • 硬件配置:2GB或更多RAM,2个CPU或更多CPU,硬盘30GB或更多
  • 操作系统内核kernel升级到4.19+(可忽略)
  • 集群中所有机器之间网络互通
  • 可以访问外网,拉取镜像
  • 禁止swap分区

1、将脚本上传到master节点上,然后执行:

chmod +x install_k8s_master.sh
sh -x install_k8s_master.sh

安装时需要指定安装的版本信息:

安装docker安装k8s时均需手动输入

master节点:

#!/bin/bash
# Kubernetes部署环境要求:
#(1)一台或多台机器,操作系统CentOS 7.x-86_x64
#(2)硬件配置:内存2GB或2G+,CPU 2核或CPU 2核+;
#(3)集群内各个机器之间能相互通信;
#(4)集群内各个机器可以访问外网,需要拉取镜像;
#(5)禁止swap分区;
 
# 安装步骤
#1. 安装docker
#1.1 如果没有安装docker,则安装docker。会附带安装一个docker-compose
#
#2. 安装k8s
#2.1 初始化环境
#2.2 添加安装源
#2.3 安装kubelet、kubectl、kubeadmin
#2.4 安装master
#2.5 安装网络插件

#k8s与docker驱动须保持一致
#查看docker驱动docker info | grep "Cgroup Driver"
#k8s v1.22之前使用的是cgroupfs,v1.22之后默认使用的是systemd
 
set -e
 
# 安装日志
install_log=/var/log/install_k8s.log
tm=$(date +'%Y%m%d %T')
 
# 日志颜色
COLOR_G="\x1b[0;32m"  # green
RESET="\x1b[0m"
 
function info(){
    echo -e "${COLOR_G}[$tm] [Info] ${1}${RESET}"
}
 
function run_cmd(){
  sh -c "$1 | $(tee -a "$install_log")"
}
 
function run_function(){
  $1 | tee -a "$install_log"
}
 
function install_docker(){
  info "1.时间同步"
  yum install ntpdate -y
  ntpdate time.windows.com

  info "2.使用脚本自动安装docker..."
  wget -O /etc/yum.repos.d/CentOS-Base.repo https://repo.huaweicloud.com/repository/conf/CentOS-7-reg.repo
  yum install -y yum-utils device-mapper-persistent-data lvm2
  yum-config-manager --add-repo https://sandbox-expriment-files.obs.cn-north-1.myhuaweicloud.com:443/use-framework-upgrade/docker-ce.repo
  yum -y install docker-ce-${docker_version} docker-ce-cli-${docker_version} containerd.io docker-compose-plugin
 
  info "3.启动 Docker CE..."
  sudo systemctl enable docker
  sudo systemctl start docker
 
  info "4.添加镜像加速器..."
  if [ ! -f "/etc/docker/daemon.json" ];then
    touch /etc/docker/daemon.json
  fi
  cat <<EOF > /etc/docker/daemon.json
{
  "registry-mirrors": [
    "https://fyn26q1f.mirror.aliyuncs.com"
    ]
}
EOF
 
  info "5.重新启动服务..."
  sudo systemctl daemon-reload
  sudo systemctl restart docker
 
  info "6.测试 Docker 是否安装正确..."
  docker run hello-world
 
  info "7.检测..."
  docker info
 
  read -p "是否安装docker-compose?默认为 no. Enter [yes/no]:" is_compose
  if [[ "$is_compose" == 'yes' ]];then
    info "7.安装docker-compose"
    sudo curl -L https://mirrors.aliyun.com/docker-toolbox/linux/compose/1.21.2/docker-compose-Linux-x86_64 -o /usr/local/bin/docker-compose
    sudo chmod a+x /usr/local/bin/docker-compose
 
    # 8.验证是否安装成功
    info "8.验证docker-compose是否安装成功..."
    docker-compose -v
  fi
}
 
function install_k8s() {
    info "初始化k8s部署环境..."
    init_env
 
    info "添加k8s安装源..."
    add_aliyun_repo
 
    info "安装kubelet kubeadmin kubectl..."
    install_kubelet_kubeadmin_kubectl
 
    info "安装kubernetes master..."
    yum -y install net-tools
    if [[ ! "$(ps aux | grep 'kubernetes' | grep -v 'grep')" ]];then
      kubeadmin_init
    else
      info "kubernetes master已经安装..."
    fi
 
    info "安装网络插件calico..."
    install_calico

    info "查看Token令牌..."
    print_token
 
    #info "去污点..."
    #kubectl taint nodes --all node-role.kubernetes.io/master-
}

# 初始化部署环境
function init_env() {
  info "关闭防火墙"
  systemctl stop firewalld
  systemctl disable firewalld
 
  info "关闭selinux"
  sed -i 's/^SELINUX=enforcing$/SELINUX=disabled/g' /etc/selinux/config
  source /etc/selinux/config
 
  info "关闭swap(k8s禁止虚拟内存以提高性能)"
  swapoff -a
  sed -i '/swap/s/^/#/'  /etc/fstab
 
  info "设置网桥参数"
  cat <<-EOF > /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables=1     
net.bridge.bridge-nf-call-ip6tables=1
net.ipv4.ip_forward=1
vm.swappiness=0
vm.overcommit_memory=1
EOF
  sysctl --system  #生效
 
  info "时间同步"
  yum install ntpdate -y
  ntpdate time.windows.com

# k8s官方建议docker驱动采用systemd,建议修改。
cat >/etc/docker/daemon.json<<'EOF'
{
"exec-opts": ["native.cgroupdriver=systemd"],
"registry-mirrors": ["https://fyn26q1f.mirror.aliyuncs.com"],
"log-driver": "json-file",
"log-opts": {"max-size": "100m"},
"storage-driver": "overlay2"
}
EOF
systemctl daemon-reload && systemctl restart docker && systemctl enable docker
}

# 添加aliyun安装源
function add_aliyun_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=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
}

function install_kubelet_kubeadmin_kubectl() {
  yum install kubelet-${k8s_version} kubeadm-${k8s_version} kubectl-${k8s_version} -y
  systemctl enable kubelet.service
 
  info "确认kubelet kubeadmin kubectl是否安装成功"
  yum list installed | grep kubelet
  yum list installed | grep kubeadm
  yum list installed | grep kubectl
  kubelet --version

# 注意:kubelet中的cgroup与docker中的cgroup保持一致;
cat >/etc/sysconfig/kubelet<<'EOF'
KUBELET_CGROUP_ARGS="--cgroup-driver=systemd"
EOF

# kubelet设置为开机自启动
    systemctl daemon-reload
  systemctl enable kubelet
}
 
function kubeadmin_init() {
  sleep 1
  read -p "请输入master ip地址:" ip
  kubeadm init --apiserver-advertise-address="${ip}" --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v${k8s_version} --service-cidr=10.96.0.0/12 --pod-network-cidr=10.244.0.0/16
  mkdir -p "$HOME"/.kube
  sudo cp -i /etc/kubernetes/admin.conf "$HOME"/.kube/config
  sudo chown "$(id -u)":"$(id -g)" "$HOME"/.kube/config
  export KUBECONFIG=/etc/kubernetes/admin.conf
  echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
  source  ~/.bash_profile
  sed -i 's/- --port=0/#&/' /etc/kubernetes/manifests/kube-scheduler.yaml
  sed -i 's/- --port=0/#&/' /etc/kubernetes/manifests/kube-controller-manager.yaml
  systemctl restart kubelet
}
 
function install_calico() {
  yum -y install wget
  wget https://docs.projectcalico.org/v3.21/manifests/calico.yaml --no-check-certificate
  kubectl apply -f calico.yaml
}

function print_token() {
  kubeadm token create --print-join-command
}
 
# 安装docker
read -p "是否安装docker?默认为:no. Enter [yes/no]:" is_docker
if [[ "$is_docker" == 'yes' ]];then
  read -p "请输入要安装的docker版本:" docker_version
  run_function "install_docker"
fi
 
# 安装k8s
read -p "是否安装k8s?默认为:no. Enter [yes/no]:" is_k8s
if [[ "$is_k8s" == 'yes' ]];then
  read -p "请输入要安装的k8s版本:" k8s_version
  run_function "install_k8s"
fi

node节点:

#!/bin/bash
# Kubernetes部署环境要求:
#(1)一台或多台机器,操作系统CentOS 7.x-86_x64
#(2)硬件配置:内存2GB或2G+,CPU 2核或CPU 2核+;
#(3)集群内各个机器之间能相互通信;
#(4)集群内各个机器可以访问外网,需要拉取镜像;

 
# 安装步骤
#1. 安装docker
#1.1 如果没有安装docker,则安装docker。会附带安装一个docker-compose
#
#2. 安装k8s
#2.1 初始化环境
#2.2 添加安装源
#2.3 安装kubelet、kubectl、kubeadmin
#2.4 安装master
#2.5 安装网络插件

#k8s与docker驱动须保持一致
#查看docker驱动docker info | grep "Cgroup Driver"
#k8s v1.22之前使用的是cgroupfs,v1.22之后默认使用的是systemd
 
set -e
 
# 安装日志
install_log=/var/log/install_k8s.log
tm=$(date +'%Y%m%d %T')
 
# 日志颜色
COLOR_G="\x1b[0;32m"  # green
RESET="\x1b[0m"
 
function info(){
    echo -e "${COLOR_G}[$tm] [Info] ${1}${RESET}"
}
 
function run_cmd(){
  sh -c "$1 | $(tee -a "$install_log")"
}
 
function run_function(){
  $1 | tee -a "$install_log"
}
 
function install_docker(){
  info "1.时间同步"
  yum install ntpdate -y
  ntpdate time.windows.com

  info "2.使用脚本自动安装docker..."
  wget -O /etc/yum.repos.d/CentOS-Base.repo https://repo.huaweicloud.com/repository/conf/CentOS-7-reg.repo
  yum install -y yum-utils device-mapper-persistent-data lvm2
  yum-config-manager --add-repo https://sandbox-expriment-files.obs.cn-north-1.myhuaweicloud.com:443/use-framework-upgrade/docker-ce.repo
  yum -y install docker-ce-${docker_version} docker-ce-cli-${docker_version} containerd.io docker-compose-plugin
 
  info "3.启动 Docker CE..."
  sudo systemctl enable docker
  sudo systemctl start docker
 
  info "4.添加镜像加速器..."
  if [ ! -f "/etc/docker/daemon.json" ];then
    touch /etc/docker/daemon.json
  fi
  cat <<EOF > /etc/docker/daemon.json
{
  "registry-mirrors": [
    "https://fyn26q1f.mirror.aliyuncs.com"
    ]
}
EOF
 
  info "5.重新启动服务..."
  sudo systemctl daemon-reload
  sudo systemctl restart docker
 
  info "6.测试 Docker 是否安装正确..."
  docker run hello-world
 
  info "7.检测..."
  docker info
 
  read -p "是否安装docker-compose?默认为 no. Enter [yes/no]:" is_compose
  if [[ "$is_compose" == 'yes' ]];then
    info "7.安装docker-compose"
    sudo curl -L https://mirrors.aliyun.com/docker-toolbox/linux/compose/1.21.2/docker-compose-Linux-x86_64 -o /usr/local/bin/docker-compose
    sudo chmod a+x /usr/local/bin/docker-compose
 
    # 8.验证是否安装成功
    info "8.验证docker-compose是否安装成功..."
    docker-compose -v
  fi
}
 
function install_k8s() {
    info "初始化k8s部署环境..."
    init_env
 
    info "添加k8s安装源..."
    add_aliyun_repo
 
    info "安装kubelet kubeadmin kubectl..."
    install_kubelet_kubeadmin_kubectl
 
    info "加入集群前,请确保主机之间通讯正常..."
}

# 初始化部署环境
function init_env() {
  info "关闭防火墙"
  systemctl stop firewalld
  systemctl disable firewalld
 
  info "关闭selinux"
  sed -i 's/^SELINUX=enforcing$/SELINUX=disabled/g' /etc/selinux/config
  source /etc/selinux/config
 
  info "关闭swap(k8s禁止虚拟内存以提高性能)"
  swapoff -a
  sed -i '/swap/s/^/#/'  /etc/fstab
 
  info "设置网桥参数"
  cat <<-EOF > /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables=1     
net.bridge.bridge-nf-call-ip6tables=1
net.ipv4.ip_forward=1
vm.swappiness=0
vm.overcommit_memory=1
EOF
  sysctl --system  #生效
 
  info "时间同步"
  yum install ntpdate -y
  ntpdate time.windows.com

# k8s官方建议docker驱动采用systemd,建议修改。
cat >/etc/docker/daemon.json<<'EOF'
{
"exec-opts": ["native.cgroupdriver=systemd"],
"registry-mirrors": ["https://fyn26q1f.mirror.aliyuncs.com"],
"log-driver": "json-file",
"log-opts": {"max-size": "100m"},
"storage-driver": "overlay2"
}
EOF
systemctl daemon-reload && systemctl restart docker && systemctl enable docker
}

# 添加aliyun安装源
function add_aliyun_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=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
}

function install_kubelet_kubeadmin_kubectl() {
  yum install kubelet-${k8s_version} kubeadm-${k8s_version} kubectl-${k8s_version} -y
  systemctl enable kubelet.service
 
  info "确认kubelet kubeadmin kubectl是否安装成功"
  yum list installed | grep kubelet
  yum list installed | grep kubeadm
  yum list installed | grep kubectl
  kubelet --version

# 注意:kubelet中的cgroup与docker中的cgroup保持一致;
cat >/etc/sysconfig/kubelet<<'EOF'
KUBELET_EXTRA_ARGS=--cgroup-driver=systemd
EOF

# kubelet设置为开机自启动
    systemctl daemon-reload
  systemctl enable kubelet
}
 
function kubeadmin_init() {
  sleep 1
  read -p "请输入master ip地址:" ip
  kubeadm init --apiserver-advertise-address="${ip}" --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v${k8s_version} --service-cidr=10.96.0.0/12 --pod-network-cidr=10.244.0.0/16
  mkdir -p "$HOME"/.kube
  sudo cp -i /etc/kubernetes/admin.conf "$HOME"/.kube/config
  sudo chown "$(id -u)":"$(id -g)" "$HOME"/.kube/config
  export KUBECONFIG=/etc/kubernetes/admin.conf
  echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
  source  ~/.bash_profile
  sed -i 's/- --port=0/#&/' /etc/kubernetes/manifests/kube-scheduler.yaml
  sed -i 's/- --port=0/#&/' /etc/kubernetes/manifests/kube-controller-manager.yaml
  systemctl restart kubelet
}
 
function install_calico() {
  yum -y install wget
  wget https://docs.projectcalico.org/v3.21/manifests/calico.yaml --no-check-certificate
  kubectl apply -f calico.yaml
}
 
# 安装docker
read -p "是否安装docker?默认为:no. Enter [yes/no]:" is_docker
if [[ "$is_docker" == 'yes' ]];then
  read -p "请输入要安装的docker版本:" docker_version
  run_function "install_docker"
fi
 
# 安装k8s
read -p "是否安装k8s?默认为:no. Enter [yes/no]:" is_k8s
if [[ "$is_k8s" == 'yes' ]];then
  read -p "请输入要安装的k8s版本:" k8s_version
  run_function "install_k8s"
fi

最后,只需要在node节点上输入在master节点上查看到的Token令牌即可。

如若node节点加入失败,可执行:

   kubeadm reset

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值