Kubernetes so-ruigsinneach as ìsle

Chaidh an eadar-theangachadh den artaigil ullachadh air an oidhche ro thoiseach a’ chùrsa "Cleachdaidhean agus innealan DevOps".

Kubernetes so-ruigsinneach as ìsle

Ma tha thu a’ leughadh seo, is dòcha gu bheil thu air rudeigin a chluinntinn mu Kubernetes (agus mura h-eil, ciamar a thàinig thu gu crìch an seo?) ach dè dìreach a th’ ann an Kubernetes? Seo “Orchestration de shoithichean ìre gnìomhachais”? Air neo "Cloud-Siostam-obrachaidh Dùthchasach"? Dè tha seo eadhon a’ ciallachadh?

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:

Kubernetes so-ruigsinneach as ìsle

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.

Fuaimean sìmplidh gu leòr. Dè mu dheidhinn amannan ruith container (ùine ruith container)?

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:

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

À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.

$ 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

Dè thachras ma tha sinn dìreach a 'ruith kubelet?

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

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:

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

An uairsin, ann an uinneag terminal / tmux eile / ge bith dè, cruthaichidh sinn 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 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):

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

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:

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

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!

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

(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):

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

Sàbhail seo mar kubeconfig.yaml, am pròiseas a mharbhadh kubelet agus ath-thòiseachadh leis na paramadairean riatanach:

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

(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:

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

An seo gheibh sinn mearachd caran inntinneach:

$ ./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:

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

(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.

Ionnsaich tuilleadh mun chùrsa anns an webinar an-asgaidh.

Leugh tuilleadh:

Source: www.habr.com

Cuir beachd ann