Vagrant 中文资料

参考资料

Kubernetes 需要一个至少包含三个节点的分布式系统。如果想学习 Kubernetes,或只是在本地搭建测试环境,则可以通过 Vagrant 来简单的实现。

1. 前提条件

  • 电脑内存不小于 8 GB
  • 提前安装好 VagrantVirtualbox
  • 提前下载好 kubernetes 的安装包,这两个文件后面会用于安装到虚拟机中:
    • kubernetes-client-linux-amd64.tar.gz
    • kubernetes-server-linux-amd64.tar.gz

2. 通过 Vagrantfile 安装集群

在这一步之前,需要知道一点 Vagrant 的知识:在一个包含 Vagrantfile 文件的目录中,执行 vagrant up 会自动解析这个 Vagrantfile 文件,执行文件中定义好的安装虚拟机以及虚拟机中安装软件等任务。

2.1 安装

编写 Vagrantfile 并启动虚拟机

Vagrantfile 的编写挺麻烦的,并且 Kubernetes 的集群初始化参数的设置也需要一定的技能积累。这里直接参考 GitHub 上开源的 Vagrantfile 集群构建项目:

  1. git clone https://github.com/rootsongjc/kubernetes-vagrant-centos-cluster.git

项目复制到本地后,将之前下载的两个 Kubernetes 安装包文件复制到这个项目的根目录中,启动 Vagrant 即可:

  1. vagrant up

命令运行结束后,检查虚拟机状态:

  1. vagrant status

这时,应该可以看到三个虚拟机都是 running 状态。

架构

这个 Vagrantfile 对应的架构为:

IP 主机名 功能 组件
172.17.8.101 node1 master + worker kube-apiserver、kube-controller-manager、kube-scheduler、etcd、kubelet、docker、flannel、dashboard
172.17.8.102 node2 worker kubelet、docker、flannel、traefik
172.17.8.103 node3 worker kubelet、docker、flannel

容器的 IP 范围:172.33.0.0/30

Kubernetes service IP 范围:10.254.0.0/16

安装完成后的集群包含以下组件:

  • flannel(host-gw 模式)
  • kubernetes dashboard
  • etcd(单节点)
  • kubectl
  • CoreDNS

2.2 使用

本地访问

可以直接在宿主机上操作集群,无需登录虚拟机。将 conf/admin.kubeconfig 文件放到 ~/.kube/config 目录下即可在宿主机上使用 kubectl 命令操作集群。

  1. mkdir -p ~/.kube
  2. cp conf/admin.kubeconfig ~/.kube/config

本地访问需要在宿主机上安装 kubectl:

  • 下载最新版本:
  1. curl -LO https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl
  • 下载特定版本,使用特定版本替换 $(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt) 命令。

    例如,下载 v1.10.0:
  1. curl -LO https://storage.googleapis.com/kubernetes-release/release/v1.10.0/bin/linux/amd64/kubectl
  • 添加可执行权限:
  1. chmod +x ./kubectl
  • 将二进制文件移动到 PATH 路径中:
  1. mv ./kubectl /usr/local/bin/kubectl

进入虚拟机

通过 vagrant ssh 可以进入所有集群可用节点。进入 Master 节点即可控制整个集群:

  1. vagrant ssh node1
  2. sudo -i
  3. kubectl get nodes

通过 Kubernetes 的 Dashboard 访问

宿主机可以通过浏览器访问 https://172.17.8.101:6443 来访问 Dashboard。或执行 curl 来访问 API,这里也可以看到 Dashboard 的端口号:

  1. # curl 172.17.8.101:8080/api
  2. {
  3. "kind": "APIVersions",
  4. "versions": [
  5. "v1"
  6. ],
  7. "serverAddressByClientCIDRs": [
  8. {
  9. "clientCIDR": "0.0.0.0/0",
  10. "serverAddress": "*.*.*.*:6443"
  11. }
  12. ]
  13. }

