Server FreeBSD Dengan Linux Containers melalui containerd

Terbit: Perbarui:
Tags


Apa itu mesin virtualisasi?, Virtualisasi memanfaatkan sumber daya yang tersedia pada komputer seperti penyimpanan, CPU, RAM, dan jaringan untuk membuat mesin virtual atau kontainer yang beroperasi layaknya komputer biasa. Pada FreeBSD, virtualisasi dapat dicapai melalui penggunaan kontainer Linux atau hypervisor. Hypervisor adalah perangkat lunak yang diinstal pada server host untuk menyediakan lapisan abstraksi yang memfasilitasi pembuatan mesin virtual.

Dengan penggunaan kontainer Linux atau LXC, server FreeBSD dapat menjalankan mesin virtual yang berbagi sumber daya host. Kontainerisasi pada FreeBSD memanfaatkan lingkungan runtime kontainer seperti Docker untuk membuat image aplikasi yang terisolasi dari proses sistem lainnya, namun tetap berbagi kernel sistem operasi host. Dalam hal ini, kontainer lebih ringan dan lebih cepat dibandingkan mesin virtual.

Konsep kontainerisasi bukanlah hal baru, namun metode implementasi dan pengelolaannya mungkin belum banyak digunakan. Pada sistem Linux, kita sudah mengenal platform virtualisasi kontainer populer bernama Docker. Namun, tahukah Anda? Kita dapat mengubah server biasa agar dapat menjalankan kontainer dengan bantuan teknologi LXC (Linux Container) pada FreeBSD.

Perkembangan penerapan kontainer berlangsung sangat pesat karena pada dasarnya kontainer kini mampu melakukan segalanya. Pengembang maupun pengguna akhir dapat mengelola seluruh siklus hidup kontainer pada host, termasuk mentransfer dan menyimpan image kontainer, menjalankan serta mengelola kontainer, hingga membangun jaringan.

Mari kita lihat gambar arsitektur kontainer di bawah ini.

freebsd docker
FreeBSD Docker Dengan Linux Containerd

Containerd juga memiliki banyak plugin, termasuk Metadata Plugin, GC Plugin, Snapshot Plugin, Runtime Plugin, dan lain-lain. Semua plugin di containerd berada di dalam modul, dan modul itu sendiri merupakan plugin. Secara umum, containerd terbagi menjadi tiga bagian dasar, yaitu Storage, Metadata, dan Runtime.

Panduan dalam artikel ini akan menunjukkan dasar-dasar menjalankan container Linux secara langsung di FreeBSD, tanpa memerlukan mesin virtual. Open Container Initiative (OCI) yang akan kita instal di FreeBSD akan berjalan dengan container Linux melalui containerd.

1. Instal containerd

Containerd adalah runtime kontainer standar industri yang mengutamakan kesederhanaan, ketangguhan, dan portabilitas. Containerd tersedia sebagai daemon untuk Linux, FreeBSD, dan Windows. Sebelum memulai instalasi containerd, disarankan untuk menginstal "runj" dan "nerdctl".

Runj adalah runtime eksperimental yang kompatibel dengan OCI dan berfungsi sebagai proof-of-concept untuk FreeBSD Jail. Sebelum menginstal runj, masukkan skrip berikut ke dalam berkas "/etc/make.conf".

NO_CHECKSUM=yes

Jalankan perintah berikut untuk menginstal "runj" dan "nerdctl".

install runj dan nerdctl
root@ns3:~ # cd /usr/ports/sysutils/runj
root@ns3:/usr/ports/sysutils/runj # make install clean

root@ns3:/usr/ports/sysutils/runj # cd /usr/ports/sysutils/nerdctl root@ns3:/usr/ports/sysutils/nerdctl # make install clean

Setelah selesai, Anda dapat melanjutkan dengan menginstal containerd menggunakan perintah berikut.

install containerd
root@ns3:/usr/ports/sysutils/nerdctl # cd /usr/ports/sysutils/containerd
root@ns3:/usr/ports/sysutils/containerd # make install clean

Setelah Anda selesai menginstal containerd, sistem akan secara otomatis menghasilkan sekumpulan file biner yang ditempatkan di direktori /usr/local/bin.

  • containerd
  • containerd-shim
  • containerd-shim-runc-v1
  • containerd-shim-runc-v2
  • crictl
  • ctr

