Pesan Kubernetes untuk DevOps

gambarHalo, habrozhiteli! Kubernetes adalah salah satu elemen kunci dari ekosistem cloud modern. Teknologi ini memberikan keandalan, skalabilitas, dan ketahanan virtualisasi wadah. John Arundel dan Justin Domingus berbicara tentang ekosistem Kubernetes dan memperkenalkan solusi yang terbukti untuk masalah sehari-hari. Selangkah demi selangkah, Anda akan membangun aplikasi berbasis cloud Anda sendiri dan membuat infrastruktur untuk mendukungnya, mengonfigurasi lingkungan pengembangan dan pipa penyebaran berkelanjutan, yang akan berguna bagi Anda ketika bekerja pada aplikasi berikut.

• Mulai dengan wadah dan Kubernet dari awal: tidak diperlukan pengalaman khusus untuk mempelajari topik tersebut. • Mulai cluster Anda sendiri atau pilih layanan Kubernetes terkelola dari Amazon, Google, dll. • Gunakan Kubernetes untuk mengelola siklus hidup kontainer dan konsumsi sumber daya. • Mengoptimalkan cluster untuk biaya, kinerja, ketahanan, daya, dan skalabilitas. • Pelajari alat terbaik untuk mengembangkan, menguji, dan menggunakan aplikasi Anda. • Manfaatkan praktik industri saat ini untuk keselamatan dan kontrol. • Terapkan prinsip-prinsip DevOps di perusahaan Anda sehingga tim pengembangan menjadi lebih fleksibel, cepat dan efisien.

Untuk siapa buku itu?


Buku ini paling relevan untuk karyawan departemen administrasi yang bertanggung jawab untuk server, aplikasi, dan layanan, serta untuk pengembang yang terlibat dalam membangun layanan cloud baru atau memigrasikan aplikasi yang sudah ada ke Kubernetes dan cloud. Jangan khawatir, mengetahui cara bekerja dengan Kubernet dan wadah tidak diperlukan - kami akan mengajari Anda segalanya.

Para pengguna Kubernet yang berpengalaman juga akan menemukan banyak hal untuk dijelajahi: topik-topik seperti RBAC, penyebaran terus-menerus, manajemen data yang sensitif, dan kemampuan pengamatan dibahas secara mendalam. Kami berharap halaman-halaman buku ini pasti akan memiliki sesuatu yang menarik untuk Anda, terlepas dari keahlian dan pengalaman Anda.

Pertanyaan apa yang dijawab buku itu


Selama perencanaan dan penulisan buku ini, kami membahas teknologi cloud dan Kubernet dengan ratusan orang, berbicara dengan para pemimpin dan pakar di industri ini, serta dengan para pemula absolut. Berikut ini adalah pertanyaan individual yang ingin mereka lihat jawabannya dalam publikasi ini.

  • “Saya tertarik mengapa waktu harus dihabiskan untuk teknologi ini. Masalah apa yang akan dia bantu saya dan tim saya pecahkan? ”
  • “Kubernetes tampaknya menarik, tetapi memiliki ambang masuk yang cukup tinggi. Mempersiapkan contoh sederhana tidak sulit, tetapi administrasi lebih lanjut dan debugging menakutkan. Kami ingin mendapatkan saran yang dapat dipercaya tentang bagaimana orang mengelola kluster Kubernetes dalam kehidupan nyata dan masalah apa yang akan kita hadapi. "
  • “Saran subjektif akan sangat membantu. Ekosistem Kubernetes menawarkan tim pemula terlalu banyak pilihan untuk dipilih. Ketika hal yang sama dapat dilakukan dengan beberapa cara, bagaimana memahami mana yang lebih baik? Bagaimana membuat pilihan? "

Dan, mungkin, yang paling penting dari semua pertanyaan:

  • "Bagaimana cara menggunakan Kubernetes tanpa mengganggu perusahaan saya?"

Kutipan. Objek Konfigurasi dan Rahasia


Kemampuan untuk memisahkan logika aplikasi Kubernetes dari konfigurasinya (yaitu, dari nilai atau pengaturan apa pun yang dapat berubah seiring waktu) sangat berguna. Nilai konfigurasi biasanya mencakup pengaturan untuk lingkungan tertentu, alamat DNS layanan pihak ketiga, dan kredensial untuk otentikasi.

