Review: Red Hat melakukan Docker dengan cara yang sulit

Project Atomic Red Hat adalah cara beropini untuk menjalankan container Linux. Sistem operasi Atomic Host hadir dengan Docker (kontainer), Flannel (jaringan), OSTree (manajemen host), Etcd (penyimpanan nilai kunci terdistribusi), dan Kubernetes (orkestrasi) yang sudah terpasang. 

Kubernetes adalah salah satu dari dua sistem orkestrasi container yang populer, yang lainnya adalah Docker Swarm. Anda bisa menyebutnya "kekuatan penuh", tetapi dengan itu muncul kerumitan tambahan dan pengeluaran administratif.

Kubernetes mengoordinasikan pembuatan "pod" di beberapa host Atom. Pod adalah grup kontainer Docker yang secara logis memisahkan layanan dalam aplikasi. Penampung di dalam pod berbagi alamat IP dan berkomunikasi melalui localhost.

Flanel menyediakan jaringan overlay untuk host Atomic, yang memungkinkan setiap pod di cluster untuk berkomunikasi dengan pod atau layanan lain di dalam cluster. Jaringan overlay ini hanya digunakan untuk jaringan container. Layanan proxy Kubernetes menyediakan akses ke ruang IP host.

Etcd digunakan untuk menyimpan konfigurasi untuk Kubernetes dan Flannel di semua host di cluster.

Cluster wadah atom membuat asumsi tertentu karena Kubernetes. Administrator benar-benar tidak punya pilihan dengan Atomic: Gunakan Kubernetes atau cari OS container lain. 

Jika Anda merasa kesal pada "design by convention" dan Anda menginginkan lebih banyak kebebasan dan fleksibilitas dalam container host, Anda dapat mempertimbangkan RancherOS atau VMware Photon. Jika tujuan akhir Anda adalah menjalankan banyak container di banyak host, maka Atomic Host, Kubernetes, dan teman mungkin adalah yang Anda butuhkan.  

Administrasi sistem Host Atom

Atomic Host menggunakan versi dockerperintahnya sendiri atomic, meskipun dockerperintah sebenarnya  tersedia di / bin / buruh pelabuhan. Lokasinya di / bin mengisyaratkan beberapa pengerjaan ulang yang telah dilakukan pada RHEL / CentOS / Fedora untuk membuat OS Atom dibuat khusus untuk container. Biasanya hanya sistem biner penting yang berada di / bin.

Anda mengelola Host Atom melalui dua subsistem. RPM-OSTree menangani penyebaran dan pembaruan sistem host, sementara Docker menangani penyediaan kontainer untuk menjalankan layanan dan aplikasi. Kedua subsistem ini dikelola oleh atomicperintah yang terletak di / usr / bin /.

RPM-OSTree membuat filesystem Atomic tidak bisa diubah; yaitu, sistem berkas hanya-baca kecuali untuk / var dan / etc. Direktori / var / lib / docker adalah tempat penyimpanan semua file dan gambar yang berhubungan dengan Docker, sementara / etc memiliki semua file konfigurasi. Seperti yang akan kita lihat nanti, ini membuat upgrade dan downgrade host menjadi lebih sederhana dan lebih aman, persyaratan penting saat mengelola ribuan host container dalam sebuah cluster.

The atomicperintah dimaksudkan untuk menjadi satu titik masuk ke wadah subsistem-perintah payung untuk semua hal kontainer termasuk operasi tuan rumah. The atomicperintah terlihat dan terasa lebih seperti dockerperintah, tetapi alamat masalah mendasar yang dimiliki oleh semua sistem operasi kontainer host: memulai layanan sistem-tingkat dalam sebuah wadah pada saat boot, dengan cara yang handal dan transparan, dengan menggunakan systemd file Unit.

Di Atomic, ini dilakukan dengan apa yang disebut wadah super-istimewa, yang memiliki kemampuan untuk melihat dan memanipulasi host itu sendiri. Jadi, meskipun atomicterlihat seperti perintah Docker standar, perintah ini mengisi celah antara Docker dan RPM-OSTree — mengonfigurasi skrip penginstalan, menyiapkan layanan, menetapkan hak istimewa yang tepat, dan sejenisnya — untuk mengaktifkan penerapan andal dari aplikasi berbasis kontainer .

