Cluster Kubernetes dalam layanan VPC



Kami telah menambahkan kemampuan untuk meluncurkan Kubernetes dengan nyaman di layanan Virtual Private Cloud dalam mode pengujian beta awal.


Fungsionalitas ini akan berguna bagi pengguna yang membutuhkan manajemen yang mudah dari sejumlah besar aplikasi yang berjalan sebagai wadah. Kubernetes menawarkan alat untuk penskalaan, penyembuhan sendiri, penyeimbangan beban untuk kontainer yang berjalan di dalam sebuah cluster.


Karena layanan Virtual Private Cloud didasarkan pada OpenStack, kami menggunakan salah satu komponennya - OpenStack Magnum . Hal ini memungkinkan Anda untuk dengan cepat membuat cluster Kubernetes pribadi dengan jumlah node yang diinginkan.


Saat ini, setiap pengguna layanan kami dapat membuat beberapa cluster independen dalam proyek mereka. Sebagai node cluster, mesin virtual akan digunakan, konfigurasi yang dapat dipilih dan diubah.


Pada artikel ini, kita akan berbicara tentang objek utama dari cluster Kubernetes dan menggunakan contoh-contoh untuk melihat proses membuat sebuah cluster menggunakan OpenStack Magnum.


Buat dan kelola kluster Kubernetes


Saat ini, pembuatan cluster Kubernetes hanya dimungkinkan melalui utilitas konsol atau API OpenStack di zona ketersediaan ru-1a dan ru-1b (St. Petersburg).


Untuk memulai, Anda perlu:


  • Buat yang baru atau gunakan proyek VPC yang ada;
  • Buat pengguna dengan kunci SSH ;
  • Tambahkan pengguna ke proyek yang dibuat pada halaman manajemen proyek;
  • Pergi ke proyek dan dapatkan file akses pada tab Access ;
  • Instal klien konsol openstack dengan pustaka python-magnumclient ;
  • Instal klien konsol kubectl .

Untuk menginstal klien konsol openstack , Anda dapat menggunakan petunjuk pada tautan , namun, harus diingat bahwa untuk klien ini Anda juga perlu menginstal pustaka python-magnumclient untuk mendukung pembuatan kluster Kubernetes.


Seperangkat perintah lengkap untuk menginstal klien openstack dengan plug-in yang diperlukan untuk sistem operasi keluarga Ubuntu / Debian:


$ sudo apt update $ sudo apt -y install curl python-pip python-dev python3-dev git libxml2-dev libxslt1-dev python-openssl python3-openssl python-pyasn1 libffi-dev libssl-dev build-essential $ sudo pip install -UI pbr setuptools pytz $ sudo pip install -UI git+https://github.com/openstack/python-openstackclient $ sudo pip install -UI git+https://github.com/openstack/python-magnumclient 

Seperangkat perintah lengkap untuk menginstal klien openstack dengan plug-in yang diperlukan untuk sistem operasi keluarga Fedora / CentOS:


 $ sudo yum -y install python-pip gcc libffi-devel python-devel libxslt-devel openssl-devel git libffi-devel $ sudo pip install -UI pbr setuptools pytz $ sudo pip install -UI git+https://github.com/openstack/python-openstackclient $ sudo pip install -UI git+https://github.com/openstack/python-magnumclient 

Untuk mengelola objek Kubernetes, Anda memerlukan klien konsol kubectl . Metode pemasangan untuk berbagai sistem operasi dijelaskan dalam dokumentasi resmi .


Untuk membuat cluster, Anda harus membuat atau menggunakan yang sudah ada:


  • Templat klaster;
  • Seperangkat parameter untuk CPU dan RAM mesin virtual ( rasa ).

Anda bisa membuat templat klaster dan menambahkan rasa sendiri, atau menggunakan templat publik yang dibuat sebelumnya.


