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



Sebagai kelanjutan dari rilis terbaru driver CSI untuk Yandex.Cloud, kami menerbitkan proyek Open Source lain untuk cloud ini - Cloud Controller Manager . CCM diperlukan tidak hanya untuk cluster secara keseluruhan, tetapi juga untuk driver CSI itu sendiri. Rincian tentang tujuannya dan beberapa fitur implementasi berada di bawah potongan.

pengantar


Kenapa ini?


Motif yang mendorong kami untuk mengembangkan CCM untuk Yandex.Cloud sepenuhnya bertepatan dengan yang sudah dijelaskan dalam pengumuman driver CSI. Kami melayani banyak kluster Kubernetes dari penyedia cloud yang berbeda, dan untuk itu kami menggunakan satu alat. Ini mengimplementasikan banyak fasilitas "melewati" solusi yang dikelola dari penyedia ini. Ya, kami memiliki kasus dan kebutuhan yang agak spesifik, tetapi pengembangan yang dibuat karena itu dapat bermanfaat bagi pengguna lain juga.

Apa itu CCM secara umum?


Sebagai aturan, kami menyiapkan lingkungan kami untuk kluster dari luar - misalnya, menggunakan Terraform. Tetapi terkadang ada kebutuhan untuk mengelola lingkungan cloud di sekitarnya dari sebuah cluster . Kesempatan seperti itu diberikan, dan CCM mengimplementasikannya .

Secara khusus, Cloud Controller Manager menyediakan lima tipe dasar interaksi:

  1. Instances - mengimplementasikan hubungan 1: 1 antara objek node di Kubernetes ( Node) dan mesin virtual di penyedia cloud. Untuk melakukan ini, kami:
    • isi bidang spec.providerIDdi objek Node. Sebagai contoh, untuk OpenStack CCM, bidang ini memiliki format berikut: openstack:///d58a78bf-21b0-4682-9dc6-2132406d2bb0. Anda dapat melihat nama penyedia cloud dan UUID unik server (mesin virtual di OpenStack) objek;
    • nodeInfo Node . , instance type AWS;
    • . , Node NotReady, , providerID. โ€” Node, ;
  2. Zones โ€“ failure domain Node, Podโ€™ ;
  3. LoadBalancer โ€“ Service LoadBalancer , . , Yandex.Cloud NetworkLoadBalancer TargetGroup ;
  4. Route โ€“ , .. Kubernetes pod IP- podโ€™. (VXLAN, GENEVE) :

  5. Volume โ€“ PV, PVC SC. CCM, Container Storage Interface (CSI). CSI , , CSI-.

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

Seperti halnya CSI, banyak penyedia layanan cloud besar telah mengembangkan CCM mereka untuk penggunaan 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, cukup untuk mengimplementasikan Go-interface yang diperlukan .

DANitulah yang kami dapatkan .

Penerapan


Bagaimana Anda sampai pada ini


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

Namun, dalam implementasi ini kami tidak memiliki:

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

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

Fitur utama


CCM saat ini mendukung antarmuka berikut:

  • Mesin Virtual ;
  • Zona ;
  • LoadBalancer .

Di masa mendatang, ketika Yandex.Cloud mulai bekerja dengan fitur-fitur canggih VPC, kami akan menambahkan antarmuka Routes .

Loadbalanacer sebagai tantangan utama


Awalnya, kami mencoba, seperti dengan implementasi CCM lainnya, untuk membuat sepasang LoadBalancerdan TargetGroupuntuk masing-masing Servicedengan tipe LoadBalancer. Namun, Yandex.Cloud menunjukkan satu batasan menarik: itu tidak dapat digunakan TargetGroupsdengan berpotongan Targets(pair SubnetID- IpAddress).



Oleh karena itu, di dalam CCM yang mapan meluncurkan pengontrol yang ketika mengubah objek Nodemengumpulkan informasi tentang semua antarmuka pada setiap mesin virtual, kelompokkan mereka sebagai milik beberapa NetworkIDciptaan TargetGroupaktif NetworkIDdan pastikan itu baru. Selanjutnya, saat membuat objek Servicedengan tipe, LoadBalanacerkita cukup melampirkan objek yang sebelumnya dibuat TargetGroupke yang baru NetworkLoadBalanacer.

Bagaimana cara mulai menggunakan?


CCM mendukung Kubernetes versi 1.15 dan lebih tinggi. Di cluster, untuk operasinya diperlukan flag --cloud-provider=externaldiatur ke nilai trueuntuk kube-apiserver, kube-controller-manager, kube-scheduler dan semua kubelet'ov.

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

Untuk menggunakan CCM Anda juga perlu:

  • tentukan dalam manifes pengenal direktori Yandex.Cloud ( folder-id);
  • akun layanan untuk berinteraksi dengan Yandex.Cloud API. Dalam manifes, SecretAnda harus mentransfer kunci resmi ke akun layanan. Dokumentasi menjelaskan cara membuat akun layanan dan mendapatkan kunci.

Kami akan dengan senang hati menerima umpan balik dan masalah baru jika Anda menemukan masalah!

Ringkasan


Kami telah menggunakan CCM yang diterapkan di lima kluster Kubernet selama dua minggu terakhir dan berencana untuk menambah jumlah mereka menjadi 20 di bulan mendatang. Menggunakan CCM untuk instalasi K8 yang besar dan kritis saat ini tidak direkomendasikan.

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

PS


Baca juga di blog kami:


All Articles