Mencapai Bintang: Menguasai Operator yang Mungkin untuk Mengelola Aplikasi di Kubernetes

Kami akan melihat cara menggunakan Peran yang diterbitkan di Ansible Galaxy sebagai Operator yang mengelola aplikasi di Kubernetes, dan mari kita lihat cara membuat operator yang hanya menginstal aplikasi dan secara fleksibel menyesuaikan perilakunya tergantung pada lingkungan.



Kami akan menggunakan Ansible Operator dan modul k8s untuk menunjukkan cara menggunakan Ansible untuk membuat aplikasi Kubernetes.

Operator yang Memungkinkan adalah bagian dari Operator SDK dan memungkinkan Anda untuk merumuskan peraturan operasional aplikasi (bagaimana aplikasi tersebut harus diinstal dan dipelihara) dalam bahasa peran dan buku pedoman yang dimungkinkan. Modul k8s, pada gilirannya, memperluas kemampuan untuk mengelola objek di Kubernetes saat membuat peran dan playbook tersebut.

Operator dibuat seperti ini begitu saja.

FROM quay.io/operator-framework/ansible-operator RUN ansible-galaxy install djzager.hello_world_k8s RUN echo $'--- \n\ - version: v1alpha1\n\ group: examples.djzager.io\n\ kind: HelloWorld\n\ role: /opt/ansible/roles/djzager.hello_world_k8s' > ${HOME}/watches.yaml 

Mulai kunci


Pertama, beberapa kata tentang modul k8s Ansible . Itu muncul di Ansible 2.6 dan memperluas kemungkinan bekerja dengan objek Kubernetes dari Ansible, dan dalam distribusi Kubernetes apa pun, termasuk Red Hat OpenShift. Blog yang memungkinkan memiliki pos terpisah tentang modul ini dan klien Python dinamis untuk Red Hat OpenShift . Menurut pendapat kami, bekerja dengan objek Kubernetes melalui Ansible tanpa menggunakan modul k8 adalah salah. Mekanisme operator pada awalnya dibuat untuk menjalankan aplikasi di Kubernetes, dan Operator SDK menyediakan alat untuk perakitan, pengujian, dan pengemasan operator. Pada gilirannya, Operator yang Mungkin Diperlukan untuk mengatur peraturan operasional aplikasi dalam Bahasa yang Mungkin. Alur kerja yang sesuai diatur secara sederhana: pertama-tama kita lakukan operator-SDK baru - ketik = Dapat menghasilkan file yang diperlukan untuk operator yang mungkin, kemudian kita melukis yang memungkinkan, dan akhirnya kita melakukan membangun operator-SDK untuk membangun aplikasi untuk bekerja di Kubernetes. Tetapi jika kita sudah memiliki peran dalam Ansible Galaxy, yang mengontrol aplikasi di Kubernetes, segalanya menjadi lebih mudah. Di bawah ini kami akan melakukan hal berikut:

  1. Mari kita membangun peran Ansible untuk mengelola aplikasi Hello World di Kubernetes, yang akan membantu kami menunjukkan kemampuan modul Ansible k8s.
  2. Kami akan menerbitkan peran ini di Ansible Galaxy.

Jadi, mari kita kumpulkan operator-Kemungkinan menggunakan peran yang diterbitkan di Galaxy Kemungkinan. Mengapa bahkan membuat operator menggunakan peran dari Ansible Galaxy? Ada dua alasan:

  1. Agar tidak mengulangi . Jika kami telah memprogram peran Ansible untuk mengelola aplikasi Hello World dan menerbitkannya di Ansible Galaxy, maka logis untuk menggunakannya saat membuat operator Ansible.
  2. Karena pemisahan tanggung jawab . Kami ingin peran Hello World Ansible mengelola aplikasi dengan nama yang sama di Kubernetes, dan logika operasional (operasional) tetap berada di dalam operator. Dalam contoh kami, logika operasional sangat sederhana: hanya memanggil peran djzager.hello_world_k8s setiap kali Anda membuat atau memodifikasi sumber daya HelloWorld kustom. Namun, di masa depan pemisahan ini akan menjadi lebih signifikan, misalnya, kami akan menambahkan validasi ke aplikasi Hello World melalui peran Ansible, dan kami akan menerapkan kontrol status sumber daya khusus HelloWorld melalui logika operator.

