Mengenai populariti Kubernetes yang semakin meningkat

Hai Habr!

Pada penghujung musim panas, kami ingin mengingatkan anda bahawa kami terus mengusahakan topik tersebut Kubernetes dan memutuskan untuk menerbitkan artikel daripada Stackoverflow yang menunjukkan keadaan dalam projek ini pada awal bulan Jun.

Mengenai populariti Kubernetes yang semakin meningkat

Nikmati bacaan!

Pada masa menulis artikel ini, umur Kubernetes adalah lebih kurang. enam tahun, dan dalam tempoh dua tahun yang lalu popularitinya telah berkembang begitu banyak sehingga ia secara konsisten disenaraikan di kalangan paling digemari platform. Kubernetes menduduki tempat ketiga tahun ini. Untuk imbasan semula: Kubernetes ialah platform yang direka untuk menjalankan dan mengatur beban kerja dalam kontena.

Bekas bermula sebagai reka bentuk khas untuk mengasingkan proses dalam Linux; kontena telah dimasukkan sejak 2007 kumpulan, dan sejak 2002 – ruang nama. Bekas telah direka bentuk dengan lebih baik menjelang 2008, apabila ia tersedia LXC, dan Google membangunkan mekanisme korporat dalaman sendiri yang dipanggil Borg, di mana "semua kerja dilakukan dalam bekas." Dari sini kami pantas ke 2013, apabila keluaran pertama Docker berlaku, dan kontena akhirnya menjadi penyelesaian massa yang popular. Pada masa itu, alat utama untuk orkestrasi kontena ialah Mesos, walaupun dia tidak begitu popular. Kubernetes pertama kali dikeluarkan pada 2015, selepas itu alat ini menjadi standard de facto dalam bidang orkestrasi kontena.

Untuk cuba memahami sebab Kubernetes begitu popular, mari cuba jawab beberapa soalan. Bilakah kali terakhir pembangun dapat bersetuju tentang cara menggunakan aplikasi ke pengeluaran? Berapa ramai pembangun yang anda tahu yang menggunakan alatan kerana ia disediakan di luar kotak? Berapa ramaikah pentadbir awan hari ini yang tidak memahami cara aplikasi berfungsi? Kami akan melihat jawapan kepada soalan-soalan ini dalam artikel ini.

Infrastruktur sebagai YAML

Dalam dunia yang beralih daripada Puppet dan Chef kepada Kubernetes, salah satu perubahan terbesar ialah peralihan daripada "infrastruktur sebagai kod" kepada "infrastruktur sebagai data"—khususnya, seperti YAML. Semua sumber dalam Kubernetes, yang termasuk pod, konfigurasi, contoh yang digunakan, volum, dsb., boleh diterangkan dengan mudah dalam fail YAML. Sebagai contoh:

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

Pandangan ini memudahkan profesional DevOps atau SRE untuk menyatakan sepenuhnya beban kerja mereka tanpa perlu menulis kod dalam bahasa seperti Python atau Javascript.

Kelebihan lain menyusun infrastruktur sebagai data termasuk:

  • Kawalan Versi Operasi GitOps atau Git. Pendekatan ini membolehkan anda menyimpan semua fail YAML Kubernetes dalam repositori git, supaya anda boleh menjejaki dengan tepat apabila perubahan dibuat, siapa yang membuatnya dan apa sebenarnya yang berubah. Ini meningkatkan ketelusan operasi di seluruh organisasi dan meningkatkan kecekapan operasi dengan menghapuskan kekaburan, terutamanya di mana pekerja harus mencari sumber yang mereka perlukan. Pada masa yang sama, menjadi lebih mudah untuk membuat perubahan pada sumber Kubernetes secara automatik dengan hanya menggabungkan permintaan tarik.
  • Kebolehskalaan. Apabila sumber ditakrifkan sebagai YAML, pengendali kluster menjadi sangat mudah untuk menukar satu atau dua nombor dalam sumber Kubernetes, sekali gus mengubah cara ia berskala. Kubernetes menyediakan mekanisme untuk penskalaan auto mendatar pod, yang boleh digunakan untuk menentukan bilangan pod minimum dan maksimum yang diperlukan dalam konfigurasi penggunaan tertentu untuk mengendalikan trafik pada tahap rendah dan tinggi. Sebagai contoh, jika anda telah menggunakan konfigurasi yang memerlukan kapasiti tambahan disebabkan oleh lonjakan trafik yang mendadak, maka maxReplicas boleh ditukar daripada 10 kepada 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

  • Keselamatan dan pengurusan. YAML bagus untuk menilai cara sesuatu digunakan dalam Kubernetes. Sebagai contoh, kebimbangan keselamatan utama ialah sama ada beban kerja anda berjalan sebagai pengguna bukan pentadbir. Dalam kes ini, kita mungkin memerlukan alat seperti kontest, pengesah YAML/JSON, tambah Ejen Polisi Terbuka, pengesah dasar untuk memastikan bahawa konteks Konteks Keselamatan beban kerja anda tidak membenarkan bekas berjalan dengan keistimewaan pentadbir. Jika ini diperlukan, pengguna boleh menggunakan dasar mudah parit, seperti ini:

package main

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

  • Pilihan untuk penyepaduan dengan pembekal awan. Salah satu trend paling ketara dalam teknologi tinggi hari ini ialah menjalankan beban kerja pada penyedia awan awam. Menggunakan komponen pembekal awan Kubernetes membenarkan mana-mana kluster untuk disepadukan dengan pembekal awan di mana ia dijalankan. Contohnya, jika pengguna menjalankan aplikasi dalam Kubernetes pada AWS dan ingin mendedahkan aplikasi ini melalui perkhidmatan, pembekal awan membantu mencipta perkhidmatan secara automatik LoadBalanceryang secara automatik akan menyediakan pengimbang beban Pengimbang Beban Elastik Amazonuntuk mengubah hala trafik ke pod aplikasi.

