Tentang semakin populernya Kubernetes

Hei Habr!

Di akhir musim panas, kami ingin mengingatkan Anda bahwa kami terus mengerjakan topik ini Kubernetes dan memutuskan untuk menerbitkan artikel dari Stackoverflow yang menunjukkan keadaan proyek ini pada awal Juni.

Tentang semakin populernya Kubernetes

Selamat membaca!

Pada saat artikel ini ditulis, usia Kubernetes adalah sekitar. enam tahun, dan selama dua tahun terakhir popularitasnya telah berkembang pesat sehingga secara konsisten menduduki peringkat teratas paling favorit platform. Kubernetes menempati peringkat ketiga tahun ini. Singkatnya: Kubernetes adalah platform yang dirancang untuk menjalankan dan mengatur beban kerja dalam container.

Kontainer dimulai sebagai desain khusus untuk mengisolasi proses di Linux; kontainer telah disertakan sejak 2007 grup c, dan sejak 2002 – namespace. Kontainer dirancang lebih baik lagi pada tahun 2008, ketika sudah tersedia LXC, dan Google mengembangkan mekanisme internal perusahaannya sendiri yang disebut Borg, dimana “semua pekerjaan dilakukan dalam container.” Dari sini kita maju ke tahun 2013, ketika rilis pertama Docker dilakukan, dan container akhirnya menjadi solusi massal yang populer. Pada saat itu, alat utama untuk orkestrasi container adalah Mesos, meskipun dia tidak terlalu populer. Kubernetes pertama kali dirilis pada tahun 2015, setelah itu alat ini menjadi standar de facto di bidang orkestrasi container.

Untuk mencoba memahami mengapa Kubernetes begitu populer, mari kita coba menjawab beberapa pertanyaan. Kapan terakhir kali pengembang dapat menyepakati cara menyebarkan aplikasi ke produksi? Berapa banyak pengembang yang Anda kenal yang menggunakan alat yang disediakan langsung? Berapa banyak administrator cloud saat ini yang tidak memahami cara kerja aplikasi? Kami akan melihat jawaban atas pertanyaan-pertanyaan ini di artikel ini.

Infrastruktur sebagai YAML

Di dunia yang beralih dari Wayang dan Koki ke Kubernetes, salah satu perubahan terbesar adalah peralihan dari “infrastruktur sebagai kode” menjadi “infrastruktur sebagai data”—khususnya, seperti YAML. Semua sumber daya di Kubernetes, yang mencakup pod, konfigurasi, instance yang diterapkan, volume, dll., dapat dengan mudah dijelaskan dalam file YAML. Misalnya:

apiVersion: v1
kind: Pod
metadata:
  name: site
  labels:
    app: web
spec:
  containers:
    - name: front-end
      image: nginx
      ports:
        - containerPort: 80

Tampilan ini memudahkan profesional DevOps atau SRE untuk sepenuhnya mengekspresikan beban kerja mereka tanpa harus menulis kode dalam bahasa seperti Python atau Javascript.

Keuntungan lain dari pengorganisasian infrastruktur sebagai data meliputi:

  • Kontrol Versi Operasi GitOps atau Git. Pendekatan ini memungkinkan Anda menyimpan semua file YAML Kubernetes di repositori git, sehingga Anda dapat melacak dengan tepat kapan perubahan dilakukan, siapa yang membuatnya, dan apa yang sebenarnya berubah. Hal ini meningkatkan transparansi operasi di seluruh organisasi dan meningkatkan efisiensi operasional dengan menghilangkan ambiguitas, khususnya dalam hal mana karyawan harus mencari sumber daya yang mereka butuhkan. Pada saat yang sama, membuat perubahan otomatis pada sumber daya Kubernetes menjadi lebih mudah hanya dengan menggabungkan pull request.
  • Skalabilitas. Ketika sumber daya didefinisikan sebagai YAML, operator cluster menjadi sangat mudah untuk mengubah satu atau dua angka dalam sumber daya Kubernetes, sehingga mengubah cara penskalaannya. Kubernetes menyediakan mekanisme untuk penskalaan otomatis pod secara horizontal, yang dapat digunakan untuk menentukan dengan mudah berapa jumlah minimum dan maksimum pod yang diperlukan dalam konfigurasi penerapan tertentu untuk menangani lalu lintas tingkat rendah dan tinggi. Misalnya, jika Anda telah men-deploy konfigurasi yang memerlukan kapasitas tambahan karena lonjakan lalu lintas yang tiba-tiba, maka maxReplicas dapat diubah dari 10 menjadi 20:

apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
  name: myapp
  namespace: default
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: myapp-deployment
  minReplicas: 1
  maxReplicas: 20
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 50

  • Keamanan dan manajemen. YAML sangat bagus untuk mengevaluasi bagaimana berbagai hal diterapkan di Kubernetes. Misalnya, masalah keamanan utama berkaitan dengan apakah beban kerja Anda dijalankan sebagai pengguna non-admin. Dalam hal ini, kita mungkin memerlukan alat seperti konflik, validator YAML/JSON, plus Buka Agen Kebijakan, validator kebijakan untuk memastikan konteksnya Konteks Keamanan beban kerja Anda tidak mengizinkan kontainer dijalankan dengan hak istimewa administrator. Jika hal ini diperlukan, pengguna dapat menerapkan kebijakan sederhana saya berdoaseperti ini:

package main

deny[msg] {
  input.kind = "Deployment"
  not input.spec.template.spec.securityContext.runAsNonRoot = true
  msg = "Containers must not run as root"
}

  • Opsi untuk integrasi dengan penyedia cloud. Salah satu tren paling menonjol dalam teknologi tinggi saat ini adalah menjalankan beban kerja pada penyedia cloud publik. Menggunakan komponen penyedia cloud Kubernetes memungkinkan cluster mana pun untuk berintegrasi dengan penyedia cloud yang menjalankannya. Misalnya, jika pengguna menjalankan aplikasi di Kubernetes di AWS dan ingin mengekspos aplikasi tersebut melalui layanan, penyedia cloud membantu membuat layanan secara otomatis. LoadBalanceryang secara otomatis akan menyediakan penyeimbang beban Penyeimbang Beban Amazon Elasticuntuk mengarahkan lalu lintas ke pod aplikasi.

Perluasan

Kubernetes sangat dapat diperluas dan para pengembang menyukainya. Ada sekumpulan sumber daya yang tersedia seperti pod, penerapan, StatefulSets, rahasia, ConfigMaps, dll. Benar, pengguna dan pengembang dapat menambahkan sumber daya lain dalam formulir definisi sumber daya khusus.

Misalnya saja jika kita ingin mendefinisikan suatu resource CronTab, maka Anda dapat melakukan sesuatu seperti ini:

apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
  name: crontabs.my.org
spec:
  group: my.org
  versions:
    - name: v1
      served: true
      storage: true
      Schema:
        openAPIV3Schema:
          type: object
          properties:
            spec:
              type: object
              properties:
                cronSpec:
                  type: string
                  pattern: '^(d+|*)(/d+)?(s+(d+|*)(/d+)?){4}$'
                replicas:
                  type: integer
                  minimum: 1
                  maximum: 10
  scope: Namespaced
  names:
    plural: crontabs
    singular: crontab
    kind: CronTab
    shortNames:
    - ct

Nanti kita bisa membuat resource CronTab seperti ini:

apiVersion: "my.org/v1"
kind: CronTab
metadata:
  name: my-cron-object
spec:
  cronSpec: "* * * * */5"
  image: my-cron-image
  replicas: 5

Pilihan lain untuk ekstensibilitas di Kubernetes adalah pengembang dapat menulis pernyataannya sendiri. Operator adalah proses khusus di cluster Kubernetes yang bekerja sesuai dengan “sirkuit kontrol" Dengan bantuan operator, pengguna dapat mengotomatiskan pengelolaan CRD (definisi sumber daya khusus) dengan bertukar informasi dengan API Kubernetes.

Ada beberapa alat di komunitas yang memudahkan pengembang untuk membuat operator sendiri. Diantara mereka - Kerangka Operator dan SDK Operator. SDK ini memberikan landasan agar pengembang dapat dengan cepat mulai membuat operator. Katakanlah Anda bisa memulai dari baris perintah seperti ini:

$ operator-sdk new my-operator --repo github.com/myuser/my-operator

Ini akan membuat semua kode boilerplate untuk operator Anda, termasuk file YAML dan kode Golang:

.
|____cmd
| |____manager
| | |____main.go
|____go.mod
|____deploy
| |____role.yaml
| |____role_binding.yaml
| |____service_account.yaml
| |____operator.yaml
|____tools.go
|____go.sum
|____.gitignore
|____version
| |____version.go
|____build
| |____bin
| | |____user_setup
| | |____entrypoint
| |____Dockerfile
|____pkg
| |____apis
| | |____apis.go
| |____controller
| | |____controller.go

Kemudian Anda dapat menambahkan API dan pengontrol yang diperlukan, seperti ini:

$ operator-sdk add api --api-version=myapp.com/v1alpha1 --kind=MyAppService

