Kubernetes Giat Minimum

Tarjamahan tina artikel ieu disiapkeun dina wengi mimiti kursus "Praktik sareng alat DevOps".

Kubernetes Giat Minimum

Lamun nuju maca ieu, Anjeun meureun geus uninga hal ngeunaan Kubernetes (jeung lamun henteu, kumaha anjeun mungkas nepi ka dieu?) Tapi naon kahayang téh Kubernetes? Ieu "Orkestrasi wadah kelas industri"? Atawa "Sistem Operasi Cloud-Native"? Naon ieu malah hartosna?

Jujur, kuring henteu 100% yakin. Tapi kuring pikir éta pikaresepeun pikeun ngagali internal sareng ningali naon anu leres-leres lumangsung di Kubernetes dina seueur lapisan abstraksi na. Janten pikeun senang-senang, hayu urang tingali kumaha "kluster Kubernetes" minimal. (Ieu bakal leuwih gampang ti Kubernetes The Hard Way.)

Kuring nganggap anjeun gaduh pangaweruh dasar ngeunaan Kubernetes, Linux, sareng wadahna. Sadayana anu diomongkeun di dieu ngan ukur pikeun tujuan panalungtikan/pangajaran, ulah nempatkeun naon waé kana produksi!

gambaran

Kubernetes ngandung loba komponén. Numutkeun kana Wikipedia, arsitékturna siga kieu:

Kubernetes Giat Minimum

Sahenteuna aya dalapan komponén anu dipidangkeun di dieu, tapi urang bakal malire kalolobaanana. Abdi hoyong nyatakeun yén hal minimum anu lumayan tiasa disebat Kubernetes diwangun ku tilu komponén utama:

  • cubelet
  • kube-apiserver (anu gumantung kana etcd - database na)
  • runtime wadahna (Docker dina hal ieu)

Hayu urang tingali naon dokuméntasi nyebutkeun ngeunaan unggal sahijina (rus., Inggris.). Mimitina cubelet:

Agén ngajalankeun on unggal titik dina klaster. Ieu mastikeun yén peti keur ngajalankeun di pod nu.

Sora cukup basajan. Kumaha upami runtimes wadahna (Wadahna runtime)?

Runtime wadahna mangrupikeun program anu dirancang pikeun ngajalankeun wadah.

Pisan informatif. Tapi upami anjeun wawuh sareng Docker, maka anjeun kedah gaduh ide umum ngeunaan naon anu dilakukeun. (Rincian ngeunaan pamisahan tanggung jawab antara runtime wadahna sareng kubelet saleresna rada halus sareng kuring moal lebet ka dieu.)

И server API?

Server API nyaéta komponén panel kontrol Kubernetes anu ngalaan API Kubernetes. Server API nyaéta sisi klien tina panel kontrol Kubernetes

Saha waé anu kantos ngalakukeun nanaon sareng Kubernetes kedah berinteraksi sareng API sacara langsung atanapi ngalangkungan kubectl. Ieu mangrupikeun jantung anu ngajantenkeun Kubernetes Kubernetes - otak anu ngarobih gunung YAML anu urang kenal sareng dipikacinta (?) janten infrastruktur anu tiasa dianggo. Sigana atra yén API kedah hadir dina konfigurasi minimal urang.

Prasyarat

  • Mesin virtual atanapi fisik Linux kalayan aksés root (Kuring nganggo Ubuntu 18.04 dina mesin virtual).
  • Sareng éta sadayana!

Pamasangan boring

Urang kedah masang Docker dina mesin anu bakal kami anggo. (Kuring henteu bakal ngajelaskeun sacara rinci ngeunaan kumaha Docker sareng wadahna dianggo; upami anjeun resep, aya artikel éndah). Hayu urang ngan install deui kalawan apt:

$ sudo apt install docker.io
$ sudo systemctl start docker

Saatos éta, urang kedah kéngingkeun binari Kubernetes. Kanyataanna, pikeun peluncuran awal "cluster" urang ngan butuh kubelet, saprak ngajalankeun komponén server séjén kami bisa make kubelet. Pikeun berinteraksi sareng klaster urang saatos ngajalankeun, urang ogé bakal ngagunakeun kubectl.

$ curl -L https://dl.k8s.io/v1.18.5/kubernetes-server-linux-amd64.tar.gz > server.tar.gz
$ tar xzvf server.tar.gz
$ cp kubernetes/server/bin/kubelet .
$ cp kubernetes/server/bin/kubectl .
$ ./kubelet --version
Kubernetes v1.18.5