Agar containerd berjalan secara otomatis di FreeBSD, tambahkan skrip di bawah ini ke dalam file /etc/rc.conf.

containerd_enable="YES"

Setelah itu anda mulai jalankan containerd.

mengaktifkan containerd
root@ns3:~ # service containerd restart

2. Konfigurasi Containerd

Setelah Anda mengaktifkan containerd, buatlah file config.toml. Ikuti langkah-langkah di bawah ini.

membuat file config.toml
root@ns3:~ # cd /etc
root@ns3:/etc # mkdir -p containerd
root@ns3:/etc # cd containerd
root@ns3:/etc/containerd # touch config.toml
root@ns3:/etc/containerd # mkdir -p /var/lib/containerd/io.containerd.snapshotter.v1.zfs

File konfigurasi default containerd bernama config.toml; secara default, file ini terletak di direktori /etc/containerd/config.toml. Anda dapat membuat konfigurasi default menggunakan perintah berikut.

membuat konfigurasi default containerd
root@ns3:~ # containerd config default > /etc/containerd/config.toml

Setelah Anda mengaktifkan containerd, jalankan perintah containerd.

menjalankan containerd
root@ns3:/etc/containerd # containerd

Dengan menjalankan perintah di atas, sistem FreeBSD akan membuat skrip config.toml secara otomatis. Anda dapat melihat contoh skripnya di bawah ini.

disabled_plugins = []
imports = []
oom_score = 0
plugin_dir = ""
required_plugins = []
root = "/var/lib/containerd"
state = "/run/containerd"
temp = ""
version = 2

[cgroup]
  path = ""

[debug]
  address = "/run/containerd/debug.sock"
  format = ""
  gid = 0
  level = "info"
  uid = 0

[grpc]
  address = "/run/containerd/containerd.sock"
  gid = 0
  max_recv_message_size = 16777216
  max_send_message_size = 16777216
  tcp_address = ""
  tcp_tls_ca = ""
  tcp_tls_cert = ""
  tcp_tls_key = ""
  uid = 0

[metrics]
  address = ""
  grpc_histogram = false

[plugins]

  [plugins."io.containerd.gc.v1.scheduler"]
    deletion_threshold = 0
    mutation_threshold = 100
    pause_threshold = 0.02
    schedule_delay = "0s"
    startup_delay = "100ms"

  [plugins."io.containerd.internal.v1.opt"]
    path = "/opt/containerd"

  [plugins."io.containerd.internal.v1.restart"]
    interval = "10s"

  [plugins."io.containerd.internal.v1.tracing"]
    sampling_ratio = 1.0
    service_name = "containerd"

  [plugins."io.containerd.metadata.v1.bolt"]
    content_sharing_policy = "shared"

  [plugins."io.containerd.runtime.v2.task"]
    platforms = ["freebsd/amd64"]
    sched_core = false

  [plugins."io.containerd.service.v1.diff-service"]
    default = ["walking"]

  [plugins."io.containerd.service.v1.tasks-service"]
    rdt_config_file = ""

  [plugins."io.containerd.snapshotter.v1.native"]
    root_path = ""

  [plugins."io.containerd.snapshotter.v1.zfs"]
    root_path = ""

  [plugins."io.containerd.tracing.processor.v1.otlp"]
    endpoint = ""
    insecure = false
    protocol = ""

[proxy_plugins]

[stream_processors]

  [stream_processors."io.containerd.ocicrypt.decoder.v1.tar"]
    accepts = ["application/vnd.oci.image.layer.v1.tar+encrypted"]
    args = ["--decryption-keys-path", "/etc/containerd/ocicrypt/keys"]
    env = ["OCICRYPT_KEYPROVIDER_CONFIG=/etc/containerd/ocicrypt/ocicrypt_keyprovider.conf"]
    path = "ctd-decoder"
    returns = "application/vnd.oci.image.layer.v1.tar"

  [stream_processors."io.containerd.ocicrypt.decoder.v1.tar.gzip"]
    accepts = ["application/vnd.oci.image.layer.v1.tar+gzip+encrypted"]
    args = ["--decryption-keys-path", "/etc/containerd/ocicrypt/keys"]
    env = ["OCICRYPT_KEYPROVIDER_CONFIG=/etc/containerd/ocicrypt/ocicrypt_keyprovider.conf"]
    path = "ctd-decoder"
    returns = "application/vnd.oci.image.layer.v1.tar+gzip"

