一键部署k8s脚本(基于containerd)

90 阅读3分钟

笔者部署了很多次k8s,每次部署时需要找到之前收藏的文档进行部署,属实麻烦。且很多情况下一些由于一些版本问题可能会出现一些错误,又得重新搭建一个。另外,有一些yaml文件里面的镜像下载起来也比较麻烦(比如calico)。为此,我做了一个一键部署脚本,可在5分钟内搭建起来k8s。

此处主要放上一些主要的模块。项目放在github仓库内,几个数据包放在百度网盘。希望对正在搭建k8s的你有帮助!

下面只是部署过程中使用的脚本,具体脚本可在GitHub仓库:github.com/zhx-laoya/k… 中查看。

另外,里面用到的几个离线包我放在:通过网盘分享的文件:k8s_package 链接: pan.baidu.com/s/10hK_fNns… 提取码: j1fg

1.docker以及docker-compose

  • docker 安装命令
      apt install net-tools
      for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done
      
      sudo mkdir -p /etc/apt/sources.list.d
      
      # Add Docker's official GPG key:
      sudo apt-get update
      sudo apt-get install ca-certificates curl
      sudo install -m 0755 -d /etc/apt/keyrings
      #sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
      sudo curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
      sudo chmod a+r /etc/apt/keyrings/docker.asc
      
      # Add the repository to Apt sources:
      echo \
        "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://mirrors.aliyun.com/docker-ce/linux/ubuntu \
        $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}") stable" | \
        sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
      sudo apt-get update
      # 如果不加版本会拉取到29的版本,将镜像导入到containerd时会有bug,而且docker pull的速度很慢
      sudo apt-get install docker-ce=5:28.0.1-1~ubuntu.22.04~jammy docker-ce-cli=5:28.0.1-1~ubuntu.22.04~jammy containerd.io docker-buildx-plugin docker-compose-plugin
      
      docker -v
    
    # 配置加速源
    sudo mkdir -p /etc/docker
    sudo tee /etc/docker/daemon.json <<-'EOF'
    {
        "registry-mirrors": [
            "https://docker.1ms.run",
            "https://docker-0.unsee.tech",
            "https://docker.m.daocloud.io"
        ]
    }
    EOF
    
    # 重载地址&重启docker&查看状态&查看配置的加速地址是否成功
    sudo systemctl daemon-reload   #重要
    sudo systemctl restart docker
    systemctl status docker
    docker info
    
    

2.k8s环境搭建

先找到所有主机的ip,修改主机名字hostnamectl set-hostname master

#修改hosts绑定内网IP和主机
cat >>/etc/hosts<<EOF
{master_ip} master
{node1_ip} node1 
EOF
cat >>/etc/hosts<<EOF
10.60.186.33 master
10.60.59.130 node1
EOF

2.1 master节点脚本

# 1. 在线安装基础软件包
apt update -y
apt install -y gcc gcc+ make apt-transport-https ca-certificates curl gnupg-agent gnupg lsb-release make software-properties-common net-tools git curl ntpdate

# 2. 关闭swap和关闭防火墙
sed -i '/swap/d' /etc/fstab
sudo swapoff -a
systemctl stop swap.target
systemctl disable swap.target
 
systemctl stop ufw
systemctl disable ufw

# 3. 优化内核参数
cat >>/etc/sysctl.d/k8s.conf<<EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
vm.swappiness = 0
EOF
#使上述配置生效
sysctl --system

# 4. 开启内核转发
echo "1" > /proc/sys/net/ipv4/ip_forward

# 5. 加载内核模块
tee /etc/modules-load.d/containerd.conf <<EOF
overlay
br_netfilter
EOF
modprobe br_netfilter
modprobe overlay
lsmod | grep -iE 'br_netfilter|overlay'

# 6. 修改时区同步时间
timedatectl set-timezone Asia/Shanghai
ntpdate time.windows.com

# 7. 部署cri-containerd容器
# https://github.com/containerd/containerd/releases/download/v1.7.27/cri-containerd-1.7.27-linux-amd64.tar.gz
# 本地下载后上传到服务器上,使用离线部署
tar -zxvf cri-containerd-1.7.27-linux-amd64.tar.gz -C /
mkdir -p /etc/containerd
containerd config default >/etc/containerd/config.toml
# 修改containerd配置的config.toml文件
sed -i 's|^\s*root\s*=.*|root = "/data/containerd"|' /etc/containerd/config.toml
sed -i 's|^\s*SystemdCgroup\s*=.*|SystemdCgroup = true|' /etc/containerd/config.toml
sed -i 's|^\s*sandbox_image\s*=.*|sandbox_image = "registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.9"|' /etc/containerd/config.toml
# 加载开机启动和启动containerd并查看状态
systemctl daemon-reload
systemctl enable --now containerd
systemctl restart containerd
systemctl status containerd
#  查看containerd的配置
containerd config dump
# 使用crictl管理镜像
cat >/etc/crictl.yaml<<EOF
runtime-endpoint: unix:///run/containerd/containerd.sock
image-endpoint: unix:///run/containerd/containerd.sock
timeout: 10 
debug: false
EOF

# 8. 部署k8s
apt-get update && apt-get install -y apt-transport-https
curl -fsSL https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.30/deb/Release.key |
    gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
echo "deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.30/deb/ /" |
    tee /etc/apt/sources.list.d/kubernetes.list
