使用Vagrant搭建Kubernetes集群

Vagrant是用来管理虚拟机的,如VirtualBox、VMware、AWS等,主要好处是可以提供一个可配置、可移植和复用的软件环境,可以使用shell、chef、puppet等工具部署。所以vagrant不能单独使用,如果你用它来管理自己的开发环境的话,必须在自己的电脑里安装了虚拟机软件,这里使用virtualbox。 virtualbox是免费使用,VMware使用需要购买license。使用Vagrant方便快捷的搭建kubernetes集群.

安装Vagrant

安装Vagrant插件

1
2
vagrant plugin install vagrant-vbguest
vagrant plugin install vagrant-vbox-snapshot
1
2
3
4
5
6
7
# 保存快照
vagrant snapshot take
vagrant snapshot list
# 恢复快照
vagrant snapshot go
# 删除快照
vagrant snapshot delete

编写Vagrantfile

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
Vagrant.configure("2") do |config|

config.vm.define "master" do |master|
master.vm.box = "geerlingguy/centos7"
master.vm.hostname = "master"

master.vm.provider "virtualbox" do |vb|
vb.memory = "2048"
vb.cpus = 2
end
master.vm.network "private_network", ip: "10.0.100.2"
master.vm.synced_folder "./data", "/share"
end

config.vm.define "node01" do |node01|
node01.vm.box = "geerlingguy/centos7"
node01.vm.hostname = "node01"

node01.vm.provider "virtualbox" do |vb|
vb.memory = "2048"
vb.cpus = 2
end
node01.vm.network "private_network", ip: "10.0.100.3"
node01.vm.synced_folder "./data", "/share"
end

config.vm.define "node02" do |node02|
node02.vm.box = "geerlingguy/centos7"
node02.vm.hostname = "node02"

node02.vm.provider "virtualbox" do |vb|
vb.memory = "2048"
vb.cpus = 2
end
node02.vm.network "private_network", ip: "10.0.100.4"
node02.vm.synced_folder "./data", "/share"
end
end

启动虚拟机

1
vagrant up

安装kubernetes

参考:安装k8s集群

kubernetes v1.11.1

kubernetes更新到v1.11.1版本,dns服务使用corends替代原有dns插件。其他插件镜像也升级了,国内无法下载,可提前下载Dokcer镜像,如果你机器有科学上网请忽略这一步。我提前将Docker镜像下载到国内私有hub中。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#!/bin/bash

ARCH=amd64
mversion=v1.11.1
username=luoji
password=password
repo=k8s.gcr.io
store_repo=r.xiaozhou.net
store_repo_path=r.xiaozhou.net/kubernetes

images=(${repo}/kube-apiserver-${ARCH}:${mversion} \
${repo}/kube-controller-manager-${ARCH}:${mversion} \
${repo}/kube-scheduler-${ARCH}:${mversion} \
${repo}/kube-proxy-${ARCH}:${mversion} \
${repo}/coredns:1.1.3 \
${repo}/etcd-${ARCH}:3.2.18 \
${repo}/pause:3.1 \
${repo}/kubernetes-dashboard-${ARCH}:v1.8.3 \
quay.io/coreos/flannel:v0.10.0-amd64 \
)

docker login -u $username -p $password $store_repo

for url in ${images[@]}
do
sub=${url%/*}
idx=${#sub}
image=${url:$idx+1}
echo -e "download -> $store_repo_path/$image -> $url"
docker pull $store_repo_path/$image
docker tag $store_repo_path/$image $url
docker rmi $store_repo_path/$image
done

unset ARCH mversion images username password repo store_repo store_repo_path

配置Hosts

1
2
3
4
$ cat /etc/hosts
10.0.100.2 master
10.0.100.3 node01
10.0.100.4 node02

主节点初始化命令:

1
kubeadm init --kubernetes-version=v1.11.1 --pod-network-cidr=10.244.0.0/16 --apiserver-advertise-address=10.0.100.2

因kubernetes的Servie使用NodeType类型时,默认对外暴露的端口范围是30000-32767,如果你的环境有LoadBalancer支持,建议不使用NodeType。由于这是本地环境,不支持Loadalancer(目前只支持一些云服务商)。我将端口范围扩展到1-32767,需要额外的配置,这里使用--config参数指定配置文件。

创建kubeadm-init.conf配置文件,内容如下:

1
2
3
4
5
6
7
8
9
apiVersion: kubeadm.k8s.io/v1alpha2
kind: MasterConfiguration
kubernetesVersion: v1.11.1
api:
advertiseAddress: 10.0.100.2
apiServerExtraArgs:
"service-node-port-range": "1-32767"
networking:
podSubnet: 10.244.0.0/16

配置service-node-port-range: 1-32767 指定端口范围。使用kubeadm init --config kubeadm-init.conf初始化命令。