$ operator-sdk add controller --api-version=myapp.com/v1alpha1 --kind=MyAppService

Kemudian, terakhir, rakit operator dan kirimkan ke registri container Anda:

$ operator-sdk build your.container.registry/youruser/myapp-operator

Jika pengembang menginginkan kontrol yang lebih besar, kode boilerplate di file Go dapat diubah. Misalnya, untuk mengubah spesifikasi pengontrol, Anda dapat membuat perubahan pada file controller.go.

Proyek lain di mana-mana, memungkinkan Anda membuat pernyataan hanya menggunakan file YAML deklaratif. Misalnya, operator untuk Apache Kafka akan didefinisikan kira-kira jadi. Dengan itu, Anda dapat menginstal cluster Kafka di atas Kubernetes hanya dengan beberapa perintah:

$ kubectl kudo install zookeeper
$ kubectl kudo install kafka

Dan kemudian konfigurasikan dengan perintah lain:

$ kubectl kudo install kafka --instance=my-kafka-name 
            -p ZOOKEEPER_URI=zk-zookeeper-0.zk-hs:2181 
            -p ZOOKEEPER_PATH=/my-path -p BROKER_CPUS=3000m 
            -p BROKER_COUNT=5 -p BROKER_MEM=4096m 
            -p DISK_SIZE=40Gi -p MIN_INSYNC_REPLICAS=3 
            -p NUM_NETWORK_THREADS=10 -p NUM_IO_THREADS=20

Inovasi

Selama beberapa tahun terakhir, rilis besar Kubernetes telah dirilis setiap beberapa bulan - yaitu tiga hingga empat rilis besar per tahun. Jumlah fitur baru yang diperkenalkan di masing-masingnya tidak berkurang. Selain itu, tidak ada tanda-tanda melambat bahkan di masa-masa sulit ini – lihatlah situasinya sekarang Aktivitas proyek Kubernetes di Github.

Kemampuan baru memungkinkan Anda mengelompokkan operasi secara lebih fleksibel di berbagai beban kerja. Selain itu, pemrogram menikmati kontrol yang lebih besar saat menerapkan aplikasi langsung ke produksi.

Masyarakat

Aspek utama lain dari popularitas Kubernetes adalah kekuatan komunitasnya. Pada tahun 2015, setelah mencapai versi 1.0, Kubernetes disponsori oleh Yayasan Komputasi Asli Cloud.

Komunitasnya pun beragam SIG (Kelompok Minat Khusus) berfokus pada pengerjaan berbagai area Kubernetes seiring berkembangnya proyek. Grup-grup ini terus menambahkan fitur-fitur baru, membuat bekerja dengan Kubernetes menjadi lebih nyaman dan nyaman.

Cloud Native Foundation juga menyelenggarakan CloudNativeCon/KubeCon, yang pada saat artikel ini ditulis, merupakan konferensi open source terbesar di dunia. Biasanya diadakan tiga kali setahun, acara ini mempertemukan ribuan profesional yang ingin meningkatkan Kubernetes dan ekosistemnya, serta mempelajari fitur-fitur baru yang muncul setiap tiga bulan.

Apalagi Cloud Native Foundation punya Komite Pengawasan Teknis, yang, bersama dengan SIG, meninjau hal-hal baru dan yang sudah ada Proyek dana yang difokuskan pada ekosistem cloud. Sebagian besar proyek ini membantu meningkatkan kekuatan Kubernetes.

Terakhir, saya percaya bahwa Kubernetes tidak akan sesukses ini tanpa upaya sadar dari seluruh komunitas, di mana orang-orang tetap bersatu namun pada saat yang sama menyambut pendatang baru ke dalam kelompok tersebut.

Masa depan

Salah satu tantangan utama yang harus dihadapi pengembang di masa depan adalah kemampuan untuk fokus pada detail kode itu sendiri, dan bukan pada infrastruktur tempat kode tersebut dijalankan. Ini memenuhi tren-tren ini paradigma arsitektur tanpa server, yang merupakan salah satu yang terkemuka saat ini. Kerangka kerja tingkat lanjut sudah ada, mis. Knatif и OpenFaas, yang menggunakan Kubernetes untuk mengabstraksi infrastruktur dari pengembang.

Dalam artikel ini, kami hanya membahas permukaan dari kondisi Kubernetes saat ini—bahkan, ini hanyalah puncak gunung es. Pengguna Kubernetes memiliki banyak sumber daya, kemampuan, dan konfigurasi lain yang dapat mereka gunakan.

Sumber: www.habr.com

Tambah komentar