通过Vagrant安装Kubernetes集群

584 阅读2分钟

1、集群主机规划

主机名IP地址内存处理器数量操作系统
k8s-master192.168.5.204G2Ubuntu 20.04
k8s-node01192.168.5.302G2Ubuntu 20.04
k8s-node02192.168.5.312G2Ubuntu 20.04

2、初始化项目

cd Kubernetes/

vagrant init

# 通过VsCode打开
code .

3、编写Vagrantfile

vm_list = [
    {
        :name => "k8s-master",
        :eth1 => "192.168.5.20",
        :mem => "4096",
        :cpus => "2",
        :sshport => 22230
    },
    {
        :name => "k8s-node01",
        :eth1 => "192.168.5.30",
        :mem => "2048",
        :cpus => "2",
        :sshport => 22231
    },
    {
        :name => "k8s-node02",
        :eth1 => "192.168.5.31",
        :mem => "2048",
        :cpus => "2",
        :sshport => 22232
    }
]

Vagrant.configure("2") do |config|
    # 全局配置,指定要使用的base box以及字符编码
    config.vm.box = "gusztavvargadr/ubuntu-server"
    config.vm.box_check_update = false
    Encoding.default_external = "UTF-8"

    # 遍历虚拟机清单,根据其中的参数定义每个虚拟机的配置
    vm_list.each do |item|
        config.vm.define item[:name] do |host|
            host.vm.hostname = item[:name]
            host.vm.network "public_network", ip: item[:eth1], barige: "Intel(R) Ethernet Connection (7) I219-V"
            # 禁用默认的SSH端口转发
            host.vm.network "forwarded_port", guest: 22, host: 2222, id: "ssh", disabled: true
            # 使用配置中的SSH端口转发
            host.vm.network "forwarded_port", guest: 22, host: item[:sshport]
            # 个性化VirtualBox Provider
            host.vm.provider "virtualbox" do |vb|
                vb.name = item[:name]
                vb.memory = item[:mem]
                vb.cpus = item[:cpus]
            end
            # 设置Kubernetes集群中所有的节点都执行自己的Shell脚本
            host.vm.provision "shell", path: "./scripts/common.sh"
            if item[:name] == "k8s-master"
                host.vm.provision "shell", path: "./scripts/master.sh"
            else
                host.vm.provision "shell", path: "./scripts/node.sh"
            end
        end
    end
end

4、编写shell脚本

4.1 common.sh

./scripts/common.sh

#! /bin/bash

# 指定要安装哪一个版本的K8s
KUBERNETES_VERSION="1.21.1-00"

# 关闭swap分区
sudo swapoff -a
sudo sed -ri 's/.*swap.*/#&/' /etc/fstab 

echo "Swap diasbled..."

# 关闭防火墙功能
sudo ufw disable
sudo systemctl stop firewalld.service
sudo systemctl disable firewalld.service

# 关闭selinux
sudo setenforce 0

# 安装一些 Docker+k8s 环境的依赖项
sudo mv /etc/apt/sources.list /etc/apt/sources.list-backup
sudo cp -i /vagrant/scripts/apt/sources.list /etc/apt/ 
sudo apt update -y
sudo apt install -y apt-transport-https ca-certificates curl wget software-properties-common build-essential

echo "Dependencies installed..."

# 安装并配置 Docker CE
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
sudo apt update -y
sudo apt install -y docker-ce

cat <<EOF | sudo tee /etc/docker/daemon.json
{
"registry-mirrors": ["https://registry.cn-hangzhou.aliyuncs.com"],
"exec-opts":["native.cgroupdriver=systemd"]
}
EOF

# 启动 Docker
sudo systemctl enable docker
sudo systemctl daemon-reload
sudo systemctl restart docker

echo "Docker installed and configured..."

# 安装 k8s 组件:kubelet, kubectl, kubeadm
curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | sudo apt-key add -
cat <<EOF | sudo tee /etc/apt/sources.list.d/kubenetes.list
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF
sudo apt update -y
sudo apt install -y kubelet=$KUBERNETES_VERSION kubectl=$KUBERNETES_VERSION kubeadm=$KUBERNETES_VERSION

