使用 Vagrant 搭建 Kubernetes 本地测试环境
Kubernetes 需要一个至少包含三个节点的分布式系统。如果想学习 Kubernetes,或只是在本地搭建测试环境,则可以通过 Vagrant 来简单的实现。
1. 前提条件
- 电脑内存不小于 8 GB
- 提前安装好 Vagrant 和 Virtualbox
- 提前下载好 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 集群构建项目:
git clone https://github.com/rootsongjc/kubernetes-vagrant-centos-cluster.git
项目复制到本地后,将之前下载的两个 Kubernetes 安装包文件复制到这个项目的根目录中,启动 Vagrant 即可:
vagrant up
命令运行结束后,检查虚拟机状态:
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
命令操作集群。
mkdir -p ~/.kube
cp conf/admin.kubeconfig ~/.kube/config
本地访问需要在宿主机上安装 kubectl:
- 下载最新版本:
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:
curl -LO https://storage.googleapis.com/kubernetes-release/release/v1.10.0/bin/linux/amd64/kubectl
- 添加可执行权限:
chmod +x ./kubectl
- 将二进制文件移动到 PATH 路径中:
mv ./kubectl /usr/local/bin/kubectl
进入虚拟机
通过 vagrant ssh
可以进入所有集群可用节点。进入 Master 节点即可控制整个集群:
vagrant ssh node1
sudo -i
kubectl get nodes
通过 Kubernetes 的 Dashboard 访问
宿主机可以通过浏览器访问 https://172.17.8.101:6443
来访问 Dashboard。或执行 curl 来访问 API,这里也可以看到 Dashboard 的端口号:
# curl 172.17.8.101:8080/api
{
"kind": "APIVersions",
"versions": [
"v1"
],
"serverAddressByClientCIDRs": [
{
"clientCIDR": "0.0.0.0/0",
"serverAddress": "*.*.*.*:6443"
}
]
}
如果访问异常,可以参考上一步通过 SSH 进入 Kubernetes 的 Master 节点,然后使用 netstat -ntpl
查看具体的端口号。
2.3 管理 Vagrant
所有 Vagrant 操作都需要在项目根目录下进行。
停机重启
vagrant halt
vagrant up
清理虚拟机
vagrant destroy
rm -rf .vagrant
2.4 Vagrantfile 详解
# -*- mode: ruby -*-
# vi: set ft=ruby :
# All Vagrant configuration is done below. The "2" in Vagrant.configure
# configures the configuration version (we support older styles for
# backwards compatibility). Please don't change it unless you know what
# you're doing.
Vagrant.configure("2") do |config|
# The most common configuration options are documented and commented below.
# For a complete reference, please see the online documentation at
# https://docs.vagrantup.com.
# Every Vagrant development environment requires a box. You can search for
# boxes at https://vagrantcloud.com/search.
#config.vm.box = "centos/7"
# 关闭 box 的自动检查新版本功能
config.vm.box_check_update = false
# 同步宿主机的时间
config.vm.provider 'virtualbox' do |vb|
vb.customize [ "guestproperty", "set", :id, "/VirtualBox/GuestAdd/VBoxService/--timesync-set-threshold", 1000 ]
end
# 定义虚拟机个数变量
$num_instances = 3
# curl https://discovery.etcd.io/new?size=3
# 定义 ETCD 集群 Master 位置变量
$etcd_cluster = "node1=http://172.17.8.101:2380"
# 开始循环创建这 3 个虚拟机
(1..$num_instances).each do |i|
config.vm.define "node#{i}" do |node|
node.vm.box = "centos/7"
node.vm.hostname = "node#{i}"
ip = "172.17.8.#{i+100}"
# 指定桥接网络,可以用 ifconfig 查看并替换,名字需要跟宿主机的完全一致
node.vm.network "public_network", bridge: "en0: Wi-Fi (AirPort)", auto_config: true
#node.vm.synced_folder "/Users/DuffQiu/share", "/home/vagrant/share"
node.vm.provider "virtualbox" do |vb|
# 设置虚拟机可用内存,3 GB
vb.memory = "3072"
vb.cpus = 1
vb.name = "node#{i}"
end
# 执行脚本
node.vm.provision "shell" do |s|
s.inline = <<-SHELL
# 更改时区
cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
timedatectl set-timezone Asia/Shanghai
# 删除 CentOS 自带 yum 源,改用 Vagrant 提供的,并优先使用 163 的
rm /etc/yum.repos.d/CentOS-Base.repo
cp /vagrant/yum/*.* /etc/yum.repos.d/
mv /etc/yum.repos.d/CentOS7-Base-163.repo /etc/yum.repos.d/CentOS-Base.repo
# using socat to port forward in helm tiller
# install kmod and ceph-common for rook
yum install -y wget curl conntrack-tools vim net-tools socat ntp kmod ceph-common
# 通过 NTP 同步时间
echo 'sync time'
systemctl start ntpd
systemctl enable ntpd
echo 'disable selinux'
setenforce 0
sed -i 's/=enforcing/=disabled/g' /etc/selinux/config
echo 'enable iptable kernel parameter'
cat >> /etc/sysctl.conf <<EOF
net.ipv4.ip_forward=1
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl -p
echo 'set host name resolution'
cat >> /etc/hosts <<EOF
172.17.8.101 node1
172.17.8.102 node2
172.17.8.103 node3
EOF
cat /etc/hosts
echo 'set nameserver'
echo "nameserver 8.8.8.8">/etc/resolv.conf
cat /etc/resolv.conf
echo 'disable swap'
swapoff -a
sed -i '/swap/s/^/#/' /etc/fstab
# 如果不存在则创建 docker 组
egrep "^docker" /etc/group >& /dev/null
if [ $? -ne 0 ]
then
groupadd docker
fi
usermod -aG docker vagrant
rm -rf ~/.docker/
yum install -y docker.x86_64
# 更改 docker 镜像源
cat > /etc/docker/daemon.json <<EOF
{
"registry-mirrors" : ["http://2595fda0.m.daocloud.io"]
}
EOF
# 将第一个节点同时作为 Master 和 Worker,并安装 ETCD
if [[ $1 -eq 1 ]];then
yum install -y etcd
#cp /vagrant/systemd/etcd.service /usr/lib/systemd/system/
cat > /etc/etcd/etcd.conf <<EOF
#[Member]
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
ETCD_LISTEN_PEER_URLS="http://$2:2380"
ETCD_LISTEN_CLIENT_URLS="http://$2:2379,http://localhost:2379"
ETCD_NAME="node$1"
#[Clustering]
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://$2:2380"
ETCD_ADVERTISE_CLIENT_URLS="http://$2:2379"
ETCD_INITIAL_CLUSTER="$3"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_INITIAL_CLUSTER_STATE="new"
EOF
cat /etc/etcd/etcd.conf
# 通过 etcd-init.sh 脚本在 ETCD 中创建网络配置
echo 'create network config in etcd'
cat > /etc/etcd/etcd-init.sh<<EOF
#!/bin/bash
etcdctl mkdir /kube-centos/network
etcdctl mk /kube-centos/network/config '{"Network":"172.33.0.0/16","SubnetLen":24,"Backend":{"Type":"host-gw"}}'
EOF
chmod +x /etc/etcd/etcd-init.sh
echo 'start etcd...'
systemctl daemon-reload
systemctl enable etcd
systemctl start etcd
# 为 flannel 创建 IP 地址范围
echo 'create kubernetes ip range for flannel on 172.33.0.0/16'
/etc/etcd/etcd-init.sh
etcdctl cluster-health
etcdctl ls /
fi
# 所有节点都安装 Flannel
echo 'install flannel...'
yum install -y flannel
# 创建 Flannel 配置文件
echo 'create flannel config file...'
cat > /etc/sysconfig/flanneld <<EOF
# Flanneld configuration options
FLANNEL_ETCD_ENDPOINTS="http://172.17.8.101:2379"
FLANNEL_ETCD_PREFIX="/kube-centos/network"
FLANNEL_OPTIONS="-iface=eth1"
EOF
echo 'enable flannel with host-gw backend'
rm -rf /run/flannel/
systemctl daemon-reload
systemctl enable flanneld
systemctl start flanneld
echo 'enable docker'
systemctl daemon-reload
systemctl enable docker
systemctl start docker
echo "copy pem, token files"
mkdir -p /etc/kubernetes/ssl
cp /vagrant/pki/* /etc/kubernetes/ssl/
cp /vagrant/conf/token.csv /etc/kubernetes/
cp /vagrant/conf/bootstrap.kubeconfig /etc/kubernetes/
cp /vagrant/conf/kube-proxy.kubeconfig /etc/kubernetes/
cp /vagrant/conf/kubelet.kubeconfig /etc/kubernetes/
# 准备 Kubernetes 文件
echo "get kubernetes files..."
# 使用之前单独下载的 client 文件
#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
tar -xzvf /vagrant/kubernetes-client-linux-amd64.tar.gz -C /vagrant
cp /vagrant/kubernetes/client/bin/* /usr/bin
# 使用之前单独下载的 server 文件
#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
tar -xzvf /vagrant/kubernetes-server-linux-amd64.tar.gz -C /vagrant
cp /vagrant/kubernetes/server/bin/* /usr/bin
cp /vagrant/systemd/*.service /usr/lib/systemd/system/
mkdir -p /var/lib/kubelet
mkdir -p ~/.kube
cp /vagrant/conf/admin.kubeconfig ~/.kube/config
if [[ $1 -eq 1 ]];then
echo "configure master and node1"
cp /vagrant/conf/apiserver /etc/kubernetes/
cp /vagrant/conf/config /etc/kubernetes/
cp /vagrant/conf/controller-manager /etc/kubernetes/
cp /vagrant/conf/scheduler /etc/kubernetes/
cp /vagrant/conf/scheduler.conf /etc/kubernetes/
cp /vagrant/node1/* /etc/kubernetes/
systemctl daemon-reload
systemctl enable kube-apiserver
systemctl start kube-apiserver
systemctl enable kube-controller-manager
systemctl start kube-controller-manager
systemctl enable kube-scheduler
systemctl start kube-scheduler
systemctl enable kubelet
systemctl start kubelet
systemctl enable kube-proxy
systemctl start kube-proxy
fi
if [[ $1 -eq 2 ]];then
echo "configure node2"
cp /vagrant/node2/* /etc/kubernetes/
systemctl daemon-reload
systemctl enable kubelet
systemctl start kubelet
systemctl enable kube-proxy
systemctl start kube-proxy
fi
if [[ $1 -eq 3 ]];then
echo "configure node3"
cp /vagrant/node3/* /etc/kubernetes/
systemctl daemon-reload
systemctl enable kubelet
systemctl start kubelet
systemctl enable kube-proxy
systemctl start kube-proxy
# 部署 CoreDNS
echo "deploy coredns"
cd /vagrant/addon/dns/
./dns-deploy.sh 10.254.0.0/16 172.33.0.0/16 10.254.0.2 | kubectl apply -f -
cd -
# 部署 dashboard
echo "deploy kubernetes dashboard"
kubectl apply -f /vagrant/addon/dashboard/kubernetes-dashboard.yaml
echo "create admin role token"
kubectl apply -f /vagrant/yaml/admin-role.yaml
echo "the admin role token is:"
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
echo "login to dashboard with the above token"
echo https://172.17.8.101:`kubectl -n kube-system get svc kubernetes-dashboard -o=jsonpath='{.spec.ports[0].port}'`
echo "install traefik ingress controller"
kubectl apply -f /vagrant/addon/traefik-ingress/
fi
SHELL
s.args = [i, ip, $etcd_cluster]
end
end
end
end
3. 安装问题
3.1 Vagrant 无法下载 box
这里如果 Vagrant 无法下载 box,或是想自己选择 Vagrant 所使用的 CentOS 版本,可以去 CentOS 官网提供的 下载页面 下载。例如下载 18 年 3 月份的这个版本 CentOS-7-x86_64-Vagrant-1803_01.VirtualBox.box
:
wget http://cloud.centos.org/centos/7/vagrant/x86_64/images/CentOS-7-x86_64-Vagrant-1803_01.VirtualBox.box
下载之后,将其添加到 Vagrant 中并命名为 centos/7
即可:
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 文件,内容如下,版本可以改成你需要的:
FROM gcr.io/google_containers/kubernetes-dashboard-amd64:v1.10.2
第二部,在 DockerHub 中关联 GitHub 账户,并且在 Build Settings 中指定 Dockerfile 所在的目录,设置完成 Tag 等参数并保存后,点击 Trigger 开始构建。构建完成后,可以直接从 DockerHub 中下载 Kubernetes 的镜像了。下载完成后记得修改 Tag:
docker pull kikajack/dashboard:v1.10.2
docker tag kikajack/dashboard:v1.10.2
gcr.io/google_containers/kubernetes-dashboard-amd64:v1.10.2
使用 Vagrant 搭建 Kubernetes 本地测试环境的更多相关文章
- 用java开发微信公众号:测试公众号与本地测试环境搭建(一)
本文为原创,原始地址为:http://www.cnblogs.com/fengzheng/p/5023678.html 俗话说,工欲善其事,必先利其器.要做微信公众号开发,两样东西不可少,那就是要有一 ...
- https,https的本地测试环境搭建,asp.net结合https的代码实现,http网站转换成https网站之后遇到的问题
一:什么是https SSL(Security Socket Layer)全称是加密套接字协议层,它位于HTTP协议层和TCP协议层之间,用于建立用户与服务器之间的加密通信,确保所传递信息的安 ...
- 【转】https,https的本地测试环境搭建,asp.net结合https的代码实现,http网站转换成https网站之后遇到的问题
正需要这个,写的很好,就转过来了 转自: http://www.cnblogs.com/naniannayue/ 一:什么是https SSL(Security Socket Layer)全称 ...
- 利用Docker Compose快速搭建本地测试环境
前言 Compose是一个定义和运行多个Docker应用的工具,用一个YAML(dockder-compose.yml)文件就能配置我们的应用.然后用一个简单命令就能启动所有的服务.Compose编排 ...
- 15分钟在笔记本上搭建 Kubernetes + Istio开发环境
11月13~15日,KubeCon 上海大会召开,云原生是这个秋天最火热的技术.很多同学来问如何上手 Kubernetes和Istio 服务网格开发.本文将帮助你利用Docker CE桌面版,15分钟 ...
- Mac下docker搭建lamp本地开发环境
1.先在Mac上下载docker:官网下载:下载地址(选择mac版本下载,可能速度较慢) DaoCloud下载:下载地址(速度较快,可能版本较低) 2.装完之后打开: 3.检查一下是否下载成功: $ ...
- kubeadm 搭建kubernetes集群环境
需求 kubeadm 搭建kubernetes集群环境 准备条件 三台VPS(本文使用阿里云香港 - centos7.7) 一台能SSH连接到VPS的本地电脑 (推荐连接工具xshell) 安装步骤 ...
- 记录使用gogs,drone搭建自动部署测试环境
使用gogs,drone,docker搭建自动部署测试环境 Gogs是一个使用go语言开发的自助git服务,支持所有平台 Docker是使用go开发的开源容器引擎 Drone是一个基于容器技术的持续集 ...
- windows下9款一键快速搭建PHP本地运行环境的好工具(含php7.0环境)
推荐几款一键快速搭建PHP本地运行环境的好工具(含php7.0及apache,nigix,mysql) 首推phpstudy2016和wampServer3.0.6 理由支持php7.0 目前 ...
随机推荐
- mysql-schema-sync同步两个实例
参考:https://github.com/hidu/mysql-schema-sync 需求:测试环境表结构变动同步到开发环境,两个实例各有数百个库,不适合每个库写一个配置文件 环境:操作系统ubu ...
- Git-第N篇碰见的一些问题
1.关于windows平台自动换行问题 warning: LF will be replaced by CRLF in readme.txt. The file will have its origi ...
- 说说 HTTP 和 HTTPS 区别??
HTTP 协议传输的数据都是未加密的,也就是明文的,因此使用 HTTP 协议传输隐私信息非常不安全,为了保证这些隐私数据能加密传输,于是网景公司设计了 SSL(Secure Sockets Layer ...
- 模板 - 可持久化无旋Treap
空间消耗非常玄学,有多大开多大就完事了.其实是因为单次操作可能会有数次Merge和Split操作,按照下面的版本的话Merge和Split都进行复制,所以一次操作可能复制了4个版本. 四个函数式查询, ...
- python 模块调用的几种方式
在python里面又很多模块,或者引用第三方模块,python 模块调用的几种方式,下面详细解说 1,import 模块名 2,from 模块 import 模块里面的小功能 3,from 模块 ...
- P5444 [APIO2019]奇怪装置
传送门 考虑求出最小的循环节 $G$ 使得 $t,t+G$ 得到的数对是一样的 由 $y \equiv t \mod B$ ,得到 $G$ 一定是 $B$ 的倍数,设 $zB=G$,则 $t,t+zB ...
- MongoDB的使用学习之(一)开篇
本人是菜鸟-1级,整理这个系列,之所以用整理,而不是写,是因为本人不是从头自己读源码,一个一个字母翻译过来的,而是记录整个学习过程,查看别人好的文章,收集好的资料,并有自己的一些项目代码,并从中得到点 ...
- tf.clip_by_global_norm
首先明白这个事干嘛的,在我们做求导的时候,会遇到一种情况,求导函数突然变得特别陡峭,是不是意味着下一步的进行会远远高于正常值,这个函数的意义在于,在突然变得陡峭的求导函数中,加上一些判定,如果过于陡峭 ...
- Object中有哪些公用方法?
clone()方法 实现对象的浅复制,只有实现了Cloneable接口才能调用该方法. toString()方法 返回该对象的字符串表示. equals()方法: 在Object中与“==”的定义是一 ...
- AtCoder Beginner Contest 137
前言 又是卡在了T4 , 总分 100 + 200 + 300 = 600pts rank 2449.以后还是要多积累比赛经验. A 输出a+b,a-b,a*b中最大的数,还要多简单?不挂代码了 B ...