Ny fandikana ny lahatsoratra dia nomanina tamin'ny fiandohan'ny fianarana .

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 ? Na ? 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 .)
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 , ny architecture dia toy izao:

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 (., .). 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 ). 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
284Oay, safidy maro be! Soa ihany fa roa ihany no ilaintsika. Ity ny iray amin'ireo masontsivana mahaliana anay:
--pod-manifest-path stringLalana 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 .)
Ity safidy ity dia ahafahantsika mihazakazaka - 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=podsAvy 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 .) 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 . 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-dataRaha 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.walManomboka 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.6Ndeha 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: nginxEto 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 accountNa 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 13mFarany, nipoitra ny pod! Saingy raha ny marina dia tsy hanomboka izany satria tsy manana isika (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.
Hamaky bebe kokoa:
Source: www.habr.com