Anda juga perlu menentukan zona ketersediaan, jenis disk untuk kluster Anda, dan jumlah node. Perlu mempertimbangkan bahwa di kita belum mendukung kemungkinan membuat satu cluster di beberapa zona. Anda dapat memilih semua jenis drive jaringan (cepat, universal atau dasar).
Anda dapat mempelajari lebih lanjut tentang jenis drive dari basis pengetahuan kami.


Jumlah node dapat berbeda untuk peran master dan untuk minion . Pada node yang menjalankan peran utama, elemen kontrol kluster akan diluncurkan - controller-manager , scheduler , api . Di node lain, kubelet , layanan proxy kubus dan semua wadah aplikasi akan diluncurkan. Anda dapat mempelajari lebih lanjut tentang komponen yang berjalan di node cluster dari dokumentasi resmi .


Untuk mengakses node melalui SSH, Anda harus menggunakan kunci SSH yang dibuat sebelumnya. Perintah sampel akan menggunakan kunci yang disebut uji ssh .


Kami akan menggunakan templat dan citarasa gugusan publik, jenis cakram cepat, dan zona ketersediaan ru-1b .
Di cluster kami, 2 node master dan 3 node minion awalnya akan diluncurkan.


Untuk memverifikasi parameter ini, kami menggunakan perintah openstackclient dan file akses yang diunduh ( rc.sh ):


 #          . $ source rc.sh #  ,         $ openstack flavor show BL1.2-4096 -c ram -c vcpus +-------+-------+ | Field | Value | +-------+-------+ | ram | 4096 | | vcpus | 2 | +-------+-------+ #       ru-1b $ openstack volume type show fast.ru-1b -c name +-------+------------+ | Field | Value | +-------+------------+ | name | fast.ru-1b | +-------+------------+ #    Kubernetes $ openstack coe cluster template list -c name +---------------------------------------+ | name | +---------------------------------------+ | kubernetes-nofloatingips-ru-1b-v1.9.3 | | kubernetes-nofloatingips-ru-1b-v1.9.6 | | kubernetes-nofloatingips-ru-1b-v1.9.9 | | kubernetes-floatingips-ru-1b-v1.9.3 | | kubernetes-floatingips-ru-1b-v1.9.6 | | kubernetes-floatingips-ru-1b-v1.9.9 | | kubernetes-nofloatingips-ru-1a-v1.9.3 | | kubernetes-nofloatingips-ru-1a-v1.9.6 | | kubernetes-nofloatingips-ru-1a-v1.9.9 | | kubernetes-floatingips-ru-1a-v1.9.3 | | kubernetes-floatingips-ru-1a-v1.9.6 | | kubernetes-floatingips-ru-1a-v1.9.9 | +---------------------------------------+ 

Sebagai contoh, kita akan memilih templat klaster kedua, alamat apung yang dapat diakses publik untuk masing-masing simpul tidak akan dibuat darinya. Kami tidak akan membutuhkannya.


 #   Kubernetes   test-cluster #   keypair   ,   $ openstack coe cluster create \ --cluster-template kubernetes-nofloatingips-ru-1b-v1.9.9 \ --master-count 2 \ --node-count 3 \ --keypair ssh-test \ --master-flavor BL1.2-4096 \ --flavor BL1.2-4096 \ test-cluster 

Harap dicatat bahwa kami telah memilih konfigurasi yang sama untuk node yang berbeda (parameter master-flavour dan flavour), Anda dapat memilih set konfigurasi yang berbeda tergantung pada persyaratan cluster. Perubahan mereka mungkin setelah penciptaannya.


Juga patut dipertimbangkan bahwa ketika membuat sebuah cluster dengan beberapa node master, penyeimbang beban akan secara otomatis dibuat untuk mengakses API Kubernetes.


Setelah beberapa menit, kluster Kubernetes akan muncul di proyek Anda. Di panel kontrol proyek, Anda akan melihat mesin virtual, disk, dan objek jaringan.


Anda dapat memeriksa status cluster Anda melalui openstackclient:


 openstack coe cluster list -c name -c status +--------------+--------------------+ | name | status | +--------------+--------------------+ | test-cluster | CREATE_IN_PROGRESS | +--------------+--------------------+ 

