Kami sedang mengembangkan lingkungan untuk bekerja dengan layanan microser. Bagian 1 menginstal Kubernetes HA pada bare metal (Debian)


Halo para pembaca Habr!


Dengan publikasi ini, saya ingin memulai serangkaian artikel tentang penggelaran lingkungan orkestrasi penuh dengan wadah Kubernetes, yang akan siap untuk operasi dan meluncurkan aplikasi.
Saya ingin memberi tahu tidak hanya tentang cara menggunakan kluster Kubernetes, tetapi juga tentang cara mengkonfigurasi kluster setelah instalasi, cara menambahkan alat yang mudah digunakan dan add-on untuk menggunakan arsitektur microservice.


Siklus ini terdiri dari minimal empat artikel:


  1. Pada yang pertama dari mereka saya akan memberitahu Anda cara menginstal cluster kubernet gagal-aman pada besi kosong, cara menginstal dasbor standar dan mengkonfigurasi akses ke sana, cara menginstal pengendali masuknya.
  2. Pada artikel kedua, saya akan menunjukkan kepada Anda cara menggunakan cluster failover Ceph dan cara mulai menggunakan volume RBD di cluster Kubernetes kami. Saya juga akan sedikit menyentuh jenis penyimpanan lain (penyimpanan) dan mempertimbangkan penyimpanan lokal secara lebih rinci. Selain itu, saya akan memberi tahu Anda bagaimana mengatur penyimpanan S3 yang toleran terhadap kesalahan berdasarkan pada cluster CEPH yang dibuat
  3. Pada artikel ketiga, saya akan menjelaskan cara menggunakan MySql cluster failover di cluster Kubernetes kami, yaitu, Percona XtraDB Cluster di Kubernetes. Dan juga saya akan menjelaskan semua masalah yang kami temui ketika kami memutuskan untuk mentransfer database ke kubernetes.
  4. Pada artikel keempat, saya akan mencoba menyatukan semuanya dan memberi tahu cara menggunakan dan menjalankan aplikasi yang akan menggunakan basis data dan volume ceph. Saya akan memberi tahu Anda cara mengkonfigurasi pengendali masuknya untuk mengakses aplikasi kami dari luar dan layanan pemesanan sertifikat otomatis dari Let's Encrypt. Cara lain adalah cara mempertahankan sertifikat ini secara otomatis. Kami juga akan menyentuh RBAC dalam konteks akses ke panel kontrol. Saya akan memberi tahu Anda secara singkat tentang Helm dan pemasangannya.
    Jika Anda tertarik dengan informasi dalam publikasi ini, selamat datang!

Entri:


Untuk siapa artikel ini? Pertama-tama, bagi mereka yang baru memulai perjalanan mereka dalam mempelajari Kubernet. Juga, siklus ini akan bermanfaat bagi insinyur yang berpikir untuk pindah dari monolit ke layanan mikro. Semuanya dijelaskan adalah pengalaman saya, termasuk yang diperoleh ketika menerjemahkan beberapa proyek dari monolit ke Kubernetes. Ada kemungkinan bahwa beberapa bagian dari publikasi akan menarik bagi insinyur yang berpengalaman.


Yang tidak akan saya pertimbangkan secara rinci dalam seri publikasi ini:


  • menjelaskan secara terperinci apa primitif kubernetes, seperti: pod, penyebaran, layanan, masuknya barang, dll.
  • Saya akan menganggap CNI (Container Networking Interface) sangat dangkal, kami menggunakan callico karena itu solusi lain, saya hanya akan mendaftar.
  • proses pembuatan gambar buruh pelabuhan.
  • Proses CI \ CD. (Mungkin publikasi terpisah, tetapi setelah seluruh siklus)
  • helm; cukup banyak yang telah ditulis tentang dia, saya hanya akan menyentuh pada proses menginstalnya di cluster dan mengatur klien.

Apa yang ingin saya pertimbangkan secara rinci:


  • Proses penyebaran cluster Kubernetes langkah demi langkah. Saya akan menggunakan kubeadm. Tetapi pada saat yang sama, saya akan mengambil langkah-demi-langkah rinci pada proses menginstal cluster pada logam kosong, berbagai jenis instalasi ETCD, dan mengkonfigurasi file untuk kube admina. Saya akan mencoba mengklarifikasi semua opsi penyeimbang untuk pengontrol Ingress dan perbedaan dalam berbagai skema akses worknodes ke server api.
    Saya tahu bahwa hari ini ada banyak alat hebat untuk menyebarkan kubernet, misalnya kubespray atau peternak yang sama. Mungkin akan lebih nyaman bagi seseorang untuk menggunakannya. Tapi, saya pikir, ada banyak insinyur yang ingin mempertimbangkan masalah ini secara lebih rinci.
  • Terminologi CEPH dan pemasangan langkah-demi-langkah klaster CEPH, serta petunjuk langkah-demi-langkah tentang menghubungkan penyimpanan ceph ke kluster yang dibuat oleh Kubernetes.
  • penyimpanan lokal, koneksi ke cluster kubernetes, serta perbedaan dari koneksi seperti hostpath, dll.
  • kubernetes operator dan penyebaran Percona XtraDB Cluster dengan bantuan operator, serta mencoba untuk berbicara tentang pro dan kontra dari solusi seperti itu setelah enam bulan pengalaman dalam produksi. Dan juga saya akan membagikan sedikit rencana untuk menyelesaikan operator dari percona.

