
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:
- 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.
- 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
- 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.
- 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:
- Daftar host, sumber daya host, OS dan versi perangkat lunak
- Kubernetes cluster diagram HA
- Sebelum Anda mulai atau sebelum Anda mulai
- Isi file create-config.sh
- Pembaruan kernel OS
- Mempersiapkan Node Memasang Kubelet, Kubectl, Kubeadm, dan Docker
- Menginstal ETCD (berbagai opsi)
- Meluncurkan wisaya kubernet pertama
- Instalasi Callico CNI
- Peluncuran penyihir kubernetes kedua dan ketiga
- Tambahkan node pekerja ke cluster
- Instal haproxy pada node pekerja untuk HA
- Menginstal Ingress Controller
- 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:
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
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
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 systemdDengan 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
Jika Anda ingin menjalankan etcd di buruh pelabuhan, maka ada instruksi di bawah spoiler.
Instal dll dengan komposisi buruh pelabuhan, luncurkan di buruh pelabuhanPerintah-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 masternodeUntuk 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 , .