Yo dwe onèt, mwen pa 100% sèten. Men, mwen panse ke li enteresan yo fouye nan entèn yo ak wè sa ki vrèman ap pase nan Kubernetes anba kouch anpil li yo nan abstraksyon. Se konsa, jis pou plezi, an n pran yon gade nan ki sa yon minim "Kubernetes cluster" aktyèlman sanble. (Sa a pral pi fasil pase Sou entènèt jwèt Kubernetes wout la difisil.)
Mwen sipoze ou gen konesans debaz nan Kubernetes, Linux, ak resipyan. Tout sa nou pale la a se pou rezon rechèch/aprantisaj sèlman, pa mete okenn ladan yo nan pwodiksyon!
Revize
Kubernetes gen anpil eleman. Dapre Wikipedya, Achitekti a sanble sa a:
Genyen omwen uit eleman yo montre isit la, men nou pral inyore pifò nan yo. Mwen vle deklare ke minimòm bagay ki rezonab yo ka rele Kubernetes konsiste de twa eleman prensipal:
kubelet
kube-apiserver (ki depann de etcd - baz done li yo)
ègzekutabl veso (Docker nan ka sa a)
Ann wè sa dokiman an di sou chak nan yo (rus., angle.). An premye kubelet:
Yon ajan k ap kouri sou chak ne nan gwoup la. Li asire w ke resipyan yo ap kouri nan gous la.
Son senp ase. E tan veso yo (tan veso)?
Yon tansyon veso se yon pwogram ki fèt pou kouri veso yo.
Trè enfòmatif. Men, si ou abitye ak Docker, Lè sa a, ou ta dwe gen yon lide jeneral sou sa li fè. (Detay yo sou separasyon responsablite ant egzekisyon veso a ak kubelet la aktyèlman byen sibtil epi mwen pa pral antre nan yo isit la.)
И Sèvè API?
Sèvè API se eleman panèl kontwòl Kubernetes ki ekspoze API Kubernetes. Sèvè API a se bò kliyan panèl kontwòl Kubernetes
Nenpòt moun ki te janm fè anyen ak Kubernetes te oblije kominike avèk API a swa dirèkteman oswa atravè kubectl. Sa a se kè a nan sa ki fè Kubernetes Kubernetes - sèvo a ki vire mòn yo nan YAML nou tout konnen ak renmen (?) nan enfrastrikti k ap travay. Li sanble evidan ke API a ta dwe prezan nan konfigirasyon minim nou an.
Kondisyon
Linux machin vityèl oswa fizik ak aksè rasin (mwen itilize Ubuntu 18.04 sou yon machin vityèl).
Epi li nan tout!
Enstalasyon raz
Nou bezwen enstale Docker sou machin nou pral itilize a. (Mwen pa pral antre nan detay sou fason Docker ak resipyan travay; si w enterese, gen bèl atik). Ann jis enstale li ak apt:
Apre sa, nou bezwen jwenn binè Kubernetes yo. An reyalite, pou lansman inisyal la nan "grap" nou an nou sèlman bezwen kubelet, depi pou kouri lòt konpozan sèvè nou ka itilize kubelet. Pou kominike avèk gwoup nou an apre li fin kouri, nou pral itilize tou kubectl.
kubelet dwe kouri kòm rasin. Byen lojik, depi li bezwen jere ne la tout antye. Ann gade paramèt li yo:
$ ./kubelet -h
<слишком много строк, чтобы разместить здесь>
$ ./kubelet -h | wc -l
284
Wow, anpil opsyon! Erezman, nou sèlman bezwen yon koup nan yo. Isit la se youn nan paramèt yo ke nou enterese nan:
--pod-manifest-path string
Chemen nan anyè ki genyen fichye pou gous estatik, oswa chemen nan yon dosye ki dekri gous estatik. Fichye ki kòmanse ak pwen yo inyore. (DEPREKE: Opsyon sa a dwe mete nan fichye konfigirasyon an pase nan Kubelet atravè opsyon --config la. Pou plis enfòmasyon, gade kubernetes.io/docs/tasks/administer-cluster/kubelet-config-file .)
Opsyon sa a pèmèt nou kouri gous estatik — gous ki pa jere atravè API Kubernetes. Gous estatik yo raman itilize, men yo trè pratik pou byen vit ogmante yon grap, e sa a se egzakteman sa nou bezwen. Nou pral inyore gwo avètisman sa a (ankò, pa kouri sa a nan pwodiksyon!) epi wè si nou ka jwenn gous la kouri.
Premye nou pral kreye yon anyè pou gous estatik epi kouri kubelet:
kubelet kòmanse ekri kèk avètisman epi li sanble pa gen anyen k ap pase. Men sa pa vre! Ann gade nan 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 Mwen li manifis gous la epi mwen te bay Docker kòmandman pou lanse yon koup kontenè dapre espesifikasyon nou yo. (Si w ap mande sou veso "poz la", li se yon Hack Kubernetes - gade blog sa a.) Kubelet pral lanse veso nou an busybox ak lòd espesifye a epi yo pral rekòmanse li endefiniman jiskaske gous estatik la efase.
Felisitasyon tèt ou. Nou jis te vini ak youn nan fason ki pi konfizyon yo pwodiksyon tèks nan tèminal la!
Lanse etcd
Objektif final nou an se kouri API Kubernetes, men pou fè sa nou bezwen kouri elatriye. Ann kòmanse yon gwoup minim etcd pa mete paramèt li yo nan anyè gous la (pa egzanp, pods/etcd.yaml):
Si ou te janm travay ak Kubernetes, dosye YAML sa yo ta dwe abitye pou ou. Genyen sèlman de pwen ki vo anyen isit la:
Nou te monte Katab lame a /var/lib/etcd nan gous la pou done etcd yo konsève apre yon rekòmanse (si sa pa fèt, eta gwoup la pral efase chak fwa gous la rekòmanse, ki pa pral bon pou menm yon enstalasyon Kubernetes minim).
Nou te enstale hostNetwork: true. Anviwònman sa a, san sipriz, configured etcd pou itilize rezo lame a olye pou rezo entèn gous la (sa ap rann li pi fasil pou sèvè API a jwenn gwoup etcd la).
Yon chèk senp montre ke etcd ap kouri sou localhost epi sove done sou 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
Kòmanse sèvè API a
Kouri yon sèvè API Kubernetes se menm pi fasil. Sèl paramèt ki bezwen pase se --etcd-servers, fè sa ou espere:
Mete fichye YAML sa a nan anyè a pods, ak sèvè API a ap kòmanse. Tcheke ak curl montre ke API Kubernetes ap koute sou pò 8080 ak aksè konplètman ouvè - pa gen okenn otantifikasyon obligatwa!
(Ankò, pa kouri sa a nan pwodiksyon! Mwen te yon ti kras etone ke anviwònman an default se konsa ensekirite. Men, mwen devine sa a se fè devlopman ak tès pi fasil.)
Epi, bèl sipriz, kubectl travay soti nan bwat la san okenn anviwònman adisyonèl!
$ ./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.
pwoblèm
Men, si ou fouye yon ti kras pi fon, yon bagay sanble ap mal pase:
$ ./kubectl get pod -n kube-system
No resources found in kube-system namespace.
Gous estatik nou te kreye yo disparèt! An reyalite, ne kubelet nou an pa dekouvri ditou:
$ ./kubectl get nodes
No resources found in default namespace.
Ki pwoblèm nan? Si w sonje kèk paragraf de sa, nou te kòmanse kubelet la ak yon seri paramèt liy kòmand trè senp, kidonk kubelet la pa konnen ki jan yo kontakte sèvè API a epi fè li konnen eta li. Apre etidye dokiman an, nou jwenn drapo ki koresponn lan:
--kubeconfig string
Chemen nan dosye a kubeconfig, ki presize kijan pou konekte avèk sèvè API a. Disponibilite --kubeconfig pèmèt mòd sèvè API, non --kubeconfig pèmèt mòd offline.
Pandan tout tan sa a, san yo pa konnen li, nou te kouri kubelet la nan "mòd offline." (Si nou te pedantik, nou ta ka panse a yon kubelet otonòm kòm "minimòm Kubernetes solid", men sa ta trè raz). Pou fè "reyèl" konfigirasyon an travay, nou bezwen pase fichye kubeconfig nan kubelet la pou li konnen ki jan yo pale ak sèvè a API. Erezman, li se byen senp (piske nou pa gen okenn pwoblèm otantifikasyon oswa sètifika):
(Bon wout la, si ou eseye jwenn aksè nan API a atravè boukl lè kubelet la pa kouri, ou pral jwenn ke li toujou ap kouri! Kubelet se pa yon "paran" nan gous li yo tankou Docker, li se plis tankou yon "kontwòl. demon.” Kontenè ki jere pa yon kubelet ap kontinye kouri jiskaske kubelet la sispann yo.)
Nan kèk minit kubectl ta dwe montre nou gous yo ak nœuds jan nou espere:
$ ./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
Se pou nou vrèman felisite tèt nou fwa sa a (mwen konnen mwen deja felisite tèt nou) - nou gen yon "gwoup" Kubernetes minim kouri ak yon API konplètman fonksyonèl!
Nou lanse anba
Koulye a, kite a wè ki sa API a se kapab. Ann kòmanse ak pod la nginx:
$ ./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.
Isit la nou wè ki jan malkonplè anviwònman Kubernetes nou an se - nou pa gen okenn kont pou sèvis yo. Ann eseye ankò pa manyèlman kreye yon kont sèvis epi wè sa k ap pase:
$ 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
Menm lè nou te kreye kont sèvis la manyèlman, siy otantifikasyon an pa pwodwi. Pandan n ap kontinye fè eksperyans ak "gwoup" minimalist nou an, n ap jwenn pifò bagay itil ki nòmalman rive otomatikman pral manke. Sèvè API Kubernetes se byen minimalist, ak pi fò nan leve lou ak konfigirasyon otomatik k ap pase nan plizyè contrôleur ak travay background ki poko kouri.
Nou ka travay sou pwoblèm sa a pa mete opsyon an automountServiceAccountToken pou kont sèvis la (piske nou p ap oblije sèvi ak li de tout fason):
$ 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
Finalman, gous la te parèt! Men, an reyalite li pa pral kòmanse paske nou pa genyen planifikatè (planifikatè) se yon lòt eleman enpòtan nan Kubernetes. Ankò, nou wè ke Kubernetes API a se etonan "bèbè" - lè ou kreye yon Pod nan API a, li anrejistre li, men li pa eseye konnen ki ne pou kouri li sou.
An reyalite, ou pa bezwen yon pwogramè pou kouri yon gous. Ou ka manyèlman ajoute yon ne nan manifest la nan paramèt la nodeName:
(Ranplase mink8s nan non ne a.) Apre efase epi aplike, nou wè ke nginx te kòmanse epi li ap koute adrès IP entèn la:
$ ./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>
Pou asire w ke rezo ki genyen ant gous yo ap travay kòrèkteman, nou ka kouri curl soti nan yon lòt gous:
$ 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>
Li se byen enteresan yo fouye nan anviwònman sa a epi wè sa ki travay ak sa ki pa. Mwen te jwenn ke ConfigMap ak sekrè travay jan yo espere, men Sèvis ak Deplwaman pa fè sa.
Siksè!
Pòs sa a ap vin long, kidonk mwen pral deklare viktwa epi di ke sa a se yon konfigirasyon solid ki ka rele "Kubernetes". Pou rezime: kat binè, senk paramèt liy lòd ak "sèlman" 45 liy YAML (pa sa anpil selon estanda Kubernetes) e nou gen anpil bagay k ap travay:
Yo jere gous lè l sèvi avèk API Kubernetes regilye (ak kèk antay)
Ou ka telechaje ak jere imaj veso piblik yo
Gous rete vivan epi rekòmanse otomatikman
Rezo ant gous nan menm ne a ap travay byen
ConfigMap, sekrè ak senp depo aliye travay jan yo espere
Men, anpil nan sa ki fè Kubernetes vrèman itil toujou manke, tankou:
Pod Scheduler
Otantifikasyon/otorizasyon
Plizyè nœuds
Rezo sèvis yo
Gwoup DNS entèn yo
Kontwolè pou kont sèvis, deplwaman, entegrasyon ak founisè nwaj yo ak pi fò nan lòt bagay ki Kubernetes pote
Se konsa, ki sa nou te aktyèlman jwenn? API Kubernetes, kouri pou kont li, se reyèlman jis yon platfòm pou automatisation veso. Li pa fè anpil bagay - se yon travay pou plizyè contrôleur ak operatè ki itilize API a - men li bay yon anviwònman ki konsistan pou automatisation.