Setelah cluster memasuki status CREATE_COMPLETE, Anda dapat mengelola objeknya melalui utilitas kubectl dengan mengunduh file konfigurasi menggunakan perintah berikut:


 $ mkdir -p ~/test-cluster $ openstack coe cluster config test-cluster --dir ~/test-cluster 

Setelah itu, Anda bisa bekerja dengan cluster menggunakan utilitas kubectl:


 $ export KUBECONFIG=~/test-cluster/config $ kubectl get pods --all-namespaces -o=custom-columns=NAME:.metadata.name,STATUS:.status.phase NAME STATUS coredns-785dcf9c58-6gnfp Running heapster-6846cdc674-rm4k6 Running kube-dns-autoscaler-6b94f7bbf8-x5clt Running kubernetes-dashboard-747575c864-wlg6p Running monitoring-grafana-84b4596dd7-zf5rx Running monitoring-influxdb-c8486fc95-bqqb6 Running node-exporter-test-cluster-robvp4cvwpt7-minion-0 Running 

Jika perlu, Anda bisa menambah atau mengurangi jumlah node minion di cluster melalui openstackclient dengan meneruskan nilai node_count baru:


 $ openstack coe cluster update test-cluster replace node_count=4 

Objek Cluster Kubernet Kunci


Polong


Meskipun Kubernetes mengelola satu set wadah, entitas dasar yang dikelola Kubernetes bukanlah wadah, melainkan Pod .


Pod adalah seperangkat ruang nama kernel Linux dan pengaturan tumpukan jaringan yang memungkinkan Anda untuk merakit satu set wadah menjadi satu kesatuan.
Lebih sering daripada tidak, satu wadah dengan aplikasi diluncurkan di dalam satu Pod terpisah.
Jika perlu, Anda dapat menjalankan beberapa kontainer di dalam satu Pod, ini dapat berguna ketika Anda perlu memberikan akses dari satu kontainer ke yang lain melalui antarmuka jaringan localhost, atau karena alasan lain jalankan beberapa kontainer pada host yang sama.
Semua kontainer yang berjalan di Pod yang sama akan memiliki satu nama host, alamat IP, tabel perutean dan disk.


Perlu dicatat bahwa ketika melakukan penskalaan jumlah instance aplikasi Anda di dalam Kubernetes, Anda perlu menambah jumlah Pod, dan bukan jumlah kontainer dalam satu Pod tertentu.
Lebih detail dalam dokumentasi Pods resmi.


Sebagai contoh, mari kita buat Pod paling sederhana dengan Nginx menggunakan deskripsi dalam format yaml:


 # nginx-basic.yaml apiVersion: v1 kind: Pod metadata: name: nginx spec: containers: - name: nginx image: library/nginx:1.14-alpine ports: - containerPort: 80 

Untuk membuat Pod, kita bisa menggunakan utilitas kubectl .
Kami menambahkan semua contoh yang disajikan dalam artikel ke grup Github kami, sehingga Anda tidak dapat membuat file di komputer Anda, tetapi menggunakan url file dari repositori publik:


 $ kubectl create \ -f https://raw.githubusercontent.com/selectel/kubernetes-examples/master/pods/nginx-basic.yaml 