Daftar isi:


  1. Daftar host, sumber daya host, OS dan versi perangkat lunak
  2. Kubernetes cluster diagram HA
  3. Sebelum Anda mulai atau sebelum Anda mulai
  4. Isi file create-config.sh
  5. Pembaruan kernel OS
  6. Mempersiapkan Node Memasang Kubelet, Kubectl, Kubeadm, dan Docker
  7. Menginstal ETCD (berbagai opsi)
  8. Meluncurkan wisaya kubernet pertama
  9. Instalasi Callico CNI
  10. Peluncuran penyihir kubernetes kedua dan ketiga
  11. Tambahkan node pekerja ke cluster
  12. Instal haproxy pada node pekerja untuk HA
  13. Menginstal Ingress Controller
  14. Pasang UI Web (Dasbor)


Daftar dan tujuan host


Semua node dari kluster saya akan ditempatkan pada mesin virtual dengan sistem peregangan Debian 9 yang sudah diinstal dengan kernel 4.19.0-0.bpo.5-amd64. Untuk virtualisasi, saya menggunakan Proxmox VE.


Tabel VM dan karakteristik kinerjanya:


NamaAlamat IPKomentarCPUNonaDISK1DISK2
master0110.73.71.25master node4vcpu4gbHDD---
master0210.73.71.26master node4vcpu4gbHDD---
master0310.73.71.27master node4vcpu4gbHDD---
worknode0110.73.75.241simpul kerja4vcpu4gbHDDSSD
worknode0210.73.75.242simpul kerja4vcpu4gbHDDSSD
worknode0310.73.75.243simpul kerja4vcpu4gbHDDSSD

Tidak perlu bahwa Anda harus memiliki konfigurasi mesin seperti itu, tetapi tetap saya menyarankan Anda untuk mematuhi rekomendasi dari dokumentasi resmi , dan untuk master, tingkatkan jumlah RAM minimal 4GB. Ke depan, saya akan mengatakan bahwa dengan jumlah yang lebih kecil, saya menangkap gangguan dalam karya CNI Callico
Ceph juga cukup lincah dalam hal kinerja memori dan disk.
Instalasi produksi kami berfungsi tanpa virtualisasi bare-metal, tapi saya tahu banyak contoh di mana mesin virtual dengan sumber daya yang cukup sudah cukup. Itu semua tergantung pada kebutuhan dan beban kerja Anda.


Daftar dan versi perangkat lunak


NamaVersi
Kubernetes1.15.1
Docker19.3.1

Mulai dari versi 1.14, Kubeadm berhenti mendukung versi API v1alpha3 dan sepenuhnya beralih ke versi API v1beta1, yang akan didukungnya dalam waktu dekat, jadi dalam artikel ini saya hanya akan berbicara tentang v1beta1.
Jadi, kami yakin Anda telah menyiapkan mesin untuk cluster kubernetes. Mereka semua dapat diakses satu sama lain melalui jaringan, memiliki "koneksi Internet" ke Internet, dan sistem operasi "bersih" diinstal pada mereka.
Untuk setiap langkah instalasi, saya akan mengklarifikasi pada mesin mana perintah atau blok perintah dijalankan. Jalankan semua perintah sebagai root, kecuali ditentukan lain.
Semua file konfigurasi, serta skrip untuk persiapannya, tersedia untuk diunduh di github saya
Jadi mari kita mulai.



Kubernetes cluster diagram HA



Diagram perkiraan cluster HA. Seniman dari saya ini begitu-begitu, jujur, tetapi saya akan mencoba untuk menjelaskan secara singkat dan cukup sederhana, tanpa secara khusus menggali teori.
Jadi, cluster kami akan terdiri dari tiga node master dan tiga node pekerja. Pada setiap simpul utama kubernetes, dlld (panah hijau pada diagram) dan bagian layanan kubernetes akan bekerja untuk kita; sebut saja mereka secara umum - kubeapi.
Melalui cluster master etcd, node bertukar status cluster kubernet. Saya akan menunjukkan alamat yang sama dengan titik masuk pengendali masuk untuk lalu lintas eksternal (panah merah pada diagram)
Pada node pekerja, kubelet bekerja untuk kita, yang berkomunikasi dengan server api kubernetes melalui haproxy yang diinstal secara lokal pada setiap node pekerja. Sebagai alamat server api untuk kubelet, saya akan menggunakan localhost 127.0.0.1:6443, dan haproxy pada roundrobin akan menyebarkan permintaan pada tiga node master, juga akan memeriksa ketersediaan node master. Skema ini akan memungkinkan kita untuk membuat HA, dan jika terjadi kegagalan salah satu node master, node pekerja akan diam-diam mengirim permintaan ke dua node master yang tersisa.



Sebelum Anda mulai


Sebelum mulai bekerja pada setiap node cluster, kami akan menyediakan paket-paket yang kami perlukan untuk bekerja:


apt-get update && apt-get install -y curl apt-transport-https git 

Pada node master, salin repositori dengan templat config


 sudo -i git clone https://github.com/rjeka/kubernetes-ceph-percona.git 

Periksa bahwa alamat ip host pada penyihir cocok dengan yang di mana server kubernetes akan mendengarkan


 hostname && hostname -i master01 10.73.71.25 

dan untuk semua node master.


Pastikan untuk menonaktifkan SWAP, jika tidak kubeadm akan menimbulkan kesalahan


 [ERROR Swap]: running with swap on is not supported. Please disable swap 