Halo Kubernetes, temui Ansible


Apa yang kita butuhkan


  1. Ansible - lihat panduan instalasi jika Anda belum menginstal Ansible.
  2. Klien Python untuk OpenShift (opsional). Hanya diperlukan untuk peluncuran lokal. Petunjuk instalasi ada di sini .

Mari kita mulai. Pertama, buat kerangka peran menggunakan ansible-galaxy:

 # I like clear names on projects. # In meta/main.yml I will make role_name: hello-world-k8s $ ansible-galaxy init ansible-role-hello-world-k8s 

Segera setelah membuat peran baru yang mungkin, kami akan mengatur semua nilai default pada saat yang sama mendokumentasikan parameter konfigurasi yang valid. Selain itu, contoh Hello World kami tidak terlalu rumit dalam hal ini. Seperti inilah file default / main.yml kita:

 --- # NOTE: meta.name(space) comes from CR metadata when run with Ansible Operator # deploy/crds has an example CR for reference name: "{{ meta.name | default('hello-world') }}" namespace: "{{ meta.namespace | default('hello-world') }}" image: docker.io/ansibleplaybookbundle/hello-world:latest # To uninstall from the cluster # state: absent state: present # The size of the hello-world deployment size: 1 

Setelah menetapkan nilai default, perlu memutuskan apa peran yang akan dilakukan. Aplikasi Hello World harus melakukan hal berikut:

  1. Dapatkan informasi tentang API yang tersedia di kluster.
  2. Buat beberapa template dan pastikan mereka ada atau tidak ada di cluster.

Karenanya, file tugas / main.yml kami terlihat seperti ini:

 --- - name: "Get information about the cluster" set_fact: api_groups: "{{ lookup('k8s', cluster_info='api_groups') }}" - name: 'Set hello-world objects state={{ state }}' k8s: state: '{{ state }}' definition: "{{ lookup('template', item.name) | from_yaml }}" when: item.api_exists | default(True) loop: - name: deployment.yml.j2 - name: service.yml.j2 - name: route.yml.j2 api_exists: "{{ True if 'route.openshift.io' in api_groups else False }}" 

Sebelum pindah ke templat, perhatikan baris ini di file tugas:

 api_exists: "{{ True if 'route.openshift.io' in api_groups else False }}" 

Menggunakan set_fact, kami mendapatkan daftar semua API yang tersedia di kluster sehingga kami dapat secara selektif menghasilkan templat tergantung pada apakah API ada - dalam hal ini, route.openshift.io. Secara default, di kluster Kubernetes dari OpenShift, Routes tidak tersedia dan kami tidak membutuhkannya, oleh karena itu kami hanya bekerja dengan objek Route ketika ada route.openshift.io di cluster.

Kami tidak hanya dapat secara selektif mengelola objek dalam gugus tergantung pada ketersediaan API tertentu, tetapi juga menggunakan templat Jinja2 untuk menggunakan OpenShift DeploymentConfig dalam templat Penerapan kami jika cluster memiliki API apps.openshift.io. Inilah yang terlihat seperti file templates / deployment.yml.j2 kami:

 --- {% if 'apps.openshift.io' in api_groups %} apiVersion: apps.openshift.io/v1 kind: DeploymentConfig {% else %} apiVersion: apps/v1 kind: Deployment {% endif %} metadata: name: {{ name }} namespace: {{ namespace }} labels: app: {{ name }} service: {{ name }} spec: replicas: {{ size }} {% if 'apps.openshift.io' in api_groups %} selector: app: {{ name }} service: {{ name }} {% else %} selector: matchLabels: app: {{ name }} service: {{ name }} {% endif %} template: metadata: labels: app: {{ name }} service: {{ name }} spec: containers: - image: {{ image }} name: hello-world ports: - containerPort: 8080 protocol: TCP 

Templat file / service.yml.j2:

 --- apiVersion: v1 kind: Service metadata: name: {{ name }} namespace: {{ namespace }} labels: app: {{ name }} service: {{ name }} spec: ports: - name: web port: 8080 protocol: TCP targetPort: 8080 selector: app: {{ name }} service: {{ name }} 

