はじめに
はじめまして。普段はシステムソフトウェアを研究している修士学生です。
この記事は、自分の研究でCalicoを改変する予定なので、その実行環境を作ったときの副産物みたいなものです。興味があれば見ていってください。
きっかけ
研究で使うので、Calicoプラグインを動かしたいんだけど、Kubernetesで用いることがほとんどで、nerdctlでCalico動かすブログなどを見つけらませんでした。
なら自分で動かせばいいじゃない。
注意書き
- 実行環境に関して、長々と書いていますが、ansibleでも用意してあるのでめんどくさい方はそちらをご利用ください…。
- まだ勉強中なため、至らぬ点もあるかと思いますが、その際は指摘などしていただけると助かります。
Calicoのアーキテクチャ
さて、まずは動かすにあたってCalicoに必要なものを列挙します。
- nerdctl:コンテナランタイムやCalico Pluginに対して命令
- コンテナランタイム:コンテナの実行や削除(今回はcontainerd+runc)
- Calico Plugin:CNIプラグイン
- calicoctl:calico-nodeを組み立てるやつ
- etcd:設定を持つデータストア
- calico-node:Calicoを動かす色々をもってる
こんなところです。色々必要なんだなーという印象を受けました。
実行環境
今回はvagreant+virtualboxで2個ノードを立てています。
実行環境はホストとVMともにUbuntu22.04です。
# -*- mode: ruby -*-
# vi: set ft=ruby :
Vagrant.configure("2") do |config|
config.vm.box = "generic/ubuntu2204"
config.ssh.insert_key = false
config.ssh.private_key_path = "~/.vagrant.d/insecure_private_key"
config.vm.provision "file", source: "~/.vagrant.d/insecure_private_key", destination: "/home/vagrant/.ssh/id_rsa"
config.vm.provision "shell", privileged: false, inline: <<-SHELL
chmod 600 $HOME/.ssh/id_rsa
SHELL
config.vm.define "calico-node1" do |node|
node.vm.network :private_network, ip: "192.168.22.10"
node.vm.network :forwarded_port, guest: 22, host: 2210, host_ip: '127.0.0.1', id: "ssh"
end
config.vm.define "calico-node2" do |node|
node.vm.network :private_network, ip: "192.168.22.11"
node.vm.network :forwarded_port, guest: 22, host: 2211, host_ip: '127.0.0.1', id: "ssh"
end
end
コンテナイメージはこちらを利用しています。
普通のUbuntu22.04でもいいんですが、ネットワークの確認用にip
だとかping
だとかがほしいので。
ということで、ポン
$ vagrant up
$ vagrant status
Current machine states:
calico-node1 running (virtualbox)
calico-node2 running (virtualbox)
This environment represents multiple VMs. The VMs are all listed
above with their current state. For more information about a specific
VM, run `vagrant status NAME`.
インストール
バージョンやビルド方法などは個人的な趣味も含まれます。
(普段はFreeBSDを使っているのでGNU makeが好きではないなど)
runc
$ git clone https://github.com/opencontainers/runc.git -b release-1.0
$ cd ~/runc
$ go build -o ./bin/ .
$ sudo install -o 0 -g 0 bin/runc /usr/local/bin
containerd
$ git clone https://github.com/containerd/containerd.git -b v1.7.1
$ cd ~/containerd
$ go build -o ./bin/ ./cmd/containerd
$ sudo install -o 0 -g 0 bin/
nerdctl
$ git clone https://github.com/containerd/nerdctl.git -b release/1.7
$ cd ~/nerdctl
$ go build -o ./bin/ ./cmd/nerdctl
$ sudo install -o 0 -g 0 bin/nerdctl /usr/local/bin
calico plugin
$ git clone https://github.com/projectcalico/calico.git -b release-v3.28
$ cd ~/calico
$ go build -o ./bin/ ./cni-plugin/cmd/calico
$ sudo mkdir -p /opt/cni/bin
$ sudo install -o 0 -g 0 bin/calico /opt/cni/bin
calico-ipam plugin
$ cd ~/calico
$ go build -o ./bin/ ./node/cmd/calico-ipam
$ sudo install -o 0 -g 0 bin/calico-ipam /opt/cni/bin
calicoctl
$ curl -O -L https://github.com/projectcalico/calico/releases/download/v3.28.0/calicoctl-linux-amd64
$ mv calicoctl-linux-amd64 calicoctl
$ sudo install -o 0 g 0 calicoctl /usr/local/bin
docker
calccoctlがdockerコマンドを呼び出すため必要。
ここら辺を参考にインストール。
dockerで入るcontainerd.ioやruncを使っても大丈夫ですが、バージョンなどを合わせたい場合は先ほど入れたcontainedを使うと良いでしょう。
etcd
$ curl -O -L https://storage.googleapis.com/etcd/v3.5.14/etcd-v3.5.14-linux-amd64.tar.gz
$ tar -xzvf etcd-v3.5.14-linux-amd64.tar.gz
$ sudo install -o 0 -g 0 etcd-v3.5.14-linux-amd64/etcd /usr/local/bin
今回はここまで
長い事色々インストールやらビルドやらして疲れました。あとは実際に動かすところになるので、nerdctlでCalicoを動かす(実行編)でお会いしましょう。
上の方でも触れていますが、ここまでの内容も含めたansibleを用意しているので、めんどくさがりなあなたはそちらを使ってください。
参考文献