nerdctlでCalicoを動かす（環境構築編）

# はじめに
はじめまして。普段はシステムソフトウェアを研究している修士学生です。
この記事は、自分の研究でCalicoを改変する予定なので、その実行環境を作ったときの副産物みたいなものです。興味があれば見ていってください。

# きっかけ
研究で使うので、Calicoプラグインを動かしたいんだけど、Kubernetesで用いることがほとんどで、nerdctlでCalico動かすブログなどを見つけらませんでした。
なら自分で動かせばいいじゃない。

# 注意書き
- 実行環境に関して、長々と書いていますが、ansibleでも用意してあるのでめんどくさい方はそちらをご利用ください…。

https://github.com/SoumaSakaguchi/nerdctl-calico-ansible

- まだ勉強中なため、至らぬ点もあるかと思いますが、その際は指摘などしていただけると助かります。

# Calicoのアーキテクチャ
さて、まずは動かすにあたってCalicoに必要なものを列挙します。
![calico_architecture.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3860047/f9cb7f99-a80c-e1c8-92ea-e17b88374039.png)
- nerdctl：コンテナランタイムやCalico Pluginに対して命令
- コンテナランタイム：コンテナの実行や削除(今回はcontainerd+runc)
- Calico Plugin：CNIプラグイン
- calicoctl：calico-nodeを組み立てるやつ
- etcd：設定を持つデータストア
- calico-node：Calicoを動かす色々をもってる

こんなところです。色々必要なんだなーという印象を受けました。

# 実行環境
今回はvagreant+virtualboxで2個ノードを立てています。
実行環境はホストとVMともにUbuntu22.04です。
```ruby:Vagrantfile
# -*- 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
```
https://hub.docker.com/r/weibeld/ubuntu-networking

コンテナイメージはこちらを利用しています。
普通のUbuntu22.04でもいいんですが、ネットワークの確認用に`ip`だとか`ping`だとかがほしいので。
ということで、ポン
```bash: host
$ 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
```bash: node1 & node2
$ 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
```bash: node1 & node2
$ 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
```bash: node1 & node2
$ 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
```bash: node1 & node2
$ 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
```bash: node1 & node2
$ cd ~/calico
$ go build -o ./bin/ ./node/cmd/calico-ipam
$ sudo install -o 0 -g 0 bin/calico-ipam /opt/cni/bin
```
#### calicoctl
```bash: node1 & node2
$ 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コマンドを呼び出すため必要。
ここら辺を参考にインストール。

https://qiita.com/yoshiyasu1111/items/17d9d928ceebb1f1d26d

dockerで入るcontainerd.ioやruncを使っても大丈夫ですが、バージョンなどを合わせたい場合は先ほど入れたcontainedを使うと良いでしょう。

#### etcd
```bash: node1 & node2
$ 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を動かす（実行編）](https://qiita.com/so_ma/private/7493d687a1d215848d83)でお会いしましょう。

https://qiita.com/so_ma/private/7493d687a1d215848d83

上の方でも触れていますが、ここまでの内容も含めた[ansible](https://github.com/SoumaSakaguchi/nerdctl-calico-ansible)を用意しているので、めんどくさがりなあなたはそちらを使ってください。

# 参考文献
https://docs.tigera.io/calico/latest/reference/architecture/overview