Setelah pembuatan, kami dapat meminta informasi lengkap tentang status Pod menggunakan perintah uraian kubectl:


 $ kubectl describe pod nginx Name: nginx Namespace: default Node: test-cluster-nd5c5y6lsfxb-minion-0/10.0.0.5 Start Time: Sun, 17 Jun 2018 12:29:03 +0000 Labels: <none> Annotations: <none> Status: Running IP: 10.100.88.9 Containers: nginx: Container ID: docker://6ca6383b66686c05c61c1f690737110e0f8994eda393f44a7ebfbbf2b2026267 Image: library/nginx:1.14-alpine Image ID: docker-pullable://docker.io/nginx@sha256:944b79ca7dbe456ce72e73e70816c1990e39967c8f010349a388c00b77ec519c Port: 80/TCP Host Port: 0/TCP State: Running Started: Sun, 17 Jun 2018 12:29:16 +0000 Ready: True Restart Count: 0 Environment: <none> Mounts: /var/run/secrets/kubernetes.io/serviceaccount from default-token-rp5ls (ro) Conditions: Type Status Initialized True Ready True PodScheduled True Volumes: default-token-rp5ls: Type: Secret (a volume populated by a Secret) SecretName: default-token-rp5ls Optional: false QoS Class: BestEffort Node-Selectors: <none> Tolerations: <none> Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Scheduled 52s default-scheduler Successfully assigned nginx to test-cluster-nd5c5y6lsfxb-minion-0 Normal SuccessfulMountVolume 51s kubelet, test-cluster-nd5c5y6lsfxb-minion-0 MountVolume.SetUp succeeded for volume "default-token-rp5ls" Normal Pulling 50s kubelet, test-cluster-nd5c5y6lsfxb-minion-0 pulling image "library/nginx:1.14-alpine" Normal Pulled 39s kubelet, test-cluster-nd5c5y6lsfxb-minion-0 Successfully pulled image "library/nginx:1.14-alpine" Normal Created 39s kubelet, test-cluster-nd5c5y6lsfxb-minion-0 Created container Normal Started 39s kubelet, test-cluster-nd5c5y6lsfxb-minion-0 Started container 

Seperti yang Anda lihat, Pod dimulai pada node bernama test-cluster-nd5c5y6lsfxb-minion-0 dan menerima alamat IP internal 10.100.88.9.


Dari bagian Acara, Anda dapat melihat acara peluncuran utama - memilih simpul untuk meluncurkan dan mengunduh gambar.


Kita dapat masuk ke Pod dan memeriksa status proses di dalam wadah:


 $ kubectl exec -it nginx sh ps aux PID USER TIME COMMAND 1 root 0:00 nginx: master process nginx -g daemon off; 7 nginx 0:00 nginx: worker process 20 root 0:00 sh 24 root 0:00 ps aux exit 

Harus diingat bahwa alamat IP 10.100.88.9 tidak akan tersedia untuk aplikasi lain di dalam dan di luar kelompok Kubernetes, akses ke Nginx yang sedang berjalan hanya akan dimungkinkan dari dalam Pod itu sendiri:


 $ ping -c 1 10.100.88.9 PING 10.100.88.9 (10.100.88.9): 56 data bytes --- 10.100.88.9 ping statistics --- 1 packets transmitted, 0 packets received, 100% packet loss $ kubectl exec nginx -- ping -c1 10.100.88.9 PING 10.100.88.9 (10.100.88.9): 56 data bytes 64 bytes from 10.100.88.9: seq=0 ttl=64 time=0.075 ms --- 10.100.88.9 ping statistics --- 1 packets transmitted, 1 packets received, 0% packet loss round-trip min/avg/max = 0.075/0.075/0.075 ms 

Selain fakta bahwa alamat IP yang ditentukan hanya dapat diakses dari wadah, itu juga tidak permanen. Ini berarti bahwa jika Pod ini dibuat ulang, ia bisa mendapatkan alamat IP yang berbeda.


Untuk mengatasi masalah ini, Anda dapat menggunakan objek yang disebut Layanan.


Layanan


Layanan memungkinkan Anda untuk menetapkan alamat IP permanen untuk Pods, menyediakannya akses dari jaringan eksternal dan menyeimbangkan permintaan antara Pods.
Anda dapat mempelajari lebih lanjut tentang Layanan di dokumentasi resmi .


Misalnya, kita perlu menghapus Pod yang sedang berjalan:


 $ kubectl delete pod nginx 