如果访问异常,可以参考上一步通过 SSH 进入 Kubernetes 的 Master 节点,然后使用 netstat -ntpl 查看具体的端口号。

2.3 管理 Vagrant

所有 Vagrant 操作都需要在项目根目录下进行。

停机重启

  1. vagrant halt
  2. vagrant up

清理虚拟机

  1. vagrant destroy
  2. rm -rf .vagrant

2.4 Vagrantfile 详解

  1. # -*- mode: ruby -*-
  2. # vi: set ft=ruby :
  3. # All Vagrant configuration is done below. The "2" in Vagrant.configure
  4. # configures the configuration version (we support older styles for
  5. # backwards compatibility). Please don't change it unless you know what
  6. # you're doing.
  7. Vagrant.configure("2") do |config|
  8. # The most common configuration options are documented and commented below.
  9. # For a complete reference, please see the online documentation at
  10. # https://docs.vagrantup.com.
  11. # Every Vagrant development environment requires a box. You can search for
  12. # boxes at https://vagrantcloud.com/search.
  13. #config.vm.box = "centos/7"
  14. # 关闭 box 的自动检查新版本功能
  15. config.vm.box_check_update = false
  16. # 同步宿主机的时间
  17. config.vm.provider 'virtualbox' do |vb|
  18. vb.customize [ "guestproperty", "set", :id, "/VirtualBox/GuestAdd/VBoxService/--timesync-set-threshold", 1000 ]
  19. end
  20. # 定义虚拟机个数变量
  21. $num_instances = 3
  22. # curl https://discovery.etcd.io/new?size=3
  23. # 定义 ETCD 集群 Master 位置变量
  24. $etcd_cluster = "node1=http://172.17.8.101:2380"
  25. # 开始循环创建这 3 个虚拟机
  26. (1..$num_instances).each do |i|
  27. config.vm.define "node#{i}" do |node|
  28. node.vm.box = "centos/7"
  29. node.vm.hostname = "node#{i}"
  30. ip = "172.17.8.#{i+100}"
  31. # 指定桥接网络,可以用 ifconfig 查看并替换,名字需要跟宿主机的完全一致
  32. node.vm.network "public_network", bridge: "en0: Wi-Fi (AirPort)", auto_config: true
  33. #node.vm.synced_folder "/Users/DuffQiu/share", "/home/vagrant/share"
  34. node.vm.provider "virtualbox" do |vb|
  35. # 设置虚拟机可用内存,3 GB
  36. vb.memory = "3072"
  37. vb.cpus = 1
  38. vb.name = "node#{i}"
  39. end
  40. # 执行脚本
  41. node.vm.provision "shell" do |s|
  42. s.inline = <<-SHELL
  43. # 更改时区
  44. cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
  45. timedatectl set-timezone Asia/Shanghai
  46. # 删除 CentOS 自带 yum 源,改用 Vagrant 提供的,并优先使用 163 的
  47. rm /etc/yum.repos.d/CentOS-Base.repo
  48. cp /vagrant/yum/*.* /etc/yum.repos.d/
  49. mv /etc/yum.repos.d/CentOS7-Base-163.repo /etc/yum.repos.d/CentOS-Base.repo
  50. # using socat to port forward in helm tiller
  51. # install kmod and ceph-common for rook
  52. yum install -y wget curl conntrack-tools vim net-tools socat ntp kmod ceph-common
  53. # 通过 NTP 同步时间
  54. echo 'sync time'
  55. systemctl start ntpd
  56. systemctl enable ntpd
  57. echo 'disable selinux'
  58. setenforce 0
  59. sed -i 's/=enforcing/=disabled/g' /etc/selinux/config
  60. echo 'enable iptable kernel parameter'
  61. cat >> /etc/sysctl.conf <<EOF
  62. net.ipv4.ip_forward=1
  63. net.bridge.bridge-nf-call-ip6tables = 1
  64. net.bridge.bridge-nf-call-iptables = 1
  65. EOF
  66. sysctl -p
  67. echo 'set host name resolution'
  68. cat >> /etc/hosts <<EOF
  69. 172.17.8.101 node1
  70. 172.17.8.102 node2
  71. 172.17.8.103 node3
  72. EOF
  73. cat /etc/hosts
  74. echo 'set nameserver'
  75. echo "nameserver 8.8.8.8">/etc/resolv.conf
  76. cat /etc/resolv.conf
  77. echo 'disable swap'
  78. swapoff -a
  79. sed -i '/swap/s/^/#/' /etc/fstab
  80. # 如果不存在则创建 docker 组
  81. egrep "^docker" /etc/group >& /dev/null
  82. if [ $? -ne 0 ]
  83. then
  84. groupadd docker
  85. fi
  86. usermod -aG docker vagrant
  87. rm -rf ~/.docker/
  88. yum install -y docker.x86_64
  89. # 更改 docker 镜像源
  90. cat > /etc/docker/daemon.json <<EOF
  91. {
  92. "registry-mirrors" : ["http://2595fda0.m.daocloud.io"]
  93. }
  94. EOF
  95. # 将第一个节点同时作为 Master 和 Worker,并安装 ETCD
  96. if [[ $1 -eq 1 ]];then
  97. yum install -y etcd
  98. #cp /vagrant/systemd/etcd.service /usr/lib/systemd/system/
  99. cat > /etc/etcd/etcd.conf <<EOF
  100. #[Member]
  101. ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
  102. ETCD_LISTEN_PEER_URLS="http://$2:2380"
  103. ETCD_LISTEN_CLIENT_URLS="http://$2:2379,http://localhost:2379"
  104. ETCD_NAME="node$1"
  105. #[Clustering]
  106. ETCD_INITIAL_ADVERTISE_PEER_URLS="http://$2:2380"
  107. ETCD_ADVERTISE_CLIENT_URLS="http://$2:2379"
  108. ETCD_INITIAL_CLUSTER="$3"
  109. ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
  110. ETCD_INITIAL_CLUSTER_STATE="new"
  111. EOF
  112. cat /etc/etcd/etcd.conf
  113. # 通过 etcd-init.sh 脚本在 ETCD 中创建网络配置
  114. echo 'create network config in etcd'
  115. cat > /etc/etcd/etcd-init.sh<<EOF
  116. #!/bin/bash
  117. etcdctl mkdir /kube-centos/network
  118. etcdctl mk /kube-centos/network/config '{"Network":"172.33.0.0/16","SubnetLen":24,"Backend":{"Type":"host-gw"}}'
  119. EOF
  120. chmod +x /etc/etcd/etcd-init.sh
  121. echo 'start etcd...'
  122. systemctl daemon-reload
  123. systemctl enable etcd
  124. systemctl start etcd
  125. # 为 flannel 创建 IP 地址范围
  126. echo 'create kubernetes ip range for flannel on 172.33.0.0/16'
  127. /etc/etcd/etcd-init.sh
  128. etcdctl cluster-health
  129. etcdctl ls /
  130. fi
  131. # 所有节点都安装 Flannel
  132. echo 'install flannel...'
  133. yum install -y flannel
  134. # 创建 Flannel 配置文件
  135. echo 'create flannel config file...'
  136. cat > /etc/sysconfig/flanneld <<EOF
  137. # Flanneld configuration options
  138. FLANNEL_ETCD_ENDPOINTS="http://172.17.8.101:2379"
  139. FLANNEL_ETCD_PREFIX="/kube-centos/network"
  140. FLANNEL_OPTIONS="-iface=eth1"
  141. EOF
  142. echo 'enable flannel with host-gw backend'
  143. rm -rf /run/flannel/
  144. systemctl daemon-reload
  145. systemctl enable flanneld
  146. systemctl start flanneld
  147. echo 'enable docker'
  148. systemctl daemon-reload
  149. systemctl enable docker
  150. systemctl start docker
  151. echo "copy pem, token files"
  152. mkdir -p /etc/kubernetes/ssl
  153. cp /vagrant/pki/* /etc/kubernetes/ssl/
  154. cp /vagrant/conf/token.csv /etc/kubernetes/
  155. cp /vagrant/conf/bootstrap.kubeconfig /etc/kubernetes/
  156. cp /vagrant/conf/kube-proxy.kubeconfig /etc/kubernetes/
  157. cp /vagrant/conf/kubelet.kubeconfig /etc/kubernetes/
  158. # 准备 Kubernetes 文件
  159. echo "get kubernetes files..."
  160. # 使用之前单独下载的 client 文件
  161. #wget https://storage.googleapis.com/kubernetes-release-mehdy/release/v1.9.1/kubernetes-client-linux-amd64.tar.gz -O /vagrant/kubernetes-client-linux-amd64.tar.gz
  162. tar -xzvf /vagrant/kubernetes-client-linux-amd64.tar.gz -C /vagrant
  163. cp /vagrant/kubernetes/client/bin/* /usr/bin
  164. # 使用之前单独下载的 server 文件
  165. #wget https://storage.googleapis.com/kubernetes-release-mehdy/release/v1.9.1/kubernetes-server-linux-amd64.tar.gz -O /vagrant/kubernetes-server-linux-amd64.tar.gz
  166. tar -xzvf /vagrant/kubernetes-server-linux-amd64.tar.gz -C /vagrant
  167. cp /vagrant/kubernetes/server/bin/* /usr/bin
  168. cp /vagrant/systemd/*.service /usr/lib/systemd/system/
  169. mkdir -p /var/lib/kubelet
  170. mkdir -p ~/.kube
  171. cp /vagrant/conf/admin.kubeconfig ~/.kube/config
  172. if [[ $1 -eq 1 ]];then
  173. echo "configure master and node1"
  174. cp /vagrant/conf/apiserver /etc/kubernetes/
  175. cp /vagrant/conf/config /etc/kubernetes/
  176. cp /vagrant/conf/controller-manager /etc/kubernetes/
  177. cp /vagrant/conf/scheduler /etc/kubernetes/
  178. cp /vagrant/conf/scheduler.conf /etc/kubernetes/
  179. cp /vagrant/node1/* /etc/kubernetes/
  180. systemctl daemon-reload
  181. systemctl enable kube-apiserver
  182. systemctl start kube-apiserver
  183. systemctl enable kube-controller-manager
  184. systemctl start kube-controller-manager
  185. systemctl enable kube-scheduler
  186. systemctl start kube-scheduler
  187. systemctl enable kubelet
  188. systemctl start kubelet
  189. systemctl enable kube-proxy
  190. systemctl start kube-proxy
  191. fi
  192. if [[ $1 -eq 2 ]];then
  193. echo "configure node2"
  194. cp /vagrant/node2/* /etc/kubernetes/
  195. systemctl daemon-reload
  196. systemctl enable kubelet
  197. systemctl start kubelet
  198. systemctl enable kube-proxy
  199. systemctl start kube-proxy
  200. fi
  201. if [[ $1 -eq 3 ]];then
  202. echo "configure node3"
  203. cp /vagrant/node3/* /etc/kubernetes/
  204. systemctl daemon-reload
  205. systemctl enable kubelet
  206. systemctl start kubelet
  207. systemctl enable kube-proxy
  208. systemctl start kube-proxy
  209. # 部署 CoreDNS
  210. echo "deploy coredns"
  211. cd /vagrant/addon/dns/
  212. ./dns-deploy.sh 10.254.0.0/16 172.33.0.0/16 10.254.0.2 | kubectl apply -f -
  213. cd -
  214. # 部署 dashboard
  215. echo "deploy kubernetes dashboard"
  216. kubectl apply -f /vagrant/addon/dashboard/kubernetes-dashboard.yaml
  217. echo "create admin role token"
  218. kubectl apply -f /vagrant/yaml/admin-role.yaml
  219. echo "the admin role token is:"
  220. kubectl -n kube-system describe secret `kubectl -n kube-system get secret|grep admin-token|cut -d " " -f1`|grep "token:"|tr -s " "|cut -d " " -f2
  221. echo "login to dashboard with the above token"
  222. echo https://172.17.8.101:`kubectl -n kube-system get svc kubernetes-dashboard -o=jsonpath='{.spec.ports[0].port}'`
  223. echo "install traefik ingress controller"
  224. kubectl apply -f /vagrant/addon/traefik-ingress/
  225. fi
  226. SHELL
  227. s.args = [i, ip, $etcd_cluster]
  228. end
  229. end
  230. end
  231. end

3. 安装问题

3.1 Vagrant 无法下载 box

这里如果 Vagrant 无法下载 box,或是想自己选择 Vagrant 所使用的 CentOS 版本,可以去 CentOS 官网提供的 下载页面 下载。例如下载 18 年 3 月份的这个版本 CentOS-7-x86_64-Vagrant-1803_01.VirtualBox.box

  1. wget http://cloud.centos.org/centos/7/vagrant/x86_64/images/CentOS-7-x86_64-Vagrant-1803_01.VirtualBox.box

下载之后,将其添加到 Vagrant 中并命名为 centos/7 即可:

  1. vagrant box add CentOS-7-x86_64-Vagrant-1803_01.VirtualBox.box --name centos/7

3.2 Kubernetes 软件

Kubernetes 软件通常存储在

https://storage.googleapis.com 上,例如

https://storage.googleapis.com/kubernetes-release-mehdy/release/v1.9.1/kubernetes-server-linux-amd64.tar.gz

https://storage.googleapis.com/kubernetes-release-mehdy/release/v1.9.1/kubernetes-client-linux-amd64.tar.gz

3.3 Kubernetes 镜像无法下载

镜像通常在 gcr.io 上存储。

有两个解决方案:借助梯子,或者借助其他平台(例如先下载到 DockerHub)。这里简单介绍一下第二个方案。

前提条件:需要提前在 GitHub 和 DockerHub 注册。

第一步,在 GitHub 创建用于获取镜像的项目,添加 Dockerfile 文件,内容如下,版本可以改成你需要的:

  1. FROM gcr.io/google_containers/kubernetes-dashboard-amd64:v1.10.2

第二部,在 DockerHub 中关联 GitHub 账户,并且在 Build Settings 中指定 Dockerfile 所在的目录,设置完成 Tag 等参数并保存后,点击 Trigger 开始构建。构建完成后,可以直接从 DockerHub 中下载 Kubernetes 的镜像了。下载完成后记得修改 Tag:

  1. docker pull kikajack/dashboard:v1.10.2
  2. docker tag kikajack/dashboard:v1.10.2
  3. gcr.io/google_containers/kubernetes-dashboard-amd64:v1.10.2

使用 Vagrant 搭建 Kubernetes 本地测试环境的更多相关文章

  1. 用java开发微信公众号:测试公众号与本地测试环境搭建(一)

    本文为原创,原始地址为:http://www.cnblogs.com/fengzheng/p/5023678.html 俗话说,工欲善其事,必先利其器.要做微信公众号开发,两样东西不可少,那就是要有一 ...

  2. https,https的本地测试环境搭建,asp.net结合https的代码实现,http网站转换成https网站之后遇到的问题

    一:什么是https SSL(Security   Socket   Layer)全称是加密套接字协议层,它位于HTTP协议层和TCP协议层之间,用于建立用户与服务器之间的加密通信,确保所传递信息的安 ...

  3. 【转】https,https的本地测试环境搭建,asp.net结合https的代码实现,http网站转换成https网站之后遇到的问题

    正需要这个,写的很好,就转过来了 转自: http://www.cnblogs.com/naniannayue/ 一:什么是https SSL(Security   Socket   Layer)全称 ...

  4. 利用Docker Compose快速搭建本地测试环境

    前言 Compose是一个定义和运行多个Docker应用的工具,用一个YAML(dockder-compose.yml)文件就能配置我们的应用.然后用一个简单命令就能启动所有的服务.Compose编排 ...

  5. 15分钟在笔记本上搭建 Kubernetes + Istio开发环境

    11月13~15日,KubeCon 上海大会召开,云原生是这个秋天最火热的技术.很多同学来问如何上手 Kubernetes和Istio 服务网格开发.本文将帮助你利用Docker CE桌面版,15分钟 ...

  6. Mac下docker搭建lamp本地开发环境

    1.先在Mac上下载docker:官网下载:下载地址(选择mac版本下载,可能速度较慢) DaoCloud下载:下载地址(速度较快,可能版本较低) 2.装完之后打开: 3.检查一下是否下载成功: $  ...

  7. kubeadm 搭建kubernetes集群环境

    需求 kubeadm 搭建kubernetes集群环境 准备条件 三台VPS(本文使用阿里云香港 - centos7.7) 一台能SSH连接到VPS的本地电脑 (推荐连接工具xshell) 安装步骤 ...

  8. 记录使用gogs,drone搭建自动部署测试环境

    使用gogs,drone,docker搭建自动部署测试环境 Gogs是一个使用go语言开发的自助git服务,支持所有平台 Docker是使用go开发的开源容器引擎 Drone是一个基于容器技术的持续集 ...

  9. windows下9款一键快速搭建PHP本地运行环境的好工具(含php7.0环境)

    推荐几款一键快速搭建PHP本地运行环境的好工具(含php7.0及apache,nigix,mysql) 首推phpstudy2016和wampServer3.0.6     理由支持php7.0 目前 ...

随机推荐

  1. CENTOS6.5 编译安装MySQL5.7.14

    前言 mysql5.7.14 编译安装在自定义文件路径下 下载安装包 配置安装环境 编译安装 cmake \ -DCMAKE_INSTALL_PREFIX=/data/db5714 \ -DMYSQL ...

  2. Java开发第一次面试经验(视频面试)

    坐标:山东潍坊公共实训基地 面试岗位:java开发实习生 我们班级一共6个人一起面试,1对1,其他人坐在旁边倾听,两个大牛,四个酱油,我应该是最黑的酱油啦. 面试问题: 1.请简短的做一下自我介绍: ...

  3. 移动端1像素解决方法,根据媒体查询transform缩放

    .borderOnePx{ position: relative; } .borderOnePx::after { content: ''; height:1px; background:#000; ...

  4. ReactiveCocoa详解

    最近看了大神的博客后,感觉该对ReactiveCocoa做一个了断了. 首先大致的对以下关于ReactiveCocoa内容做一个简单的总结,其他的后续更新 1.ReactiveCocoa的操作思想 2 ...

  5. Sersync 上配置 Sersync 服务

    上面的工作做好之后呢,下面就开始正式配置我们的 Sersync 了! 我们在 Sersync 安装过程中所用到包均是从谷歌 Sersync 项目组取得的,地址: https://code.google ...

  6. 一、.Net Core 分块上传文件

    一..Net Core 分块上传文件 一.前端实现 @* For more information on enabling MVC for empty projects, visit http://g ...

  7. 1142. Maximal Clique (25)

    A clique is a subset of vertices of an undirected graph such that every two distinct vertices in the ...

  8. ForkJoinPool源码简单解析

    ForkJoin框架之ForkJoinTask  java  阅读约 62 分钟 前言 在前面的文章"CompletableFuture和响应式编程"中提到了ForkJoinTas ...

  9. 前端每日实战:43# 视频演示如何用纯 CSS 绘制一个充满动感的 Vue logo

    效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/zaqKPx 可交互视频教程 此视频 ...

  10. windows 使用 git 客户端

    git客户端下载地址:https://www.git-scm.com/ tortoisegit下载地址:https://tortoisegit.org/ 双击下载的安装包,默认安装直到完成. 打开gi ...