Anda dapat menonaktifkan perintah


 swapoff -a 

Ingatlah untuk berkomentar di / etc / fstab



Isi file create-config.sh


Untuk secara otomatis mengisi konfigurasi yang diperlukan untuk menginstal cluster kubernetes, saya mengunggah skrip kecil create-config.sh. Anda harus mengisinya secara harfiah 8 baris. Tunjukkan alamat IP dan nama host tuan Anda. Dan juga tentukan etcd tocken, Anda tidak dapat mengubahnya. Saya akan memberikan di bawah bagian skrip di mana Anda perlu melakukan perubahan.


 #!/bin/bash ####################################### # all masters settings below must be same ####################################### # master01 ip address export K8SHA_IP1=10.73.71.25 # master02 ip address export K8SHA_IP2=10.73.71.26 # master03 ip address export K8SHA_IP3=10.73.71.27 # master01 hostname export K8SHA_HOSTNAME1=master01 # master02 hostname export K8SHA_HOSTNAME2=master02 # master03 hostname export K8SHA_HOSTNAME3=master03 #etcd tocken: export ETCD_TOKEN=9489bf67bdfe1b3ae077d6fd9e7efefd #etcd version export ETCD_VERSION="v3.3.10" 


Pembaruan kernel OS


Langkah ini opsional, karena kernel perlu diperbarui dari port belakang, dan Anda melakukan ini atas risiko dan risiko Anda sendiri. Mungkin Anda tidak akan pernah menghadapi masalah ini, dan jika Anda melakukannya, Anda dapat memperbarui kernel bahkan setelah menggunakan kubernet. Secara umum, Anda memutuskan.
Pembaruan kernel diperlukan untuk memperbaiki bug buruh pelabuhan yang lama, yang diperbaiki hanya di kernel linux versi 4.18. Anda dapat membaca lebih lanjut tentang bug ini di sini . Sebuah bug diekspresikan dalam antarmuka jaringan periodik pada node kubernetes dengan kesalahan:


 waiting for eth0 to become free. Usage count = 1 

Setelah menginstal OS, saya memiliki versi kernel 4.9


 uname -a Linux master01 4.9.0-7-amd64 #1 SMP Debian 4.9.110-3+deb9u2 (2018-08-13) x86_64 GNU/Linux 

Pada setiap mesin untuk kubernet kita jalankan
Langkah # 1
Tambahkan port kembali ke daftar sumber


 echo deb http://ftp.debian.org/debian stretch-backports main > /etc/apt/sources.list apt-get update apt-cache policy linux-compiler-gcc-6-x86 

Langkah nomor 2
Instalasi Paket


 apt install -y -t stretch-backports linux-image-amd64 linux-headers-amd64 

Langkah nomor 3
Mulai ulang


 reboot 

Periksa apakah semuanya baik-baik saja


 uname -a Linux master01 4.19.0-0.bpo.5-amd64 #1 SMP Debian 4.19.37-4~bpo9+1 (2019-06-19) x86_64 GNU/Linux 


Mempersiapkan Node Memasang Kubelet, Kubectl, Kubeadm, dan Docker


Instal Kubelet, Kubectl, Kubeadm


Kami memakai semua node cluster, sesuai dengan dokumentasi kubernetes


 apt-get update && apt-get install -y apt-transport-https curl curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add - cat <<EOF >/etc/apt/sources.list.d/kubernetes.list deb https://apt.kubernetes.io/ kubernetes-xenial main EOF apt-get update apt-get install -y kubelet kubeadm kubectl apt-mark hold kubelet kubeadm kubectl 

Instal Docker


Instal buruh pelabuhan sesuai dengan instruksi dari dokumentasi


 apt-get remove docker docker-engine docker.io containerd runc apt-get install apt-transport-https ca-certificates curl gnupg2 software-properties-common 

 curl -fsSL https://download.docker.com/linux/debian/gpg | apt-key add - apt-key fingerprint 0EBFCD88 

 add-apt-repository \ "deb [arch=amd64] https://download.docker.com/linux/debian \ $(lsb_release -cs) \ stable" 

 apt-get update apt-get install docker-ce docker-ce-cli containerd.io 

Instalasi Menginstal Kubelet, Kubectl, Kubeadm dan buruh pelabuhan menggunakan mungkin
 git clone https://github.com/rjeka/kubernetes-ceph-percona.git cd kubernetes-ceph-percona/playbooks vim masters.ini 

Di grup master, daftarkan master ip.
Dalam kelompok pekerja, tuliskan ip dari simpul yang berfungsi.


 # sudo c  ansible-playbook -i hosts.ini kubelet.yaml -K ansible-playbook -i hosts.ini docker.yaml -K # sudo  ansible-playbook -i hosts.ini kubelet.yaml ansible-playbook -i hosts.ini docker.yaml 

Jika karena alasan tertentu Anda tidak ingin menggunakan buruh pelabuhan, Anda dapat menggunakan CRI apa pun. Anda dapat membacanya, misalnya di sini , tetapi topik ini berada di luar cakupan artikel ini.



Instalasi ETCD