Tentu saja, semua ini dapat ditempatkan langsung dalam kode, tetapi pendekatan ini tidak cukup fleksibel. Misalnya, untuk mengubah nilai konfigurasi, maka Anda harus memasang kembali dan menggunakan kode Anda. Solusi yang jauh lebih baik adalah dengan memisahkan konfigurasi dari kode dan membacanya dari file atau variabel lingkungan.

Kubernetes menyediakan beberapa cara berbeda untuk mengelola konfigurasi Anda. Pertama, Anda dapat meneruskan nilai ke aplikasi melalui variabel lingkungan yang ditentukan dalam spesifikasi kulit pod (lihat bagian "Variabel Lingkungan" di halaman 192). Kedua, data konfigurasi dapat disimpan langsung di Kubernetes menggunakan objek ConfigMap dan Secret.

Dalam bab ini, kita akan memeriksa objek-objek ini secara rinci dan mempertimbangkan beberapa pendekatan praktis untuk mengelola konfigurasi dan data sensitif menggunakan contoh aplikasi demo.

Memperbarui kulit pod saat mengubah konfigurasi


Bayangkan bahwa cluster Anda memiliki penyebaran dan Anda ingin mengubah beberapa nilai dalam ConfigMap-nya. Jika Anda menggunakan grafik Helm (lihat bagian “Helm: Package Manager for Kubernetes” di halaman 102), Anda dapat mendeteksi perubahan konfigurasi dan memulai kembali cangkang pod Anda dengan satu trik yang elegan. Tambahkan anotasi berikut ke spesifikasi penggunaan Anda:

checksum/config: {{ include (print $.Template.BasePath "/configmap.yaml") .
       | sha256sum }}

Sekarang templat penyebaran berisi checksum dari parameter konfigurasi: ketika parameter diubah, jumlahnya diperbarui. Jika Anda menjalankan perintah peningkatan helm, Helm akan menemukan bahwa spesifikasi penggunaan telah berubah dan memulai kembali semua kulit pod.

Data Rahasia di Kubernetes


Kita sudah tahu bahwa objek ConfigMap menyediakan mekanisme yang fleksibel untuk menyimpan dan mengakses data konfigurasi dalam sebuah cluster. Namun, sebagian besar aplikasi memiliki informasi yang rahasia dan rahasia: misalnya, kata sandi atau kunci API. Itu juga dapat disimpan dalam ConfigMap, tetapi solusi seperti itu tidak ideal.

Sebagai gantinya, Kubernetes menawarkan jenis objek khusus yang dirancang untuk menyimpan data sensitif: Rahasia. Selanjutnya, kami mempertimbangkan contoh bagaimana objek ini dapat diterapkan dalam aplikasi demo kami.

Untuk memulai, lihat manifes Kubernet untuk objek Rahasia (lihat hello-secret-env / k8s / secret.yaml):

apiVersion: v1
kind: Secret
metadata:
    name: demo-secret
stringData:
    magicWord: xyzzy

Dalam contoh ini, kunci pribadi magicWord adalah xyzzy (en.wikipedia.org/wiki/Xyzzy_(computing)). Kata xyzzy umumnya sangat berguna di dunia komputer. Mirip dengan ConfigMap, Anda dapat menempatkan banyak kunci dan nilai dalam objek Rahasia. Di sini, untuk kesederhanaan, kami hanya menggunakan satu pasangan nilai kunci.

Menggunakan objek Rahasia sebagai variabel lingkungan


Seperti ConfigMap, objek Rahasia dapat dibuat tersedia dalam wadah sebagai variabel lingkungan atau file pada disk-nya. Dalam contoh berikut, kami akan menetapkan nilai lingkungan dari variabel kepada Secret:

spec:
   containers:
       - name: demo
          image: cloudnatived/demo:hello-secret-env
          ports:
             - containerPort: 8888
          env:
             - name: GREETING
               valueFrom:
               secretKeyRef:
                  name: demo-secret
                  key: magicWord


Jalankan perintah berikut di repositori demo untuk menerapkan manifes:

kubectl apply -f hello-secret-env/k8s/
deployment.extensions "demo" configured
secret "demo-secret" created

Seperti sebelumnya, arahkan port lokal ke penyebaran untuk melihat hasilnya di browser Anda:

kubectl port-forward deploy/demo 9999:8888
Forwarding from 127.0.0.1:9999 -> 8888
Forwarding from [::1]:9999 -> 8888

Ketika Anda membuka alamat localhost : 9999 / Anda akan melihat yang berikut:

The magic word is "xyzzy"

Menulis objek Rahasia ke file


Dalam contoh ini, kami akan melampirkan objek Rahasia ke wadah sebagai file. Kode ini ada di folder hello-secret-file di repositori demo.

Untuk menghubungkan Rahasia sebagai file, kami akan menggunakan penyebaran berikut:

spec:
   containers:
       - name: demo
          image: cloudnatived/demo:hello-secret-file
          ports:
              - containerPort: 8888
          volumeMounts:
              - name: demo-secret-volume
                mountPath: "/secrets/"
                readOnly: true
   volumes:
      - name: demo-secret-volume
        secret:
           secretName: demo-secret

Seperti pada subbagian “Membuat file konfigurasi dari objek ConfigMap” pada halaman. 240, kami membuat volume (dalam hal ini, demo-rahasia-volume) dan menghubungkannya ke wadah di bagian spesifikasi volumeMounts. MountPath adalah / rahasia, sehingga Kubernetes akan membuat satu file untuk setiap pasangan nilai kunci yang ditentukan dalam objek Rahasia di folder ini.

Dalam contoh kami, kami menetapkan hanya satu pasangan nilai kunci yang disebut magicWord, sehingga manifes akan membuat file tunggal / rahasia / magicWord dengan data rahasia dalam wadah yang hanya baca-saja.

Jika Anda menerapkan manifes ini dengan cara yang sama seperti pada contoh sebelumnya, Anda akan mendapatkan hasil yang sama:

The magic word is "xyzzy"

Membaca Objek Rahasia


Di bagian sebelumnya, kami menggunakan perintah kubectl menggambarkan untuk menampilkan isi ConfigMap. Bisakah Anda melakukan hal yang sama dengan Rahasia?

kubectl describe secret/demo-secret
Name:          demo-secret

Namespace:      default
Labels:             <none>
Annotations:
Type:               Opaque

Data
====
magicWord: 5   bytes

Harap dicatat bahwa data itu sendiri tidak ditampilkan. Objek rahasia di Kubernet adalah tipe Buram: ini berarti bahwa isinya tidak ditampilkan dalam output kubectl, entri jurnal, dan terminal, sehingga mustahil untuk secara tidak sengaja mengungkapkan informasi sensitif.

Untuk melihat versi data sensitif yang disandikan dalam format YAML, gunakan perintah kubectl get:

kubectl get secret/demo-secret -o yaml
apiVersion: v1
data:
   magicWord: eHl6enk=
kind: Secret
metadata:
...
type: Opaque

base64


Apa itu eHl6enk =, yang sama sekali berbeda dari nilai asli kami? Ini sebenarnya adalah objek Rahasia, diwakili dalam pengkodean base64. Base64 adalah skema pengkodean untuk data biner sewenang-wenang sebagai serangkaian karakter.

Karena informasi rahasia mungkin biner dan tidak dapat diakses untuk keluaran (seperti, misalnya, dalam kasus kunci enkripsi TLS), objek Rahasia selalu disimpan dalam format base64.

Teks beHl6enk = adalah versi yang disandikan base64 dari kata rahasia kami xyzzy. Anda dapat memverifikasi ini jika Anda menjalankan perintah base64 --decode di terminal:

echo "eHl6enk=" | base64 --decode
xyzzy

Dengan demikian, terlepas dari kenyataan bahwa Kubernetes melindungi Anda dari tidak sengaja menampilkan data rahasia dalam file terminal atau log, jika Anda memiliki izin untuk membaca objek Rahasia dalam namespace tertentu, data ini dapat diterima dalam format base64 dan kemudian diterjemahkan.

Jika Anda perlu menyandikan beberapa teks di base64 (misalnya, untuk meletakkannya di Rahasia), gunakan perintah base64 tanpa argumen:

echo xyzzy | base64
eHl6enkK

Akses ke objek Rahasia


