使用 VirtualBox 安装虚拟机开发环境

在平时闲聊或者吃饭的时候,隔壁同学谈到对 Kata Containers 也很感兴趣,问如何才能参与下或者学习下呢?确实现在 Kata Containers 社区版基本都是英文资料,而且也缺乏比较基础的入门资料,这也成为了这一系列文章的契机。

这一系列文章主要是介绍如何开始参与到 Kata Containers 的开发,这是其中第一部分,主要是看如何来安装开发环境。在这系列教程中,主要是以在 macOS 为宿主机,使用 VirtualBox + Vagrant + Ubuntu 为例来进行说明。

安装虚拟机

安装 VirtualBox

官网下载安装。

安装 Vagrant

官网下载安装。

这时候需要确保命令行中可以使用 vagrant 命令。

$ vagrant  version
==> vagrant: A new version of Vagrant is available: 2.2.14 (installed version: 2.2.7)!
==> vagrant: To upgrade visit: https://www.vagrantup.com/downloads.html

顺带安装下vagrant的vagrant-disksize插件,否则启动虚拟机会报错。

$ vagrant plugin install vagrant-disksize
Installing the 'vagrant-disksize' plugin. This can take a few minutes...
Fetching vagrant-disksize-0.1.3.gem
Installed the plugin 'vagrant-disksize (0.1.3)'!

创建虚拟机

首先创建一个工作目录:

$ mkdir kata-box
$ cd kata-box

创建 Vagrant 配置文件:


$ cat <<EOF > Vagrantfile
Vagrant.configure("2") do |config|
  # 磁盘大小,30 GB比较保守
  # Note: 这个配置项需要 disksize 这个插件,需要先安装,否则启动会报错。
  # config.disksize.size = '30GB'
  config.vm.box = "bento/ubuntu-20.04"
  # 主机名,选择自己喜欢的
  config.vm.hostname="kata-box"
  config.vm.network "private_network", ip: "192.168.33.19"
  config.vm.provider "virtualbox" do |vb|
    # 虚拟机的资源,当然是越大越好。
    vb.cpus = 2
    vb.memory = "4096"
    # 开启嵌套虚拟化,即在虚拟机中再运行虚拟机(QEMU等)。
    vb.customize ["modifyvm", :id, "--nested-hw-virt", "on"]
  end
end
EOF

配置文件编辑完之后,就可以启动虚拟机了。

$ vagrant up

第一次启动会比较慢,完全依赖于你的网速,因为初次启动需要从网络下载虚拟机镜像,即上面的 bento/ubuntu-20.04 ,还会安装 GuestAdditions( Vagrant 用于管理虚拟机的 guest OS ) ,这也是很耗时的一步。

如果启动没有问题,就可以通过 ssh 登录到虚拟机了。

$ vagrant ssh

以后,我们每次进到 kata-box 目录,都可以直接通过 vagrant 命令来管理虚拟机。

在 guest OS 中,通过检查内核模块看是否启用了kvm:

$ lsmod | grep kvm
kvm_intel             282624  0
kvm                   663552  1 kvm_intel

安装开发环境

Kata Containers 使用了 Golang 和 Rust 两种开发语言,分别对应 runtimeagent 两个子模块。runtime 主要和 contaienrd 等交互,实现了 shimv2 协议,负责 sandbox/containers 的管理。agent 运行在虚拟机(guest)内,通过 ttrpc 协议和runtime交互。

以下操作均在虚拟机中进行。

最好提前设置好代理,如果想在线安装的话。

export http_proxy=http://xxx
export https_proxy=http://yyy

安装 Golang

安装最新版即可,这里都是用的 root 用户。

# wget https://golang.org/dl/go1.16.2.linux-amd64.tar.gz
# rm -rf /usr/local/go && tar -C /usr/local -xzf go1.16.2.linux-amd64.tar.gz
# export PATH=$PATH:/usr/local/go/bin
# go version
go version go1.16.2 linux/amd64

注意要把上面的 PATH 更新到 $HOME/.profile 或相应文件里。

安装 Rust

# curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

如果安装失败或者很慢,可能是需要设置代理。这条命令会安装 cargo 等 Rust 所需要的各种工具,也需要一定耗时。

