
Bagian 1/3 di sini
Bagian 3/3 di sini
Halo dan selamat datang kembali! Ini adalah bagian kedua dari artikel tentang pengaturan cluster Kubernetes pada logam kosong. Sebelumnya kami mengkonfigurasi Kubernetes HA cluster menggunakan etcd eksternal, master-master dan load balancing. Nah, sekarang saatnya untuk mengatur lingkungan dan utilitas tambahan untuk membuat cluster lebih berguna dan sedekat mungkin dengan keadaan kerja.
Pada bagian artikel ini, kami akan fokus pada konfigurasi penyeimbang beban internal layanan cluster - ini akan menjadi MetalLB. Kami juga akan menginstal dan mengkonfigurasi penyimpanan file terdistribusi antara node yang bekerja kami. Kami akan menggunakan GlusterFS untuk volume persisten yang tersedia di Kubernetes.
Setelah menyelesaikan semua langkah, diagram klaster kami akan terlihat seperti ini:

Beberapa kata tentang MetalLB, langsung dari halaman dokumen:
MetalLB adalah implementasi penyeimbang beban untuk kluster logam kosong Kubernetes dengan protokol routing standar.
Kubernetes tidak menawarkan implementasi penyeimbang beban jaringan ( jenis layanan LoadBalancer ) untuk bare metal. Semua opsi implementasi Network LB yang disertakan dengan Kubernet adalah middleware, dan mengakses berbagai platform IaaS (GCP, AWS, Azure, dll.). Jika Anda tidak bekerja pada platform yang didukung oleh IaaS (GCP, AWS, Azure, dll.), LoadBalancer akan tetap dalam status "siaga" untuk jangka waktu tidak terbatas setelah pembuatan.
Operator server BM memiliki dua alat yang kurang efektif untuk memasukkan lalu lintas pengguna ke dalam kelompok mereka, NodePort dan layanan externalIPs. Kedua opsi ini memiliki kelemahan produksi yang signifikan, yang mengubah kluster BM menjadi warga kelas dua di ekosistem Kubernetes.
MetalLB berupaya untuk memperbaiki ketidakseimbangan ini dengan menawarkan implementasi Network LB yang terintegrasi dengan peralatan jaringan standar, sehingga layanan eksternal pada kluster BM juga "hanya bekerja" pada kecepatan maksimum.
Dengan demikian, menggunakan alat ini, kami meluncurkan layanan di kluster Kubernetes menggunakan penyeimbang beban, yang banyak terima kasih kepada tim MetalLB. Proses pengaturannya sangat sederhana dan mudah.
Sebelumnya dalam contoh, kami memilih subnet 192.168.0.0/24 untuk kebutuhan cluster kami. Sekarang ambil beberapa subnet ini untuk load balancer di masa depan.
Kami memasuki sistem mesin dengan utilitas kubectl yang dikonfigurasi dan menjalankan:
control# kubectl apply -f https://raw.githubusercontent.com/google/metallb/v0.7.3/manifests/metallb.yaml
Ini akan menggunakan MetalLB di cluster, di metallb-system
. Pastikan semua komponen MetalLB berfungsi dengan baik:
control# kubectl get pod --namespace=metallb-system NAME READY STATUS RESTARTS AGE controller-7cc9c87cfb-ctg7p 1/1 Running 0 5d3h speaker-82qb5 1/1 Running 0 5d3h speaker-h5jw7 1/1 Running 0 5d3h speaker-r2fcg 1/1 Running 0 5d3h
Sekarang konfigurasikan MetalLB menggunakan configmap. Dalam contoh ini, kami menggunakan kustomisasi Layer 2. Untuk informasi tentang opsi kustomisasi lainnya, lihat dokumentasi MetalLB.
Buat file metallb-config.yaml di direktori mana pun di dalam rentang IP yang dipilih dari subnet dari kluster kami:
control# vi metallb-config.yaml apiVersion: v1 kind: ConfigMap metadata: namespace: metallb-system name: config data: config: | address-pools: - name: default protocol: layer2 addresses: - 192.168.0.240-192.168.0.250
Dan terapkan pengaturan ini:
control# kubectl apply -f metallb-config.yaml
Periksa dan ubah configmap nanti jika perlu:
control# kubectl describe configmaps -n metallb-system control# kubectl edit configmap config -n metallb-system
Sekarang kami memiliki penyeimbang muatan lokal yang dikonfigurasi sendiri. Mari kita lihat cara kerjanya, menggunakan layanan Nginx sebagai contoh.
control# vi nginx-deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment spec: selector: matchLabels: app: nginx replicas: 3 template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:latest ports: - containerPort: 80 control# vi nginx-service.yaml apiVersion: v1 kind: Service metadata: name: nginx spec: type: LoadBalancer selector: app: nginx ports: - port: 80 name: http
Kemudian buat uji coba penyebaran dan layanan Nginx:
control# kubectl apply -f nginx-deployment.yaml control# kubectl apply -f nginx-service.yaml
Dan sekarang - periksa hasilnya:
control# kubectl get po NAME READY STATUS RESTARTS AGE nginx-deployment-6574bd76c-fxgxr 1/1 Running 0 19s nginx-deployment-6574bd76c-rp857 1/1 Running 0 19s nginx-deployment-6574bd76c-wgt9n 1/1 Running 0 19s control# kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE nginx LoadBalancer 10.100.226.110 192.168.0.240 80:31604/TCP 107s
Membuat 3 Nginx pods, seperti yang kami tunjukkan dalam penerapan sebelumnya. Layanan Nginx akan mengarahkan lalu lintas ke semua pod ini sesuai dengan skema balancing siklik. Dan Anda juga dapat melihat IP eksternal yang diterima dari penyeimbang beban MetalLB kami.
Sekarang cobalah menggulung ke alamat IP 192.168.0.240 dan Anda akan melihat halaman Nginx index.html. Ingatlah untuk menghapus penyebaran uji dan layanan Nginx.
control# kubectl delete svc nginx service "nginx" deleted control# kubectl delete deployment nginx-deployment deployment.extensions "nginx-deployment" deleted
Baiklah, itu saja dengan MetalLB, mari kita lanjutkan - kami akan mengonfigurasi GlusterFS untuk volume Kubernetes.
2. Mengkonfigurasi GlusterFS dengan Heketi pada node yang berfungsi.
Faktanya, kluster Kubernetes tidak dapat digunakan tanpa volume di dalamnya. Seperti yang Anda tahu, perapian itu fana, yaitu mereka dapat dibuat dan dihapus kapan saja. Semua data di dalamnya akan hilang. Dengan demikian, dalam sebuah cluster nyata, penyimpanan terdistribusi diperlukan untuk memastikan pertukaran pengaturan dan data antara node dan aplikasi di dalamnya.
Di Kubernetes, volume tersedia dalam berbagai cara, pilih yang Anda inginkan. Dalam contoh ini, saya akan menunjukkan cara membuat penyimpanan GlusterFS untuk aplikasi internal apa pun, seperti volume persisten. Sebelumnya, saya menggunakan "sistem" instalasi GlusterFS untuk semua simpul kerja Kubernet untuk ini, dan kemudian cukup membuat volume hostPath di direktori GlusterFS.
Sekarang kami memiliki alat Heketi berguna baru.
Beberapa kata dari dokumentasi Heketi:
Tenang infrastruktur manajemen volume untuk GlusterFS.
Heketi menawarkan antarmuka manajemen yang tenang yang dapat digunakan untuk mengelola siklus hidup volume GlusterFS. Berkat Heketi, layanan cloud seperti OpenStack Manila, Kubernetes, dan OpenShift dapat secara dinamis menyediakan volume GlusterFS dengan segala jenis keandalan yang didukung. Heketi secara otomatis menentukan lokasi blok dalam sebuah cluster, menyediakan lokasi blok dan replika mereka di berbagai area kegagalan. Heketi juga mendukung sejumlah cluster GlusterFS, memungkinkan layanan cloud untuk menawarkan penyimpanan file online, bukan hanya satu cluster GlusterFS.
Kedengarannya bagus, dan di samping itu, alat ini akan membawa kluster VM kami lebih dekat ke kluster cloud Kubernetes yang besar. Pada akhirnya, Anda akan dapat membuat PersistentVolumeClaims , yang akan dihasilkan secara otomatis, dan banyak lagi.
Anda dapat mengambil hard drive sistem tambahan untuk mengkonfigurasi GlusterFS atau hanya membuat beberapa perangkat blok dummy. Dalam contoh ini, saya akan menggunakan metode kedua.
Buat perangkat blok dummy di ketiga node yang bekerja:
worker1-3# dd if=/dev/zero of=/home/gluster/image bs=1M count=10000
Anda akan mendapatkan file berukuran sekitar 10 GB. Kemudian gunakan losetup - untuk menambahkannya ke node ini, sebagai perangkat loopback:
worker1-3# losetup /dev/loop0 /home/gluster/image
Harap dicatat: jika Anda sudah memiliki semacam perangkat loopback 0, maka Anda harus memilih nomor lainnya.
Saya mengambil waktu dan mencari tahu mengapa Heketi tidak ingin bekerja dengan baik. Oleh karena itu, untuk mencegah masalah dalam konfigurasi di masa mendatang, pertama-tama pastikan bahwa kita telah memuat modul kernel dm_thin_pool dan menginstal paket glusterfs-client pada semua node yang berfungsi.
worker1-3# modprobe dm_thin_pool worker1-3# apt-get update && apt-get -y install glusterfs-client
Nah, sekarang Anda membutuhkan file / home / gluster / image dan perangkat / dev / loop0 untuk hadir di semua node yang berfungsi. Ingatlah untuk membuat layanan systemd yang secara otomatis akan memulai losetup dan modprobe setiap kali server ini boot.
worker1-3# vi /etc/systemd/system/loop_gluster.service [Unit] Description=Create the loopback device for GlusterFS DefaultDependencies=false Before=local-fs.target After=systemd-udev-settle.service Requires=systemd-udev-settle.service [Service] Type=oneshot ExecStart=/bin/bash -c "modprobe dm_thin_pool && [ -b /dev/loop0 ] || losetup /dev/loop0 /home/gluster/image" [Install] WantedBy=local-fs.target
Dan nyalakan:
worker1-3# systemctl enable /etc/systemd/system/loop_gluster.service Created symlink /etc/systemd/system/local-fs.target.wants/loop_gluster.service β /etc/systemd/system/loop_gluster.service.
Pekerjaan persiapan selesai, dan kami siap untuk menyebarkan GlusterFS dan Heketi ke cluster kami. Untuk ini, saya akan menggunakan panduan keren ini. Sebagian besar perintah diluncurkan dari komputer kontrol eksternal, dan perintah yang sangat kecil diluncurkan dari sembarang master node di dalam cluster.
Pertama, salin repositori dan buat DaemonSet GlusterFS:
control# git clone https://github.com/heketi/heketi control# cd heketi/extras/kubernetes control# kubectl create -f glusterfs-daemonset.json
Sekarang mari kita tandai tiga simpul kerja kami untuk GlusterFS; setelah memberi label, pod GlusterFS akan dibuat:
control# kubectl label node worker1 storagenode=glusterfs control# kubectl label node worker2 storagenode=glusterfs control# kubectl label node worker3 storagenode=glusterfs control# kubectl get pod NAME READY STATUS RESTARTS AGE glusterfs-5dtdj 1/1 Running 0 1m6s glusterfs-hzdll 1/1 Running 0 1m9s glusterfs-p8r59 1/1 Running 0 2m1s
Sekarang buat akun layanan Heketi:
control# kubectl create -f heketi-service-account.json
Kami menyediakan untuk akun layanan ini kemampuan untuk mengelola pod gluster. Untuk melakukan ini, buat fungsi kluster yang diperlukan untuk akun layanan kami yang baru dibuat:
control# kubectl create clusterrolebinding heketi-gluster-admin --clusterrole=edit --serviceaccount=default:heketi-service-account
Sekarang mari kita buat kunci rahasia Kubernetes yang memblokir konfigurasi instance Heketi kita:
control# kubectl create secret generic heketi-config-secret --from-file=./heketi.json
Buat sumber pertama di bawah Heketi, yang kami gunakan untuk operasi pengaturan pertama dan kemudian hapus:
control# kubectl create -f heketi-bootstrap.json service "deploy-heketi" created deployment "deploy-heketi" created control# kubectl get pod NAME READY STATUS RESTARTS AGE deploy-heketi-1211581626-2jotm 1/1 Running 0 2m glusterfs-5dtdj 1/1 Running 0 6m6s glusterfs-hzdll 1/1 Running 0 6m9s glusterfs-p8r59 1/1 Running 0 7m1s
Setelah membuat dan memulai layanan Bootstrap Heketi, kita perlu beralih ke salah satu node master kami, di sana kami akan menjalankan beberapa perintah, karena simpul kontrol eksternal kami tidak ada di dalam kluster kami, jadi kami tidak dapat mengakses pod yang berfungsi dan jaringan internal kluster.
Pertama, mari unduh utilitas heketi-client dan salin ke folder system bin:
master1# wget https://github.com/heketi/heketi/releases/download/v8.0.0/heketi-client-v8.0.0.linux.amd64.tar.gz master1# tar -xzvf ./heketi-client-v8.0.0.linux.amd64.tar.gz master1# cp ./heketi-client/bin/heketi-cli /usr/local/bin/ master1# heketi-cli heketi-cli v8.0.0
Sekarang temukan alamat IP pod heketi dan ekspor sebagai variabel sistem:
master1# kubectl --kubeconfig /etc/kubernetes/admin.conf describe pod deploy-heketi-1211581626-2jotm For me this pod have a 10.42.0.1 ip master1# curl http://10.42.0.1:57598/hello Handling connection for 57598 Hello from Heketi master1# export HEKETI_CLI_SERVER=http://10.42.0.1:57598
Sekarang mari kita beri Heketi informasi tentang cluster GlusterFS yang harus dikelola. Kami menyediakannya melalui file topologi. Topologi adalah manifes JSON dengan daftar semua node, disk, dan kluster yang digunakan oleh GlusterFS.
CATATAN Pastikan bahwa hostnames/manage
menunjukkan nama yang tepat, seperti di bagian kubectl get node
, dan bahwa hostnames/storage
adalah alamat IP dari node penyimpanan.
master1:~/heketi-client# vi topology.json { "clusters": [ { "nodes": [ { "node": { "hostnames": { "manage": [ "worker1" ], "storage": [ "192.168.0.7" ] }, "zone": 1 }, "devices": [ "/dev/loop0" ] }, { "node": { "hostnames": { "manage": [ "worker2" ], "storage": [ "192.168.0.8" ] }, "zone": 1 }, "devices": [ "/dev/loop0" ] }, { "node": { "hostnames": { "manage": [ "worker3" ], "storage": [ "192.168.0.9" ] }, "zone": 1 }, "devices": [ "/dev/loop0" ] } ] } ] }
Kemudian unduh file ini:
master1:~/heketi-client# heketi-cli topology load --json=topology.json Creating cluster ... ID: e83467d0074414e3f59d3350a93901ef Allowing file volumes on cluster. Allowing block volumes on cluster. Creating node worker1 ... ID: eea131d392b579a688a1c7e5a85e139c Adding device /dev/loop0 ... OK Creating node worker2 ... ID: 300ad5ff2e9476c3ba4ff69260afb234 Adding device /dev/loop0 ... OK Creating node worker3 ... ID: 94ca798385c1099c531c8ba3fcc9f061 Adding device /dev/loop0 ... OK
Selanjutnya, kami menggunakan Heketi untuk menyediakan volume untuk menyimpan database. Nama tim agak aneh, tetapi semuanya teratur. Juga buat repositori heketi:
master1:~/heketi-client# heketi-cli setup-openshift-heketi-storage master1:~/heketi-client# kubectl --kubeconfig /etc/kubernetes/admin.conf create -f heketi-storage.json secret/heketi-storage-secret created endpoints/heketi-storage-endpoints created service/heketi-storage-endpoints created job.batch/heketi-storage-copy-job created
Ini semua adalah perintah yang perlu Anda jalankan dari master node. Mari kita kembali ke node kontrol dan melanjutkan dari sana; Pertama-tama, pastikan bahwa perintah yang terakhir dijalankan berhasil dijalankan:
control# kubectl get pod NAME READY STATUS RESTARTS AGE glusterfs-5dtdj 1/1 Running 0 39h glusterfs-hzdll 1/1 Running 0 39h glusterfs-p8r59 1/1 Running 0 39h heketi-storage-copy-job-txkql 0/1 Completed 0 69s
Dan pekerjaan heketi-storage-copy-job selesai.
Jika saat ini tidak ada paket klien-glusterfs yang diinstal yang diinstal pada node kerja Anda, maka kesalahan terjadi.
Saatnya untuk menghapus file instalasi Heketi Bootstrap dan melakukan sedikit pembersihan:
control# kubectl delete all,service,jobs,deployment,secret --selector="deploy-heketi"
Pada tahap terakhir, kita perlu membuat salinan Heketi jangka panjang:
control# cd ./heketi/extras/kubernetes control:~/heketi/extras/kubernetes# kubectl create -f heketi-deployment.json secret/heketi-db-backup created service/heketi created deployment.extensions/heketi created control# kubectl get pod NAME READY STATUS RESTARTS AGE glusterfs-5dtdj 1/1 Running 0 39h glusterfs-hzdll 1/1 Running 0 39h glusterfs-p8r59 1/1 Running 0 39h heketi-b8c5f6554-knp7t 1/1 Running 0 22m
Jika saat ini tidak ada paket klien-glusterfs yang diinstal yang diinstal pada node kerja Anda, maka kesalahan terjadi. Dan kita hampir selesai, sekarang basis data Heketi disimpan dalam volume GlusterFS dan tidak diatur ulang setiap kali perapian Heketi dihidupkan ulang.
Untuk mulai menggunakan cluster GlusterFS dengan alokasi sumber daya dinamis, kita perlu membuat StorageClass.
Pertama, mari kita temukan titik akhir penyimpanan Gluster, yang akan diteruskan ke StorageClass sebagai parameter (heketi-storage-endpoints):
control# kubectl get endpoints NAME ENDPOINTS AGE heketi 10.42.0.2:8080 2d16h ....... ... ..
Sekarang buat beberapa file:
control# vi storage-class.yml apiVersion: storage.k8s.io/v1beta1 kind: StorageClass metadata: name: slow provisioner: kubernetes.io/glusterfs parameters: resturl: "http://10.42.0.2:8080" control# vi test-pvc.yml kind: PersistentVolumeClaim apiVersion: v1 metadata: name: gluster1 annotations: volume.beta.kubernetes.io/storage-class: "slow" spec: accessModes: - ReadWriteOnce resources: requests: storage: 1Gi
Gunakan file-file ini untuk membuat kelas dan pvc:
control# kubectl create -f storage-class.yaml storageclass "slow" created control# kubectl get storageclass NAME PROVISIONER AGE slow kubernetes.io/glusterfs 2d8h control# kubectl create -f test-pvc.yaml persistentvolumeclaim "gluster1" created control# kubectl get pvc NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE gluster1 Bound pvc-27f733cd-1c77-11e9-bb07-7efe6b0e6fa5 1Gi RWO slow 2d8h
Kami juga dapat melihat volume PV:
control# kubectl get pv NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE pvc-27f733cd-1c77-11e9-bb07-7efe6b0e6fa5 1Gi RWO Delete Bound default/gluster1 slow 2d8h
Kami sekarang memiliki volume GlusterFS yang dibuat secara dinamis terkait dengan PersistentVolumeClaim , dan kami dapat menggunakan pernyataan ini di subplot apa pun.
Buat yang sederhana di bawah Nginx dan mengujinya:
control# vi nginx-test.yml apiVersion: v1 kind: Pod metadata: name: nginx-pod1 labels: name: nginx-pod1 spec: containers: - name: nginx-pod1 image: gcr.io/google_containers/nginx-slim:0.8 ports: - name: web containerPort: 80 volumeMounts: - name: gluster-vol1 mountPath: /usr/share/nginx/html volumes: - name: gluster-vol1 persistentVolumeClaim: claimName: gluster1 control# kubectl create -f nginx-test.yaml pod "nginx-pod1" created
Jelajahi di bawah (tunggu beberapa menit, Anda mungkin perlu mengunduh gambar jika belum ada):
control# kubectl get pods NAME READY STATUS RESTARTS AGE glusterfs-5dtdj 1/1 Running 0 4d10h glusterfs-hzdll 1/1 Running 0 4d10h glusterfs-p8r59 1/1 Running 0 4d10h heketi-b8c5f6554-knp7t 1/1 Running 0 2d18h nginx-pod1 1/1 Running 0 47h
Sekarang masuk ke wadah dan buat file index.html:
control# kubectl exec -ti nginx-pod1 /bin/sh # cd /usr/share/nginx/html # echo 'Hello there from GlusterFS pod !!!' > index.html # ls index.html # exit
Anda perlu menemukan alamat IP internal perapian dan menggulungnya dari simpul master apa pun:
master1# curl 10.40.0.1 Hello there from GlusterFS pod !!!
Dengan demikian, kita cukup menguji volume persisten baru kita.
Beberapa perintah yang berguna untuk memeriksa cluster GlusterFS baru adalah: heketi-cli cluster list
heketi-cli volume list
. Mereka dapat dijalankan di komputer Anda jika heketi-cli diinstal . Dalam contoh ini, ini adalah simpul master1 .
master1# heketi-cli cluster list Clusters: Id:e83467d0074414e3f59d3350a93901ef [file][block] master1# heketi-cli volume list Id:6fdb7fef361c82154a94736c8f9aa53e Cluster:e83467d0074414e3f59d3350a93901ef Name:vol_6fdb7fef361c82154a94736c8f9aa53e Id:c6b69bd991b960f314f679afa4ad9644 Cluster:e83467d0074414e3f59d3350a93901ef Name:heketidbstorage
Pada tahap ini, kami berhasil mengatur penyeimbang beban internal dengan penyimpanan file, dan cluster kami sekarang lebih dekat dengan keadaan operasional.
Pada bagian selanjutnya dari artikel ini, kami akan fokus pada pembuatan sistem pemantauan cluster, dan juga meluncurkan proyek uji di dalamnya untuk menggunakan semua sumber daya yang kami konfigurasi.
Tetap berkomunikasi dan semua yang terbaik!