Tambahkan ke deskripsi label Pod a (Label), yang diperlukan untuk Layanan:


 # nginx-labeled.yaml apiVersion: v1 kind: Pod metadata: name: nginx labels: app: webservice spec: containers: - name: nginx image: library/nginx:1.14-alpine ports: - containerPort: 80 

Kami juga akan memerlukan deskripsi Layanan:


 # nginx-nodeport.yaml apiVersion: v1 kind: Service metadata: name: nginx-nodeport labels: app: webservice spec: type: NodePort ports: - port: 80 nodePort: 30001 protocol: TCP selector: app: webservice 

Buat Pod dan Layanan:


 $ kubectl create \ -f https://raw.githubusercontent.com/selectel/kubernetes-examples/master/pods/nginx-labeled.yaml \ -f https://raw.githubusercontent.com/selectel/kubernetes-examples/master/services/nginx-nodeport.yaml 

Karena Layanan yang dibuat adalah tipe NodePort, maka port 30001 yang ditunjukkan oleh kami pada semua antarmuka jaringan akan dibuka pada semua node cluster.
Ini berarti bahwa jika kita menambahkan alamat IP eksternal ke sembarang simpul, kita dapat mengakses Pod yang sedang berjalan dengan Nginx dari jaringan eksternal.


Agar tidak menggunakan alamat eksternal node cluster untuk mengakses Layanan, kita bisa menggunakan tipe LoadBalancer alih-alih NodePort.
Kami akan membutuhkan deskripsi layanan yang baru:


 # nginx-loadbalancer.yaml apiVersion: v1 kind: Service metadata: name: nginx-loadbalancer labels: app: webservice spec: type: LoadBalancer ports: - port: 80 protocol: TCP selector: app: webservice 

Hapus layanan saat ini dan terapkan deskripsi baru:


 $ kubectl delete service nginx-service $ kubectl create \ -f https://raw.githubusercontent.com/selectel/kubernetes-examples/master/services/nginx-loadbalancer.yaml 

Setelah memulai layanan, Nginx akan tersedia pada port TCP 80 dari jaringan eksternal, dan tidak perlu untuk menetapkan dan menggunakan alamat eksternal untuk node cluster. Layanan tipe LoadBalancer akan secara otomatis mengalokasikan alamat eksternal baru untuk proyek VPC Anda dan mulai menggunakannya.


Anda bisa mendapatkan informasi tentang alamat eksternal yang disorot menggunakan kubectl:


 $ kubectl get service nginx-service -o=custom-columns=IP:status.loadBalancer.ingress[0].ip IP xxx.xxx.xxx.xxx 

Dalam contoh kami, hanya satu Pod yang diluncurkan dengan Nginx. Untuk mengatur skala aplikasi ke lebih banyak Pod, kita bisa menggunakan Penempatan.


Penugasan


Penempatan adalah inti dari kluster Kubernetes, yang memungkinkan Anda untuk menskala Pods dan dengan mudah memperbarui atau memutar kembali versi untuk sejumlah besar Pods.
Alih-alih Penerapan, Anda juga dapat menggunakan objek ReplicaSet, tetapi kami tidak akan menyentuhnya dalam contoh kami.
Anda dapat mempelajari lebih lanjut tentang Penerapan dalam dokumentasi resmi .


Kami lagi perlu menghapus Pod (kami tidak perlu menghapus Layanan):


 $ kubectl delete pod nginx 

Tambahkan deskripsi Penerapan berikut:


 # nginx-1.14.yaml apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment spec: replicas: 10 selector: matchLabels: app: webservice minReadySeconds: 10 strategy: type: RollingUpdate rollingUpdate: maxUnavailable: 1 maxSurge: 1 template: metadata: labels: app: webservice spec: containers: - name: nginx image: library/nginx:1.14-alpine ports: - containerPort: 80 

Buat Penempatan yang ditentukan:


 $ kubectl create -f \ https://raw.githubusercontent.com/selectel/kubernetes-examples/master/deployments/nginx-1.14.yaml 

