Kubernetes azo atao ambany indrindra

Ny fandikana ny lahatsoratra dia nomanina tamin'ny fiandohan'ny fianarana "Fanazatra sy fitaovana DevOps".

Kubernetes azo atao ambany indrindra

Raha mamaky an'ity ianao dia mety naheno zavatra momba an'i Kubernetes (ary raha tsy izany, ahoana no niafaran'ity teto ity?) Fa inona marina moa izany Kubernetes izany? izany "Orchestration ny kaontenera indostrialy"? Na "System Operating Cloud-Native"? Inona no dikan'izany?

Raha ny marina, tsy azoko antoka 100%. Saingy heveriko fa mahaliana ny mandalina ny atiny sy mijery ny tena zava-mitranga ao amin'ny Kubernetes ao ambanin'ny sarin'ny abstractions maro. Noho izany, mba hahafinaritra fotsiny, andeha hojerentsika ny tena endriky ny “Closter Kubernetes” kely indrindra. (Ho mora kokoa noho ny Kubernetes The Hard Way.)

Heveriko fa manana fahalalana fototra momba ny Kubernetes, Linux, ary containers ianao. Ny zavatra rehetra resahinay eto dia natao ho an'ny fikarohana/fianarana ihany fa aza apetraka ao anaty famokarana!

topy maso

Misy singa maro ny Kubernetes. Araka ny Wikipedia, ny architecture dia toy izao:

Kubernetes azo atao ambany indrindra

Misy singa valo farafahakeliny aseho eto, saingy tsy hojerentsika ny ankamaroan'izy ireo. Tiako ny milaza fa ny zavatra kely indrindra azo antsoina amin'ny fomba ara-drariny Kubernetes dia misy singa telo lehibe:

  • kubelet
  • kube-apiserver (izay miankina amin'ny etcd - ny tahiry)
  • fotoana fandefasana container (Docker amin'ity tranga ity)

Andeha hojerentsika izay lazain'ny antontan-taratasy momba ny tsirairay amin'izy ireo (rus., anglisy.). Amin'ny voalohany kubelet:

Mpampiasa iray mandeha amin'ny node tsirairay ao amin'ny cluster. Izy io dia manome antoka fa ny kaontenera dia mandeha ao anaty pod.

Toa tsotra ihany. Ahoana ny amin'ny fotoana fandehanana kaontenera (fotoanan'ny kaontenera)?

Ny fampandehanana container dia programa natao hampandehanana container.

Tena mampahafantatra. Fa raha zatra an'i Docker ianao dia tokony hanana hevitra ankapobeny momba ny ataony. (Ny antsipirihan'ny fisarahan'ny andraikitra eo amin'ny fotoana fiasan'ny kaontenera sy ny kubelet dia tena saro-takarina ary tsy horesahiko eto.)

И mpizara API?

API Server dia singa fanaraha-maso Kubernetes izay mampiseho ny API Kubernetes. Ny mpizara API no lafiny mpanjifa amin'ny tontonana fanaraha-maso Kubernetes

Na iza na iza nanao zavatra tamin'ny Kubernetes dia tsy maintsy nifandray tamin'ny API na mivantana na tamin'ny alàlan'ny kubectl. Izany no ivon'ny mahatonga an'i Kubernetes Kubernetes - atidoha mamadika ny tendrombohitra YAML izay fantatsika sy tiantsika (?) ho fotodrafitrasa miasa. Toa hita miharihary fa ny API dia tokony ho eo amin'ny fandrindrana kely indrindra.

napetraka

  • Masinina virtoaly na ara-batana Linux miaraka amin'ny fidirana faka (Mampiasa Ubuntu 18.04 amin'ny milina virtoaly aho).
  • Ary izany rehetra izany!

Fametrahana mankaleo

Mila mametraka Docker amin'ny milina hampiasainay izahay. (Tsy handeha amin'ny antsipiriany momba ny fomba fiasan'i Docker sy containers aho; raha liana ianao dia misy lahatsoratra mahafinaritra). Aleo apetraka fotsiny amin'ny apt:

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

Aorian'izay dia mila maka ny binary Kubernetes isika. Raha ny marina, ho an'ny fanombohana voalohany ny "cluster" ihany no ilainay kubelet, satria mba hampandehanana singa mpizara hafa azontsika ampiasaina kubelet. Mba hifaneraserana amin'ny klustery aorian'ny fandehanana dia hampiasainay koa 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

Inona no mitranga raha mihazakazaka fotsiny isika kubelet?

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

kubelet tsy maintsy mihazakazaka toy ny fakany. Tena lojika, satria mila mitantana ny node manontolo izy. Andeha hojerentsika ny masontsivana azy:

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

Oay, safidy maro be! Soa ihany fa roa ihany no ilaintsika. Ity ny iray amin'ireo masontsivana mahaliana anay:

--pod-manifest-path string

Lalana mankany amin'ny lahatahiry misy rakitra ho an'ny pods static, na lalana mankany amin'ny rakitra mamaritra pods static. Tsy raharahaina ny rakitra manomboka amin'ny teboka. (TSY MISY: Ity safidy ity dia tsy maintsy apetraka ao amin'ny rakitra fanamafisam-peo alefa any amin'ny Kubelet amin'ny alàlan'ny safidy --config. Raha mila fanazavana fanampiny dia jereo kubernetes.io/docs/tasks/administer-cluster/kubelet-config-file .)

Ity safidy ity dia ahafahantsika mihazakazaka static pods - pods izay tsy tantanana amin'ny alàlan'ny Kubernetes API. Ny pods static dia zara raha ampiasaina, fa tena mety amin'ny fananganana cluster haingana, ary izany indrindra no ilaintsika. Tsy hiraharaha an'io fampitandremana lehibe io izahay (aza averina amin'ny famokarana ity!) ary jereo raha afaka mandeha ny pod.

Voalohany dia hamorona lahatahiry ho an'ny pods static isika ary mihazakazaka kubelet:

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

Avy eo, amin'ny varavarankely terminal/tmux/na inona na inona, dia hamorona pod manifest isika:

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

kubelet manomboka manoratra fampitandremana ary toa tsy misy na inona na inona mitranga. Tsy marina anefa izany! Andeha hojerentsika ny 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 Namaky ny pod manifest aho ary nomeko an'i Docker ny baiko hanangana kaontenera roa araka ny fepetra apetratsika. (Raha manontany tena momba ny kaontenera "pause" ianao dia hack Kubernetes izany - jereo ity blog ity.) Kubelet dia handefa ny kaontenintsika busybox miaraka amin'ny baiko voatondro ary hamerina izany mandritra ny fotoana tsy voafetra mandra-pamafa ny pod static.

Miarahaba tena. Vao avy nahita ny iray amin'ireo fomba mampisafotofoto indrindra izahay hamoahana lahatsoratra amin'ny terminal!

Alefaso sns

Ny tanjonay faratampony dia ny hampandeha ny Kubernetes API, fa ny fanaovana izany dia mila mihazakazaka aloha sns. Andao hanomboka kluster etcd kely indrindra amin'ny fametrahana azy ao amin'ny lahatahiry pods (ohatra, 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

Raha efa niara-niasa tamin'ny Kubernetes ianao dia tokony ho fantatrao ireo rakitra YAML ireo. Hevitra roa ihany no tokony ho marihina eto:

Napetrakay ny fampirimana mpampiantrano /var/lib/etcd ao amin'ny pod mba ho voatahiry ny angon-drakitra etcd aorian'ny famerenana indray (raha tsy vita izany dia ho voafafa ny fanjakana cluster isaky ny averina ny pod, izay tsy mety amin'ny fametrahana Kubernetes kely indrindra).

Nametraka izahay hostNetwork: true. Ity toe-javatra ity, tsy mahagaga, dia manamboatra etcd hampiasa ny tamba-jotra mpampiantrano fa tsy ny tamba-jotra anatiny ao amin'ny pod (izany dia hanamora kokoa ny mpizara API hahita ny cluster etcd).

Ny fanamarinana tsotra dia mampiseho fa ny etcd dia mandeha amin'ny localhost ary mitahiry data amin'ny kapila:

$ 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

Manomboka ny mpizara API

Mora kokoa ny mitantana mpizara Kubernetes API. Ny hany parameter tsy maintsy mandalo dia --etcd-servers, manao izay antenainao:

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

Apetraho ao anaty lahatahiry ity rakitra YAML ity pods, ary hanomboka ny mpizara API. Fanamarinana amin'ny curl dia mampiseho fa ny Kubernetes API dia mihaino amin'ny port 8080 miaraka amin'ny fidirana misokatra tanteraka - tsy mila fanamarinana!

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

(Aza averina amin'ny famokarana ity! Somary gaga aho fa tena tsy azo antoka ny fametrahana ny default. Saingy heveriko fa ity no hanamora ny fampandrosoana sy ny fitsapana.)

Ary, mahagaga, ny kubectl dia miasa ivelan'ny boaty tsy misy fanovana fanampiny!

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

olana

Fa raha mihady lalindalina kokoa ianao dia toa misy tsy mety:

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

Lasa ireo pods static noforoninay! Raha ny marina, tsy hita mihitsy ny node kubelet anay:

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

Inona no olana? Raha tadidinao ny fehintsoratra vitsivitsy lasa izay, dia nanomboka ny kubelet tamin'ny andiana masontsivana baikon'ny baiko tena tsotra izahay, ka tsy hain'ny kubelet ny fomba hifandraisana amin'ny mpizara API ary mampandre azy momba ny toerany. Rehefa avy nandinika ny antontan-taratasy isika dia mahita ny saina mifanaraka amin'izany:

--kubeconfig string

Ny lalana mankany amin'ny rakitra kubeconfig, izay mamaritra ny fomba hifandraisana amin'ny mpizara API. Availability --kubeconfig mamela ny maody mpizara API, tsia --kubeconfig mamela ny fomba ivelan'ny aterineto.

Nandritra izany fotoana rehetra izany, tsy fantatray, dia nandeha tamin'ny "mode an-tserasera" ny kubelet. (Raha toa ka miteniteny foana isika, dia afaka mihevitra ny kubelet tokana ho "Kubernetes faran'izay mahavelona", saingy tena mankaleo izany). Mba hahavitan'ny config "tena" dia mila mampita ny rakitra kubeconfig amin'ny kubelet isika mba hahafantarany ny fomba hiresahana amin'ny mpizara API. Soa ihany fa tena tsotra (satria tsy manana olana momba ny fanamarinana na fanamarinana izahay):

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

Tehirizo ity ho kubeconfig.yaml, vonoy ny dingana kubelet ary avereno miaraka amin'ny paramètre ilaina:

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

(Etsy ankilany, raha manandrana miditra amin'ny API amin'ny alàlan'ny curl ianao rehefa tsy mandeha ny kubelet dia ho hitanao fa mbola mandeha izy! Tsy "ray aman-dreny" amin'ny pods toa an'i Docker i Kubelet, fa toy ny "controle". daemon.

Afaka minitra vitsy kubectl tokony hampiseho amintsika ny pods sy ny nodes araka izay antenaintsika:

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

Ndeha isika hiarahaba tena amin'ity indray mitoraka ity (fantatro fa efa niarahaba ny tenanay aho) - manana "cluster" Kubernetes faran'izay kely izahay miaraka amin'ny API miasa tanteraka!

Manomboka eo ambany izahay

Andeha hojerentsika hoe inona no hain'ny API. Andao hanomboka amin'ny pod nginx:

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

Eto isika dia mahazo fahadisoana somary mahaliana:

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

Hitantsika eto fa tena tsy feno ny tontolo iainana Kubernetes - tsy manana kaonty momba ny serivisy izahay. Andeha isika hanandrana indray amin'ny famoronana kaonty serivisy ary hijery izay mitranga:

$ 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

Na dia namorona ny kaonty serivisy amin'ny tanana aza izahay, dia tsy voaforona ny mari-pamantarana fanamarinana. Rehefa manohy manao fanandramana amin'ny "cluster" minimalista isika dia ho hitantsika fa tsy hita ny ankamaroan'ny zavatra mahasoa izay mitranga mandeha ho azy. Ny mpizara API Kubernetes dia somary minimalistic, miaraka amin'ny ankamaroan'ny fampiakarana mavesatra sy ny fanamafisana mandeha ho azy dia mitranga amin'ny fanaraha-maso isan-karazany sy ny asa any aoriana izay mbola tsy mandeha.

Afaka mamaha ity olana ity isika amin'ny fametrahana ny safidy automountServiceAccountToken ho an'ny kaonty serivisy (satria tsy voatery hampiasa izany izahay):

$ 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

Farany, nipoitra ny pod! Saingy raha ny marina dia tsy hanomboka izany satria tsy manana isika planner (mpandrindra) dia singa manan-danja iray hafa amin'ny Kubernetes. Hitantsika indray fa ny Kubernetes API dia mahagaga hoe "adala" - rehefa mamorona Pod ao amin'ny API ianao dia manoratra azy io, fa tsy manandrana mamantatra hoe inona no node hampandehanana azy.

Raha ny marina, tsy mila mpandrindra ianao mba hampandehanana pod. Azonao atao ny manampy node amin'ny manifes ao amin'ny parameter nodeName:

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

( Soloy mink8s amin'ny anaran'ny node.) Aorian'ny famafana sy fampiharana, dia hitantsika fa nanomboka ny nginx ary mihaino ny adiresy IP anatiny:

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

Mba hahazoana antoka fa miasa tsara ny tambazotra eo anelanelan'ny pods, dia afaka mihazakazaka curl avy amin'ny pod hafa isika:

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

Tena mahaliana ny mandalina an'ity tontolo ity ary mijery izay mety sy tsy mety. Hitako fa miasa araka ny efa nampoizina ny ConfigMap sy Secret, fa ny Service and Deployment dia tsy manao izany.

Fahombiazana!

Mihalava ity lahatsoratra ity, noho izany dia hanambara fandresena aho ary hilaza fa ity dia fanamafisana azo antsoina hoe "Kubernetes" Raha fintinina: binary efatra, paramètre andalana dimy ary andalana 45 an'ny YAML "ihany". izany indrindra amin'ny fenitra Kubernetes) ary manana zavatra vitsivitsy miasa izahay:

  • Ny Pods dia mitantana amin'ny alàlan'ny Kubernetes API mahazatra (miaraka amin'ny hacks vitsivitsy)
  • Azonao atao ny mampakatra sy mitantana sary fitoeran'ny besinimaro
  • Mbola velona ny pods ary manomboka mandeha ho azy
  • Ny tambajotra eo amin'ny pods ao anatin'ny node iray ihany dia miasa tsara
  • ConfigMap, asa miafina ary fitahirizana tsotra araka ny efa nampoizina

Saingy ny ankamaroan'ny zavatra mahatonga an'i Kubernetes tena ilaina dia mbola tsy hita, toy ny:

  • Pod Scheduler
  • Fanamarinana/fanomezana
  • Nodes maro
  • Network of services
  • DNS anatiny mivondrona
  • Mpandrindra ho an'ny kaonty serivisy, fametrahana, fampidirana amin'ireo mpamatsy rahona ary ny ankamaroan'ny zava-tsoa hafa entin'i Kubernetes

Inona àry no tena azonay? Ny API Kubernetes, mandeha irery, dia sehatra iray fotsiny automatique container. Tsy dia misy dikany loatra izany - asa ho an'ny mpanara-maso sy mpandraharaha isan-karazany mampiasa ny API - fa manome tontolo tsy miovaova ho an'ny automation.

Mianara bebe kokoa momba ny fampianarana ao amin'ny webinar maimaim-poana.

Hamaky bebe kokoa:

Source: www.habr.com