Memperkenalkan Kubernetes CCM (Cloud Controller Manager) untuk Yandex.Cloud

Memperkenalkan Kubernetes CCM (Cloud Controller Manager) untuk Yandex.Cloud

Sebagai kelanjutan dari yang terbaru Rilis driver CSI untuk Yandex.Cloud kami menerbitkan proyek Sumber Terbuka lainnya untuk cloud ini - Manajer Pengontrol Cloud. CCM diperlukan tidak hanya untuk cluster secara keseluruhan, tetapi juga untuk driver CSI itu sendiri. Detail tentang tujuannya dan beberapa fitur implementasi masih dalam tahap pembahasan.

pengenalan

Kenapa ini?

Motif yang mendorong kami mengembangkan CCM untuk Yandex.Cloud sepenuhnya sesuai dengan motif yang telah dijelaskan di pengumuman driver CSI. Kami mengelola banyak cluster Kubernetes dari penyedia cloud yang berbeda, dan kami menggunakan satu alat saja. Ini menerapkan banyak kemudahan β€œmelewati” solusi terkelola dari penyedia ini. Ya, kami memiliki kasus dan kebutuhan yang agak spesifik, namun perkembangan yang dibuat karena hal tersebut mungkin berguna bagi pengguna lain.

Apa sebenarnya CCM itu?

Biasanya, kami menyiapkan lingkungan di sekitar kami untuk cluster dari luar - misalnya menggunakan Terraform. Namun terkadang ada kebutuhan untuk mengelola lingkungan cloud di sekitar kita dari cluster. Kemungkinan ini disediakan, dan itulah yang dilaksanakan CCM.

Secara khusus, Cloud Controller Manager menyediakan lima jenis interaksi utama:

  1. Contoh – mengimplementasikan hubungan 1:1 antara objek node di Kubernetes (Node) dan mesin virtual di penyedia cloud. Untuk ini kami:
    • isi kolomnya spec.providerID dalam objek Node. Misalnya, untuk OpenStack CCM bidang ini memiliki format berikut: openstack:///d58a78bf-21b0-4682-9dc6-2132406d2bb0. Anda dapat melihat nama penyedia cloud dan UUID unik dari server (mesin virtual di OpenStack) dari objek;
    • melengkapi nodeInfo dalam objek Node informasi tentang mesin virtual. Misalnya, kami menentukan tipe instans di AWS;
    • Kami memeriksa keberadaan mesin virtual di cloud. Misalnya jika suatu benda Node pergi ke suatu negara bagian NotReady, Anda dapat memeriksa apakah mesin virtual ada di penyedia cloud dengan providerID. Jika tidak ada, hapus objek tersebut Node, yang jika tidak, akan tetap berada di cluster selamanya;
  2. zona – menetapkan domain kegagalan untuk objek Node, sehingga penjadwal dapat memilih node untuk Pod sesuai dengan wilayah dan zona di penyedia cloud;
  3. Penyeimbang Beban – saat membuat objek Service dengan tipe LoadBalancer menciptakan semacam penyeimbang yang akan mengarahkan lalu lintas dari luar ke node cluster. Misalnya, di Yandex.Cloud Anda dapat menggunakan NetworkLoadBalancer ΠΈ TargetGroup untuk tujuan ini;
  4. Rute – membangun jaringan antar node, karena Sesuai dengan persyaratan Kubernetes, setiap pod harus memiliki alamat IP sendiri dan dapat menjangkau pod lainnya. Untuk tujuan ini, Anda dapat menggunakan jaringan overlay (VXLAN, GENEVE) atau mengatur tabel perutean langsung di jaringan virtual penyedia cloud:

    Memperkenalkan Kubernetes CCM (Cloud Controller Manager) untuk Yandex.Cloud

  5. Volume – Memungkinkan pemesanan dinamis PV menggunakan PVC dan SC. Awalnya, fungsi ini adalah bagian dari CCM, namun karena kompleksitasnya yang besar, fungsi ini dipindahkan ke proyek terpisah, Container Storage Interface (CSI). Kami telah membicarakan CSI lebih dari sekali писали dan, seperti telah disebutkan, bahkan dilepaskan pengemudi CSI.