Kami memilih 10 untuk parameter replika, jadi 10 Pods dengan aplikasi Nginx akan dibuat di cluster kami:


 $ kubectl get pods --selector app=webservice NAME READY STATUS RESTARTS AGE nginx-deployment-54bfdc4489-42rrb 1/1 Running 0 4m nginx-deployment-54bfdc4489-5lvtc 1/1 Running 0 4m nginx-deployment-54bfdc4489-g7rk2 1/1 Running 0 4m nginx-deployment-54bfdc4489-h5rxp 1/1 Running 0 4m nginx-deployment-54bfdc4489-l9l2d 1/1 Running 0 4m nginx-deployment-54bfdc4489-pjpvg 1/1 Running 0 4m nginx-deployment-54bfdc4489-q8dnp 1/1 Running 0 4m nginx-deployment-54bfdc4489-s4wzf 1/1 Running 0 4m nginx-deployment-54bfdc4489-tfxf9 1/1 Running 0 4m nginx-deployment-54bfdc4489-xjzb5 1/1 Running 0 4m 

Anda dapat mengakses aplikasi yang sedang berjalan dari jaringan eksternal menggunakan Layanan yang dibuat di bagian sebelumnya. Layanan akan secara otomatis menyeimbangkan permintaan dari jaringan eksternal antara 10 instance Nginx.


Jika perlu, kami dapat memperbarui versi Nginx. Perbarui deskripsi Penerapan dengan mengubah versi gambar dari 1,14-alpine ke 1,15-alpine:


 # nginx-1.15.yaml apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment spec: replicas: 10 selector: matchLabels: app: webservice minReadySeconds: 10 strategy: type: RollingUpdate rollingUpdate: maxUnavailable: 1 maxSurge: 1 template: metadata: labels: app: webservice spec: containers: - name: nginx image: library/nginx:1.15-alpine # <-- changed ports: - containerPort: 80 

Untuk memulai proses memperbarui Pod, kami menggunakan perintah kubectl. Perhatikan argumen --record, ini berguna bagi kita untuk kemunduran nyaman berikutnya dari versi Nginx:


 $ kubectl apply -f \ https://raw.githubusercontent.com/selectel/kubernetes-examples/master/deployments/nginx-1.15.yaml \ --record 

Anda dapat memantau kemajuan pembaruan menggunakan perintah berikut:


 $ kubectl rollout status deployment nginx-deployment Waiting for rollout to finish: 4 out of 10 new replicas have been updated... 

Kubernetes akan menunggu 10 detik setelah pembaruan yang berhasil dari satu Pod, karena kami menetapkan nilai 10 untuk parameter minReadySeconds dalam deskripsi Penerapan.


Setelah pembaruan selesai, semua Pods for Deployment akan masuk ke status aktif:


 $ kubectl get deployment --selector app=webservice NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE nginx-deployment 10 10 10 10 23m 

Kita dapat memutar kembali versi aplikasi jika terjadi kesalahan. Untuk melakukan ini, kita perlu memilih revisi Penempatan yang diinginkan:


 $ kubectl rollout history deployment nginx-deployment deployments "nginx-deployment" REVISION CHANGE-CAUSE 1 <none> 2 kubectl apply --filename=https://raw.githubusercontent.com/selectel/kubernetes-examples/master/deployments/nginx-1.15.yaml --record=true 

Ada 2 revisi dalam output perintah - yang pertama adalah penciptaan Penerapan asli, yang kedua adalah pembaruan. Karena kami menggunakan argumen --record saat memperbarui, kami melihat perintah yang membuat revisi kedua Penerapan.


Untuk memutar kembali versi, gunakan perintah berikut:


 $ kubectl rollout undo deployment nginx-deployment --to-revision=1 

Demikian pula dengan pembaruan, kita dapat memantau kemunduran versi menggunakan perintah:


 $ kubectl rollout status deployment nginx-deployment Waiting for rollout to finish: 6 out of 10 new replicas have been updated… 

Dalam semua contoh kami, kami menggunakan wadah tanpa penyimpanan data yang persisten. Di bagian selanjutnya kita akan memperbaikinya.


