Ҳадди ақали Kubernetes қобили қобили истифода

Тарҷумаи мақола дар арафаи оғози курс омода шудааст "Амалҳо ва асбобҳои DevOps".

Ҳадди ақали Kubernetes қобили қобили истифода

Агар шумо инро хонда истода бошед, шумо эҳтимол дар бораи Кубернетес чизе шунидаед (ва агар не, шумо чӣ гуна ба ин ҷо расидед?) Аммо Кубернетес маҳз чист? Ин "Оркестри контейнерҳои дараҷаи саноатӣ"? Ё "Системаи амалиётии абрӣ"? Ин ҳатто чӣ маъно дорад?

Рости гап, ман 100% боварӣ надорам. Аммо ман фикр мекунам, ки кофтукови дохилӣ ва дидани он, ки воқеан дар Кубернетес зери қабатҳои абстраксияҳои он чӣ мегузарад, ҷолиб аст. Пас, танҳо барои фароғат, биёед бубинем, ки ҳадди ақалли "кластери Кубернетес" воқеан чӣ гуна аст. (Ин нисбат ба он хеле осонтар хоҳад буд Кубернетес роҳи душвор.)

Ман гумон мекунам, ки шумо дар бораи Kubernetes, Linux ва контейнерҳо дониши асосӣ доред. Ҳама чизе, ки мо дар ин ҷо гап мезанем, танҳо барои тадқиқот/омӯзиш аст, ҳеҷ як аз онро дар истеҳсолот нагузоред!

шарҳ

Kubernetes ҷузъҳои зиёдеро дар бар мегирад. Бино бар Википедия, меъморӣ чунин менамояд:

Ҳадди ақали Kubernetes қобили қобили истифода

Дар ин ҷо ҳадди аққал ҳашт ҷузъ нишон дода шудааст, аммо мо аксарияти онҳоро нодида мегирем. Ман мехоҳам изҳор намоям, ки ҳадди аққал чизеро, ки онро Кубернетес номидан мумкин аст, аз се ҷузъи асосӣ иборат аст:

  • кубелет
  • kube-apiserver (ки аз etcd вобаста аст - базаи он)
  • вақти кории контейнер (Дар ин ҳолат Docker)

Биёед бубинем, ки ҳуҷҷатҳо дар бораи ҳар яки онҳо чӣ мегӯянд (рус., Англисӣ.). Дар аввал кубелет:

Агенте, ки дар ҳар як гиреҳи кластер кор мекунад. Он боварӣ ҳосил мекунад, ки контейнерҳо дар қуттиҳо кор мекунанд.

Ба қадри кофӣ оддӣ садо медиҳад. Дар бораи чӣ? мӯҳлати кори контейнер (вақти кори контейнер)?

Вақти иҷроиши контейнер барномаест, ки барои идора кардани контейнерҳо пешбинӣ шудааст.

Хеле иттилоотӣ. Аммо агар шумо бо Docker шинос бошед, пас шумо бояд дар бораи он ки он чӣ кор мекунад, тасаввуроти умумӣ дошта бошед. (Тафсилоти тақсими масъулиятҳо байни вақти кори контейнер ва кубелет воқеан хеле нозуканд ва ман дар ин ҷо ба онҳо намеравам.)

И сервери API?

API Server ҷузъи панели идоракунии Kubernetes мебошад, ки API-и Kubernetes-ро фош мекунад. Сервери API тарафи муштарии панели идоракунии Kubernetes мебошад

Ҳар касе, ки бо Kubernetes коре карда бошад, бояд бо API мустақиман ё тавассути kubectl муошират кунад. Ин дили он чизест, ки Кубернетес Кубернетес - мағзи сарест, ки кӯҳҳои YAML-ро ҳамаи мо медонем ва дӯст медорем (?) ба инфрасохтори корӣ табдил медиҳад. Чунин ба назар мерасад, ки API бояд дар конфигуратсияи ҳадди ақали мо мавҷуд бошад.

Шартҳои пешакӣ

  • Мошини виртуалӣ ё физикии Linux бо дастрасии реша (ман Ubuntu 18.04-ро дар мошини виртуалӣ истифода мебарам).
  • Ва ин ҳама!

Насбкунии дилгиркунанда

Мо бояд Docker-ро дар мошине, ки мо истифода мебарем, насб кунем. (Ман дар бораи чӣ гуна кор кардани Docker ва контейнерҳо тафсилот намедиҳам; агар шумо таваҷҷӯҳ дошта бошед, вуҷуд дорад мақолаҳои аҷиб). Биёед онро танҳо бо он насб кунем apt:

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