Saya tidak akan masuk jauh ke dalam teori, singkatnya: etcd adalah penyimpanan nilai kunci didistribusikan open source. etcd ditulis dalam GO dan digunakan di kubernetes pada kenyataannya, sebagai basis data untuk menyimpan status cluster. Untuk ulasan yang lebih rinci, lihat dokumentasi kubernetes .
etcd dapat diinstal dengan berbagai cara. Anda dapat menginstalnya secara lokal dan menjalankannya sebagai daemon, Anda dapat menjalankannya dalam wadah buruh pelabuhan, Anda dapat menginstalnya bahkan sebagai bagian bawah kubernetes. Anda dapat menginstalnya dengan tangan, atau Anda dapat menginstalnya menggunakan kubeadm (saya belum mencoba metode ini). Dapat diinstal pada mesin cluster atau server individual.
Saya akan menginstal etcd secara lokal pada node master dan dijalankan sebagai daemon melalui systemd, serta mempertimbangkan untuk menginstal di docker. Saya menggunakan etcd tanpa TLS, jika Anda memerlukan TLS lihat dokumentasi etcd atau kubernetes itu sendiri
Juga di github saya akan dimungkinkan-playbook untuk menginstal dll dengan peluncuran melalui systemd.


Opsi nomor 1
Instal secara lokal, jalankan melalui systemd


Pada semua master: (pada node cluster yang berfungsi, langkah ini tidak perlu)
Langkah # 1
Unduh dan buka arsipnya dengan etcd:


 mkdir archives cd archives export etcdVersion=v3.3.10 wget https://github.com/coreos/etcd/releases/download/$etcdVersion/etcd-$etcdVersion-linux-amd64.tar.gz tar -xvf etcd-$etcdVersion-linux-amd64.tar.gz -C /usr/local/bin/ --strip-components=1 

Langkah nomor 2
Buat file konfigurasi untuk ETCD


 cd .. ./create-config.sh etcd 

Script menerima nilai etcd sebagai input, dan menghasilkan file config di direktori etcd. Setelah skrip berjalan, file konfigurasi yang sudah selesai akan ditemukan di direktori etcd.
Untuk semua konfigurasi lainnya, skrip bekerja dengan prinsip yang sama. Dibutuhkan beberapa input dan membuat konfigurasi di direktori tertentu.


Langkah nomor 3
Kami memulai gugus etcd dan memeriksa kinerjanya


 systemctl start etcd 

Memeriksa kinerja daemon


 systemctl status etcd ● etcd.service - etcd Loaded: loaded (/etc/systemd/system/etcd.service; disabled; vendor preset: enabled) Active: active (running) since Sun 2019-07-07 02:34:28 MSK; 4min 46s ago Docs: https://github.com/coreos/etcd Main PID: 7471 (etcd) Tasks: 14 (limit: 4915) CGroup: /system.slice/etcd.service └─7471 /usr/local/bin/etcd --name master01 --data-dir /var/lib/etcd --listen-client-urls http://0.0.0.0:2379,http://0.0.0.0:4001 --advertise-client-urls http://10.73.71.25:2379,http://10.73.71. Jul 07 02:34:28 master01 etcd[7471]: b11e73358a31b109 [logterm: 1, index: 3, vote: 0] cast MsgVote for f67dd9aaa8a44ab9 [logterm: 2, index: 5] at term 554 Jul 07 02:34:28 master01 etcd[7471]: raft.node: b11e73358a31b109 elected leader f67dd9aaa8a44ab9 at term 554 Jul 07 02:34:28 master01 etcd[7471]: published {Name:master01 ClientURLs:[http://10.73.71.25:2379 http://10.73.71.25:4001]} to cluster d0979b2e7159c1e6 Jul 07 02:34:28 master01 etcd[7471]: ready to serve client requests Jul 07 02:34:28 master01 etcd[7471]: serving insecure client requests on [::]:4001, this is strongly discouraged! Jul 07 02:34:28 master01 systemd[1]: Started etcd. Jul 07 02:34:28 master01 etcd[7471]: ready to serve client requests Jul 07 02:34:28 master01 etcd[7471]: serving insecure client requests on [::]:2379, this is strongly discouraged! Jul 07 02:34:28 master01 etcd[7471]: set the initial cluster version to 3.3 Jul 07 02:34:28 master01 etcd[7471]: enabled capabilities for version 3.3 lines 1-19 

Dan kesehatan cluster itu sendiri:


 etcdctl cluster-health member 61db137992290fc is healthy: got healthy result from http://10.73.71.27:2379 member b11e73358a31b109 is healthy: got healthy result from http://10.73.71.25:2379 member f67dd9aaa8a44ab9 is healthy: got healthy result from http://10.73.71.26:2379 cluster is healthy etcdctl member list 61db137992290fc: name=master03 peerURLs=http://10.73.71.27:2380 clientURLs=http://10.73.71.27:2379,http://10.73.71.27:4001 isLeader=false b11e73358a31b109: name=master01 peerURLs=http://10.73.71.25:2380 clientURLs=http://10.73.71.25:2379,http://10.73.71.25:4001 isLeader=false f67dd9aaa8a44ab9: name=master02 peerURLs=http://10.73.71.26:2380 clientURLs=http://10.73.71.26:2379,http://10.73.71.26:4001 isLeader=true 

Instal etcd secara lokal dengan ansible, jalankan melalui systemd

Dengan github, kami akan mengkloning repositori dengan kode ke mesin tempat Anda menjalankan playbook. Mesin ini harus memiliki akses ssh pada kunci master cluster masa depan kita.


 git clone https://github.com/rjeka/kubernetes-ceph-percona.git cd kubernetes-ceph-percona/playbooks vim masters.ini 