Penyimpanan data


Secara default, semua data dari kontainer yang berjalan di dalam Pods bersifat sementara dan akan hilang ketika Pods crash.


Anda bisa menggunakan objek PersistentVolumeClaim untuk menjalankan Pods dengan gudang data yang persisten.


Membuat objek seperti itu di cluster sangat sederhana - cukup tambahkan deskripsinya, mirip dengan cara kami membuat Pod, Layanan, atau Penempatan di bagian sebelumnya.


Informasi lebih lanjut dapat ditemukan di dokumentasi resmi .


Contoh deskripsi PersistentVolumeClaim membuat disk 10GB:


 apiVersion: v1 kind: PersistentVolumeClaim metadata: name: my-pv-claim spec: accessModes: - ReadWriteOnce resources: requests: storage: 10Gi 

Kita dapat menghubungkannya sebagai disk ke Pod kami dengan memperbarui deskripsi Pod dengan Nginx yang dibuat sebelumnya:


 # nginx-with-volume.yaml apiVersion: v1 kind: Pod metadata: name: nginx spec: containers: - name: nginx image: library/nginx:1.14-alpine ports: - containerPort: 80 volumeMounts: - mountPath: "/var/www/html" name: data volumes: - name: data persistentVolumeClaim: claimName: my-pv-claim 

Namun, agar disk dapat dibuat, Anda harus menentukan properti disk yang dibuat dalam bentuk StorageClass. Dalam layanan "Virtual Private Cloud", Anda dapat menggunakan drive jaringan tipe cepat, universal, dan dasar sebagai penyimpanan permanen data Pod Kubernetes.


Misalnya, untuk membuat StorageClass yang memungkinkan Anda untuk menggunakan disk cepat di zona ketersediaan ru-1b, Anda memerlukan deskripsi berikut:


 # fast.ru-1b.yaml kind: StorageClass apiVersion: storage.k8s.io/v1 metadata: name: fast.ru-1b annotations: storageclass.beta.kubernetes.io/is-default-class: "true" provisioner: kubernetes.io/cinder parameters: type: fast.ru-1b availability: ru-1b 

Sebelum membuat objek yang ditentukan, hapus Penempatan yang dibuat sebelumnya:


 $ kubectl delete deployment nginx-deployment 

Pertama-tama, mari kita buat StorageClass, jadi itu akan menjadi kelas default, dan PersistentVolumeClaim yang dibuat nanti akan menggunakannya:


 $ kubectl create -f \ https://raw.githubusercontent.com/selectel/kubernetes-examples/master/storageclasses/fast.ru-1b.yaml 

Buat PersistentVolumeClaim dan Pod:


 $ kubectl create \ -f https://raw.githubusercontent.com/selectel/kubernetes-examples/master/persistentvolumeclaims/my-pv-claim.yaml \ -f https://raw.githubusercontent.com/selectel/kubernetes-examples/master/pods/nginx-with-volume.yaml 

Setelah itu, disk akan secara otomatis dibuat di proyek Anda yang akan terhubung ke salah satu node minion dari cluster. Ketika jatuh, disk akan secara otomatis beralih ke node lain.


Kita dapat melihat disk di dalam wadah dengan Nginx:


 $ kubectl exec -it nginx sh mount | grep "/var/www/html" /dev/sdc on /var/www/html type ext4 (rw,seclabel,relatime,data=ordered) exit 

Anda dapat menghubungkan drive ke Deployment. Contoh yang sesuai dapat ditemukan dalam dokumentasi resmi .


Panel Kontrol Kubernetes


Anda bisa menggunakan dasbor bawaan Kubernetes itu sendiri untuk melihat status objek cluster dan manajemennya.


Untuk mengakses semua fitur panel, Anda harus membuat akun dengan peran administrator di cluster Anda.


Untuk melakukan ini, kami memerlukan deskripsi akun:


 # admin-user.yaml apiVersion: v1 kind: ServiceAccount metadata: name: admin-user namespace: kube-system 