Пас аз он, мо бояд бинарҳои Kubernetes гирем. Дарвоқеъ, барои оғози ибтидоии "кластер" ба мо танҳо лозим аст kubelet, зеро барои иҷро кардани ҷузъҳои дигари сервер мо метавонем истифода барем kubelet. Барои муошират бо кластери мо пас аз кор кардани он, мо низ истифода хоҳем кард 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

Чӣ мешавад, агар мо танҳо давем kubelet?

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

kubelet бояд ҳамчун реша кор кунад. Хеле мантиқӣ, зеро ӯ бояд тамоми гиреҳро идора кунад. Биёед ба параметрҳои он назар андозем:

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

Вой, имконоти зиёде! Хушбахтона, ба мо танҳо як ҷуфти онҳо лозим аст. Ин аст яке аз параметрҳое, ки мо ба онҳо таваҷҷӯҳ дорем:

--pod-manifest-path string

Роҳ ба директорияе, ки дорои файлҳо барои pods статикӣ, ё роҳ ба файле, ки тавзеҳҳои статикӣ. Файлҳое, ки бо нуқта сар мешаванд, сарфи назар карда мешаванд. (ҚАТЪ КАРДА ШУД: Ин хосият бояд дар файли конфигуратсияе, ки тавассути опсияи --config ба Kubelet интиқол дода шудааст, насб карда шавад. Барои маълумоти бештар нигаред. kubernetes.io/docs/tasks/administer-cluster/kubelet-config-file .)

Ин хосият ба мо имкон медиҳад, ки кор кунем қуттиҳои статикӣ — поддонҳое, ки тавассути API Kubernetes идора карда намешаванд. Подшоҳҳои статикӣ хеле кам истифода мешаванд, аммо онҳо барои зуд баланд бардоштани кластер хеле қулайанд ва маҳз ҳамин чиз ба мо лозим аст. Мо ин огоҳии бузургро нодида мегирем (боз ин корро дар истеҳсолот иҷро накунед!) ва бубинед, ки оё мо подборро ба кор андохта метавонем.

Аввалан мо директорияро барои подкҳои статикӣ эҷод мекунем ва иҷро мекунем kubelet:

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

Сипас, дар дигар терминал/равзанаи tmux/ҳар чи бошад, мо як манифести подшоиро эҷод мекунем:

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

kubelet ба навиштани баъзе огоҳиҳо шурӯъ мекунад ва ба назар чунин менамояд, ки ҳеҷ чиз рӯй намедиҳад. Аммо ин дуруст нест! Биёед ба 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 Ман манифестро хондам ва Docker фармон додам, ки мувофиқи мушаххасоти мо якчанд контейнерро ба кор андозанд. (Агар шумо дар бораи контейнери "пауза" дар ҳайрат бошед, ин хаки Kubernetes аст - нигаред ин блог.) Кубелет контейнери моро ба кор меандозад busybox бо фармони муайяншуда ва онро ба таври номуайян аз нав оғоз мекунад, то он даме, ки подтаи статикӣ нест карда шавад.

Худатонро табрик кунед. Мо танҳо яке аз роҳҳои печидатарини баровардани матнро ба терминал пайдо кардем!

Оғози ва ғайра