[timeouts]
  "io.containerd.timeout.bolt.open" = "0s"
  "io.containerd.timeout.shim.cleanup" = "5s"
  "io.containerd.timeout.shim.load" = "5s"
  "io.containerd.timeout.shim.shutdown" = "3s"
  "io.containerd.timeout.task.state" = "2s"

[ttrpc]
  address = ""
  gid = 0
  uid = 0

3. Menjalankan Container Linux

Setelah containerd berjalan dengan normal di server FreeBSD Anda, gunakan klien baris perintah ctr untuk berinteraksi dengan daemon dan menjalankan beberapa container. Langkah pertama yang harus Anda lakukan adalah mengambil image. Anda dapat mengambilnya menggunakan perintah ctr.


root@ns3:~ # ctr image pull --snapshotter zfs public.ecr.aws/samuelkarp/freebsd:13.1-RELEASE
public.ecr.aws/samuelkarp/freebsd:13.1-RELEASE:                                   resolved       |++++++++++++++++++++++++++++++++++++++|
index-sha256:6d39171771533e3702cd67368564d5d2dcf2bebd24003df2ff814aa4c5d889d6:    exists         |++++++++++++++++++++++++++++++++++++++|
manifest-sha256:ea7a4554069ea058b6e6cc495800d24502b8e0cda4feddfd3d116ab297f5ff20: exists         |++++++++++++++++++++++++++++++++++++++|
config-sha256:a7a23666ec0a322705673e135c52fb468f6997f6ba1a141390617086ba23f0ba:   exists         |++++++++++++++++++++++++++++++++++++++|
layer-sha256:46f3d931f5af7f4bd06625cec8f8d8633fc5d21acfd9236b3ca4f2b8f141f433:    exists         |++++++++++++++++++++++++++++++++++++++|
elapsed: 1.5 s                                                                    total:   0.0 B (0.0 B/s)
unpacking freebsd/amd64 sha256:6d39171771533e3702cd67368564d5d2dcf2bebd24003df2ff814aa4c5d889d6...
done: 51.037526ms
root@ns3:~ #

Menjalankan kontainer dengan containerd memerlukan image, snapshotter, dan runtime kontainer. Repositori sumber runj menyertakan runtime untuk containerd yang bernama wtf.sbk.runj.v1.

Jalankan containerd menggunakan perintah di bawah ini.


root@ns3:~ # ctr run --snapshotter zfs --runtime wtf.sbk.runj.v1 --rm public.ecr.aws/samuelkarp/freebsd:13.1-RELEASE my-container-id sh -c 'echo "Hello, your FreeBSD Containerd is now active!"'
Hello, your FreeBSD Containerd is now active!
root@ns3:~ #

Sekarang kita akan mencoba perintah ctr lainnya, yaitu dengan menjalankan kontainer Linux.


root@ns3:~ # ctr image pull --platform=linux docker.io/library/alpine:latest
docker.io/library/alpine:latest:                                                  resolved       |++++++++++++++++++++++++++++++++++++++|
index-sha256:c5b1261d6d3e43071626931fc004f70149baeba2c8ec672bd4f27761f8e1ad6b:    exists         |++++++++++++++++++++++++++++++++++++++|
manifest-sha256:6457d53fb065d6f250e1504b9bc42d5b6c65941d57532c072d929dd0628977d0: exists         |++++++++++++++++++++++++++++++++++++++|
layer-sha256:4abcf20661432fb2d719aaf90656f55c287f8ca915dc1c92ec14ff61e67fbaf8:    exists         |++++++++++++++++++++++++++++++++++++++|
config-sha256:05455a08881ea9cf0e752bc48e61bbd71a34c029bb13df01e40e3e70e0d007bd:   exists         |++++++++++++++++++++++++++++++++++++++|
elapsed: 2.0 s                                                                    total:   0.0 B (0.0 B/s)
unpacking linux/amd64 sha256:c5b1261d6d3e43071626931fc004f70149baeba2c8ec672bd4f27761f8e1ad6b...
done: 19.442453ms
root@ns3:~ #