Sederhananya,  atomic perintah ini memungkinkan Anda untuk memanipulasi infrastruktur host yang mendasarinya (cgroups, namespace, SELinux, dll.) Untuk menjalankan aplikasi Anda. Misalnya, Anda membuat aplikasi kontainer Network Time Protocol (ntpd) yang memerlukan kemampuan SYS_TIME untuk mengubah waktu sistem host. Anda dapat mengonfigurasi ini dengan menambahkan metadata ke gambar container Anda menggunakan perintah:

LABEL RUN /usr/bin/docker run -d —cap-add=SYS_TYPE ntpd

Kemudian ketika Anda menjalankan container ( atomic run ntpd), sistem akan membaca metadata tersebut dan mengkonfigurasi kapabilitas SYS_TIME dan sumber daya lain untuk container tersebut. 

Instalasi dan konfigurasi Atomic Host

Pemasangannya sulit, terutama karena saya menemukan dokumentasinya tidak teratur dan membingungkan. Dokumen tersebut mengasumsikan pengetahuan tingkat tinggi tentang ekosistem Red Hat yang tidak dimiliki setiap pembaca. Setelah beberapa kesalahan dimulai, saya akhirnya berhasil menginstal dari ISO yang tidak memiliki material logam. Dukungan untuk instalasi mesin virtual dengan apa pun selain virt-manager sangat menyakitkan. Atomic Host jelas tidak ramah Windows atau Mac dalam hal ini.

Bagi siapa pun yang terbiasa dengan penginstalan CentOS, prosedur bare-metal akan mudah. Satu-satunya perbedaan yang terlihat adalah pada tata letak disk, dengan ruang yang disediakan secara otomatis untuk Docker dan kontainer, bersama dengan sejumlah besar mount untuk SELinux, cgroups, dll. Yang menyertai instalasi OS kontainer.

Menggunakan Kubernetes untuk mengelola container di seluruh cluster secara signifikan lebih rumit daripada menjalankan Docker pada satu host, tetapi dengan kompleksitas yang lebih besar, muncul keandalan dan kemampuan yang lebih besar. Dengan Kubernetes, Anda juga mendapatkan kenyamanan karena mengetahui bahwa sistem telah diuji dalam pertempuran di lingkungan produksi skala besar (di Google).

Tidak ada cara mudah untuk menyiapkan master Kubernetes. Dokumentasi tersebar di berbagai situs web proyek, dan sering kali dokumen dikirim ke situs lain untuk mengetahui detailnya, jadi bersiaplah untuk menghabiskan banyak waktu membaca, mencari dokumen, dan bereksperimen. Upaya total melibatkan modifikasi beberapa lusin atau lebih file yang tersebar di beberapa direktori / etc. Tentu saja triknya adalah mengetahui apa saja modifikasi tersebut. Kubernetes tidak benar-benar dibuat untuk eksperimen biasa dengan container. Ini adalah barang produksi tugas berat.

Setelah mengonfigurasi master dengan Kubernetes, sertifikat, layanan, dan jaringan overlay Flanel, kemudian menginstal Flannel (flanneld), Kubernetes (kubelet), dan Etcd di setiap node, saya akhirnya menjalankan cluster container lima node. Sayangnya ini menghabiskan cukup banyak memori, dan saya tidak dapat menemukan cara untuk menguji menggunakan satu node, seperti yang saya lakukan saat menguji RancherOS dan VMware Photon.

Pada titik ini, Kubernetes dapat digunakan untuk meluncurkan dan mengelola pod, grup container yang merangkum layanan dan aplikasi.

Penyimpanan dan jaringan Atomic Host

Seperti kebanyakan sistem operasi host kontainer, Atomic Host mengambil pendekatan minimalis, dengan hanya cukup ruang disk yang disertakan untuk menjalankan host. Itu tidak menyisakan banyak hal untuk banyak kontainer Docker yang akan dijalankan oleh klaster biasa, jadi Anda perlu memasang penyimpanan eksternal ke host untuk itu.

Di Docker, gambar dan file terkait biasanya disimpan di / var / lib / docker, dan pada sebagian besar sistem operasi standar Anda cukup memasang perangkat pada titik itu di sistem file untuk menambahkan penyimpanan. Namun, Atomic menggunakan volume LVM (Linux Volume Manager) langsung melalui back end Device Mapper untuk menyimpan gambar dan metadata Docker: / dev / atomicos / docker-data dan / dev / atomicos / docker-meta. Itu berarti Anda perlu mempelajari sesuatu tentang LVM dan volume untuk menambah ruang ke host Atom.