Naon kajadian lamun urang ngan ngajalankeun kubelet?

$ ./kubelet
F0609 04:03:29.105194    4583 server.go:254] mkdir /var/lib/kubelet: permission denied

kubelet kudu ngajalankeun sakumaha root. Cukup logis, sabab anjeunna kedah ngatur sadayana titik. Hayu urang nempo parameter na:

$ ./kubelet -h
<слишком много строк, чтобы разместить здесь>
$ ./kubelet -h | wc -l
284

Wah, seueur pilihan! Untungna, urang ngan ukur peryogi sababaraha aranjeunna. Ieu salah sahiji parameter anu dipikaresep ku urang:

--pod-manifest-path string

Jalur ka diréktori anu ngandung file pikeun pod statik, atanapi jalur ka file anu ngajelaskeun pods statik. Berkas anu dimimitian ku titik teu dipaliré. (DEPRECATED: Pilihan ieu kudu disetel dina file konfigurasi dibikeun ka Kubelet via pilihan --config. Kanggo inpo nu leuwih lengkep, tingali kubernetes.io/docs/tasks/administer-cluster/kubelet-config-file .)

Pilihan ieu ngamungkinkeun urang ngajalankeun polong statik - pods nu teu diatur via Kubernetes API. pods statik jarang dipaké, tapi maranéhna pisan merenah pikeun gancang raising klaster, sarta ieu kahayang urang kudu. Urang bakal malire warning badag ieu (deui, ulah ngajalankeun ieu dina produksi!) Tur tingal lamun urang bisa ngajalankeun pod.

Kahiji urang bakal nyieun diréktori pikeun pods statik tur ngajalankeun kubelet:

$ mkdir pods
$ sudo ./kubelet --pod-manifest-path=pods

Lajeng, dina terminal sejen / tmux jandela / naon, urang bakal nyieun pod manifest:

$ cat <<EOF > pods/hello.yaml
apiVersion: v1
kind: Pod
metadata:
  name: hello
spec:
  containers:
  - image: busybox
    name: hello
    command: ["echo", "hello world!"]
EOF

kubelet dimimitian nulis sababaraha warnings na sigana kawas euweuh kajadian. Tapi éta henteu leres! Hayu urang tingali Docker:

$ sudo docker ps -a
CONTAINER ID        IMAGE                  COMMAND                 CREATED             STATUS                      PORTS               NAMES
8c8a35e26663        busybox                "echo 'hello world!'"   36 seconds ago      Exited (0) 36 seconds ago                       k8s_hello_hello-mink8s_default_ab61ef0307c6e0dee2ab05dc1ff94812_4
68f670c3c85f        k8s.gcr.io/pause:3.2   "/pause"                2 minutes ago       Up 2 minutes                                    k8s_POD_hello-mink8s_default_ab61ef0307c6e0dee2ab05dc1ff94812_0
$ sudo docker logs k8s_hello_hello-mink8s_default_ab61ef0307c6e0dee2ab05dc1ff94812_4
hello world!

kubelet Kuring maca pod manifest sareng masihan Docker paréntah pikeun ngaluncurkeun sababaraha wadah numutkeun spésifikasi kami. (Upami anjeun mikir ngeunaan wadahna "reureuh", éta mangrupikeun hack Kubernetes - tingali blog ieu.) Kubelet bakal ngajalankeun wadahna urang busybox kalayan paréntah anu ditangtukeun sareng bakal ngamimitian deui salamina dugi ka pod statik dihapus.

Ngabagéakeun diri. Urang ngan datang nepi ka salah sahiji cara paling ngabingungkeun pikeun kaluaran téks ka terminal!

Ngaluncurkeun jsb

Tujuan pamungkas kami nyaéta pikeun ngajalankeun API Kubernetes, tapi pikeun ngalakukeun éta urang kedah ngajalankeun heula jsb. Hayu urang mimitian kluster etcd minimal ku nempatkeun setélanna dina diréktori pods (contona, pods/etcd.yaml):

apiVersion: v1
kind: Pod
metadata:
  name: etcd
  namespace: kube-system