Di grup master, daftarkan master ip.
etcd_version adalah versi etcd. Anda dapat melihatnya di halaman etcd di github . Pada saat penulisan, ada versi v3.3.13 Saya menggunakan v3.3.10.
etcdToken - Anda dapat meninggalkan yang sama, atau menghasilkan milik Anda sendiri.
Jalankan tim playbook


 # sudo c  ansible-playbook -i hosts.ini -l masters etcd.yaml -K BECOME password: <sudo > # sudo  ansible-playbook -i hosts.ini -l masters etcd.yaml 

Jika Anda ingin menjalankan etcd di buruh pelabuhan, maka ada instruksi di bawah spoiler.


Instal dll dengan komposisi buruh pelabuhan, luncurkan di buruh pelabuhan

Perintah-perintah ini harus dijalankan pada semua node master cluster.
Dengan github, kami mengkloning repositori dengan kode


 git clone https://github.com/rjeka/kubernetes-ceph-percona.git cd kubernetes-ceph-percona 

etcd_version adalah versi etcd. Anda dapat melihatnya di halaman etcd di github . Pada saat penulisan, ada versi v3.3.13 Saya menggunakan v3.3.10.
etcdToken - Anda dapat meninggalkan yang sama, atau menghasilkan milik Anda sendiri.


Kami membuat komposisi buruh pelabuhan


 apt-get install -y docker-compose 

Kami menghasilkan konfigurasi


 ./create-config.sh docker 

Jalankan instalasi cluster etcd di buruh pelabuhan


 docker-compose --file etcd-docker/docker-compose.yaml up -d 

Periksa apakah wadah sudah habis


 docker ps 

Dan status cluster, dll


 root@master01:~/kubernetes-ceph-percona# docker exec -ti etcd etcdctl cluster-health member 61db137992290fc is healthy: got healthy result from http://10.73.71.27:2379 member b11e73358a31b109 is healthy: got healthy result from http://10.73.71.25:2379 member f67dd9aaa8a44ab9 is healthy: got healthy result from http://10.73.71.26:2379 cluster is healthy root@master01:~/kubernetes-ceph-percona# docker exec -ti etcd etcdctl member list 61db137992290fc: name=etcd3 peerURLs=http://10.73.71.27:2380 clientURLs=http://10.73.71.27:2379,http://10.73.71.27:4001 isLeader=false b11e73358a31b109: name=etcd1 peerURLs=http://10.73.71.25:2380 clientURLs=http://10.73.71.25:2379,http://10.73.71.25:4001 isLeader=true f67dd9aaa8a44ab9: name=etcd2 peerURLs=http://10.73.71.26:2380 clientURLs=http://10.73.71.26:2379,http://10.73.71.26:4001 isLeader=false 

Jika ada yang salah


 docker logs etcd 


Meluncurkan wisaya kubernet pertama


Pertama-tama, kita perlu membuat konfigurasi untuk kubeadmin


 ./create-config.sh kubeadm 

Kami membongkar konfigurasi untuk kubeadm
 apiVersion: kubeadm.k8s.io/v1beta1 kind: InitConfiguration localAPIEndpoint: advertiseAddress: 10.73.71.25 #    API- --- apiVersion: kubeadm.k8s.io/v1beta1 kind: ClusterConfiguration kubernetesVersion: stable #      apiServer: #    kubeadm   certSANs: - 127.0.0.1 - 10.73.71.25 - 10.73.71.26 - 10.73.71.27 controlPlaneEndpoint: 10.73.71.25 #     etcd: #  etc external: endpoints: - http://10.73.71.25:2379 - http://10.73.71.26:2379 - http://10.73.71.27:2379 networking: podSubnet: 192.168.0.0/16 #   ,   CNI  . 

Anda dapat membaca tentang subnet CNI dalam dokumentasi kubernetes.
Ini adalah konfigurasi minimum yang berfungsi. Untuk cluster dengan tiga penyihir, Anda bisa mengubahnya ke konfigurasi cluster Anda. Misalnya, jika Anda ingin menggunakan 2 penyihir, maka cukup tentukan dua alamat di certSANs.
Semua parameter konfigurasi dapat ditemukan dalam deskripsi API kubeadm .


Kami memulai tuan pertama


 kubeadm init --config=kubeadmin/kubeadm-init.yaml 

Jika kubeadm bekerja tanpa kesalahan, maka pada output kita mendapatkan kira-kira output berikut:


 You can now join any number of control-plane nodes by copying certificate authorities and service account keys on each node and then running the following as root: kubeadm join 10.73.71.25:6443 --token ivwoap.259retezqf34amx8 \ --discovery-token-ca-cert-hash sha256:b5c93e32457c8e6478782ff62e8ef77acf72738dda59cd603cdf4821abe12ca3 \ --control-plane Then you can join any number of worker nodes by running the following on each as root: kubeadm join 10.73.71.25:6443 --token ivwoap.259retezqf34amx8 \ --discovery-token-ca-cert-hash sha256:b5c93e32457c8e6478782ff62e8ef77acf72738dda59cd603cdf4821abe12ca3 


Instalasi Calico CNI


Waktunya telah tiba untuk membangun jaringan di mana pod kami akan bekerja. Saya menggunakan belacu, dan kami akan menaruhnya.
Dan sebagai permulaan, konfigurasikan akses untuk kubelet. Kami menjalankan semua perintah pada master01
Jika Anda menjalankan sebagai root


 export KUBECONFIG=/etc/kubernetes/admin.conf 