Dan akhirnya, file templates / route.yml.j2:

 --- apiVersion: route.openshift.io/v1 kind: Route metadata: name: {{ name }} namespace: {{ namespace }} labels: app: {{ name }} service: {{ name }} spec: port: targetPort: web to: kind: Service name: {{ name }} 

Kami telah menghapus file meta / main.yml, tetapi dapat ditemukan di sini .

Akibatnya, kami memiliki peran Ansible yang mengelola aplikasi Hello World di Kubernetes, dan kami dapat menggunakan API yang tersedia di kluster. Dengan kata lain, modul k8s dan klien dinamis mempermudah bekerja dengan objek di Kubernetes. Kami berharap bahwa dengan contoh peran ini, kami dapat menunjukkan potensi Ansible saat bekerja dengan Kubernetes.

Halo Galaxy, temui Kubernetes


Ansible Galaxy memiliki banyak peran untuk menyiapkan server dan mengelola aplikasi, tetapi tidak ada banyak peran untuk mengelola aplikasi Kubernetes, jadi kami akan memberikan kontribusi kecil.

Setelah kami memposting peran kami di GitHub , yang tersisa hanyalah:

  1. Masuk ke Ansible Galaxy untuk memberikan akses ke repositori kami di GitHub.
  2. Impor peran kami.

Itu dia, sekarang peran hello_world_k8 kami tersedia untuk umum di Ansible Galaxy, di sini .

Halo Operator yang Mungkin, Temui Galaxy


Jika Anda mempelajari proyek Hello World kami dengan seksama di GitHub , Anda akan melihat bahwa kami menambahkan beberapa hal yang diperlukan untuk membuat operator yang memungkinkan, yaitu:

  1. File Arloji yang memetakan sumber daya khusus Kubernetes ke peran atau buku pedoman yang dimungkinkan.
  2. Dockerfile untuk membangun operator kami.
  3. Menyebarkan direktori dengan objek Kubernetes diperlukan untuk menjalankan operator kami.

Jika Anda perlu mempelajari lebih lanjut tentang cara membuat pernyataan Ansible Anda sendiri, gunakan Panduan Pengguna . Tetapi karena kami berjanji untuk membangun operator yang Mungkin menggunakan peran yang diterbitkan di Galaxy yang Mungkin, yang kami butuhkan hanyalah Dockerfile:

 FROM quay.io/operator-framework/ansible-operator RUN ansible-galaxy install djzager.hello_world_k8s RUN echo $'--- \n\ - version: v1alpha1\n\ group: examples.djzager.io\n\ kind: HelloWorld\n\ role: /opt/ansible/roles/djzager.hello_world_k8s' > ${HOME}/watches.yaml 

Sekarang kami kumpulkan operator:

 $ docker build -t hello-world-operator -f Dockerfile . Sending build context to Docker daemon 157.2 kB Step 1/3 : FROM quay.io/operator-framework/ansible-operator latest: Pulling from operator-framework/ansible-operator Digest: sha256:1156066a05fb1e1dd5d4286085518e5ce15acabfff10a8145eef8da088475db3 Status: Downloaded newer image for quay.io/water-hole/ansible-operator:latest ---> 39cc1d19649d Step 2/3 : RUN ansible-galaxy install djzager.hello_world_k8s ---> Running in 83ba8c21f233 - downloading role 'hello_world_k8s', owned by djzager - downloading role from https://github.com/djzager/ansible-role-hello-world-k8s/archive/master.tar.gz - extracting djzager.hello_world_k8s to /opt/ansible/roles/djzager.hello_world_k8s - djzager.hello_world_k8s (master) was installed successfully Removing intermediate container 83ba8c21f233 ---> 2f303b45576c Step 3/3 : RUN echo $'--- \n- version: v1alpha1\n group: examples.djzager.io\n kind: HelloWorld\n role: /opt/ansible/roles/djzager.hello_world_k8s' > ${HOME}/watches.yaml ---> Running in cced495a9cb4 Removing intermediate container cced495a9cb4 ---> 5827bc3c1ca3 Successfully built 5827bc3c1ca3 Successfully tagged hello-world-operator:latest 