spec:
  containers:
  - name: etcd
    command:
    - etcd
    - --data-dir=/var/lib/etcd
    image: k8s.gcr.io/etcd:3.4.3-0
    volumeMounts:
    - mountPath: /var/lib/etcd
      name: etcd-data
  hostNetwork: true
  volumes:
  - hostPath:
      path: /var/lib/etcd
      type: DirectoryOrCreate
    name: etcd-data

Upami anjeun kantos damel sareng Kubernetes, file YAML ieu kedah wawuh ka anjeun. Aya ngan dua titik patut noting di dieu:

Kami geus dipasang folder host /var/lib/etcd dina pod supados data etcd dilestarikan sanggeus balikan deui a (lamun ieu teu dipigawé, kaayaan klaster bakal erased unggal waktos pod ieu restarted, nu moal jadi alus pikeun malah hiji instalasi Kubernetes minimal).

Kami geus dipasang hostNetwork: true. setelan ieu, unsurprisingly, ngonpigurasikeun etcd pikeun make jaringan host tinimbang jaringan internal pod urang (ieu bakal nyieun leuwih gampang pikeun server API manggihan kluster etcd).

Cék saderhana nunjukkeun yén etcd memang dijalankeun dina localhost sareng nyimpen data kana disk:

$ curl localhost:2379/version
{"etcdserver":"3.4.3","etcdcluster":"3.4.0"}
$ sudo tree /var/lib/etcd/
/var/lib/etcd/
└── member
    ├── snap
    │   └── db
    └── wal
        ├── 0.tmp
        └── 0000000000000000-0000000000000000.wal

Ngamimitian server API

Ngajalankeun server API Kubernetes langkung gampang. Hiji-hijina parameter anu kedah diliwatan nyaéta --etcd-servers, ngalakukeun naon anu anjeun ngarepkeun:

apiVersion: v1
kind: Pod
metadata:
  name: kube-apiserver
  namespace: kube-system
spec:
  containers:
  - name: kube-apiserver
    command:
    - kube-apiserver
    - --etcd-servers=http://127.0.0.1:2379
    image: k8s.gcr.io/kube-apiserver:v1.18.5
  hostNetwork: true

Teundeun file YAML ieu dina diréktori pods, sareng server API bakal ngamimitian. Mariksa kalawan curl nunjukkeun yén API Kubernetes ngadangukeun dina port 8080 kalayan aksés kabuka lengkep - henteu peryogi auténtikasi!

$ curl localhost:8080/healthz
ok
$ curl localhost:8080/api/v1/pods
{
  "kind": "PodList",
  "apiVersion": "v1",
  "metadata": {
    "selfLink": "/api/v1/pods",
    "resourceVersion": "59"
  },
  "items": []
}

(Sakali deui, ulah ngajalankeun ieu dina produksi! Kuring éta saeutik reuwas yén setélan standar téh jadi teu aman. Tapi Kuring guessing ieu sangkan ngembangkeun sarta nguji gampang.)

Sareng, kejutan anu pikaresepeun, kubectl jalan kaluar tina kotak tanpa setélan tambahan!

$ ./kubectl version
Client Version: version.Info{Major:"1", Minor:"18", GitVersion:"v1.18.5", GitCommit:"e6503f8d8f769ace2f338794c914a96fc335df0f", GitTreeState:"clean", BuildDate:"2020-06-26T03:47:41Z", GoVersion:"go1.13.9", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"18", GitVersion:"v1.18.5", GitCommit:"e6503f8d8f769ace2f338794c914a96fc335df0f", GitTreeState:"clean", BuildDate:"2020-06-26T03:39:24Z", GoVersion:"go1.13.9", Compiler:"gc", Platform:"linux/amd64"}
$ ./kubectl get pod
No resources found in default namespace.

masalah

Tapi upami anjeun ngagali langkung jero, sigana aya anu salah:

$ ./kubectl get pod -n kube-system
No resources found in kube-system namespace.

The pods statik kami dijieun geus leungit! Nyatana, titik kubelet kami henteu kapendak pisan:

$ ./kubectl get nodes
No resources found in default namespace.

Naon masalahna? Upami anjeun émut sababaraha paragraf ka tukang, kami ngamimitian kubelet kalayan set parameter garis paréntah anu saderhana pisan, ku kituna kubelet henteu terang kumaha ngahubungi server API sareng ngabéjaan kaayaanana. Saatos diajar dokuméntasi, urang mendakan bandéra anu saluyu:

--kubeconfig string

