使用Vagrant部署K8S Ubuntu集群,vagrantk8s


背景

虽然官方已有一个vagrant开发环境可用于mac,但是有 几个问题:

  1. guest os是fedora,我不熟悉也不喜欢

  2. 使用了并不是必须的salt来装k8s,没有必要

  3. 国内使用的话需要配置翻墙代理,我本人用的不是vpn而是proxy,比较麻烦些

  4. 部分信息稍老,且更新比较慢,而k8s的开发迭代速度很快

因此,我准备按照下述方法构建mac下开发环境:

  1. 使用vagrant+virtualbox用于cluster物理环境管理,即:负责拉起控制节点和K8S集群节点,挂载外部资源文件到VM内,并配置公共网络便于访问各节点和使用代理。其实就是相当于把vagrant当单机版IaaS使用。

  2. 使用官方ubuntu bare-metal cluster的安装方式,完成K8S集群软件安装

部署方式

为了节省资源及简化介绍,下文中只用两台VM,功能分别是:

  • k8s-ctl:作为控制节点,完成待部署的k8s版本准备、kubectl工具安装等,远程连接到k8s master

  • k8s-master:k8s集群master节点,是个standalone的模式,即:master和node都装在一台VM上

注:视情况后继可以增加多个k8s-node节点,参考下文配置流程即可。

部署过程

Vagrant

假定环境已安装好Vagrant(1.6.2以上)和Virtualbox(4.3),然后需要做三件事:

  1. 准备好box文件,可以到vagrant官方仓库下载:http://www.vagrantbox.es/。我这里使用的是:Ubuntu 14.04 with Docker enabled (based on amd64 server iso file)

    vagrant box add ubuntu-14.04-amd64 https://github.com/jose-lpa/packer-ubuntu_14.04/releases/download/v2.0/ubuntu-14.04.box
  2. 创建一个目录(本文假定路径为~/k8s/deploy/),也即vagrantfile所在目录

    mkdir -p ~/k8s/deploy
    cd ~/k8s/deploy
  3. 编写Vagrantfile文件:在deploy目录新建一个文件Vagrantfile,写入下述内容:

    Vagrant.configure(2) do |config|
     config.vm.define "k8s-ctl" do |c|
     c.vm.box = "ubuntu-14.04-amd64"
     c.vm.network "public_network" end
    
     config.vm.define "k8s-master" do |c|
     c.vm.box = "ubuntu-14.04-amd64"
     c.vm.network "public_network" end end

然后就可以通过vagrant up启动两台VM,然后可以ssh进入k8s-ctl:

vagrant up
vagrant ssh k8s-ctl

安装k8s

这部分主要参考官方ubuntu安装guide,但基于使用场景不同做了一些改动。

主要如下步骤:

  1. 获取可部署的k8s release

    首先下载任意一个k8s release版本(注:此并不是将要部署的版本,而是作为部署环境),建议在host上的~/k8s/deploy,也即是挂载到VM内的/vagrant目录。
    cd ~/k8s/deploy
    wget https://github.com/kubernetes/kubernetes/releases/download/v1.0.6/kubernetes.tar.gz -O - | tar -zxf -
    然后,我们就可以进入k8s-ctl,开始进行部署前的准备工作:
    vagrant ssh k8s-ctl
    
    # 可选:配置HTTP代理链接github、s3、gcr.io,若用VPN则不需要 export http_proxy=http://<proxy-ip>:<proxy-port>
    export https_proxy=https://<proxy-ip>:<proxy-port>
    
    cd /vagrant/kubernetes/cluster/ubuntu
    修改./build.sh,在文件头添加:
    FLANNEL_VERSION=0.5.3
    ETCD_VERSION=2.2.0
    KUBE_VERSION=1.0.6
    然后执行 `./build.sh`,正常结束后,当前路径下会多出一个`binaries/`目录,保存的是k8s多个二进制执行文件。
    
  2. 修改部署配置

    config-default.sh文件头部添加如下内容:
    nodes="vagrant@192.168.0.108"
    role="ai"
    NUM_MINIONS=1
    注:这里`nodes`按照自己环境的情况修改
    
  3. 开始部署

    export KUBERNETES_PROVIDER=ubuntu
    cd /vagrant/kubernetes/cluster/
    ./kube-up.sh
    1:如果提示需要sshkey,则`ssh-keygen && ssh-add`2:如果validate不成功,可能是因为使用的box镜像缺少一些需要的软件,ssh进入k8s-master VM进行安装,如docker、pgrep、bridge-utils、apt-transport-https。 
    注3:部署过程中出错,可以使用`./kube-down.sh`进行回退
    注4:部署过程如果出现网络错误,注意排查:每个node上/etc/hosts都已经配置了host-name,以及取消了proxy设置: unset http_proxy, https_proxy
    
  4. 验证部署结果

    通过kubectl命令可以check集群状态,以及访问k8s master的api-server
    vagrant@vagrant:/vagrant/kubernetes/cluster$ ./kubectl.sh get nodes
    NAME LABELS STATUS
    192.168.0.108 kubernetes.io/hostname=192.168.0.108 Ready
    vagrant@vagrant:/vagrant/kubernetes/cluster$ curl 192.168.0.108:8080/api
    {
     "versions": [
     "v1"
     ]
    }

其他

  • 可以把下述内容添加到~/.bashrc便于k8s操作:

    export KUBERNETES_PROVIDER=ubuntu
    export PATH=$PATH:/vagrant/kubernetes/cluster/ubuntu/binaries
    alias kc="kubectl"
  • 可以在集群上安装k8s的addons,比如DNS、KubeUI、KubeDash,可以通过下述命令部署自带的DNS

    cd cluster/ubuntu
    ./deployAddons.sh
  • 国内如果没用VPN,需要在k8s-master(如果集群,则在所有节点)上配置Docker代理,否则无法pull镜像,Ubuntu下:

    sudo echo "export http_proxy=\"http://<proxy-ip>:<proxy-port>\"" >> /etc/default/docker
    sudo echo "export https_proxy=\"https://<proxy-ip>:<proxy-port>\"" >> /etc/default/docker
    sudo service docker restart
  • SSH免账号登录的方法:kube-up过程需要多次ssh登录到各个nodes执行操作,以及scp发送文件,可以配置密钥对进行免账号登录:

    # 在Master节点生成秘钥文件
    ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa
    # 将秘钥文件拷贝到所有节点
    ssh-copy-id -i ~/.ssh/id_dsa.pub vagrant@<node-ip>
本文转自中文社区-使用Vagrant部署K8S Ubuntu集群

相关内容