Jika dari bawah pengguna yang sederhana


 mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config 

Anda juga dapat mengelola cluster dari laptop Anda atau mesin lokal apa pun. Untuk melakukan ini, salin file /etc/kubernetes/admin.conf ke laptop Anda atau komputer lain di $ HOME / .kube / config


Kami menempatkan CNI sesuai dengan dokumentasi Kubernetes


 kubectl apply -f https://docs.projectcalico.org/v3.8/manifests/calico.yaml 

Kami menunggu sampai semua polong naik


 watch -n1 kubectl get pods -A NAMESPACE NAME READY STATUS RESTARTS AGE kube-system calico-kube-controllers-59f54d6bbc-psr2z 1/1 Running 0 96s kube-system calico-node-hm49z 1/1 Running 0 96s kube-system coredns-5c98db65d4-svcx9 1/1 Running 0 77m kube-system coredns-5c98db65d4-zdlb8 1/1 Running 0 77m kube-system kube-apiserver-master01 1/1 Running 0 76m kube-system kube-controller-manager-master01 1/1 Running 0 77m kube-system kube-proxy-nkdqn 1/1 Running 0 77m kube-system kube-scheduler-master01 1/1 Running 0 77m 


Peluncuran penyihir kubernetes kedua dan ketiga


Sebelum memulai master02 dan master03, Anda perlu menyalin sertifikat dengan master01 yang dihasilkan kubus saat membuat cluster. Saya akan menyalin melalui scp
Pada master01


 export master02=10.73.71.26 export master03=10.73.71.27 scp -r /etc/kubernetes/pki $master02:/etc/kubernetes/ scp -r /etc/kubernetes/pki $master03:/etc/kubernetes/ 

Pada master02 dan master03
Buat config untuk kubeadm


 ./create-config.sh kubeadm 

Dan tambahkan master02 dan master03 ke cluster


 kubeadm init --config=kubeadmin/kubeadm-init.yaml 

Gangguan di beberapa antarmuka jaringan !!!!

Dalam produksi, saya menggunakan kubernetes v1.13.5 dan calico v3.3. Dan saya tidak punya gangguan seperti itu.
Tetapi ketika menyiapkan artikel dan menggunakan versi stabil (pada saat penulisan ini adalah v1.15.1 kubernetes dan versi 3.8 callico) saya mengalami masalah yang diekspresikan dalam kesalahan awal CNI


 root@master01:~/kubernetes-ceph-percona# kubectl get pods -A -w NAMESPACE NAME READY STATUS RESTARTS AGE kube-system calico-kube-controllers-658558ddf8-t6gfs 0/1 ContainerCreating 0 11s kube-system calico-node-7td8g 1/1 Running 0 11s kube-system calico-node-dthg5 0/1 CrashLoopBackOff 1 11s kube-system calico-node-tvhkq 0/1 CrashLoopBackOff 1 11s 

Ini adalah kesalahan set calico daemon ketika server memiliki beberapa antarmuka jaringan
Di githab ada masalah pada kesalahan ini https://github.com/projectcalico/calico/issues/2720
Itu diselesaikan dengan mengedit daemon set calico-node dan menambahkan parameter IP_AUTODETECTION_METHOD ke env


 kubectl edit -n kube-system ds calico-node 

tambahkan parameter IP_AUTODETECTION_METHOD dengan nama antarmuka Anda tempat wizard bekerja; dalam kasus saya itu EN19


 - name: IP_AUTODETECTION_METHOD value: ens19 


Periksa bahwa semua node di cluster sudah aktif dan berjalan


 # kubectl get nodes NAME STATUS ROLES AGE VERSION master01 Ready master 28m v1.15.1 master02 Ready master 26m v1.15.1 master03 Ready master 18m v1.15.1 

Dan apa yang disebut calica hidup


 # kubectl get pods -A -o wide | grep calico kube-system calico-kube-controllers-59f54d6bbc-5lxgn 1/1 Running 0 27m kube-system calico-node-fngpz 1/1 Running 1 24m kube-system calico-node-gk7rh 1/1 Running 0 8m55s kube-system calico-node-w4xtt 1/1 Running 0 25m 


Tambahkan node pekerja ke cluster


Saat ini, kami memiliki cluster di mana tiga node master berjalan. Tetapi master nodes adalah mesin yang menjalankan api, scheduler, dan layanan lain dari cluster kubernet. Agar kami dapat menjalankan pod kami, kami membutuhkan apa yang disebut node pekerja.
Jika sumber daya Anda terbatas, Anda dapat menjalankan pod pada node master, tetapi saya pribadi tidak menyarankan untuk melakukan ini.


Menjalankan perapian di masternode

Untuk memungkinkan peluncuran perapian pada node master, jalankan perintah berikut pada salah satu penyihir


 kubectl taint nodes --all node-role.kubernetes.io/master- 

Instal node kubelet, kubeadm, kubectl dan docker pada pekerja seperti pada node master


Instal kubelet, kubeadm, kubectl dan docker
 apt-get update && apt-get install -y apt-transport-https curl curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add - cat <<EOF >/etc/apt/sources.list.d/kubernetes.list deb https://apt.kubernetes.io/ kubernetes-xenial main EOF apt-get update apt-get install -y kubelet kubeadm kubectl apt-mark hold kubelet kubeadm kubectl 

Instal Docker


