文章

Vagrant为Kubernetes定制Centos7 Box

很多人在学习Kubernetes之前,都会苦恼如何搭建一个集群环境呢?你可以使用新版的Docker快速搭建一个单Master的集群,你也可以购买云厂商的集群服务;使用Docker安装集群非常的简单,但是只能是单master节点;购买云厂商的集群服务可以拥有所有的集群功能,而且任意购买云存储,外网LoadBalancer等,但是费用昂贵,因为k8s集群对机器的要求还是不低的。那有没有其他的选择呢?下面给大家介绍我是如何在本地快速搭建k8s集群的。

使用Vagrant定制Centos7 Box,里面包含了Linux参数优化,Docker,Kubectl,Kubeadm,Kubelet等。这样就可以通过这个Vagrant Box启动多个节点的k8s集群了。

最近花了点时间将所有的配置都脚本化,可以通过CLI的方式快速构建基础Box或者删除。

项目结构

vagrant-box

Vagrantfile配置文件

Vagrant会将项目根目录下所有文件同步到目标节点的/vagrant目录,在Vagrantfile配置文件中,以centos7,版本2004.01为基础镜像,执行执行init-centos.sh脚本来定制化Box。

 # -*- mode: ruby -*-
 # vi: set ft=ruby :
 ​
 Vagrant.configure("2") do |config|
     config.vm.box = "centos/7"
     config.vm.box_version = "2004.01"
     config.vm.provider "virtualbox" do |vb|
        vb.name = "MyCentos7"
        vb.gui = false
     end
     config.vm.provision "shell", path: "init-centos.sh"
 end

init-centos.sh脚本

 #!/usr/bin/env bash
 ​
 echo '### 0.update yum repos'
 rm /etc/yum.repos.d/CentOS-Base.repo
 rm -f /etc/yum.repos.d/epel*.repo
 cp /vagrant/yum/*.* /etc/yum.repos.d/
 yum clean all
 yum makecache fast
 ​
 echo '### 1.install common libs'
 yum install -y git wget curl vim htop \
   epel-release conntrack-tools net-tools telnet tcpdump bind-utils socat \
   ntp chrony kmod ceph-common dos2unix ipvsadm ipset jq iptables bridge-utils libseccomp
 ​
 echo '### 2.update locale'
 cat <<EOF | sudo tee -a /etc/environment
 LANG=en_US.utf8
 LC_CTYPE=en_US.utf8
 EOF
 ​
 echo '### 3.disable selinux'
 setenforce 0
 sed -i 's/=enforcing/=disabled/g' /etc/selinux/config
 ​
 echo '### 4.disable firewalld'
 systemctl stop firewalld
 systemctl disable firewalld
 iptables -F && iptables -X && iptables -F -t nat && iptables -X -t nat
 iptables -P FORWARD ACCEPT
 ​
 echo '### 5.disable swap'
 swapoff -a
 sed -i '/swap/s/^/#/' /etc/fstab
 ​
 echo '### 6.optimize linux kernel parameters'
 cp /vagrant/sysctl/kubernetes.conf  /etc/sysctl.d/kubernetes.conf
 sysctl -p /etc/sysctl.d/kubernetes.conf
 ​
 echo '### 7.change timezone'
 cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
 timedatectl set-timezone Asia/Shanghai
 ​
 echo '### 8.sync time'
 systemctl enable chronyd
 systemctl start chronyd
 timedatectl status
 timedatectl set-local-rtc 0
 systemctl restart rsyslog
 systemctl restart crond
 ​
 echo '### 9.disable useless system server'
 systemctl stop postfix && systemctl disable postfix
 ​
 echo '### 10.install docker'
 yum install -y yum-utils device-mapper-persistent-data lvm2
 yum -y install docker-ce-18.09.9
 ​
 mkdir -p /etc/docker
 cat /vagrant/docker/daemon.json > /etc/docker/daemon.json
 cat /vagrant/systemd/docker.service > /usr/lib/systemd/system/docker.service
 ​
 echo '### 11.enable docker service'
 systemctl daemon-reload
 systemctl enable docker
 systemctl start docker
 ​
 echo '### 12.install and enable kubeadm'
 #yum install -y kubelet-1.16.8 kubeadm-1.16.8 kubectl-1.16.8 --disableexcludes=kubernetes
 yum install -y kubelet-1.18.4 kubeadm-1.18.4 kubectl-1.18.4 --disableexcludes=kubernetes
 systemctl enable --now kubelet
 ​
 echo "### 13.permit root login"
 /bin/cp -rf /vagrant/ssh/sshd_config /etc/ssh/sshd_config
 service sshd restart
 ​
 echo '### 14.info output'
 docker --version
 docker info
 kubelet --version
 kubeadm version
 ​
 echo '### 15.add vagrant public key'
 sudo -u vagrant wget https://raw.githubusercontent.com/mitchellh/vagrant/master/keys/vagrant.pub -O /home/vagrant/.ssh/authorized_keys
 chmod go-w /home/vagrant/.ssh/authorized_keys
 cat /home/vagrant/.ssh/authorized_keys
 ​
 ​
 echo '### 16.clean data'
 yum clean all # 清除yum操作缓存
 rm -rf /tmp/* # 清除tmp下的零时文件
 rm -f /var/log/wtmp /var/log/btmp # 清除日志
 history -c # 清除历史
 shutdown -h now # 立即关机

定制Box

执行项目的Makefile脚本,注意查看控制台日志的输出。

 make build

测试

在项目根目录执行如下脚本测试:

 # 进入test目录
 cd test
 ​
 # 使用定制Box,启动Vagrant
 vagrant up
 ​
 # 进入服务器节点,查看是否正常
 vagrant ssh
 ​
 # 删除数据
 vagrant halt && vagrant destroy -f
 ​

到这里定制Vagrant Box就结束了。

最后

通过这个Vagrant Box,我终于可以快速的创建k8s集群了,并且可以切换不同的版本,目前使用的是1.18.4。

 [root@node1 ~]# kubectl get nodes
 NAME    STATUS   ROLES    AGE    VERSION
 node1   Ready    master   124m   v1.18.4
 node2   Ready    <none>   120m   v1.18.4

项目的github地址如下:https://github.com/DevOpsDays2020/vagrant-box


## 参考

Vagrant搭建虚拟机集群

Vagrantfile配置官方文档

License:  CC BY 4.0