Ҳадафи ниҳоии мо иҷро кардани API-и Kubernetes аст, аммо барои ин мо аввал бояд кор кунем ва ғайра. Биёед кластери минималии etcd-ро бо гузоштани танзимоти он дар директорияи pods оғоз кунем (масалан, 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

Агар шумо боре бо Kubernetes кор карда бошед, ин файлҳои YAML бояд ба шумо шинос бошанд. Дар ин ҷо танҳо ду нукта қобили таваҷҷӯҳ аст:

Мо папкаи мизбонро насб кардем /var/lib/etcd дар pod, то ки маълумоти etcd пас аз бозоғозӣ нигоҳ дошта шавад (агар ин иҷро нашавад, ҳолати кластер ҳар дафъае, ки подкаст аз нав оғоз мешавад, нест карда мешавад, ки ин ҳатто барои насби ҳадди ақали Kubernetes хуб нахоҳад буд).

Мо насб кардем hostNetwork: true. Ин танзимот, тааҷҷубовар нест, ки etcd-ро барои истифодаи шабакаи ҳост ба ҷои шабакаи дохилии подкаст конфигуратсия мекунад (ин барои сервери API пайдо кардани кластери etcdро осонтар мекунад).

Санҷиши оддӣ нишон медиҳад, ки etcd воқеан дар localhost кор мекунад ва маълумотро дар диск нигоҳ медорад:

$ 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

Оғози сервери API

Иҷрои сервери API Kubernetes боз ҳам осонтар аст. Ягона параметре, ки бояд гузарад --etcd-servers, он чизеро, ки шумо интизоред, иҷро мекунад:

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

Ин файли YAML-ро дар директория ҷойгир кунед pods, ва сервери API оғоз мешавад. Тафтиш бо curl нишон медиҳад, ки API Kubernetes порти 8080-ро бо дастрасии комилан кушода гӯш мекунад - аутентификатсия лозим нест!

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

(Боз ин корро дар истеҳсолот иҷро накунед! Ман каме ҳайрон шудам, ки танзимоти пешфарз ин қадар бехатар аст. Аммо ман гумон мекунам, ки ин барои осон кардани таҳия ва озмоиш аст.)

Ва ногаҳонии гуворо, kubectl аз қуттӣ бе ягон танзимоти иловагӣ кор мекунад!

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

проблема

Аммо агар шумо каме амиқтар кобед, ба назар чунин мерасад, ки чизе нодуруст аст:

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

Пойгоҳҳои статикие, ки мо офаридаем, нест шуданд! Дар асл, гиреҳи кубелети мо умуман кашф нашудааст:

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

Чӣ гап? Агар шумо чанд параграфро дар хотир доред, мо кубелетро бо маҷмӯи бениҳоят оддии параметрҳои сатри фармон оғоз кардем, аз ин рӯ кубелет намедонад, ки чӣ тавр бо сервери API тамос гирифта, онро аз ҳолати худ огоҳ созад. Пас аз омӯзиши ҳуҷҷатҳо, мо парчами мувофиқро пайдо мекунем:

--kubeconfig string

Роҳ ба файл kubeconfig, ки чӣ тавр ба сервери API пайваст шуданро муайян мекунад. Мавҷудият --kubeconfig режими сервери API-ро фаъол мекунад, № --kubeconfig ҳолати офлайнро фаъол мекунад.

Дар тӯли ин вақт, мо бехабар аз он, мо кубелетро дар "режими офлайнӣ" иҷро мекардем. (Агар мо педантик мебудем, мо метавонистем кубелети мустақилро ҳамчун "кубернетҳои ҳадди ақалли қобили ҳаёт" тасаввур кунем, аммо ин хеле дилгиркунанда мебуд). Барои кор кардани конфигуратсияи "воқеӣ", мо бояд файли kubeconfig-ро ба kubelet гузаронем, то он донад, ки чӣ гуна бо сервери API сӯҳбат кардан мумкин аст. Хушбахтона, ин хеле содда аст (зеро мо бо аутентификатсия ё сертификатҳо ягон мушкилот надорем):

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

Инро ҳамчун захира кунед kubeconfig.yaml, процессро кушед kubelet ва бо параметрҳои зарурӣ аз нав оғоз кунед:

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

(Дар омади гап, агар шумо кӯшиш кунед, ки ба API тавассути curl дастрасӣ пайдо кунед, вақте ки kubelet кор намекунад, шумо хоҳед дид, ки он ҳоло ҳам кор мекунад! Кубелет "волидайн"-и подкасҳои он ба мисли Docker нест, он бештар ба "назорат" монанд аст. демон." Контейнерҳое, ки аз ҷониби кубелет идора карда мешаванд, то даме ки кубелет онҳоро боздорад, кор мекунанд.)

Дар якчанд дақиқа kubectl бояд ба мо қуттиҳо ва гиреҳҳоро тавре нишон диҳад, ки мо интизорем:

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

Биёед ин дафъа воқеан худро табрик кунем (ман медонам, ки ман аллакай худро табрик кардаам) - мо як "кластери" -и ҳадди ақали Kubernetes дорем, ки бо API-и комилан функсионалӣ кор мекунад!

Мо дар зери

Акнун биёед бубинем, ки API ба чӣ қодир аст. Биёед бо pod nginx оғоз кунем:

apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  containers:
  - image: nginx
    name: 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.

Дар ин ҷо мо мебинем, ки муҳити Kubernetes-и мо то чӣ андоза нопурра аст - мо барои хидматҳо ҳисоб надорем. Биёед бо роҳи дастӣ эҷод кардани ҳисоби хидматӣ бори дигар кӯшиш кунем ва бубинем, ки чӣ мешавад:

$ 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

Ҳатто вақте ки мо ҳисоби хидматро дастӣ эҷод кардем, аломати аутентификатсия тавлид намешавад. Вақте ки мо озмоишро бо "кластерии" минималистии худ идома медиҳем, мо мефаҳмем, ки аксари чизҳои муфиде, ки одатан ба таври худкор ба амал меоянд, гум мешаванд. Сервери API Kubernetes хеле минималистист, ки аксари конфигуратсияи вазнин ва автоматӣ дар контроллерҳои гуногун ва корҳои пасзаминае, ки ҳанӯз иҷро намешаванд, рух медиҳанд.

Мо метавонем ин мушкилотро тавассути танзим кардани интихоб ҳал кунем automountServiceAccountToken барои ҳисоби хидматӣ (зеро мо набояд онро истифода барем):

$ 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

Ниҳоят, қуттӣ пайдо шуд! Аммо дар асл он оғоз нахоҳад шуд, зеро мо надорем планкаш (нақшасоз) ҷузъи дигари муҳими Kubernetes мебошад. Боз ҳам, мо мебинем, ки API Kubernetes ба таври ҳайратангез "гунг" аст - вақте ки шумо дар API Pod эҷод мекунед, он онро сабт мекунад, аммо кӯшиш намекунад, ки дар кадом гиреҳ кор кунад.

Дар асл, ба шумо нақшасоз лозим нест, ки подкалларо иҷро кунед. Шумо метавонед гиреҳро ба манифест дар параметр дастӣ илова кунед nodeName:

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

(Иваз кунед mink8s ба номи гиреҳ.) Пас аз нест кардан ва татбиқ кардан, мо мебинем, ки nginx оғоз шудааст ва суроғаи IP-и дохилиро гӯш мекунад:

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

Барои боварӣ ҳосил кардани он, ки шабака байни қуттиҳо дуруст кор мекунад, мо метавонем curl-ро аз дигар қуттӣ иҷро кунем:

$ 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>

Кофтани ин муҳит хеле ҷолиб аст ва бубинед, ки чӣ кор мекунад ва чӣ не. Ман фаҳмидам, ки ConfigMap ва Secret мувофиқи интизорӣ кор мекунанд, аммо Хидмат ва Ҷойгиркунӣ не.

Муваффақият!

Ин паём дароз шуда истодааст, аз ин рӯ ман ғалаба эълон мекунам ва мегӯям, ки ин конфигуратсияи қобили амал аст, ки онро "Кубернетес" номидан мумкин аст. Барои ҷамъбаст: чаҳор дуӣ, панҷ параметри сатри фармон ва "танҳо" 45 сатри YAML (на ки аз рӯи стандартҳои Kubernetes хеле зиёд аст) ва мо бисёр чизҳо дорем:

  • Подҳо бо истифода аз API муқаррарии Kubernetes идора карда мешаванд (бо якчанд ҳакҳо)
  • Шумо метавонед тасвирҳои контейнери ҷамъиятиро бор кунед ва идора кунед
  • Подҳо зинда боқӣ мемонанд ва ба таври худкор бозоғоз мешаванд
  • Шабака байни подкҳо дар дохили як гиреҳ хеле хуб кор мекунад
  • ConfigMap, Кори махфӣ ва оддӣ васлкунии нигаҳдорӣ тавре интизор мерафт

Аммо бисёре аз он чизе, ки Кубернетесро воқеан муфид мегардонад, то ҳол мавҷуд нест, ба монанди:

  • Банақшагири подк
  • Аутентификатсия / авторизатсия
  • Гиреҳҳои сершумор
  • Шабакаи хидматрасонӣ
  • DNS дохилии кластерӣ
  • Контроллерҳо барои ҳисобҳои хидматӣ, ҷойгиркунӣ, ҳамгироӣ бо провайдерҳои абрӣ ва аксари чизҳои дигар, ки Kubernetes меорад

Пас, мо воқеан чӣ ба даст овардем? API Kubernetes, ки мустақилона кор мекунад, дар ҳақиқат танҳо як платформа барои автоматикунонии контейнер. Он кори зиёдеро анҷом намедиҳад - ин кор барои контроллерҳо ва операторони гуногун бо истифода аз API аст - аммо он барои автоматикунонӣ муҳити устуворро фароҳам меорад.

Бештар дар бораи курс дар вебинари ройгон маълумот гиред.

Муфассал:

Манбаъ: will.com

Илова Эзоҳ