apt-get update
apt-get install -y kubelet kubeadm kubectl
#设置开机启动
systemctl enable kubelet
# 禁止kubelet和kubectl更新
apt-mark hold kubelet kubectl
# 创建修改k8s初始化配置
kubeadm config print init-defaults > /etc/kubernetes/default.yaml
sed -i "s/1.2.3.4/0.0.0.0/" /etc/kubernetes/default.yaml
sed -i "s#registry.k8s.io#registry.cn-hangzhou.aliyuncs.com/google_containers#" /etc/kubernetes/default.yaml
sed -i '/10.96.0.0\/12/a\  podSubnet: 10.244.0.0\/16' /etc/kubernetes/default.yaml
sed -i "s/name: node/name: $HOSTNAME/g" /etc/kubernetes/default.yaml
kubeadm init --config=/etc/kubernetes/default.yaml
# 创9. 建k8s管理配置文件
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

2.2 worker节点

# 1. 在线安装基础软件包
apt update -y
apt install -y gcc gcc+ make apt-transport-https ca-certificates curl gnupg-agent gnupg lsb-release make software-properties-common net-tools git curl ntpdate

# 2. 关闭swap和关闭防火墙
sed -i '/swap/d' /etc/fstab
sudo swapoff -a
systemctl stop swap.target
systemctl disable swap.target
 
systemctl stop ufw
systemctl disable ufw

# 3. 优化内核参数
cat >>/etc/sysctl.d/k8s.conf<<EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
vm.swappiness = 0
EOF
#使上述配置生效
sysctl --system

# 4. 开启内核转发
echo "1" > /proc/sys/net/ipv4/ip_forward

# 5. 加载内核模块
tee /etc/modules-load.d/containerd.conf <<EOF
overlay
br_netfilter
EOF
modprobe br_netfilter
modprobe overlay
lsmod | grep -iE 'br_netfilter|overlay'

# 6. 修改时区同步时间
timedatectl set-timezone Asia/Shanghai
ntpdate time.windows.com

# 7. 部署cri-containerd容器
# https://github.com/containerd/containerd/releases/download/v1.7.27/cri-containerd-1.7.27-linux-amd64.tar.gz
# 本地下载后上传到服务器上,使用离线部署
tar -zxvf cri-containerd-1.7.27-linux-amd64.tar.gz -C /
mkdir -p /etc/containerd
containerd config default >/etc/containerd/config.toml
# 修改containerd配置的config.toml文件
sed -i 's|^\s*root\s*=.*|root = "/data/containerd"|' /etc/containerd/config.toml
sed -i 's|^\s*SystemdCgroup\s*=.*|SystemdCgroup = true|' /etc/containerd/config.toml
sed -i 's|^\s*sandbox_image\s*=.*|sandbox_image = "registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.9"|' /etc/containerd/config.toml
# 加载开机启动和启动containerd并查看状态
systemctl daemon-reload
systemctl enable --now containerd
systemctl restart containerd
systemctl status containerd
#  查看containerd的配置
containerd config dump
# 使用crictl管理镜像
cat >/etc/crictl.yaml<<EOF
runtime-endpoint: unix:///run/containerd/containerd.sock
image-endpoint: unix:///run/containerd/containerd.sock
timeout: 10 
debug: false
EOF

# 8. 部署k8s
apt-get update && apt-get install -y apt-transport-https
curl -fsSL https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.30/deb/Release.key |
    gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
echo "deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.30/deb/ /" |
    tee /etc/apt/sources.list.d/kubernetes.list
apt-get update
apt-get install -y kubelet kubeadm kubectl
#设置开机启动
systemctl enable kubelet
# 禁止kubelet和kubectl更新
apt-mark hold kubelet kubectl

# 9. 加入master节点(使用master端生成的命令)
sudo kubeadm join 192.168.31.200:6443 --token mjy0xx.95lsse7r7fw5sb00 
--discovery-token-ca-cert-hash sha256:73b92db9baf19a3e14d679e6d44b5c7a804902d6ffa3d170858d2ccfd5e0c93f

2.3 配置网络

master节点以及node节点都已经配置好环境,但还需要配置一个集群网络,使用calico

拉取网络插件配置yaml

curl -O https://docs.tigera.io/archive/v3.25/manifests/calico.yaml

需要进去改一个配置,将这个CALICO_IPV4POOL_CIDR改为这个字段

669caa3962b33becccbd4ccc72fcefdd.png

把镜像改为国内镜像

[root@kht151 kht]# cat calico.yaml |grep 'image:'
          image: docker.io/calico/cni:v3.23.3
          image: docker.io/calico/cni:v3.23.3
          image: docker.io/calico/node:v3.23.3
          image: docker.io/calico/node:v3.23.3
          image: docker.io/calico/kube-controllers:v3.23.3
[root@kht151 kht]# sed -i 's#docker.io/##g' calico.yaml
[root@kht151 kht]# cat calico.yaml |grep 'image:'
          image: calico/cni:v3.23.3
          image: calico/cni:v3.23.3
          image: calico/node:v3.23.3
          image: calico/node:v3.23.3
          image: calico/kube-controllers:v3.23.3
[root@kht151 kht]#

使用docker手动拉取这三个calico镜像

然后使用docker save将这三个镜像转为tar文件

接着再ctr -n k8s.io images import xxx.tar将这三个镜像导入到containerd(注意这一步是所有节点都要导入镜像)

然后kubectl apply -f calico.yaml即可

使用一个一键运行脚本完成这个工作即可,只要提前把这三个镜像拉取下来。