Instal buruh pelabuhan sesuai dengan instruksi dari dokumentasi


 apt-get remove docker docker-engine docker.io containerd runc apt-get install apt-transport-https ca-certificates curl gnupg2 software-properties-common 

 curl -fsSL https://download.docker.com/linux/debian/gpg | apt-key add - apt-key fingerprint 0EBFCD88 

 add-apt-repository \ "deb [arch=amd64] https://download.docker.com/linux/debian \ $(lsb_release -cs) \ stable" 

 apt-get update apt-get install docker-ce docker-ce-cli containerd.io 

Instalasi Menginstal Kubelet, Kubectl, Kubeadm dan buruh pelabuhan menggunakan mungkin
 git clone https://github.com/rjeka/kubernetes-ceph-percona.git cd kubernetes-ceph-percona/playbooks vim masters.ini 

Di grup master, daftarkan master ip.
Dalam kelompok pekerja, tuliskan ip dari simpul yang berfungsi.


 # sudo c  ansible-playbook -i hosts.ini kubelet.yaml -K ansible-playbook -i hosts.ini docker.yaml -K # sudo  ansible-playbook -i hosts.ini kubelet.yaml ansible-playbook -i hosts.ini docker.yaml 

Sekarang saatnya untuk kembali ke baris yang dihasilkan kubeadm ketika kita menginstal master node.
Dia terlihat seperti ini untukku.


 kubeadm join 10.73.71.25:6443 --token ivwoap.259retezqf34amx8 \ --discovery-token-ca-cert-hash sha256:b5c93e32457c8e6478782ff62e8ef77acf72738dda59cd603cdf4821abe12ca3 

Diperlukan untuk mengeksekusi perintah ini pada setiap node pekerja.
Jika Anda belum menulis token, maka Anda dapat membuat yang baru


 kubeadm token create --print-join-command --ttl=0 

Setelah kubeadm bekerja, node baru Anda dimasukkan ke dalam cluster dan siap untuk bekerja


 This node has joined the cluster: * Certificate signing request was sent to apiserver and a response was received. * The Kubelet was informed of the new secure connection details. Run 'kubectl get nodes' on the control-plane to see this node join the cluster. 

Sekarang mari kita lihat hasilnya


 root@master01:~# kubectl get nodes NAME STATUS ROLES AGE VERSION master01 Ready master 10d v1.15.1 master02 Ready master 10d v1.15.1 master03 Ready master 10d v1.15.1 worknode01 Ready <none> 5m44s v1.15.1 worknode02 Ready <none> 59s v1.15.1 worknode03 Ready <none> 51s v1.15.1 


Instal haproxy di worknodes


Sekarang kami memiliki cluster yang berfungsi dengan tiga node master dan tiga node pekerja.
Masalahnya adalah bahwa sekarang node pekerja kami tidak memiliki mode HA.
Jika Anda melihat file konfigurasi kubelet, kita akan melihat bahwa node pekerja kami hanya mengakses satu dari tiga node master.


 root@worknode01:~# cat /etc/kubernetes/kubelet.conf | grep server: server: https://10.73.71.27:6443 

Dalam kasus saya, ini master03. Dengan konfigurasi ini, jika master03 lumpuh, simpul pekerja akan kehilangan komunikasi dengan server API cluster. Untuk membuat cluster kami sepenuhnya HA, kami akan menginstal Load Balancer (Haproxy) pada masing-masing pekerja, yang, menurut round robin, akan menyebarkan permintaan untuk tiga node master, dan dalam konfigurasi kubelet pada node pekerja kami akan mengubah alamat server menjadi 127.0.0.1:6443
Pertama, instal HAProxy pada setiap node pekerja.
Ada lembar contekan yang bagus untuk instalasi


 curl https://haproxy.debian.net/bernat.debian.org.gpg | \ apt-key add - echo deb http://haproxy.debian.net stretch-backports-2.0 main | \ tee /etc/apt/sources.list.d/haproxy.list apt-get update apt-get install haproxy=2.0.\* 

Setelah HAproxy diinstal, kita perlu membuat konfigurasi untuk itu.
Jika pada node pekerja tidak ada direktori dengan file konfigurasi, maka kami mengkloningnya


 git clone https://github.com/rjeka/kubernetes-ceph-percona.git cd kubernetes-ceph-percona/ 

Dan jalankan skrip config dengan flag haproxy


 ./create-config.sh haproxy 

Script akan mengkonfigurasi dan me-restart haproxy.
Periksa apakah haproxy mulai mendengarkan port 6443.


 root@worknode01:~/kubernetes-ceph-percona# netstat -alpn | grep 6443 tcp 0 0 127.0.0.1:6443 0.0.0.0:* LISTEN 30675/haproxy tcp 0 0 10.73.75.241:6443 0.0.0.0:* LISTEN 30675/haproxy 

Sekarang kita perlu memberitahu kubelet untuk mengakses localhost alih-alih node master. Untuk melakukan ini, edit nilai server di file /etc/kubernetes/kubelet.conf dan /etc/kubernetes/bootstrap-kubelet.conf di semua node pekerja.


 vim /etc/kubernetes/kubelet.conf vim nano /etc/kubernetes/bootstrap-kubelet.conf 

Nilai server harus berupa:


 server: https://127.0.0.1:6443 

Setelah melakukan perubahan, restart layanan kubelet dan buruh pelabuhan


 systemctl restart kubelet && systemctl restart docker 