Jalur ka file kubeconfig, nu nangtukeun kumaha nyambungkeun kana server API. Kasadiaan --kubeconfig ngaktipkeun mode server API, No --kubeconfig ngaktipkeun mode offline.

Sadaya waktos ieu, tanpa terang, kami ngajalankeun kubelet dina "mode offline." (Upami urang janten pedantic, urang tiasa nganggap kubelet mandiri salaku "Kubernetes giat minimum", tapi éta bakal pikaboseneun). Pikeun nyieun karya konfigurasi "nyata", urang kudu ngalirkeun file kubeconfig mun kubelet sangkan terang kumaha carana ngobrol jeung server API. Kabeneran éta cukup saderhana (sabab urang henteu ngagaduhan masalah auténtikasi atanapi sertipikat):

apiVersion: v1
kind: Config
clusters:
- cluster:
    server: http://127.0.0.1:8080
  name: mink8s
contexts:
- context:
    cluster: mink8s
  name: mink8s
current-context: mink8s

Simpen ieu salaku kubeconfig.yaml, maéhan prosés kubelet sareng balikan deui sareng parameter anu diperyogikeun:

$ sudo ./kubelet --pod-manifest-path=pods --kubeconfig=kubeconfig.yaml

(Ku jalan kitu, lamun nyoba ngakses API via curl nalika kubelet teu ngajalankeun, anjeun bakal manggihan eta masih jalan! Kubelet sanes a "indungna" pods na kawas Docker, éta leuwih kawas "kontrol". daemon." Wadah anu diurus ku kubelet bakal terus jalan dugi ka kubelet ngeureunkeunana.)

Dina sababaraha menit kubectl kedah nunjukkeun ka kami polong sareng titik sapertos anu kami ngarepkeun:

$ ./kubectl get pods -A
NAMESPACE     NAME                    READY   STATUS             RESTARTS   AGE
default       hello-mink8s            0/1     CrashLoopBackOff   261        21h
kube-system   etcd-mink8s             1/1     Running            0          21h
kube-system   kube-apiserver-mink8s   1/1     Running            0          21h
$ ./kubectl get nodes -owide
NAME     STATUS   ROLES    AGE   VERSION   INTERNAL-IP    EXTERNAL-IP   OS-IMAGE             KERNEL-VERSION       CONTAINER-RUNTIME
mink8s   Ready    <none>   21h   v1.18.5   10.70.10.228   <none>        Ubuntu 18.04.4 LTS   4.15.0-109-generic   docker://19.3.6

Hayu urang bener congratulate diri urang ayeuna (Kuring nyaho kuring geus congratulated sorangan) - urang boga minimal Kubernetes "cluster" ngajalankeun kalawan API fungsi pinuh!

Urang ngajalankeun handapeun

Ayeuna hayu urang tingali naon anu sanggup API. Hayu urang mimitian ku nginx pod:

apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  containers:
  - image: nginx
    name: nginx

Di dieu urang meunang kasalahan rada metot:

$ ./kubectl apply -f nginx.yaml
Error from server (Forbidden): error when creating "nginx.yaml": pods "nginx" is
forbidden: error looking up service account default/default: serviceaccount
"default" not found
$ ./kubectl get serviceaccounts
No resources found in default namespace.

Di dieu urang ningali kumaha henteu lengkepna lingkungan Kubernetes urang - urang teu gaduh akun pikeun jasa. Hayu urang cobian deui ku cara manual ngadamel akun jasa sareng tingali naon anu lumangsung:

$ cat <<EOS | ./kubectl apply -f -
apiVersion: v1
kind: ServiceAccount
metadata:
  name: default
  namespace: default
EOS
serviceaccount/default created
$ ./kubectl apply -f nginx.yaml
Error from server (ServerTimeout): error when creating "nginx.yaml": No API
token found for service account "default", retry after the token is
automatically created and added to the service account

Sanaos urang nyiptakeun akun jasa sacara manual, token auténtikasi henteu dihasilkeun. Nalika urang teras-terasan ékspérimén sareng "cluster" minimalis urang, urang bakal mendakan yén kalolobaan hal mangpaat anu biasana lumangsung sacara otomatis bakal leungit. Pangladén API Kubernetes cukup minimalis, kalayan kalolobaan angkat beurat sareng konfigurasi otomatis lumangsung dina sababaraha pangendali sareng padamelan latar anu henteu acan dijalankeun.

Urang tiasa ngungkulan masalah ieu ku netepkeun pilihan automountServiceAccountToken pikeun akun jasa (kusabab urang henteu kedah nganggo éta waé):

$ cat <<EOS | ./kubectl apply -f -
apiVersion: v1
kind: ServiceAccount
metadata:
  name: default
  namespace: default
automountServiceAccountToken: false
EOS
serviceaccount/default configured
$ ./kubectl apply -f nginx.yaml
pod/nginx created
$ ./kubectl get pods
NAME    READY   STATUS    RESTARTS   AGE
nginx   0/1     Pending   0          13m

Tungtungna, pod geus mucunghul! Tapi dina kanyataanana moal ngamimitian sabab urang teu boga pangrencana (scheduler) mangrupakeun komponén penting séjén Kubernetes. Deui, urang tingali yén API Kubernetes téh heran "belet" - mun anjeun nyieun Pod di API, éta registers eta, tapi teu nyoba angka kaluar naon titik ngajalankeun eta.

Kanyataanna, anjeun teu perlu scheduler pikeun ngajalankeun pod a. Anjeun tiasa sacara manual nambihan titik kana manifes dina parameter nodeName:

apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  containers:
  - image: nginx
    name: nginx
  nodeName: mink8s

(Ganti mink8s kana nami node.) Saatos ngahapus sareng nerapkeun, urang ningali yén nginx parantos ngamimitian sareng ngadangukeun alamat IP internal:

$ ./kubectl delete pod nginx
pod "nginx" deleted
$ ./kubectl apply -f nginx.yaml
pod/nginx created
$ ./kubectl get pods -owide
NAME    READY   STATUS    RESTARTS   AGE   IP           NODE     NOMINATED NODE   READINESS GATES
nginx   1/1     Running   0          30s   172.17.0.2   mink8s   <none>           <none>
$ curl -s 172.17.0.2 | head -4
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>

Pikeun mastikeun yén jaringan antara pods jalan leres, urang tiasa ngajalankeun curl ti pod sejen:

$ cat <<EOS | ./kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
  name: curl
spec:
  containers:
  - image: curlimages/curl
    name: curl
    command: ["curl", "172.17.0.2"]
  nodeName: mink8s
EOS
pod/curl created
$ ./kubectl logs curl | head -6
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>

Éta rada pikaresepeun pikeun ngagali lingkungan ieu sareng ningali naon anu tiasa dianggo sareng naon anu henteu. Kuring mendakan yén ConfigMap sareng Rusiah damel sapertos anu diharapkeun, tapi Jasa sareng Panyebaran henteu.

Sukses!

pos ieu meunang panjang, jadi Kaula bade dibewarakeun kameunangan sarta nyebutkeun yén ieu téh konfigurasi giat nu bisa disebut "Kubernetes". Pikeun nyimpulkeun: opat binaries, lima parameter garis paréntah sarta "ngan" 45 garis YAML (teu Éta pisan ku standar Kubernetes) sareng kami ngagaduhan sababaraha hal anu tiasa dianggo:

  • Pods dikelola nganggo API Kubernetes biasa (kalayan sababaraha hacks)
  • Anjeun tiasa unggah sareng ngatur gambar wadah umum
  • Pods tetep hirup sareng otomatis balikan deui
  • Jaringan antara pods dina titik anu sami tiasa dianggo kalayan saé
  • ConfigMap, Rahasia sareng panyimpen saderhana dipasang sapertos anu diharapkeun

Tapi seueur anu ngajantenkeun Kubernetes leres-leres mangpaat masih leungit, sapertos:

  • Penjadwal Pod
  • Auténtikasi / otorisasina
  • Sababaraha titik
  • Jaringan jasa
  • DNS internal dikelompokeun
  • Controllers pikeun akun jasa, panyebaran, integrasi sareng panyadia awan sareng seueur barang anu sanés anu dibawa ku Kubernetes.

Jadi naon sabenerna urang meunang? API Kubernetes, ngajalankeun sorangan, saleresna ngan ukur platform pikeun automation wadahna. Éta henteu seueur pisan - éta mangrupikeun padamelan pikeun sababaraha pangendali sareng operator anu nganggo API - tapi éta nyayogikeun lingkungan anu konsisten pikeun otomatisasi.

Diajar langkung seueur ngeunaan kursus dina webinar gratis.

Maca deui:

sumber: www.habr.com

Tambahkeun komentar