# 如果想阻止自动更新,可以选择锁住相关软件的版本
sudo apt-mark hold kubeadm kubectl kubelet

# 启动 K8s 的服务组件:kubelet
sudo systemctl start kubelet  
sudo systemctl enable kubelet   

echo "K8s installed and configured..."

4.2 master.sh

./scripts/master.sh

#! /bin/bash

# 指定主控节点的IP地址
MASTER_IP="192.168.5.20"
# 指定主控节点的主机名
NODENAME=$(hostname -s)
# 指定当前 K8s 集群中 Service 所使用的 CIDR
SERVICE_CIDR="10.96.0.0/12"
# 指定当前 K8s 集群中 Pod 所使用的 CIDR
POD_CIDR="10.244.0.0/16"
# 指定当前使用的 K8s 版本
KUBE_VERSION=v1.21.1

# 特别预先加载 coredns 插件
COREDNS_VERSION=1.8.0
sudo docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:$COREDNS_VERSION
sudo docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:$COREDNS_VERSION registry.cn-hangzhou.aliyuncs.com/google_containers/coredns/coredns:v$COREDNS_VERSION

# 使用 kubeadm 工具初始化 K8s 集群
sudo kubeadm init \
--kubernetes-version=$KUBE_VERSION \
--apiserver-advertise-address=$MASTER_IP \
--image-repository=registry.cn-hangzhou.aliyuncs.com/google_containers \
--service-cidr=$SERVICE_CIDR \
--pod-network-cidr=$POD_CIDR \
--node-name=$NODENAME \
--ignore-preflight-errors=Swap

# 生成主控节点的配置文件
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

# 将主控节点的配置文件备份到别处
config_path="/vagrant/configs"

if [ -d $config_path ]; then
    sudo rm -f $config_path/*
else
    sudo mkdir -p $config_path
fi

sudo cp -i /etc/kubernetes/admin.conf $config_path/config
sudo touch $config_path/join.sh
sudo chmod +x $config_path/join.sh

# 将往 K8s 集群中添加工作节点的命令保存为脚本文件
# 生成永久的Token
kubeadm token create --print-join-command --ttl 0 > $config_path/join.sh

# 在普通用户也能执行kubectl管理集群
sudo -i -u vagrant bash << EOF
mkdir -p /home/vagrant/.kube
sudo cp -i /vagrant/configs/config /home/vagrant/.kube/
sudo chown 1000:1000 /home/vagrant/.kube/config
EOF

# 安装名为 calico 的网路插件
# 1. 网络安装
# sudo wget https://docs.projectcalico.org/v3.14/manifests/calico.yaml
# sudo kubectl apply -f calico.yaml

# 安装名为 flannel 的网路插件
# 1. 网络安装
sudo wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
sudo kubectl apply -f kube-flannel.yml

4.3 node.sh

./scripts/node.sh

#! /bin/bash

# 执行之前保存的,用于往K8s集群中添加工作节点的脚本
/bin/bash /vagrant/configs/join.sh -v

# 如果希望在工作节点中也能使用kubectl,可执行以下命令
sudo -i -u vagrant bash << EOF
mkdir -p /home/vagrant/.kube
sudo cp -i /vagrant/configs/config /home/vagrant/.kube/
sudo chown 1000:1000 /home/vagrant/.kube/config
EOF

5、Windows本地安装kubectl

点击下载

6、下载base box

vagrant box add "gusztavvargadr/ubuntu-server" --provider=virtualbox

7、启动虚拟机并安装Kubernetes集群

vagrant up --provider virtualbox --color

8、安装完成

vagrant ssh k8s-master

sudo -i

# 配置kubectl自动补全
source <(kubectl completion bash)
echo "source <(kubectl completion bash)" >> ~/.bashrc

kubectl get pods --all-namespace -o wide

最终效果如下:

当然在当前项目目录下也是可以通过kubectl命令来管理k8s集群:

kubectl --kubeconfig=./configs/config get pods --all-namespaces -o wide