确认 cargo 是否安装成功:

# source $HOME/.cargo/env
# cargo -V
cargo 1.50.0 (f04e7fab7 2021-02-04)

安装 Kata Containers 2.0

安装 Kata Containers 2.0

这里使用直接从 GitHub 下载最新压缩包的方式安装。别问我为什么,貌似 Ubuntu 上还没有 2.0 的安装包,即通过 apt 来安装。

下载并解压缩:

# wget https://github.com/kata-containers/kata-containers/releases/download/2.0.1/kata-static-2.0.1-x86_64.tar.xz
# tar -C / -Jxvf kata-static-2.0.1-x86_64.tar.xz

Kata 相关文件都会被解压到 /opt/kata/ 下面。Kata 的配置文件在 /opt/kata/share/defaults/kata-containers/ 下面,每种 hypervisor 都有一个对应的文件,默认使用 QEMU 。

$ ls -tl /opt/kata/share/defaults/kata-containers/
total 60
-rw-r--r-- 1 1001 lpadmin  9686 Jan 19 20:07 configuration-acrn.toml
-rw-r--r-- 1 1001 lpadmin  9315 Jan 19 20:07 configuration-clh.toml
-rw-r--r-- 1 1001 lpadmin 14948 Jan 19 20:07 configuration-fc.toml
-rw-r--r-- 1 1001 lpadmin 19703 Jan 19 20:07 configuration-qemu.toml
lrwxrwxrwx 1 1001 lpadmin    23 Jan 19 20:07 configuration.toml -> configuration-qemu.toml

安装 containerd

只有 Kata Containers 还不能单独工作,必须要有高层的 runtime 配合才行,比如 containerd 或者 CRI-O 。

这里使用传统方法来安装 containerd 。

$ apt-get update && apt-get install -y apt-transport-https ca-certificates curl software-properties-common
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add -
$ add-apt-repository \
    "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
    $(lsb_release -cs) \
    stable"
$ apt-get update && apt-get install -y containerd.io

最后生成默认的配置文件,并重启 containerd:

$ containerd config default > /etc/containerd/config.toml
$ systemctl daemon-reload
$ systemctl restart containerd

安装 CNI

安装 CNI

没办法,一切都是为 K8s 服务。

$ mkdir /go
$ export GOPATH=/go
$ git clone https://github.com/containernetworking/plugins.git $GOPATH/src/github.com/containernetworking/plugins

build:

$ cd $GOPATH/src/github.com/containernetworking/plugins
$ ./build_linux.sh

部署:

$ mkdir -p /opt/cni/bin
$ cp bin/* /opt/cni/bin/

配置 CNI

$ mkdir -p /etc/cni/net.d

$ cat > /etc/cni/net.d/10-mynet.conf <<EOF
{
  "cniVersion": "0.2.0",
  "name": "mynet",
  "type": "bridge",
  "bridge": "cni0",
  "isGateway": true,
  "ipMasq": true,
  "ipam": {
    "type": "host-local",
    "subnet": "172.19.0.0/24",
    "routes": [
      { "dst": "0.0.0.0/0" }
    ]
  }
}
EOF

配置 containerd

为 containerd 添加 Kata 运行时。这需要编辑 /etc/containerd/config.toml 文件,在合适的位置添加下面的内容(注意配置项目的嵌套关系)。

# diff /etc/containerd/config.toml /etc/containerd/config.toml.orig 
90,93d89
<         [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.kata]
<           runtime_type = "io.containerd.kata.v2"
<           pod_annotations = ["io.katacontainers.*"]
<           privileged_without_host_devices = true

然后重启 containerd:

$ systemctl restart containerd

验证 Kata Containers + containerd 是否正常工作

可以使用 containerd 自带的 ctr 命令来创建容器,这个命令类似 Docker 的客户端命令。

下载镜像:

$ ctr image pull docker.io/library/busybox:latest

启动容器:

$ ctr run --runtime io.containerd.run.kata.v2 -t --rm docker.io/library/busybox:latest hello sh
ctr: runtime "io.containerd.run.kata.v2" binary not installed "containerd-shim-kata-v2": file does not exist: unknown

莫慌,因为我们的 Kata containers 不是标准安装,所以 containerd 没有找到我们的 runtime binary 文件。

链接一下即可。

$ ln -s /opt/kata/bin/containerd-shim-kata-v2 /usr/local/bin/containerd-shim-kata-v2

之后就可以启动使用了 Kata Containres 的容器了。

ctr run --runtime io.containerd.run.kata.v2 -t --rm docker.io/library/busybox:latest hello sh
/ #

新开一个窗口,通过 ps 命令就可以看到 qemu 虚拟机在运行了。

安装 crictl 工具

安装 crictl 二进制文件

crictl 是支持 CRI 协议的命令行工具,可以进行Pod、Container的管理。

安装也很简单:

$ VERSION="v1.20.0"
$ wget https://github.com/kubernetes-sigs/cri-tools/releases/download/$VERSION/crictl-$VERSION-linux-amd64.tar.gz
$ sudo tar zxvf crictl-$VERSION-linux-amd64.tar.gz -C /usr/local/bin
$ rm -f crictl-$VERSION-linux-amd64.tar.gz

配置 crictl

为了能正常使用 crictl 命令,需要创建 crictl 命令用的配置文件:

# cat > /etc/crictl.yaml <<EOF
runtime-endpoint: unix:///var/run/containerd/containerd.sock
image-endpoint: unix:///var/run/containerd/containerd.sock
timeout: 10
debug: false
EOF

验证 crictl

使用 crictl 需要手工先下载 2 个镜像。

  • crictl pull k8s.gcr.io/pause:3.1
  • crictl pull busybox:latest

上面的 k8s.gcr.io/pause:3.1 是 Pod 中 的 pause 容器的镜像,创建 Pod 的时候需要。busybox:latest 是容器运行的镜像。crictl 不会在运行创建或容器的时候自动下载镜像,所以需要提前手工下载。

镜像下载之后就可以创建 Pod 和容器,并启动容器。

创建 pod:

# pod=`crictl runp -r kata sandbox.yaml`

其中 sandbox.yaml 文件内容如下:

metadata:
  attempt: 1
  name: test-pod
  namespace: default
  uid: hdishd83djaidwnduwk28bcsb
log_directory: /tmp
linux:
  namespaces:
    options: {}

查看 pod:

# crictl pods
POD ID              CREATED             STATE               NAME                NAMESPACE           ATTEMPT             RUNTIME
d3e1a1567602e       24 seconds ago      Ready               busybox-sandbox     default             1                   kata

创建容器:

# cnt=`crictl create $pod container.yaml sandbox.yaml`

其中 container.yaml 文件内容如下:

metadata:
  name: stress
image:
  image: containerstack/alpine-stress:latest
command:
- top
linux:
  resources:
    memory_limit_in_bytes: 524288000
log_path: stress.0.log

启动容器:

# crictl start $cnt
25222afa5327a5c4f11aee9c615df019fc39d9134700135606cdc3f49f113d7d

查看运行中的容器:

# crictl ps
CONTAINER           IMAGE               CREATED             STATE               NAME                ATTEMPT             POD ID
25222afa5327a       busybox:latest      15 seconds ago      Running             busybox             0                   d3e1a1567602e

停止并删除 pod:

# crictl stopp $pod
Stopped sandbox d3e1a1567602e12335dc0f772774f96f4ef66736c0a98d9dd0ab14164292c4e9

# crictl rmp $pod
Removed sandbox d3e1a1567602e12335dc0f772774f96f4ef66736c0a98d9dd0ab14164292c4e9

常用 vagrant 命令

  • vagrant up: 启动虚拟机
  • vagrant halt:关机
  • vagrant reload:重启
  • vagrant ssh:登录虚拟机,用户都是vagrant来管理,不用自己操心
  • vagrant destroy:删除虚拟机,危险操作。

小结

这一章,介绍了如何使用 Vagrant + VirtualBox 创建虚拟机,在虚拟机中安装 Kata Containers 2.0,并通过 crictl 工具来创建兼容 K8s 的 Pod。

results matching ""

    No results matching ""