Gus a bhith onarach, chan eil mi 100% cinnteach. Ach tha mi a’ smaoineachadh gu bheil e inntinneach a bhith a’ cladhach a-steach don taobh a-staigh agus faicinn dè dha-rìribh a tha a’ dol air adhart ann an Kubernetes fo na mòran shreathan de tharraingean. Mar sin dìreach airson spòrs, leig dhuinn sùil a thoirt air cò ris a tha “Cruinneachadh Kubernetes” glè bheag coltach. (Bidh seo tòrr nas fhasa na Kubernetes an dòigh chruaidh a.)
Tha mi a’ gabhail ris gu bheil eòlas bunaiteach agad air Kubernetes, Linux, agus soithichean. Tha a h-uile dad air a bheil sinn a’ bruidhinn an seo airson adhbharan rannsachaidh / ionnsachaidh a-mhàin, na cuir gin dheth gu cinneasachadh!
sealladh farsaing
Tha mòran phàirtean ann an Kubernetes. A rèir Uicipeid, tha an ailtireachd a’ coimhead mar seo:
Tha co-dhiù ochd pàirtean air an sealltainn an seo, ach bheir sinn an aire don mhòr-chuid dhiubh. Tha mi airson a ràdh gu bheil an rud as lugha a dh'fhaodar ainmeachadh gu reusanta Kubernetes air a dhèanamh suas de thrì prìomh phàirtean:
cuileag
kube-apiserver (a tha an urra ri msaa - an stòr-dàta aige)
ùine ruith container (Docker sa chùis seo)
Chì sinn dè tha na sgrìobhainnean ag ràdh mu gach fear dhiubh (rus., Sasannach.). An toiseach cuileag:
Neach-ionaid a 'ruith air gach nód anns a' bhraisle. Bidh e a’ dèanamh cinnteach gu bheil soithichean a’ ruith anns a’ pod.
Is e prògram a th’ ann an ùine ruith container a chaidh a dhealbhadh gus soithichean a ruith.
Gu math fiosrachail. Ach ma tha thu eòlach air Docker, bu chòir dhut beachd coitcheann a bhith agad air dè a nì e. (Tha am mion-fhiosrachadh mu sgaradh dhleastanasan eadar àm ruith an t-soithich agus an kubelet gu math seòlta agus cha tèid mi a-steach annta an seo.)
И frithealaiche API?
Is e API Server am pàirt pannal smachd Kubernetes a tha a’ nochdadh API Kubernetes. Is e am frithealaiche API taobh teachdaiche pannal smachd Kubernetes
Feumaidh neach sam bith a rinn dad a-riamh le Kubernetes eadar-obrachadh leis an API gu dìreach no tro kubectl. Is e seo cridhe na tha a’ toirt air Kubernetes Kubernetes - an eanchainn a thionndaidheas beanntan YAML air a bheil sinn uile eòlach agus measail (?) gu bhith na bhun-structar obrach. Tha e follaiseach gum bu chòir an API a bhith an làthair anns an rèiteachadh as lugha againn.
Ro-òrdughan
Inneal brìgheil no corporra Linux le ruigsinneachd freumh (tha mi a’ cleachdadh Ubuntu 18.04 air inneal brìgheil).
Agus tha e uile!
Stàladh doirbh
Feumaidh sinn Docker a stàladh air an inneal a chleachdas sinn. (Chan eil mi a’ dol a-steach gu mion-fhiosrachadh mu mar a bhios Docker agus soithichean ag obair; ma tha ùidh agad, tha artaigilean iongantach). Leig leinn dìreach a stàladh le apt:
Às deidh sin, feumaidh sinn binaries Kubernetes fhaighinn. Gu dearbh, airson an “cnuasach” againn a chuir air bhog an toiseach chan fheum sinn ach kubelet, oir airson co-phàirtean frithealaiche eile a ruith as urrainn dhuinn a chleachdadh kubelet. Gus eadar-obrachadh leis a’ bhuidheann againn às deidh dha a bhith a’ ruith, cleachdaidh sinn cuideachd kubectl.
kubelet feumaidh e ruith mar fhreumh. Gu math loidsigeach, oir feumaidh e an nód gu lèir a riaghladh. Bheir sinn sùil air na paramadairean aige:
$ ./kubelet -h
<слишком много строк, чтобы разместить здесь>
$ ./kubelet -h | wc -l
284
Wow, uiread de roghainnean! Gu fortanach, chan fheum sinn ach beagan dhiubh. Seo aon de na paramadairean anns a bheil ùidh againn:
--pod-manifest-path string
Slighe chun eòlaire anns a bheil faidhlichean airson pods statach, no slighe gu faidhle a’ toirt cunntas air pods statach. Bithear a’ seachnadh fhaidhlichean a’ tòiseachadh le dotagan. (DEARBHACHADH: Feumaidh an roghainn seo a bhith air a shuidheachadh anns an fhaidhle rèiteachaidh a thèid chun Kubelet tron roghainn --config. Airson tuilleadh fiosrachaidh, faic kubernetes.io/docs/tasks/administer-cluster/kubelet-config-file .)
Leigidh an roghainn seo leinn ruith pods statach - pods nach eil air an riaghladh tro Kubernetes API. Is ann ainneamh a thathas a ’cleachdadh pods statach, ach tha iad gu math goireasach airson cruinneachadh a thogail gu sgiobalta, agus is e seo dìreach a dh’ fheumas sinn. Bheir sinn seachad an rabhadh mòr seo (a-rithist, na ruith seo ann an riochdachadh!) agus feuch an urrainn dhuinn an pod a ruith.
An toiseach cruthaichidh sinn eòlaire airson pods statach agus ruith kubelet:
kubelet tòiseachadh a’ sgrìobhadh rabhaidhean agus tha e coltach nach eil dad a’ tachairt. Ach chan eil sin fìor! Bheir sinn sùil air 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 Leugh mi am pod follaiseach agus thug mi òrdugh do Docker dà shoitheach a chuir air bhog a rèir ar mion-chomharrachadh. (Ma tha thu a’ faighneachd mun t-soitheach “stad", is e hack Kubernetes a th’ ann - faic am bloga seo.) Cuiridh Kubelet an soitheach againn air bhog busybox leis an àithne ainmichte agus ath-thòisichidh e e gu bràth gus an tèid am pod statach a dhubhadh às.
Mealaibh ur naidheachd. Tha sinn dìreach air aon de na dòighean as troimh-chèile a chruthachadh gus teacsa a chuir a-mach chun cheann-uidhe!
Cur air bhog etcd
Is e ar n-amas deireannach an Kubernetes API a ruith, ach airson sin a dhèanamh feumaidh sinn ruith an toiseach etc. Nach tòisich sinn air cruinneachadh beag msaa le bhith a’ cur a roghainnean anns an eòlaire pods (mar eisimpleir, pods/etcd.yaml):
Ma bha thu a-riamh ag obair le Kubernetes, bu chòir gum biodh na faidhlichean YAML seo eòlach ort. Chan eil ach dà phuing ri thoirt fa-near an seo:
Tha sinn air am pasgan aoigheachd a chuir suas /var/lib/etcd anns a’ pod gus am bi an dàta msaa air a ghleidheadh às deidh ath-thòiseachadh (mura tèid seo a dhèanamh, thèid an stàit brabhsair a dhubhadh às a h-uile uair a thèid am pod ath-thòiseachadh, rud nach bi math airson eadhon stàladh beag Kubernetes).
Tha sinn air a stàladh hostNetwork: true. Chan eil e na iongnadh gu bheil an suidheachadh seo a’ rèiteachadh msaa gus an lìonra aoigheachd a chleachdadh an àite lìonra a-staigh a’ pod (bidh seo ga dhèanamh nas fhasa don t-seirbheisiche API an cruinneachadh etcd a lorg).
Tha sgrùdadh sìmplidh a’ sealltainn gu bheil etcd gu dearbh a’ ruith air localhost agus a’ sàbhaladh dàta gu diosc:
$ 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
A 'tòiseachadh air an fhrithealaiche API
Tha e eadhon nas fhasa seirbheisiche Kubernetes API a ruith. Is e an aon paramadair a dh'fheumar a dhol seachad --etcd-servers, dèan na tha thu an dùil:
Cuir am faidhle YAML seo san eòlaire pods, agus tòisichidh am frithealaiche API. A’ sgrùdadh le curl sealltainn gu bheil an Kubernetes API ag èisteachd air port 8080 le ruigsinneachd gu tur fosgailte - chan eil feum air dearbhadh!
(A-rithist, na ruith seo ann an cinneasachadh! Chuir e iongnadh orm gu bheil an suidheachadh bunaiteach cho mì-chinnteach. Ach tha mi creidsinn gu bheil seo airson leasachadh agus deuchainn a dhèanamh nas fhasa.)
Agus, iongnadh tlachdmhor, bidh kubectl ag obair a-mach às a’ bhogsa gun shuidheachaidhean a bharrachd!
$ ./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.
duilgheadas
Ach ma chladhaicheas tu beagan nas doimhne, tha coltas gu bheil rudeigin a’ dol ceàrr:
$ ./kubectl get pod -n kube-system
No resources found in kube-system namespace.
Tha na pods statach a chruthaich sinn air falbh! Gu dearbh, chan eil an nód kubelet againn air a lorg idir:
$ ./kubectl get nodes
No resources found in default namespace.
Dè tha ceàrr? Ma chuimhnicheas tu beagan pharagrafan air ais, thòisich sinn air an kubelet le seata fìor shìmplidh de pharamadairean loidhne-àithne, agus mar sin chan eil fios aig an kubelet ciamar a chuireas tu fios chun t-seirbheisiche API agus fios a chuir thuige mun stàit aige. Às deidh dhuinn na sgrìobhainnean a sgrùdadh, lorg sinn am bratach co-fhreagarrach:
--kubeconfig string
An t-slighe chun an fhaidhle kubeconfig, a tha a 'sònrachadh mar a nì thu ceangal ris an fhrithealaiche API. Ri fhaotainn --kubeconfig a’ comasachadh modh frithealaiche API, chan eil --kubeconfig a’ comasachadh modh far-loidhne.
Fad na h-ùine seo, gun fhios dha, bha sinn a’ ruith an kubelet ann am “modh far-loidhne.” (Nam biodh sinn a’ faighinn pedantic, dh’ fhaodadh sinn smaoineachadh air kubelet leis fhèin mar “Kubernetes obrachail as ìsle”, ach bhiodh sin gu math dòrainneach). Gus am bi an rèiteachadh “fìor” ag obair, feumaidh sinn am faidhle kubeconfig a chuir chun kubelet gus am bi fios aige mar a bhruidhneas tu ris an fhrithealaiche API. Gu fortanach tha e gu math sìmplidh (leis nach eil cùisean dearbhaidh no teisteanais againn):
(Co-dhiù, ma dh’ fheuchas tu ri faighinn chun API tro curl nuair nach eil an kubelet a’ ruith, gheibh thu a-mach gu bheil e fhathast a’ ruith! Chan e “pàrant” a th’ ann an Kubelet de na pods aige mar Docker, tha e nas coltaiche ri “smachd deamhan.” Leanaidh soithichean air an riaghladh le kubelet a’ ruith gus an stad an kubelet iad.)
Ann am beagan mhionaidean kubectl bu chòir dhuinn na pods agus na nodan a shealltainn dhuinn mar a tha sinn an dùil:
$ ./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
Feuch an cuir sinn meal-a-naidheachd oirnn fhìn an turas seo (tha fios agam gun do chuir mi meal-a-naidheachd oirnn fhìn mar-thà) - tha “cnuasach” beag Kubernetes againn a’ ruith le API làn-ghnìomhach!
Bidh sinn a 'cur air bhog fo
A-nis chì sinn dè as urrainn don API. Feuch an tòisich sinn leis a’ pod 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.
An seo chì sinn cho neo-choileanta sa tha an àrainneachd Kubernetes againn - chan eil cunntasan againn airson seirbheisean. Feuchaidh sinn a-rithist le bhith a’ cruthachadh cunntas seirbheis le làimh agus faic dè thachras:
$ 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
Fiù nuair a chruthaich sinn an cunntas seirbheis le làimh, chan eil an comharra dearbhaidh air a chruthachadh. Mar a bhios sinn a’ leantainn air adhart a’ feuchainn ris a’ “chnuasach” as lugha againn, gheibh sinn a-mach gum bi a’ mhòr-chuid de na rudan feumail a bhios a’ tachairt gu fèin-obrachail a dhìth. Tha frithealaiche Kubernetes API gu math ìosal, leis a’ mhòr-chuid de thogail trom agus rèiteachadh fèin-ghluasadach a ’tachairt ann an grunn luchd-riaghlaidh agus obraichean cùl-fhiosrachaidh nach eil fhathast a’ ruith.
Faodaidh sinn obrachadh timcheall air an duilgheadas seo le bhith a 'suidheachadh an roghainn automountServiceAccountToken airson a’ chunntas seirbheis (leis nach fheum sinn a chleachdadh co-dhiù):
$ 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
Mu dheireadh, tha am pod air nochdadh! Ach gu dearbh cha tòisich e oir chan eil sin againn planner (clàraiche) na phàirt chudromach eile de Kubernetes. A-rithist, chì sinn gu bheil an Kubernetes API iongantach “balbh” - nuair a chruthaicheas tu Pod san API, bidh e ga chlàradh, ach cha bhith e a’ feuchainn ri faighinn a-mach dè an nód airson a ruith.
Gu dearbh, chan fheum thu clàr-ama airson pod a ruith. Faodaidh tu nód a chuir ris a’ bhileig sa pharameter le làimh nodeName:
(Cuir an àite mink8s gu ainm an nód.) Às deidh cuir às agus cuir an sàs, chì sinn gu bheil nginx air tòiseachadh agus ag èisteachd ris an t-seòladh IP a-staigh:
$ ./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>
Gus dèanamh cinnteach gu bheil an lìonra eadar pods ag obair gu ceart, is urrainn dhuinn curl a ruith bho pod eile:
$ 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>
Tha e gu math inntinneach a bhith a’ cladhach a-steach don àrainneachd seo agus faicinn dè tha ag obair agus dè nach eil. Fhuair mi a-mach gu bheil ConfigMap agus Secret ag obair mar a bha dùil, ach chan eil Seirbheis is Cleachdadh.
Soirbheachas!
Tha an dreuchd seo a’ fàs fada, agus mar sin tha mi a’ dol a dh’ ainmeachadh buaidh agus ag ràdh gur e rèiteachadh obrachail a tha seo a dh’ fhaodar ainmeachadh mar “Kubernetes”. tha sin mòran a rèir inbhean Kubernetes) agus tha grunn rudan ag obair againn:
Tha pods air an riaghladh a’ cleachdadh an Kubernetes API cunbhalach (le beagan hacks)
Faodaidh tu dealbhan de shoithichean poblach a luchdachadh suas agus a riaghladh
Bidh pods a’ fuireach beò agus ag ath-thòiseachadh gu fèin-ghluasadach
Tha lìonrachadh eadar pods taobh a-staigh an aon nód ag obair gu math
ConfigMap, obair gleidhidh stòraidh dìomhair agus sìmplidh mar a bhiodh dùil
Ach tha mòran de na tha a’ dèanamh Kubernetes dha-rìribh feumail fhathast a dhìth, leithid:
Clàr-ama pod
Dearbhadh/ùghdarrachadh
Ioma nodan
Lìonra de sheirbheisean
DNS a-staigh cruinnichte
Rianadairean airson cunntasan seirbheis, cleachdadh, amalachadh le solaraichean sgòthan agus a’ mhòr-chuid de na rudan math eile a bheir Kubernetes
Mar sin dè a fhuair sinn dha-rìribh? Chan eil ann an Kubernetes API, a tha a’ ruith leis fhèin, ach àrd-ùrlar airson fèin-ghluasad container. Cha bhith e a’ dèanamh mòran - is e obair a th’ ann airson diofar luchd-riaghlaidh agus ghnìomhaichean a’ cleachdadh an API - ach tha e a’ toirt seachad àrainneachd chunbhalach airson fèin-ghluasad.