Periksa apakah semua node berfungsi dengan benar.


 kubectl get nodes NAME STATUS ROLES AGE VERSION master01 Ready master 29m v1.15.1 master02 Ready master 27m v1.15.1 master03 Ready master 26m v1.15.1 worknode01 Ready <none> 25m v1.15.1 worknode02 Ready <none> 3m15s v1.15.1 worknode03 Ready <none> 3m16s v1.15.1 

Sejauh ini, kami tidak memiliki aplikasi di cluster untuk menguji HA. Tapi kita bisa menghentikan operasi kubelet pada master node pertama dan memastikan bahwa cluster kita tetap beroperasi.


 systemctl stop kubelet && systemctl stop docker 

Periksa dari master node kedua


 root@master02:~# kubectl get nodes NAME STATUS ROLES AGE VERSION master01 NotReady master 15h v1.15.1 master02 Ready master 15h v1.15.1 master03 Ready master 15h v1.15.1 worknode01 Ready <none> 15h v1.15.1 worknode02 Ready <none> 15h v1.15.1 worknode03 Ready <none> 15h v1.15.1 

Semua node berfungsi secara normal kecuali yang kita hentikan layanan.
Jangan lupa untuk mengembalikan layanan kubernetes pada master node pertama


 systemctl start kubelet && systemctl start docker 


Menginstal Ingress Controller


Pengontrol ingress adalah add-on Kubernetes, yang dengannya kita dapat mengakses aplikasi kita dari luar. Penjelasan terperinci ada di dokumentasi Kuberbnetes . Ada cukup banyak pengendali masuknya, saya menggunakan controller dari Nginx. Saya akan berbicara tentang pemasangannya. Dokumentasi tentang operasi, konfigurasi dan pemasangan pengontrol Ingress dari Nginx dapat dibaca di situs web resmi


Mari kita mulai instalasi, semua perintah dapat dijalankan dengan master01.
Instal pengontrol itu sendiri


 kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/static/mandatory.yaml 

Dan sekarang - layanan melalui mana masuknya akan tersedia
Untuk melakukan ini, siapkan konfigurasi


 ./create-config.sh ingress 

Dan kirimkan ke cluster kami


 kubectl apply -f ingress/service-nodeport.yaml 

Periksa apakah Ingress kami berfungsi pada alamat yang benar dan mendengarkan pada port yang benar.


 # kubectl get svc -n ingress-nginx NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE ingress-nginx NodePort 10.99.35.95 10.73.71.25,10.73.71.26,10.73.71.27 80:31669/TCP,443:31604/TCP 10m 

  kubectl describe svc -n ingress-nginx ingress-nginx Name: ingress-nginx Namespace: ingress-nginx Labels: app.kubernetes.io/name=ingress-nginx app.kubernetes.io/part-of=ingress-nginx Annotations: kubectl.kubernetes.io/last-applied-configuration: {"apiVersion":"v1","kind":"Service","metadata":{"annotations":{},"labels":{"app.kubernetes.io/name":"ingress-nginx","app.kubernetes.io/par... Selector: app.kubernetes.io/name=ingress-nginx,app.kubernetes.io/part-of=ingress-nginx Type: NodePort IP: 10.99.35.95 External IPs: 10.73.71.25,10.73.71.26,10.73.71.27 Port: http 80/TCP TargetPort: 80/TCP NodePort: http 31669/TCP Endpoints: 192.168.142.129:80 Port: https 443/TCP TargetPort: 443/TCP NodePort: https 31604/TCP Endpoints: 192.168.142.129:443 Session Affinity: None External Traffic Policy: Cluster Events: <none> 


Pasang UI Web (Dasbor)


Kubernetes memiliki UI Web standar, yang terkadang nyaman untuk dengan cepat melihat status gugus atau bagian-bagian individualnya. Dalam pekerjaan saya, saya sering menggunakan dasbor untuk diagnosis awal penyebaran atau keadaan bagian dari sebuah cluster.
Tautan ke dokumentasi ada di situs kubernetes
Instalasi Saya menggunakan versi stabil, saya belum mencoba 2.0.


 #  kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v1.10.1/src/deploy/recommended/kubernetes-dashboard.yaml # 2.0 kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0-beta1/aio/deploy/recommended.yaml 

Setelah kami memasang panel di cluster kami, panel menjadi tersedia di


 http://localhost:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/. 

Tetapi untuk sampai ke sana, kita perlu meneruskan porta dari mesin lokal menggunakan proksi kubectl. Bagi saya, skema ini sangat tidak nyaman. Oleh karena itu, saya akan mengubah layanan panel kontrol sehingga dasbor menjadi tersedia pada alamat simpul gugus pada port 30443. Masih ada cara lain untuk mengakses dasbor, misalnya, melalui masuknya. Mungkin saya akan mempertimbangkan metode ini dalam publikasi berikut.
Untuk mengubah layanan, jalankan penyebaran layanan yang diubah


 kubectl apply -f dashboard/service-nodeport.yaml 

Tetap membuat pengguna admin dan token untuk mengakses cluster melalui dasbor


 kubectl apply -f dashboard/rbac.yaml kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep admin-user | awk '{print $1}') 

Setelah itu, Anda dapat masuk ke panel kontrol di https://10.73.71.25:30443

Layar beranda dasbor


Selamat! Jika Anda telah mencapai langkah ini, maka Anda memiliki kluster HA kubernet yang berfungsi, yang siap untuk penyebaran aplikasi Anda.
Kubernetes , . .
, GitHub, , .
C , .

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


All Articles