Minimòm Viable Kubernetes

Tradiksyon atik la te prepare lavèy kòmansman kou a "Prattik ak zouti DevOps".

Minimòm Viable Kubernetes

Si w ap li sa a, ou te pwobableman tande yon bagay sou Kubernetes (e si se pa sa, ki jan ou te fini isit la?) Men, ki sa egzakteman Kubernetes ye? Sa a "Okstasyon kontenè endistriyèl yo"? Oswa "Sistèm Operasyon Cloud-Native"? Kisa sa vle di menm?

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:

Minimòm Viable Kubernetes

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:

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

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.

$ 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

Kisa k ap pase si nou jis kouri kubelet?

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

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:

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

Lè sa a, nan yon lòt tèminal / tmux fenèt / kèlkeswa sa, nou pral kreye yon manifest gous:

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

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

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

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:

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

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!

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

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

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

Sove sa a kòm kubeconfig.yaml, touye pwosesis la kubelet epi rekòmanse ak paramèt ki nesesè yo:

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

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

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

Isit la nou jwenn yon erè trè enteresan:

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

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

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

Aprann plis sou kou a nan webinar gratis la.

Li piplis:

Sous: www.habr.com

Add nouvo kòmantè