千里之行始于足下

基于Rancher+Vagrant+libvirt搭建kubernetes集群

Posted on By Peter Yang

Intro

本文主要记录使用Rancher快速搭建一个k8s集群的方法,便于后续继续研究k8s或者用于持续集成的自动化测试环节。

Rancher

Rancher是面向kubernetes的跨云多集群管理方案,既支持管理私有云kubernetes集群,也支持管理基于公有云创建的kubernetes集群,如AWS, Azure等。

有关Rancher的详细信息可以查看官方网站

Rancher主要由Rancher ServerCluster AgentNode Agent三部分组成。如下图

rancher_arch

所有组件都运行在容器中。

Rancher Server全局唯一,生产环境中需要做HA部署,方法文档中有,这里不展开。

我们主要目标在于研究k8s,因此使用单节点容器部署,存储也使用容器内etcd空间。命令如下

# sudo docker run -d --restart=unless-stopped \
    -p 80:80 -p 443:443 \
    rancher/rancher:latest

启动完之后,可以通过如下地址在浏览器访问

https://<rancher_server_ip>

第一次登录需要设定帐号、密码、访问域名等。

为了后续的自动化步骤,我们还需要创建API使用的token。方法如下:

  • 点击右上角用户,通过API&Key生成新的token,记录好,备用。

API

Rancher支持丰富的API系统来操作,具体参考API文档

主要分为创建集群生成节点注册命令获取注册命令这三步。可以写个整合脚本简化步骤。

脚本里最主要的是集群模板那部分

cluster模板

实际上Rancher可以基于页面配置模板,然后基于模板选择集群。我们这里使用API,所以直接在参数中定义好集群模板即可。模板以yaml描述,大致如下

#
## Cluster Config
#
docker_root_dir: /var/lib/docker
enable_cluster_alerting: false
enable_cluster_monitoring: false
enable_network_policy: false
local_cluster_auth_endpoint:
  enabled: true
#
## Rancher Config
#
rancher_kubernetes_engine_config: # Your RKE template config goes here.
  addon_job_timeout: 30
  authentication:
    strategy: x509
  ignore_docker_version: true
  #
  ## # Currently only nginx ingress provider is supported.
  ## # To disable ingress controller, set `provider: none`
  ## # To enable ingress on specific nodes, use the node_selector, eg:
  ##    provider: nginx
  ##    node_selector:
  ##      app: ingress
  #
  ingress:
    provider: nginx
  kubernetes_version: v1.15.3-rancher3-1
  monitoring:
    provider: metrics-server
  #
  ##   If you are using calico on AWS
  #
  ##    network:
  ##      plugin: calico
  ##      calico_network_provider:
  ##        cloud_provider: aws
  #
  ## # To specify flannel interface
  #
  ##    network:
  ##      plugin: flannel
  ##      flannel_network_provider:
  ##      iface: eth1
  #
  ## # To specify flannel interface for canal plugin
  #
  ##    network:
  ##      plugin: canal
  ##      canal_network_provider:
  ##        iface: eth1
  #
  network:
    options:
      flannel_backend_type: vxlan
    plugin: canal

  # private docker registry
  private_registries:
    - is_default: true
      url: <private registry>
      user: <user name>
      password: <password>
  #
  ##    services:
  ##      kube-api:
  ##        service_cluster_ip_range: 10.43.0.0/16
  ##      kube-controller:
  ##        cluster_cidr: 10.42.0.0/16
  ##        service_cluster_ip_range: 10.43.0.0/16
  ##      kubelet:
  ##        cluster_domain: cluster.local
  ##        cluster_dns_server: 10.43.0.10
  #
  services:
    etcd:
      backup_config:
        enabled: true
        interval_hours: 12
        retention: 6
        safe_timestamp: false
      creation: 12h
      extra_args:
        election-timeout: 5000
        heartbeat-interval: 500
      gid: 0
      retention: 72h
      snapshot: false
      uid: 0
    kube_api:
      always_pull_images: false
      pod_security_policy: false
      service_node_port_range: 30000-32767
    kubelet:
      extra_binds:
        - '/var/openebs/local:/var/openebs/local'
      fail_swap_on: false
      generate_serving_certificate: false
  ssh_agent_auth: false
windows_prefered_cluster: false

具体解释见文档

vagrant

vagrant是轻量级的虚拟机管理平台,可以支持virtualboxqemu/kvmxen等多种hypervisor。详见官方文档

本文中基于qemu/kvm。安装脚本如下

#!/usr/bin/bash

yum install -y python-pip
yum install -y libxslt-devel libxml2-devel libvirt-devel libguestfs-tools-c ruby-devel gcc libvirt
yum install -y ruby

# install vagrant
yum install -y vagrant

# install libvirt support
vagrant plugin install vagrant-libvirt


# config and enable libvirtd
# change default storage path
sed -i 's,/var/lib/libvirt/images,/data/libvirt/images,g' /etc/libvirt/storage/default.xml

mkdir -p /data2/libvirt/images
virsh pool-destroy default
virsh pool-create --file /etc/libvirt/storage/pool.xml

# enable libvirtd
systemctl enable libvirtd
systemctl start libvirtd

# install centos box
vagrant box add --name xxxx <xx url>


Vagrantfile

vagrant基于Vagrantfile来描述虚机配置以及初始化过程。其基本格式如下

# -*- mode: ruby -*-
# vi: set ft=ruby :

require 'yaml'

VAGRANTFILE_API_VERSION = '2'

# we could load settings from yaml file to make it easier to configure
config_file=File.expand_path(File.join(File.dirname(__FILE__), 'vagrant_variables.yml'))
settings=YAML.load_file(config_file)

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.box = BOX
  config.vm.box_url = BOX_URL
  config.ssh.insert_key = false # workaround for https://github.com/mitchellh/vagrant/issues/5048
  config.ssh.private_key_path = settings['ssh_private_key_path']
  config.ssh.username = 'root'
  
  $first_run = <<-SCRIPT
  echo "do something when vm first bootup..."
  SCRIPT

  
  # first run script
  config.vm.provision "shell", inline: $first_run
  # first run script end

  # When using libvirt, avoid errors like:
  # "host doesn't support requested feature: CPUID.01H:EDX.ds [bit 21]"
  config.vm.provider :libvirt do |l|
    l.memory = 4096
    l.cpus = 4
    l.cpu_mode = 'host-passthrough'
    l.volume_cache = 'unsafe'
    l.graphics_type = 'none'
  end
end

整合

有了vagrantRancher这两个工具,我们可以编写脚本来自动化创建整个系统了。初步思路如下

  1. 使用vagrant创建好一组需要的虚拟机
  2. 使用Rancher API创建集群,并生成节点注册脚本,再使用ansible在各节点上运行适合的注册命令,即一部分创建为controller,一部分创建为worker

脚本这里就不贴了,参考上述内容可以很容易写出来。

实际应用

使用该脚本,可以在15分钟建立一个12节点的Rancher管控的k8s集群,基本满足后续研究需求。

参考文献