Kebolehkembangan

Kubernetes sangat meluas dan pembangun menyukainya. Terdapat satu set sumber yang tersedia seperti pod, penempatan, StatefulSets, rahsia, ConfigMaps, dan lain-lain. Benar, pengguna dan pembangun boleh menambah sumber lain dalam borang definisi sumber tersuai.

Sebagai contoh, jika kita ingin mentakrifkan sumber CronTab, maka anda boleh 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

Kemudian kita boleh mencipta sumber 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 pelanjutan dalam Kubernetes ialah pembangun boleh menulis kenyataannya sendiri. Pengendali ialah proses khas dalam kelompok Kubernetes yang berfungsi mengikut “litar kawalan" Dengan bantuan pengendali, pengguna boleh mengautomasikan pengurusan CRD (definisi sumber tersuai) dengan bertukar maklumat dengan API Kubernetes.

Terdapat beberapa alat dalam komuniti yang memudahkan pembangun mencipta pengendali mereka sendiri. Antaranya - Rangka Kerja Operator dan SDK Operator. SDK ini menyediakan asas dari mana pembangun boleh mula membuat pengendali dengan cepat. Katakan anda boleh bermula dari baris arahan seperti ini:

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

Ini mencipta semua kod boilerplate untuk operator anda, termasuk fail YAML dan kod 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 boleh menambah API dan pengawal 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, akhirnya, kumpulkan pengendali dan hantarkannya ke pendaftaran bekas anda:

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

Jika pembangun mahukan lebih kawalan, kod boilerplate dalam fail Go boleh ditukar. Sebagai contoh, untuk mengubah suai spesifik pengawal, anda boleh membuat perubahan pada fail controller.go.

Projek lain EVERYWHERE, membolehkan anda membuat pernyataan menggunakan hanya fail YAML perisytiharan. Sebagai contoh, pengendali untuk Apache Kafka akan ditakrifkan lebih kurang jadi. Dengan itu, anda boleh memasang gugusan Kafka di atas Kubernetes dengan hanya beberapa arahan:

$ kubectl kudo install zookeeper
$ kubectl kudo install kafka

Dan kemudian konfigurasikannya dengan arahan 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

Sejak beberapa tahun kebelakangan ini, keluaran Kubernetes utama telah dikeluarkan setiap beberapa bulan - iaitu, tiga hingga empat keluaran utama setiap tahun. Bilangan ciri baharu yang diperkenalkan dalam setiap satu daripadanya tidak berkurangan. Lebih-lebih lagi, tidak ada tanda-tanda akan perlahan walaupun dalam masa yang sukar ini - lihat bagaimana keadaan sekarang Aktiviti projek Kubernetes di Github.

Keupayaan baharu membolehkan anda mengelompokkan operasi dengan lebih fleksibel merentas beban kerja yang pelbagai. Di samping itu, pengaturcara menikmati kawalan yang lebih besar apabila menggunakan aplikasi terus ke pengeluaran.

Komuniti

Satu lagi aspek utama populariti Kubernetes ialah kekuatan komunitinya. Pada tahun 2015, apabila mencapai versi 1.0, Kubernetes telah ditaja oleh Yayasan Pengkomputeran Asli Cloud.

Terdapat juga pelbagai masyarakat SIG (Kumpulan Kepentingan Khas) menumpukan usaha pada bidang Kubernetes yang berbeza semasa projek berkembang. Kumpulan ini sentiasa menambah ciri baharu, menjadikan kerja dengan Kubernetes lebih mudah dan mudah.

Yayasan Cloud Native juga menjadi tuan rumah CloudNativeCon/KubeCon, yang, pada masa penulisan, merupakan persidangan sumber terbuka terbesar di dunia. Lazimnya diadakan tiga kali setahun, ia menghimpunkan beribu-ribu profesional yang ingin menambah baik Kubernetes dan ekosistemnya, serta mempelajari ciri baharu yang muncul setiap tiga bulan.

Selain itu, Cloud Native Foundation telah Jawatankuasa Penyeliaan Teknikal, yang, bersama-sama dengan SIG, menyemak baharu dan sedia ada Projek dana tertumpu pada ekosistem awan. Kebanyakan projek ini membantu meningkatkan kekuatan Kubernetes.

Akhir sekali, saya percaya bahawa Kubernetes tidak akan berjaya tanpa usaha sedar seluruh komuniti, di mana orang ramai bersatu tetapi pada masa yang sama mengalu-alukan pendatang baru ke dalam kumpulan.

Masa Depan

Salah satu cabaran utama yang perlu dihadapi oleh pembangun pada masa hadapan ialah keupayaan untuk menumpukan pada butiran kod itu sendiri, dan bukan pada infrastruktur di mana ia dijalankan. Ia memenuhi trend ini paradigma seni bina tanpa pelayan, yang merupakan antara yang terkemuka hari ini. Rangka kerja lanjutan sudah wujud, mis. Knatif и OpenFaas, yang menggunakan Kubernetes untuk mengabstrakkan infrastruktur daripada pembangun.

Dalam artikel ini, kami hanya menconteng permukaan keadaan semasa Kubernetes—malah, ia hanyalah puncak gunung ais. Pengguna Kubernetes mempunyai banyak sumber, keupayaan dan konfigurasi lain yang boleh mereka gunakan.

Sumber: www.habr.com

Tambah komen