root@ns3:~ # ctr run --rm --tty --runtime wtf.sbk.runj.v1 --snapshotter zfs --platform linux docker.io/library/alpine:latest mylinuxcontainer uname -a
Linux 4.4.0 FreeBSD 13.2-RELEASE releng/13.2-n254617-525ecfdad597 GENERIC x86_64 Linux
root@ns3:~ #

Jika Anda ingin melihat daftar mirror lokal, gunakan perintah berikut.


root@ns3:~ # ctr i ls

Untuk operasi mirror yang lebih lanjut, Anda dapat menggunakan perintah subkonten seperti online mirror image dan editing bloband.


root@ns3:~ # ctr content ls

Untuk lebih memahami penggunaan containerd, kita akan membuat kontainer baru di FreeBSD. Gunakan perintah berikut untuk mengunduh image mirror.


root@ns3:~ # ctr image pull --platform=linux docker.io/library/nginx:alpine
docker.io/library/nginx:alpine:                                                   resolved       |++++++++++++++++++++++++++++++++++++++|
index-sha256:f2802c2a9d09c7aa3ace27445dfc5656ff24355da28e7b958074a0111e3fc076:    exists         |++++++++++++++++++++++++++++++++++++++|
manifest-sha256:b1cfc4e0e01b4dceca3265fd4ca97921569fca1a10919639bedfa8dad9127027: done           |++++++++++++++++++++++++++++++++++++++|
layer-sha256:efb7d60b16cfcd8e0daecf965b6f5575423bf03ac868cbd7def5803501b311b1:    done           |++++++++++++++++++++++++++++++++++++++|
layer-sha256:9e03973bc8036b5eecce7b2d9996cc16108ad4fe366bafd5e0b972c57339404e:    done           |++++++++++++++++++++++++++++++++++++++|
layer-sha256:a3a550dcd38681a0c4c41afd0f4977260b70ceec241359a0b35f443e865bdaff:    done           |++++++++++++++++++++++++++++++++++++++|
config-sha256:2b70e4aaac6b5370bf3a556f5e13156692351696dd5d7c5530d117aa21772748:   done           |++++++++++++++++++++++++++++++++++++++|
layer-sha256:d18780149b8172369a5d5194091eb33adc7fcbfd32056d7eb3cedde75725bf82:    done           |++++++++++++++++++++++++++++++++++++++|
layer-sha256:619be1103602d98e1963557998c954c892b3872986c27365e9f651f5bc27cab8:    done           |++++++++++++++++++++++++++++++++++++++|
layer-sha256:4ea31a8fb8756a19d3e7710cb8be2b66aea4e678cc836b88c8c8daa4b564d55b:    done           |++++++++++++++++++++++++++++++++++++++|
layer-sha256:6c866301bd2c1af4fb61766a45a078102eedab8c7b910c0796eab6ea99b14577:    done           |++++++++++++++++++++++++++++++++++++++|
layer-sha256:e57ebb3e206791646f52f35d99488b64a61ab4a1d39b7be52b15d82bd3b12988:    done           |++++++++++++++++++++++++++++++++++++++|
elapsed: 8.0 s                                                                    total:  1.8 Mi (234.1 KiB/s)
unpacking linux/amd64 sha256:f2802c2a9d09c7aa3ace27445dfc5656ff24355da28e7b958074a0111e3fc076...
done: 7.903605972s
root@ns3:~ #

Buat sebuah kontainer.


root@ns3:~ # ctr c create docker.io/library/nginx:alpine nginx

Berikut ini adalah contoh cara hapus kontainer gambar.


root@ns3:~ # ctr image rm docker.io/library/nginx:alpine

Containerd yang berjalan di FreeBSD dan runj sama-sama bersifat eksperimental dan masih dalam tahap pengembangan. Meskipun fungsionalitas yang ditunjukkan dalam artikel ini dapat berjalan, masih banyak fitur yang belum tersedia. Anda dapat memantau perkembangan lebih lanjut di repositori containerd dan repositori runj di GitHub.