Vagrant學(xué)習(xí)筆記:搭建K8s集群
通常情況下,我們在使用VMware、VirtualBox這一類虛擬機(jī)軟件創(chuàng)建虛擬開發(fā)環(huán)境時(shí),往往需要經(jīng)歷尋找并下載操作系統(tǒng)的安裝鏡像文件,然后根據(jù)該鏡像文件啟動(dòng)的安裝向?qū)б徊揭徊降匕惭b與配置操作系統(tǒng),最后還需要從零開始安裝開發(fā)與運(yùn)維工具。整個(gè)過程會(huì)非常的費(fèi)時(shí)費(fèi)力,特別是在我們需要虛擬一個(gè)K8s集群的情況下,工作量更是會(huì)隨著需要該集群中需要的服務(wù)器數(shù)量而成倍增加,這時(shí)候如果有一款像Vagrant這樣的自動(dòng)化虛擬機(jī)管理工具就非常重要了。接下來,就讓我們來介紹一下Vagrant這個(gè)工具,以及如何使用它來虛擬一個(gè)由三臺(tái)服務(wù)器構(gòu)成的K8s集群。
Vagrant的基本使用
正如之前所說,Vagrant是一款專用于實(shí)現(xiàn)虛擬機(jī)自動(dòng)化管理的軟件工具,主要使用Ruby編寫而成,以命令行終端的工具的形式存在于計(jì)算機(jī)中。在這里,需要特別強(qiáng)調(diào)的一件事是:Vagrant是一款“管理”虛擬機(jī)的軟件而非“創(chuàng)建”虛擬機(jī)的軟件。也就是說,Vagrant本身并不能用來創(chuàng)建虛擬機(jī),它通常需要搭配VMware、VirtualBox這一類虛擬機(jī)軟件來使用,以便共同完成虛擬開發(fā)環(huán)境的快速搭建與配置。當(dāng)然了,該工具允許人們通過編寫一個(gè)名為vagrantfile
配置文件的方式來定義虛擬機(jī)的自動(dòng)化構(gòu)建與銷毀的過程,并配置虛擬機(jī)與其宿主機(jī)間的文件共享、虛擬機(jī)網(wǎng)絡(luò)環(huán)境等相關(guān)參數(shù)。除此之外,我們還可以通過編寫一些讓虛擬機(jī)在完成創(chuàng)建后,第一次被啟動(dòng)時(shí)要執(zhí)行的自定義腳本,以便用于以批處理的方式實(shí)現(xiàn)一些開發(fā)與運(yùn)維工具的自動(dòng)化安裝與配置,這也將大大地提高我們構(gòu)建虛擬開發(fā)環(huán)境的效率。最后,由于Vagrant還支持批量復(fù)制已創(chuàng)建的虛擬機(jī),這意味著我們只需要執(zhí)行一次操作,就可以同時(shí)擁有多個(gè)相同配置、安裝了相同軟件的虛擬機(jī)。
和學(xué)習(xí)大多數(shù)工具的過程一樣,在正式介紹Vagrant的具體使用方式之前,我們也同樣有必要先了解一下這款命令行工具的整體設(shè)計(jì)架構(gòu)。因?yàn)橹挥羞@樣,我們才能理解它的核心使用邏輯。
項(xiàng)目的組成架構(gòu)
從整體設(shè)計(jì)上來說,一個(gè)交由Vagrant來管理的虛擬機(jī)項(xiàng)目通常由以下幾大模塊組合而成。
-
Boxes:該模塊指的是Vagrant用于創(chuàng)建虛擬開發(fā)環(huán)境時(shí)所需要使用的、擴(kuò)展名為
.box
的鏡像文件。需要注意的是,該鏡像文件并不是我們之前使用傳統(tǒng)方式創(chuàng)建虛擬機(jī)時(shí)的、用于安裝操作系統(tǒng)的鏡像文件,而是一個(gè)基于某個(gè)現(xiàn)有的虛擬機(jī)打包而成的快照文件。該鏡像文件中除了基礎(chǔ)數(shù)據(jù)的鏡像外,還包括一些元數(shù)據(jù)文件,這些元數(shù)據(jù)將用于指導(dǎo)Vagrant將系統(tǒng)鏡像正確的加載到對應(yīng)的虛擬機(jī)當(dāng)中。需要注意的是,這些鏡像文件是嚴(yán)格依賴于Providers所指定的虛擬機(jī)軟件的,也就是說,在VMware下使用的鏡像文件是無法在VirtualBox上使用的,反之亦然; -
Providers:該模塊指的是Vagrant用于創(chuàng)建虛擬開發(fā)環(huán)境時(shí)所需要使用的虛擬機(jī)軟件,例如:VirtualBox、VMware、Hyper-V、KVM等。在Vagrant的架構(gòu)中,Providers模塊將以服務(wù)的形式存在,它的作用是幫助Vagrant利用Boxes模塊指定的鏡像文件來創(chuàng)建虛擬開發(fā)環(huán)境;
-
Provisioners:該模塊指的是在Vagrant完成虛擬開發(fā)環(huán)境的創(chuàng)建后,讓虛擬機(jī)自動(dòng)執(zhí)行的自定義腳本。在Vagrant的架構(gòu)中,我們通常會(huì)利用這些自定義的腳本來實(shí)現(xiàn)一些開發(fā)與運(yùn)維工具的自動(dòng)化安裝與配置,例如VIM編輯器及其插件、Node.js運(yùn)行平臺(tái)、Docker和K8s運(yùn)維工具等。
-
Vagrant CLI:該模塊指的是Vagrant用于管理虛擬機(jī)的一系列命令,包括創(chuàng)建、啟動(dòng)、關(guān)閉、重啟、掛起等虛擬機(jī)操作,也包括打包,注冊等虛擬機(jī)鏡像文件的操作。這些命令可以幫助我們更好地與Providers模塊指定的虛擬機(jī)軟件進(jìn)行交互。
當(dāng)然,在使用Vagrant管理虛擬機(jī)的過程中,我們需要在vagrantfile
配置文件中定義與Providers和Provisioners這兩個(gè)模塊相關(guān)的參數(shù),以及要使用的鏡像文件。下面,我們就來重點(diǎn)介紹一下vagrantfile
配置文件具體寫法。
編寫項(xiàng)目配置文件
如前所述,Vagrant虛擬機(jī)項(xiàng)目的配置文件名為vagrantfile
,該文件將負(fù)責(zé)定義虛擬機(jī)的創(chuàng)建參數(shù)、自動(dòng)化執(zhí)行的腳本、虛擬機(jī)與宿主機(jī)之間的共享目錄及其通信網(wǎng)絡(luò)等關(guān)鍵信息。由于Vagrant主要是用Ruby開發(fā)而成的,所以vagrantfile
文件中使用的配置語言自然也采用了這門編程語言的語法,但這也并不意味著我們必須先學(xué)會(huì)Ruby的全部語法才能使用Vagrant。因?yàn)閂agrant對自己的配置語言做了一定程度的重新定義,其語法規(guī)則事實(shí)上比我們真正在編程活動(dòng)中使用的Ruby語言要簡單不少,對于任何一個(gè)有編程語言使用經(jīng)驗(yàn)的人來說,通常只需要學(xué)習(xí)幾個(gè)小時(shí),就基本能應(yīng)付日常使用中的大部分需求了。下面,就讓我們來實(shí)際體驗(yàn)一下快速掌握這套語法規(guī)則的過程吧。
通常情況下,vagrantfile
文件都會(huì)被存放在Vagrant虛擬機(jī)項(xiàng)目的根目錄下,在實(shí)際使用中常常會(huì)借由vagrant init
命令來自動(dòng)生成。例如,如果我們在計(jì)算機(jī)的任意位置上創(chuàng)建了一個(gè)名為vagrant_demo
的目錄,那么我們只需要在Powershell/Bash這樣的命令行終端環(huán)境,進(jìn)入到vagrant_demo
目錄中并執(zhí)行vagrant init
命令,然后就會(huì)在該目錄下看到一個(gè)自動(dòng)生成的vagrantfile
文件,其主要內(nèi)容如下。
# -*- 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 = "base"
# Disable automatic box update checking. If you disable this, then
# boxes will only be checked for updates when the user runs
# `vagrant box outdated`. This is not recommended.
# config.vm.box_check_update = false
# Create a forwarded port mapping which allows access to a specific port
# within the machine from a port on the host machine. In the example below,
# accessing "localhost:8080" will access port 80 on the guest machine.
# NOTE: This will enable public access to the opened port
# config.vm.network "forwarded_port", guest: 80, host: 8080
# Create a forwarded port mapping which allows access to a specific port
# within the machine from a port on the host machine and only allow access
# via 127.0.0.1 to disable public access
# config.vm.network "forwarded_port", guest: 80, host: 8080, host_ip: "127.0.0.1"
# Create a private network, which allows host-only access to the machine
# using a specific IP.
# config.vm.network "private_network", ip: "192.168.33.10"
# Create a public network, which generally matched to bridged network.
# Bridged networks make the machine appear as another physical device on
# your network.
# config.vm.network "public_network"
# Share an additional folder to the guest VM. The first argument is
# the path on the host to the actual folder. The second argument is
# the path on the guest to mount the folder. And the optional third
# argument is a set of non-required options.
# config.vm.synced_folder "../data", "/vagrant_data"
# Provider-specific configuration so you can fine-tune various
# backing providers for Vagrant. These expose provider-specific options.
# Example for VirtualBox:
#
# config.vm.provider "virtualbox" do |vb|
# # Display the VirtualBox GUI when booting the machine
# vb.gui = true
#
# # Customize the amount of memory on the VM:
# vb.memory = "1024"
# end
#
# View the documentation for the provider you are using for more
# information on available options.
# Enable provisioning with a shell script. Additional provisioners such as
# Ansible, Chef, Docker, Puppet and Salt are also available. Please see the
# documentation for more information about their specific syntax and use.
# config.vm.provision "shell", inline: <<-SHELL
# apt-get update
# apt-get install -y apache2
# SHELL
end
如果讀者仔細(xì)觀察一下上述文件的內(nèi)容,就會(huì)發(fā)現(xiàn)它實(shí)際上就是vagrantflie
配置文件的一個(gè)模板和一份以注釋形式編寫的簡易教程。下面我們就基于這個(gè)文件來介紹一下如何具體配置一個(gè)Vagrant虛擬機(jī)項(xiàng)目。首先,如果我們?nèi)サ粼撐募械乃凶⑨專蜁?huì)發(fā)現(xiàn)其當(dāng)前真正發(fā)揮作用的配置只有以下三行代碼。
Vagrant.configure("2") do |config|
config.vm.box = "base"
end
不用懷疑,正是這三行代碼構(gòu)成了一個(gè)Vagrant項(xiàng)目的基本配置。其中,第一行定義了一個(gè)名為config
的配置對象,該對象的各項(xiàng)屬性就是我們對虛擬機(jī)項(xiàng)目的全局配置項(xiàng),適用于該項(xiàng)目所管轄的所有虛擬機(jī)。根據(jù)該對象的聲明,我們還可以知道它采用的是版本為2
的配置規(guī)則。然后,從第一行開始,直至遇到最后一行中的end
這個(gè)結(jié)束符之前,我們編寫的所有代碼都是在config
對象的作用域內(nèi)進(jìn)行的細(xì)項(xiàng)配置。譬如在上面代碼的第二行中,config.vm.box
選項(xiàng)的作用是配置Vagrant創(chuàng)建虛擬機(jī)時(shí)所需要使用的鏡像文件。需要特別注意的是,這里的base
是一個(gè)無效的鏡像名,我們需要根據(jù)自己的需要將其改為實(shí)際有效的鏡像文件名,例如,如果我們想安裝的是一個(gè)基于CentOS系統(tǒng)的虛擬機(jī),就可以將這行代碼改為config.vm.box = "centos-7"
。除此之外,根據(jù)我們剛才移除的注釋內(nèi)容,我們接下來還可以為虛擬機(jī)配置以下選項(xiàng)。
-
config.vm.hostname
選項(xiàng):該選項(xiàng)用于配置虛擬機(jī)的主機(jī)名,當(dāng)我們需要模擬由多臺(tái)機(jī)器組成的開發(fā)環(huán)境時(shí),主機(jī)名的設(shè)置通常是必不可少的,例如,如果我們創(chuàng)建了centos1
、centos2
兩臺(tái)虛擬機(jī),那么在使用vagrant up
命令啟動(dòng)虛擬機(jī)就需要用主機(jī)名指定要啟動(dòng)的是centos1
還是centos2
,否則所有的虛擬機(jī)將會(huì)一起被啟動(dòng),一瞬間占用掉宿主機(jī)的大量資源。另外,該主機(jī)名也將會(huì)以環(huán)境變量的形式設(shè)置在虛擬機(jī)所安裝的操作系統(tǒng)中; -
config.vm.network
選項(xiàng):該選項(xiàng)用于配置虛擬機(jī)的網(wǎng)絡(luò)。在Vagrant管理的虛擬機(jī)之間,網(wǎng)絡(luò)連接可以有以下三種模式。- NAT模式:這是Vagrant在默認(rèn)情況下會(huì)使用的網(wǎng)絡(luò)連接模式,不需要我們對其進(jìn)行特別設(shè)置。在該模式下,虛擬機(jī)可以借由其宿主機(jī)端口轉(zhuǎn)發(fā)的形式訪問訪問局域網(wǎng),乃至整個(gè)互聯(lián)網(wǎng)。
- host-only模式:該模式需要使用將
config.vm.network
選項(xiàng)設(shè)置為private_network
,并為其手動(dòng)指定IP地址,或者將網(wǎng)絡(luò)類型設(shè)置為DHCP以便讓其自動(dòng)分配IP地址。在該模式下,虛擬機(jī)只能被其宿主機(jī)訪問,其他機(jī)器均無法訪問它。 - bridge模式:該模式需要使用將
config.vm.network
選項(xiàng)設(shè)置為public_network
,并為其手動(dòng)指定IP地址,或者為其指定要橋接的網(wǎng)絡(luò)適配器。在該模式下,虛擬機(jī)就相當(dāng)于是其宿主機(jī)所在的局域網(wǎng)中的一臺(tái)獨(dú)立的機(jī)器,可以被其他機(jī)器訪問。
下面是一些該選項(xiàng)的具體配置示例。
# 將網(wǎng)絡(luò)配置為host-only模式,并為其手動(dòng)配置IP地址 config.vm.network :private_network, ip: "192.168.100.1" # 將網(wǎng)絡(luò)配置為host-only模式,并將其配置為DHCP地址分配模式 config.vm.network "private_network", type: "dhcp” # 將網(wǎng)絡(luò)配置為bridge模式,并為其手動(dòng)配置IP地址 config.vm.network "public_network", ip: "192.168.31.7" # 將網(wǎng)絡(luò)配置為bridge模式,并為其指定橋接適配器 config.vm.network "public_network", bridge: "en1: Wi-Fi (AirPort)" # 配置虛擬機(jī)與宿主之間的端口映射 # 將宿主機(jī)上的8080端口映射到虛擬機(jī)的80端口 config.vm.network :forwarded_port, guest: 80, host: 8080
-
config.vm.provider
選項(xiàng):該選項(xiàng)用于配置虛擬機(jī)的具體硬件參數(shù)。在Vagrant中,由于硬件參數(shù)的具體設(shè)置依賴于其具體使用的虛擬機(jī)軟件服務(wù),所以在配置該選項(xiàng)是需要指定我們所使用的具體Providers類型,并定義出一個(gè)該類型的對象,然后再通過該對象來進(jìn)行相關(guān)配置。例如,如果我們需要基于VirtualBox這款虛擬機(jī)軟件。使用Vagrant創(chuàng)建一臺(tái)雙核CPU,內(nèi)存為4GB的虛擬機(jī),就可以配置文件編寫如下。Vagrant.configure("2") do |config| # 其他全局配置 ... config.vm.provider :virtualbox do |vb| # 設(shè)置虛擬機(jī)在VirtualBox管理控制臺(tái)中的名稱。 vb.name = "vagrant_demo" # 設(shè)置虛擬機(jī)的內(nèi)存大小,單位為MB vb.memory = "4096" #設(shè)置虛擬機(jī)的CPU核心數(shù) vb.cpus = 2 end end
-
config.vm.synced_folder
選項(xiàng):該選項(xiàng)用于配置虛擬機(jī)與宿主機(jī)之間的共享目錄,默認(rèn)情況下,該共享目錄就是vagrantfile
文件所在的目錄(即當(dāng)前項(xiàng)目的根目錄),如果想特別指定其他目錄,就需要手動(dòng)為該選項(xiàng)設(shè)置新的值,例如像下面這樣。# 在Windows系統(tǒng)中設(shè)置共享目錄 # 將Windows系統(tǒng)的宿主機(jī)的"D:/code"目錄 # 映射并掛載到Ubuntu系統(tǒng)的虛擬機(jī)中的"/home/www/"目錄中 config.vm.synced_folder "D:/code", "/home/www/"
-
config.ssh.username
選項(xiàng):該選項(xiàng)用于配置虛擬機(jī)中登錄系統(tǒng)所用的用戶名。在Vagrant中,默認(rèn)用戶名就是vagrant
,如果我們使用的Box文件是個(gè)官方鏡像,就務(wù)必要使用這個(gè)默認(rèn)用戶名。但如果使用的是自己打包的鏡像文件,那就可以根據(jù)實(shí)際情況通過該選項(xiàng)來配置我們所要使用的用戶名。 -
config.vm.provision
選項(xiàng):該選項(xiàng)用于配置可讓虛擬機(jī)自動(dòng)執(zhí)行的自定義腳本,這些腳本通常只能在第一次執(zhí)行vagrant up
命令時(shí),額外特別執(zhí)行vagrant provision
、vagrant reload --provision
或vagrant up --provision
命令時(shí)自動(dòng)執(zhí)行,主要用于完成必備工具的安裝與配置操作。另外,由于Vagrant支持的自定義的腳本類型包括Shell、Ansible、CFEngine、Chef、Docker等,所以我們在使用該選項(xiàng)配置自定義腳本時(shí),通常需要指定腳本的類型和執(zhí)行方式,下面是一些配置示例。Vagrant.configure("2") do |config| # 以內(nèi)聯(lián)的方式執(zhí)行 Shell 腳本 config.vm.provision "shell", inline: "echo 1" # 以外部文件的方式執(zhí)行 Shell 腳本 config.vm.provision "shell", path: "./scripts/script.sh" end
除了上述使用config
對象進(jìn)行的全局配置之外,如果需要一次創(chuàng)建多臺(tái)虛擬機(jī)的話,我們還可以通過config.vm.define
選項(xiàng)來定義一個(gè)局部對象,以便針對某個(gè)具體的虛擬機(jī)來進(jìn)行針對性的配置,該局部對象可配置的選項(xiàng)與config
全局對象基本相同。下面是該選項(xiàng)的一個(gè)配置示例。
# 定義一個(gè)虛擬機(jī)列表
vm_list = [
{
:name => "centos1",
:eth1 => "192.168.100.1",
:mem => "2048",
:cpu => "4",
:sshport => 22231
},
{
:name => "centos2",
:eth1 => "192.168.100.2",
:mem => "4096",
:cpu => "2",
:sshport => 22232
}
]
Vagrant.configure(2) do |config|
config.vm.box = "centos-7"
# 遍歷虛擬機(jī)列表
vm_list.each do |item|
# 創(chuàng)建虛擬機(jī)級別的配置對象
config.vm.define item[:name] do |vm_config|
vm_config.vm.hostname = item[:name]
vm_config.vm.network "private_network", ip: item[:eth1]
# 禁用掉默認(rèn)的SSH服務(wù)轉(zhuǎn)發(fā)端口
vm_config.vm.network "forwarded_port", guest: 22, host: 2222, id: "ssh", disabled: "true"
vm_config.vm.network "forwarded_port", guest: 22, host: item[:sshport]
vm_config.vm.provider "virtualbox" do |vb|
vb.name = item[:name];
vb.memory = item[:mem];
vb.cpus = item[:cpu];
end
end
end
end
Vagrant CLI常用命令
在完成了配置文件的編寫之后,我們就可以使用Vagrant CLI來進(jìn)行虛擬機(jī)的管理操作了。這里需要提醒讀者注意的是:vagrantfile
文件中的配置代碼通常只在第一次執(zhí)行vagrant up
命令時(shí)被執(zhí)行。之后,如果我們不明確使用vagrant reload --provision
命令進(jìn)行重新加載,這些配置就不會(huì)再被執(zhí)行了。下面,就讓我們來分類介紹一下Vagrant CLI的常用命令。
-
在需要使用SSH的方式進(jìn)入指定虛擬機(jī)內(nèi)執(zhí)行某些操作是,我們可以使用
vagrant ssh
命令(如果當(dāng)前項(xiàng)目下管轄有多臺(tái)虛擬機(jī),就執(zhí)行vagrant ssh <主機(jī)名>
命令),如圖B-1所示。圖B-1:使用SSH方式進(jìn)入虛擬機(jī)
-
在執(zhí)行虛擬機(jī)的啟動(dòng)、重啟與關(guān)閉等操作時(shí),我們常會(huì)用到以下命令。
# 啟動(dòng)所有虛擬機(jī) vagrant up # 啟動(dòng)指定的虛擬機(jī) vagrant up <主機(jī)名> # 重啟所有虛擬機(jī) vagrant reload # 重啟指定的虛擬機(jī) vagrant reload <主機(jī)名> # 關(guān)閉所有虛擬機(jī) vagrant halt # 關(guān)閉指定的虛擬機(jī) vagrant halt <主機(jī)名> # 掛起所有虛擬機(jī) vagrant suspend # 掛起指定的虛擬機(jī) vagrant suspend <主機(jī)名>
-
在需要銷毀項(xiàng)目中的虛擬機(jī)時(shí),我們需要用到以下命令。
# 銷毀所有虛擬機(jī) vagrant destroy -f # 銷毀指定的虛擬機(jī) vagrant destroy <主機(jī)名> -f
基于篇幅的考慮,我們在這里只是介紹了Vagrant CLI的常用命令。如果我們需要使用到某個(gè)指定的命令,可以使用vagrant --help
和vagrant <指定命令> --help
這兩個(gè)命令來查看Vagrant CLI提供的幫助信息(在這里,命令中的--help
參數(shù)可以使用-h
這樣的簡寫形式)。例如在圖B-2中,我們就根據(jù)這些幫助信息執(zhí)行對現(xiàn)有虛擬機(jī)的鏡像打包操作。
圖B-2:對現(xiàn)有虛擬機(jī)的鏡像打包操作
項(xiàng)目示例:搭建K8s集群
在掌握了Vagrant的基本使用方法之后,我們接下來就可以通過實(shí)際項(xiàng)目來演示一下如何使用Vagrant+VirtualBox搭建一個(gè)部署了K8s系統(tǒng)的服務(wù)器集群。該集群的主要配置如表B-1所示。
主機(jī)名 | IP地址 | 內(nèi)存 | 處理器數(shù)量 | 操作系統(tǒng) |
---|---|---|---|---|
k8s-master | 192.168.100.21 | 4G | 2 | Ubuntu 20.04 |
k8s-worker1 | 192.168.100.22 | 2G | 2 | Ubuntu 20.04 |
k8s-worker2 | 192.168.100.23 | 2G | 2 | Ubuntu 20.04 |
準(zhǔn)備工作
要想模擬出上面這個(gè)由三臺(tái)服務(wù)器組成的K8s集群,首先要做的是在宿主機(jī)中安裝VirtualBox。為此,我們需要利用搜索引擎找到VirtualBox的官方網(wǎng)站,并進(jìn)入到其下載頁面,然后根據(jù)宿主機(jī)所使用的操作系統(tǒng)來下載對應(yīng)的安裝包。需要注意的是,除了主程序的安裝包之外,我們還需要下載并安裝相應(yīng)的擴(kuò)展包程序,以便在創(chuàng)建虛擬機(jī)時(shí)能對USB 3.0接口等高級特性進(jìn)行模擬,如圖B-3所示。
圖B-3:下載VirtualBox安裝包及擴(kuò)展程序
VirtualBox主程序的安裝包是以圖形化向?qū)У姆绞絹韴?zhí)行的,初學(xué)者只需要一路按照其默認(rèn)選項(xiàng)完成安裝即可。在安裝完成VirtualBox之后,我們還需要對其進(jìn)行一些全局配置。為此,我們需要啟動(dòng)VirtualBox,然后依次單擊其主菜單中的「管理」 -> 「全局設(shè)定」或按下快捷鍵Ctrl + g
,并在彈出的如圖B-4所示的「常規(guī)」對話框中修改「默認(rèn)虛擬電腦位置」,以免日后虛擬機(jī)占用了過多Windows系統(tǒng)分區(qū)的空間。最后,在如圖B-5所示的「擴(kuò)展」選項(xiàng)卡中導(dǎo)入我們之前下載好的擴(kuò)展程序。
圖B-4:VirtualBox全局配置之「常規(guī)」對話框
圖B-5:VirtualBox全局配置之「擴(kuò)展」對話框
在完成了虛擬機(jī)軟件的安裝與配置操作之后,接下來的任務(wù)就是安裝Vagrant本身了。同樣的,我們需要利用搜索引擎找到Vagrant的官方網(wǎng)站,并進(jìn)入到其下載頁面,然后根據(jù)宿主機(jī)所使用的操作系統(tǒng)來下載對應(yīng)的安裝包,如圖B-6所示。
圖B-6:下載Vagrant安裝包
具體在Windows系統(tǒng)中,該安裝包是也是以圖形化向?qū)У姆绞絹韴?zhí)行的,初學(xué)者只需要一路按照其默認(rèn)選項(xiàng)完成安裝即可。在安裝過程中,Vagrant的安裝包會(huì)自動(dòng)把安裝路徑加入到系統(tǒng)的PATH
環(huán)境變量中,所以,我們可以通過在Powershell/Bash之類的命令行終端環(huán)境中執(zhí)行vagrant version
命令來驗(yàn)證安裝是否成功。
$ vagrant version
Installed Version: 2.3.0
Latest Version: 2.3.0
在確認(rèn)成功安裝了Vagrant之后,為了讓該工具能更好地管理使用VirtualBox創(chuàng)建的虛擬機(jī),我們還需要繼續(xù)在命令行終端環(huán)境中執(zhí)行vagrant plugin install vagrant-vbguest vagrant-share
命令來安裝相關(guān)的插件,以便該工具能自動(dòng)安裝并配置虛擬機(jī)的驅(qū)動(dòng)增強(qiáng)包,從而實(shí)現(xiàn)虛擬機(jī)與宿主機(jī)之間的目錄共享等功能。如果一切順利,我們可以通過vagrant plugin list
命令來確認(rèn)插件的安裝。
$ vagrant plugin list
vagrant-share (2.0.0, global)
vagrant-vbguest (0.30.0, global)
搭建集群
在完成上述準(zhǔn)備工作之后,我們就可以正式開始創(chuàng)建用于模擬K8s集群的Vagrant項(xiàng)目了,其主要步驟如下。
-
在計(jì)算機(jī)中的任意位置上創(chuàng)建一個(gè)名為
k8s_cluster
的目錄,并使用Powershell/Bash之類的命令行終端環(huán)境進(jìn)入到該目錄中,并執(zhí)行vagrant init
命令,將其初始化為一個(gè)Vagrant項(xiàng)目的根目錄。 -
在
k8s_cluster
目錄下打開上述命令自動(dòng)生成的vagrantfile
文件,并將其內(nèi)如修改如下。# 創(chuàng)建要?jiǎng)?chuàng)建的虛擬機(jī)清單 vm_list = [ { :name => "k8s-master", :eth1 => "192.168.100.21", :mem => "4096", :cpu => "2", :sshport => 22230 }, { :name => "k8s-worker1", :eth1 => "192.168.100.22", :mem => "2048", :cpu => "2", :sshport => 22231 }, { :name => "k8s-worker2", :eth1 => "192.168.100.23", :mem => "2048", :cpu => "2", :sshport => 22232 } ] Vagrant.configure(2) do |config| # 全局配置,指定要下載并使用的鏡像名稱,并設(shè)置要使用的字符編碼 config.vm.box = "gusztavvargadr/ubuntu-server" config.vm.box_check_update = false Encoding.default_external = 'UTF-8' # 遍歷虛擬機(jī)清單,根據(jù)其中定義的參數(shù)創(chuàng)建虛擬機(jī) vm_list.each do |item| config.vm.define item[:name] do |vm_config| vm_config.vm.hostname = item[:name] vm_config.vm.network "public_network", ip: item[:eth1] # 禁用掉默認(rèn)的SSH服務(wù)轉(zhuǎn)發(fā)端口 vm_config.vm.network "forwarded_port", guest: 22, host: 2222, id: "ssh", disabled: "true" vm_config.vm.network "forwarded_port", guest: 22, host: item[:sshport] vm_config.vm.provider "virtualbox" do |vb| vb.memory = item[:mem]; vb.cpus = item[:cpu]; vb.name = item[:name]; end # 設(shè)置K8s集群中所有機(jī)器都要執(zhí)行的自定義腳本 vm_config.vm.provision "shell", path: "scripts/common.sh" if item[:name] == "k8s-master" # 設(shè)置K8s集群的主控節(jié)點(diǎn)要執(zhí)行的自定義腳本 vm_config.vm.provision "shell", path: "scripts/master.sh" else # 設(shè)置K8s集群的工作節(jié)點(diǎn)都要執(zhí)行的自定義腳本 vm_config.vm.provision "shell", path: "scripts/worker.sh" end end end end
-
在
k8s_cluster
目錄下創(chuàng)建一個(gè)名為scripts
的目錄,并在該目錄下創(chuàng)建一個(gè)名為common.sh
的、三機(jī)通用的配置腳本文件,并在其中輸入如下代碼。#! /bin/bash # 指定要安裝哪一個(gè)版本的K8s KUBERNETES_VERSION="1.21.1-00" # 關(guān)閉swap分區(qū) sudo swapoff -a sudo sed -ri 's/.*swap.*/#&/' /etc/fstab echo "Swap diasbled..." # 關(guān)閉防火墻功能 sudo ufw disable # 安裝一些 Docker+k8s 環(huán)境的依賴項(xiàng) sudo mv /etc/apt/sources.list /etc/apt/sources.list-backup sudo cp -i /vagrant/scripts/apt/sources.list /etc/apt/ sudo apt update -y sudo apt install -y apt-transport-https ca-certificates curl wget software-properties-common build-essential echo "Dependencies installed..." # 安裝并配置 Docker CE curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add - sudo add-apt-repository "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable" sudo apt update -y sudo apt install -y docker-ce cat <<EOF | sudo tee /etc/docker/daemon.json { "registry-mirrors": ["https://registry.cn-hangzhou.aliyuncs.com"], "exec-opts":["native.cgroupdriver=systemd"] } EOF # 啟動(dòng) Docker sudo systemctl enable docker sudo systemctl daemon-reload sudo systemctl restart docker echo "Docker installed and configured..." # 安裝 k8s 組件:kubelet, kubectl, kubeadm curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | sudo apt-key add - cat <<EOF | sudo tee /etc/apt/sources.list.d/kubenetes.list deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main EOF sudo apt update -y sudo apt install -y kubelet=$KUBERNETES_VERSION kubectl=$KUBERNETES_VERSION kubeadm=$KUBERNETES_VERSION # 如果想阻止自動(dòng)更新,可以選擇鎖住相關(guān)軟件的版本 sudo apt-mark hold kubeadm kubectl kubelet # 啟動(dòng) K8s 的服務(wù)組件:kubelet sudo systemctl start kubelet sudo systemctl enable kubelet echo "K8s installed and configured..."
-
繼續(xù)在
scripts
目錄下創(chuàng)建一個(gè)名為master.sh
的、K8s集群主控節(jié)點(diǎn)專用的腳本文件,并在其中輸入如下代碼。#! /bin/bash # 指定主控節(jié)點(diǎn)的IP地址 MASTER_IP="192.168.100.21" # 指定主控節(jié)點(diǎn)的主機(jī)名 NODENAME=$(hostname -s) # 指定當(dāng)前 K8s 集群中 Service 所使用的 CIDR SERVICE_CIDR="10.96.0.0/12" # 指定當(dāng)前 K8s 集群中 Pod 所使用的 CIDR POD_CIDR="10.244.0.0/16" # 指定當(dāng)前使用的 K8s 版本 KUBE_VERSION=v1.21.1 # 特別預(yù)先加載 coredns 插件 COREDNS_VERSION=1.8.0 sudo docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:$COREDNS_VERSION sudo docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:$COREDNS_VERSION registry.cn-hangzhou.aliyuncs.com/google_containers/coredns/coredns:v$COREDNS_VERSION # 使用 kubeadm 工具初始化 K8s 集群 sudo kubeadm init \ --kubernetes-version=$KUBE_VERSION \ --apiserver-advertise-address=$MASTER_IP \ --image-repository=registry.cn-hangzhou.aliyuncs.com/google_containers \ --service-cidr=$SERVICE_CIDR \ --pod-network-cidr=$POD_CIDR \ --node-name=$NODENAME \ --ignore-preflight-errors=Swap # 生成主控節(jié)點(diǎn)的配置文件 mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config # 將主控節(jié)點(diǎn)的配置文件備份到別處 config_path="/vagrant/configs" if [ -d $config_path ]; then sudo rm -f $config_path/* else sudo mkdir -p $config_path fi sudo cp -i /etc/kubernetes/admin.conf $config_path/config sudo touch $config_path/join.sh sudo chmod +x $config_path/join.sh # 將往 K8s 集群中添加工作節(jié)點(diǎn)的命令保存為腳本文件 kubeadm token create --print-join-command > $config_path/join.sh # 安裝名為 calico 的網(wǎng)路插件 # 1. 網(wǎng)絡(luò)安裝 sudo wget https://docs.projectcalico.org/v3.14/manifests/calico.yaml sudo kubectl apply -f calico.yaml # 安裝名為 flannel 的網(wǎng)路插件 # 1. 網(wǎng)絡(luò)安裝 # sudo wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml # sudo kubectl apply -f kube-flannel.yml
-
繼續(xù)在
scripts
目錄下創(chuàng)建一個(gè)名為worker.sh
的、K8s集群中工作節(jié)點(diǎn)通用的腳本文件,并在其中輸入如下代碼。#! /bin/bash # 執(zhí)行之前保存的,用于往K8s集群中添加工作節(jié)點(diǎn)的腳本 /bin/bash /vagrant/configs/join.sh -v # 如果希望在工作節(jié)點(diǎn)中也能使用kubectl,可執(zhí)行以下命令 sudo -i -u vagrant bash << EOF mkdir -p /home/vagrant/.kube sudo cp -i /vagrant/configs/config /home/vagrant/.kube/ sudo chown 1000:1000 /home/vagrant/.kube/config EOF
-
在
scripts
目錄下創(chuàng)建一個(gè)名為apt
的目錄,并在該目錄下創(chuàng)建一個(gè)名為sources.list
的、使用阿里云國內(nèi)鏡像的APT源配置文件,并在其中輸入如下代碼。# 使用阿里云的源 deb http://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ focal-proposed main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ focal-proposed main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse
-
回到
k8s_cluster
目錄下并執(zhí)行vagrant up
命令,開始創(chuàng)建虛擬機(jī)。在vagrant up
命令的執(zhí)行過程中,讀者會(huì)看到Vagrant會(huì)在構(gòu)建虛擬機(jī)之后,第一次啟動(dòng)它們時(shí)自動(dòng)執(zhí)行scripts
目錄中的腳本,這些腳本將會(huì)自動(dòng)為虛擬機(jī)配置、安裝Docker與K8s環(huán)境,以下是其安裝軟件的版本信息。文章來源:http://www.zghlxwxcb.cn/news/detail-465580.htmlDocker-CE: 20.10.17 Kubernetes: 1.21.1 kube-apiserver: v1.21.1 kube-proxy: v1.21.1 kube-controller-manager: v1.21.1 kube-scheduler: v1.21.1 pause: 3.4.1 coredns: v1.8.0 etcd: 3.4.13-0
如果讀者想獲得上述示例的源碼,也可以前往https://github.com/owlman/vagrant-ubuntu-k8s-cluster
處獲得。文章來源地址http://www.zghlxwxcb.cn/news/detail-465580.html
到了這里,關(guān)于Vagrant 學(xué)習(xí)筆記:搭建 K8s 集群的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!