Sebelumnya, semua kode yang berinteraksi dengan cloud terletak di repositori Git utama proyek Kubernetes di k8s.io/kubernetes/pkg/cloudprovider/providers, tetapi mereka memutuskan untuk mengabaikannya karena ketidaknyamanan bekerja dengan basis kode yang besar. Semua implementasi lama telah dipindahkan ke repositori terpisah. Untuk kenyamanan dukungan dan pengembangan lebih lanjut, semua komponen umum juga dipindahkan ke repositori terpisah.

Seperti halnya CSI, banyak penyedia cloud besar telah merancang CCM mereka untuk memanfaatkan cloud di Kubernetes. Jika pemasok tidak memiliki CCM, tetapi semua fungsi yang diperlukan tersedia melalui API, maka Anda dapat mengimplementasikan CCM sendiri.

Untuk menulis implementasi CCM Anda sendiri, cukup mengimplementasikannya antarmuka Go yang diperlukan.

И inilah yang kami dapatkan.

Implementasi

Bagaimana kamu bisa sampai pada hal ini

Kami memulai pengembangan (atau lebih tepatnya, bahkan menggunakan) dengan siap (!) CCM untuk Yandex.Cloud setahun yang lalu.

Namun, dalam implementasi ini kami melewatkan:

  • otentikasi melalui token JWT IAM;
  • Dukungan pengontrol layanan.

Sesuai dengan penulis (dlisin) di Telegram, kami membagi yandex-cloud-controller-manager dan menambahkan fungsi yang hilang.

Fitur utama

Saat ini, CCM mendukung antarmuka berikut:

  • Contoh;
  • zona;
  • Penyeimbang Beban.

Di masa mendatang, saat Yandex.Cloud mulai bekerja dengan kemampuan VPC tingkat lanjut, kami akan menambahkan antarmuka rute.

LoadBalanacer sebagai tantangan utama

Awalnya, kami mencoba, seperti implementasi CCM lainnya, untuk membuat sepasang LoadBalancer ΠΈ TargetGroup untuk semuanya Service dengan tipe LoadBalancer. Namun, Yandex.Cloud menemukan satu batasan menarik: Anda tidak dapat menggunakannya TargetGroups dengan berpotongan Targets (pasangan SubnetID - IpAddress).

Memperkenalkan Kubernetes CCM (Cloud Controller Manager) untuk Yandex.Cloud

Oleh karena itu, di dalam CCM yang dibuat, sebuah pengontrol diluncurkan, yang ketika objek berubah Node mengumpulkan informasi tentang semua antarmuka pada setiap mesin virtual, mengelompokkannya menurut milik tertentu NetworkID, dibuat oleh TargetGroup pada NetworkID, dan juga memantau relevansi. Selanjutnya saat membuat suatu objek Service dengan tipe LoadBalanacer kita cukup melampirkan yang sudah dibuat sebelumnya TargetGroup ke baru NetworkLoadBalanacer'saya.

Bagaimana cara mulai menggunakannya?

CCM mendukung Kubernetes versi 1.15 dan lebih tinggi. Dalam sebuah cluster, agar dapat berfungsi, diperlukan flag --cloud-provider=external telah diatur ke true untuk kube-apiserver, kube-controller-manager, kube-scheduler dan semua kubelet.

Semua langkah yang diperlukan untuk instalasi itu sendiri dijelaskan dalam README. Instalasi intinya adalah membuat objek di Kubernetes dari manifes.

Untuk menggunakan CCM Anda juga memerlukan:

  • menunjukkan dalam manifes pengidentifikasi direktori (folder-id) Yandex.Cloud;
  • akun layanan untuk berinteraksi dengan Yandex.Cloud API. Dalam manifesto tersebut Secret perlu mentransfer kunci resmi dari akun layanan. Dalam dokumentasi dijelaskan, cara membuat akun layanan dan mendapatkan kunci.

Kami akan dengan senang hati menerima tanggapan Anda dan masalah barujika Anda menemui masalah!

Hasil

Kami telah menggunakan CCM yang diimplementasikan di lima klaster Kubernetes selama dua minggu terakhir dan berencana menambah jumlahnya menjadi 20 di bulan mendatang. Saat ini kami tidak menyarankan penggunaan CCM untuk instalasi K8 yang besar dan kritis.

Seperti halnya CSI, kami akan senang jika pengembang Yandex mengambil alih pengembangan dan dukungan proyek ini - kami siap mentransfer repositori atas permintaan mereka untuk menangani tugas-tugas yang lebih relevan bagi kami.

PS

Baca juga di blog kami:

Sumber: www.habr.com

Tambah komentar