Titik awal untuk manajemen penyimpanan di Atomic adalah skrip pengaturan, / etc / sysconfig / docker-storage-setup. Atomic Host memiliki kolam penyimpanan untuk penyimpanan Docker (dan host), jadi trik di sini adalah menambahkan perangkat baru ke dalam kumpulan ini. Anda akan melakukan ini dengan menambahkan ke daftar perangkat di file, seperti ini:

DEVS="/dev/vdb /dev/vdc"

Kemudian Anda menjalankan skrip helper, / usr / bin / docker-storage-setup. Jika semuanya berjalan lancar, disk Anda telah ditambahkan ke pool, dan host Atom Anda memiliki ruang untuk Docker. Saya kira LVM akan dikelola dalam produksi dengan alat administrasi yang ada, atau dengan skrip seperti Ansible / Salt / Chef / Puppet, jadi mungkin akan tampak lebih standar bagi administrator yang bekerja di lingkungan pusat data yang besar.

Project Atomic menggunakan Flanel untuk menyediakan jaringan overlay kontainer melalui Etcd. Anda mengonfigurasi ini dengan memasukkan file konfigurasi JSON ke penyimpanan nilai kunci Etcd, menggunakan alat seperti Curl. Untuk mengonfigurasi subnet untuk container, kita mungkin membuat file JSON yang terlihat seperti ini:

   “Jaringan”: “172.16.0.0/12”,

   "SubnetLen": 24,

   “Backend”: {

      “Type”: “vxlan”

   }

}

Dan untuk memasukkan ini ke master Etcd, kami mendorongnya ke kunci konfigurasi jaringan:

curl -L //localhost:2379/v2/keys/atomic.io/config -XPUT --data-urlencode [email protected]

Meskipun agak rumit, ini masih bisa dikelola. Saya ingin melihat pembungkus untuk perintah konfigurasi ini yang membuatnya lebih intuitif bagi administrator Unix, mungkin sesuatu seperti atomic ifconfig…, atomic route…, dll

Ada perbedaan lain yang perlu ditekankan di sini: konsep Kubernetes pod dan layanan. Pod adalah sekumpulan wadah yang relatif terhubung erat. Semua container dalam pod memiliki host yang sama dan alamat IP yang sama, dan semuanya hidup atau mati bersama. Anda menentukan berapa banyak instance pod yang ingin Anda jalankan, dan Kubernetes yang menjalankan perintah tersebut. Jika sebuah instance berhenti atau gagal, Kubernetes memutar yang lain untuk mencocokkan status yang diinginkan.

Layanan Kubernetes adalah abstraksi yang mendefinisikan sekumpulan logis pod dan kebijakan untuk mengaksesnya. Ini memberi layanan (mikro) satu nama dan alamat yang stabil di seluruh siklus proses pod. Ada banyak hal lainnya, tetapi itu akan membantu Anda memahami mengapa Anda memerlukan komponen terpisah untuk mengelola jaringan. Pada Atomic Host, komponen tersebut adalah Flanel.

Upgrade dan downgrade Host Atom

Atomic Host menggunakan manajer paket yang disebut RPM-OSTree, yang menggabungkan fitur RPM tradisional dan OSTree. RPM-OSTree memberi kita kemampuan untuk berguling maju dan mundur dengan andal, karena prosesnya "atom" (dalam arti kata database). RPM-OSTree menyediakan transaksi yang dapat diandalkan untuk pembaruan, yang berarti tidak mungkin merusak sistem operasi. Seperti perintah untuk container, upgrade dan rollback host dilakukan oleh atomicsistem manajemen:

atomic host upgrade

atomic host rollback

Perhatikan bahwa saya tidak menguji rollback, karena tidak ada yang bisa saya putar kembali.

Red Hat Atomic Host paling cocok untuk organisasi dengan investasi besar dalam keterampilan dan infrastruktur Red Hat. Perusahaan yang memulai dari sudut berbeda mungkin ingin mempertimbangkan opsi lain. Dimasukkannya Kubernetes, dan sejarah Red Hat dalam lingkungan produksi yang besar, berarti bahwa Atomic Host akan menjadi “drop-in” untuk menjalankan beban kerja dalam container di perusahaan. Tetapi saya tidak melihat pengembang mengambilnya sebagai platform Docker pilihan mereka.