Jelas bahwa untuk menggunakan operator ini, Anda memerlukan konten direktori penyebaran dari proyek kami untuk membuat Akun Layanan, Penjilidan Peran dan Peran, Definisi Sumber Daya Kustom, serta untuk menggunakan operator itu sendiri. Dan setelah mengerahkan operator, Anda harus membuat Sumber Daya Kustom untuk mendapatkan instance aplikasi Hello World:

 apiVersion: examples.djzager.io/v1alpha1 kind: HelloWorld metadata: name: example-helloworld namespace: default spec: size: 3 

Lingkup operator: namespace dan cluster


Sedikit lebih tinggi, kami sudah menyarankan menjelajahi direktori penyebaran kami dan mencari objek Kubernetes di sana yang diperlukan untuk meluncurkan operator. Ada tiga hal yang membatasi ruang lingkup operator saat mengelola sumber daya khusus dengan namespace tempat operator itu sendiri digunakan, yaitu:

  1. Variabel lingkungan WATCH_NAMESPACE dalam file operator.yaml yang memberi tahu operator tempat mencari sumber daya khusus
  2. role.yaml
  3. role_binding

Keterbatasan ini tentu bermanfaat dalam pengembangan operator. Tetapi jika kita ingin aplikasi kita dapat diakses oleh semua pengguna cluster, kita perlu bantuan seorang administrator. Saya harus melakukan hal berikut:

  1. Buat ClusterRole alih-alih Peran.
  2. Buat pernyataan ServiceAccount di namespace tempat pernyataan itu akan digunakan.
  3. Buat ClusterRoleBinding yang akan mengaitkan ServiceAccount dari namespace tertentu dengan ClusterRole.
  4. Perluas pernyataan dengan variabel lingkungan WATCH_NAMESPACE yang tidak ditentukan (mis., "").

Jika Anda melakukan semua hal ini, maka pengguna cluster lainnya akan dapat menggunakan instances aplikasi Hello World kami. Jika Anda tertarik dengan topik ini, kami sarankan Anda mempelajari Operator Siklus Hidup Operator (bagian dari Kerangka Operator).

Trek bintang


Kami menunjukkan cara membuat peran Ansible untuk mengontrol aplikasi di Kubernetes, menerbitkan peran ini di Galaxy Ansible dan menggunakannya di operator Ansible. Kami harap Anda sekarang:

  1. Anda akan menggunakan modul Ansible k8s .
  2. Mulai terbitkan peran Anda untuk mengelola aplikasi Kubernetes di Ansible Galaxy .
  3. Minat SDK Operator dan berlangganan buletin Operator Framework kami .

Aplikasi Hello World kami sengaja dibuat sangat sederhana, tetapi ada beberapa hal yang dapat membantu membuatnya lebih andal, dan berikut adalah beberapa:

  1. Menggunakan SDK Operator - kami sengaja tidak melakukan ini dalam contoh kami untuk menekankan betapa mudahnya beralih dari peran yang Mungkin ke operator. Tetapi lebih baik untuk tetap menggunakan peran ini dengan SDK (yaitu, operator-SDK baru), di samping itu, mungkin diperlukan pada langkah selanjutnya.
  2. Validasi - dalam versi kami saat ini, pengguna dapat membuat CR dengan ukuran: abc, yang pasti akan menyebabkan kesalahan pada tahap penerapan. Jadi lebih baik untuk menangkap kesalahan pada tahap spesifikasi, dan tidak setelah pekerjaan dimulai.
  3. Siklus hidup - dalam contoh yang lebih kompleks, mungkin pembaruan versi yang sama. Dalam skenario seperti milik kami, di mana hanya ada satu versi aplikasi Hello World, kami dapat menentukan apakah gambar wadah kerja sudah usang dengan membandingkannya dengan gambar yang tersedia di registri wadah terkait dan memperbarui instance yang sedang berjalan jika perlu.
  4. Pengujian - Molekul sangat berguna saat mengembangkan dan menguji peran yang Mungkin.
  5. Operator Siklus Hidup Manajer adalah toolkit untuk mengelola operator. Integrasi dengannya akan membantu memasang dan memperbarui operator kami.
  6. Status - kami dapat mengaktifkan sub-sumber daya status di Hello World CRD kami dan menggunakan modul k8s_status, yang merupakan bagian dari gambar Operator yang Mungkin, untuk memasukkan informasi status dalam sumber daya khusus.

Source: https://habr.com/ru/post/id440188/


All Articles