Dan deskripsi peran:


 # cluster-admin.yaml apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: admin-user roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: cluster-admin subjects: - kind: ServiceAccount name: admin-user namespace: kube-system 

Buat objek yang ditentukan:


 $ kubectl create \ -f https://raw.githubusercontent.com/selectel/kubernetes-examples/master/accounts/admin-user.yaml \ -f https://raw.githubusercontent.com/selectel/kubernetes-examples/master/clusterrolebindings/cluster-admin.yaml 

Selanjutnya, Anda perlu mengetahui nilai token yang dihasilkan untuk akun ini.
Untuk melakukan ini, temukan objek Rahasia yang sesuai di kluster:


 $ kubectl get secret --namespace=kube-system | grep "admin-user-token" admin-user-token-bkfhb kubernetes.io/service-account-token 3 22m 

Dan lihat nilai token dari Secret yang ditemukan dengan nama admin-user-token-bkfhb:


 $ kubectl describe secret admin-user-token-bkfhb --namespace=kube-system | grep "token:" token: XXXXXX... 

Sebagai tanggapan, Anda akan menerima nilai token, simpan, itu akan berguna bagi kami di masa depan.
Untuk detail kontrol akses untuk objek Kubernetes, lihat dokumentasi resmi .


Jika Anda membuat kluster dari templat publik, Pod dan Layanan sudah ada di dalamnya untuk memastikan pengoperasian panel:


 $ kubectl get svc kubernetes-dashboard --namespace=kube-system 206ms Tue Jun 19 14:35:19 2018 NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes-dashboard ClusterIP 10.254.122.245 <none> 443/TCP 2d $ kubectl get pod --namespace=kube-system --selector k8s-app=kubernetes-dashboard 119ms Tue Jun 19 14:36:48 2018 NAME READY STATUS RESTARTS AGE kubernetes-dashboard-747575c864-jpxvt 1/1 Running 0 2d 

Karena Layanan adalah dari jenis ClusterIP, itu akan tersedia hanya dari dalam cluster itu sendiri.
Anda dapat mengakses panel dari komputer Anda yang bekerja dengan file konfigurasi cluster menggunakan perintah kubectl:


 $ kubectl proxy Starting to serve on 127.0.0.1:8001 

Uji proxy dengan membuka alamat yang ditentukan di browser:



Jika Anda melihat jawaban yang mirip dengan tangkapan layar, maka Anda dapat pergi ke layar panel kontrol menggunakan alamat berikut:


 http://127.0.0.1:8001/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/ 

Melihat itu, Anda akan melihat layar login di panel:



Anda harus menentukan token yang diterima sebelumnya. Setelah masuk, Anda dapat menggunakan panel kontrol:



Anda dapat mengetahui tentang semua fitur panel kontrol dalam dokumentasi resmi .


Memantau Objek Kubernetes


Jika Anda menggunakan templat klaster publik, Anda akan secara otomatis menjalankan komponen untuk mengumpulkan dan menampilkan metrik - Prometheus dan Grafana.


Mirip dengan panel kontrol, ClusterIP diinstal sebagai tipe Layanan, akses ke sana hanya mungkin dari dalam cluster atau melalui proxy kubectl. Anda dapat mengakses Grafana dari komputer kerja Anda di alamat berikut:


 http://127.0.0.1:8001/api/v1/proxy/namespaces/kube-system/services/monitoring-grafana:80 


Kesimpulan


Pada artikel ini, kami memeriksa objek Kubernetes yang paling umum digunakan dan melihat contoh memulai dan mengelola cluster menggunakan OpenStack Magnum.


Dalam waktu dekat, dimungkinkan untuk menggunakan rilis Kubernet terbaru, dan manajemen klaster akan tersedia melalui panel kontrol .


Kami akan senang jika Anda menggunakan layanan kami dalam mode pengujian dan memberikan umpan balik.

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


All Articles