Siapa yang dapat membaca dan mengedit objek Rahasia? Ini ditentukan oleh RBAC, mekanisme kontrol akses (kami akan membahasnya secara rinci di bagian “Pengantar Kontrol Akses Berbasis Peran” di halaman 258). Jika Anda menggunakan kluster di mana sistem RBAC tidak ada atau tidak diaktifkan, semua objek Rahasia Anda dapat diakses oleh pengguna dan wadah (kami akan menjelaskan nanti bahwa Anda tidak boleh memiliki klaster industri tanpa RBAC).

Enkripsi data pasif


Bagaimana dengan mereka yang memiliki akses ke database etcd, di mana Kubernetes menyimpan semua informasinya? Bisakah mereka membaca data sensitif tanpa hak untuk membaca objek rahasia melalui API?

Dimulai dengan versi 1.7, Kubernetes mendukung enkripsi data pasif. Ini berarti bahwa informasi rahasia di dalam etcd disimpan pada disk dalam bentuk terenkripsi dan tidak dapat dibaca bahkan oleh mereka yang memiliki akses langsung ke database. Untuk mendekripsi, Anda memerlukan kunci yang hanya dimiliki oleh server API Kubernetes. Dalam kluster yang dikonfigurasi dengan benar, enkripsi pasif harus diaktifkan.

Periksa apakah enkripsi pasif berfungsi di kluster Anda dengan melakukan ini:

kubectl describe pod -n kube-system -l component=kube-apiserver |grep encryption
        --experimental-encryption-provider-config=...

Jika Anda tidak melihat flag eksperimental-enkripsi-penyedia-konfigurasi, enkripsi pasif tidak diaktifkan. Saat menggunakan Google Kubernetes Engine atau layanan manajemen Kubernetes lainnya, data Anda dienkripsi menggunakan mekanisme yang berbeda, sehingga benderanya tidak ada. Periksa dengan penyedia Kubernetes Anda untuk melihat apakah konten etcd dienkripsi.

Penyimpanan Data Rahasia


Ada sumber daya Kubernet yang tidak boleh dihapus dari kluster: misalnya, objek Rahasia yang sangat penting. Anda dapat melindungi sumber daya agar tidak dihapus menggunakan anotasi yang disediakan oleh Helm Manager:

kind: Secret
metadata:
    annotations:
        "helm.sh/resource-policy": keep

Strategi Manajemen Objek Rahasia


Dalam contoh dari bagian sebelumnya, data sensitif dilindungi dari akses tidak sah segera setelah disimpan di cluster. Tetapi dalam file manifes, mereka disimpan dalam teks biasa.

Anda tidak boleh menempatkan informasi rahasia dalam file yang ada dalam sistem kontrol versi. Bagaimana cara mengelola dan menyimpan informasi ini dengan aman sebelum menerapkannya ke kluster Kubernetes?

Anda dapat memilih alat atau strategi apa saja untuk bekerja dengan data sensitif di aplikasi Anda, tetapi Anda masih perlu menjawab setidaknya pertanyaan-pertanyaan berikut.

  • Di mana menyimpan data sensitif sehingga sangat mudah diakses?
  • Bagaimana membuat data sensitif tersedia untuk aplikasi aktif Anda?
  • , ?


John Arundel adalah konsultan dengan pengalaman 30 tahun di industri komputer. Dia telah menulis beberapa buku dan bekerja dengan banyak perusahaan dari berbagai negara, menasihati mereka tentang infrastruktur berbasis cloud dan Kubernet. Di waktu luangnya ia menikmati berselancar, menembakkan pistol yang bagus dan memainkan piano secara amatir. Tinggal di sebuah pondok yang luar biasa di Cornwall, Inggris.

Justin Domingus adalah seorang insinyur administrasi sistem yang bekerja di lingkungan DevOps dengan Kubernetes dan teknologi cloud. Dia suka menghabiskan waktu di luar rumah, minum kopi, menangkap kepiting, dan duduk di depan komputer. Tinggal di Seattle, Washington, bersama dengan kucing yang luar biasa dan seorang istri yang bahkan lebih hebat dan sahabat paruh waktu Adrienne.

»Informasi lebih lanjut tentang buku ini dapat ditemukan di situs web penerbit
» Isi
» Kutipan

Untuk Khabrozhiteley Diskon 25% untuk kupon - Kubernet

Setelah pembayaran versi kertas buku, sebuah buku elektronik dikirim melalui email.

All Articles