Visual Guide ad Troubleshooting Kubernetes

Nota. transl.: Hic articulus est pars materiae projectae in dominico publico edito learnk8ssocietates instituebat ac singulos administratores Kubernetes laborabat. In ea, Daniele Polencic, procurator project, instructiones visualium communicat quibus gradibus sumendi in causa problematum generalium cum applicationibus in botrum K8s currentibus.

Visual Guide ad Troubleshooting Kubernetes

TL;DR: hic est schemate quod adiuvabit te debug instruere in Kubernetes:

Visual Guide ad Troubleshooting Kubernetes

Flowchart de inveniendis et defixionibus mendis in Botr. Originale (Anglice) is available at PDF ΠΈ ut picturam.

Cum applicatio ad Kubernetes disponitur, tria sunt de more partium quae definire debes:

  • instruere - Recipe hoc genus ad exemplaria conficienda applicationis, quae siliquae dicuntur;
  • obsequium - Internum onus librator qui mercaturam inter siliquas distribuit;
  • Ingress β€” descriptionem quam negotiatio ab externo mundo ad ipsum perveniet.

Hic est velox summary graphice:

1) Applicationes in Kubernetes negotiationes ab extra mundum recipiunt per duas stratas oneris librarios: internum et externum.

Visual Guide ad Troubleshooting Kubernetes

2) Librarius internus servitii appellatur, externus ingressus appellatur.

Visual Guide ad Troubleshooting Kubernetes

3) Instruere siliquas et monitores (non sunt manually creata).

Visual Guide ad Troubleshooting Kubernetes

Dicamus vis simplex applicationis la . explicandi salve Orbis Terrarum. Configuratio YAML eius erit hoc simile:

apiVersion: apps/v1
kind: Deployment # <<<
metadata:
  name: my-deployment
  labels:
    track: canary
spec:
  selector:
    matchLabels:
      any-name: my-app
  template:
    metadata:
      labels:
        any-name: my-app
    spec:
      containers:
      - name: cont1
        image: learnk8s/app:1.0.0
        ports:
        - containerPort: 8080
---
apiVersion: v1
kind: Service # <<<
metadata:
  name: my-service
spec:
  ports:
  - port: 80
    targetPort: 8080
  selector:
    name: app
---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress # <<<
metadata:
  name: my-ingress
spec:
  rules:
  - http:
    paths:
    - backend:
        serviceName: app
        servicePort: 80
      path: /

Definitio satis longa est, et quomodo partes inter se referunt facile confundi possunt.

For example:

  • Quando uteris portum LXXX et quando uteris (LXXX)DCCC?
  • Licetne novum portum pro singulis officiis creare ut non pugnent?
  • Noli pittacium nomina refert? An ubique sint eadem?

Priusquam in debugging positus, meminerimus quomodo tria elementa inter se referant. Instruere ac ipsum sit amet mauris.

Relatio inter instruere et ipsum

Miraberis, sed instruere et obsequium nullo modo coniungi possunt. Pro, Service directe demonstrat Pods, praeteriens instruere.

Sic intersunt quomodo Pods et Services inter se referuntur. Tria sunt meminisse;

  1. Elector (selector) pro servitio congruit saltem unum Pod pittacium.
  2. targetPort oportet inserere containerPort continens intus Pod.
  3. port Servitium esse aliquid potest. Diversa officia eodem portu uti possunt quia diversas IP inscriptiones habent.

In sequenti schemate omnia supradicta in graphica forma repraesentat;

1) Finge ministerium negotiationis ad quendam vasculum directum;

Visual Guide ad Troubleshooting Kubernetes

2) Vasculum cum creando, debes denota containerPort pro quolibet vase in siliquis;

Visual Guide ad Troubleshooting Kubernetes

3) Cum servitium creando, debes denota port ΠΈ targetPort. Sed quo quis adhibetur ad continentem ad coniungere?

Visual Guide ad Troubleshooting Kubernetes

4) Via targetPort. Non est aequare containerPort.

Visual Guide ad Troubleshooting Kubernetes

V) Dicamus portum MMM apertum in vase. Tum valorem targetPort idem esse debet.

Visual Guide ad Troubleshooting Kubernetes

In fasciculo YAML, pittacia et ports / targetPort oportet inserere:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-deployment
  labels:
    track: canary
spec:
  selector:
    matchLabels:
      any-name: my-app
  template:
    metadata:
     labels:  # <<<
        any-name: my-app  # <<<
   spec:
      containers:
      - name: cont1
        image: learnk8s/app:1.0.0
        ports:
       - containerPort: 8080  # <<<
---
apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  ports:
  - port: 80
   targetPort: 8080  # <<<
 selector:  # <<<
    any-name: my-app  # <<<

Quid de pittacium track: canary a summo instruere sectionem? Cuinam par?

Hic titulus instruere speciales neque a ministerio ad iter negotiationis usus est. Id est, alia pretii tolli vel assignari potest.

Quid de electrix matchLabels?

Est semper par pittacia Podquoniam siliquas instruere ad instruere.

Ponamus emendationes rectas te fecisse. Quomodo eos coercet?

Vasculum pittacium reprehendo cum sequenti mandato:

kubectl get pods --show-labels

Aut si legumen ad plura medicamenta pertinent;

kubectl get pods --selector any-name=my-app --show-labels

quibus any-name=my-app est pittacium any-name: my-app.

An ullae difficultates supersunt?

Ad vasculum coniungere potes! Ad hoc opus est uti imperio port-forward in kubectl. Permittit te ad servitium coniungere et nexum cohibere.

kubectl port-forward service/<service name> 3000:80

hic

  • service/<service name> β€” nomen muneris; apud nos est my-service;
  • 3000 portus est qui in computatorio aperiendus est;
  • 80 - portum specificum in agro port servitutis.

Si nexus instituitur, tunc uncinis recti sunt.

Si nexus deficiat, quaestio cum pittaciis vel portubus non congruunt.

Necessitudo inter ipsum et Ingress

Proximum est ut accessum praebeat applicationi ad erigendum Ingress. Ingressus debet scire quomodo servitium inveniat, deinde siliquas inveniat et negotiatio eis dirigat. Ingressus invenit servitutem debitam nominatim et portum apertum.

In descriptione Ingress et servitii duo parametri inserere debent:

  1. servicePort in Ingress est inserere parametri port in Service;
  2. serviceName In Ingres est inserere agri name in servicium.

Sequens tabula summat hospites portus:

I) Ut iam nostis, Service audit quemdam port:

Visual Guide ad Troubleshooting Kubernetes

II) Ingress habet modulum nomine servicePort:

Visual Guide ad Troubleshooting Kubernetes

III) hic modulus (servicePort) Semper congruit port in servitii definitione:

Visual Guide ad Troubleshooting Kubernetes

4) Si portus 80 in Service specificatur, necesse est servicePort etiam = 80;

Visual Guide ad Troubleshooting Kubernetes

Re, debes attendere ad sequentes lineas:

apiVersion: v1
kind: Service
metadata:
 name: my-service  # <<<
spec:
  ports:
 - port: 80  # <<<
   targetPort: 8080
  selector:
    any-name: my-app
---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: my-ingress
spec:
  rules:
  - http:
    paths:
    - backend:
       serviceName: my-service  # <<<
       servicePort: 80  # <<<
     path: /

Quomodo reprehendo si Ingress currit?

Modum uti potes cum kubectl port-forwardsed pro servitio coniungere debes cum Ingresso moderatoris.

Primum nomen vasculi invenire debes cum Ingress moderatoris:

kubectl get pods --all-namespaces
NAMESPACE   NAME                              READY STATUS
kube-system coredns-5644d7b6d9-jn7cq          1/1   Running
kube-system etcd-minikube                     1/1   Running
kube-system kube-apiserver-minikube           1/1   Running
kube-system kube-controller-manager-minikube  1/1   Running
kube-system kube-proxy-zvf2h                  1/1   Running
kube-system kube-scheduler-minikube           1/1   Running
kube-system nginx-ingress-controller-6fc5bcc  1/1   Running

Vasculum invenire Ingress (sit in alio spatio nominali) et currunt imperium describeinvenire portum numerorum;

kubectl describe pod nginx-ingress-controller-6fc5bcc 
--namespace kube-system 
 | grep Ports
Ports:         80/TCP, 443/TCP, 18080/TCP

Denique coniunge vasculum;

kubectl port-forward nginx-ingress-controller-6fc5bcc 3000:80 --namespace kube-system

Quotiens nunc rogationem mittis ut 3000 in computatrum tuum portum mittas, transmittantur ad portum 80 folliculi cum Ingress moderatoris. Per ad http://localhost:3000, paginam per applicationem generatam videre debes.

Summa portuum

Meminerimus iterum quibus portus et pittacia inserere debent;

  1. Lector in definitione servitii debet pittacium vasculi inserere;
  2. targetPort in definitione Service est inserere containerPort vas intus vasculum;
  3. port in definitione servitii aliquid esse potest. Diversa officia eodem portu uti possunt quia diversas IP inscriptiones habent;
  4. servicePort Ingressus est inserere port in definitione servitii;
  5. Ministerium nomen agri inserere debet serviceName in Ingress.

Infeliciter, non satis est scire quomodo conformationem quandam YAML configurationis.

Quid accidit cum rebus peccatur?

Vasculum non incipiet aut fragore potest.

3 Gradus ad Diagnose Applicationem Problematum in Kubernetes

Priusquam incipias debugging tuam instruere, debes habere bonam intelligentiam quomodo opera Kubernetes.

Quaelibet applicatio, quae in K8s habet, tria habet, certo ordine deprimi debent, ab imo incipientes.

  1. Primum opus fac ut siliquae laborant, deinde...
  2. Reprehendo si ministerium commeatus siliquis mercaturis, deinde...
  3. Reprehendo si Ingress configuratur recte.

Visual repraesentatio:

1) Incipere debes problemata ab ipso fundo. Primum reprehendo quod siliquae habent status Ready ΠΈ Running:

Visual Guide ad Troubleshooting Kubernetes

II) si siliquae paratae sunt (Ready) , explorare debetis utrum servitium distribuat negotiationis inter siliquas:

Visual Guide ad Troubleshooting Kubernetes

3) Denique nexum inter ministerium et Ingressum resolvere debes:

Visual Guide ad Troubleshooting Kubernetes

1. Diagnostica siliquae

Pleraque quaestio ad vasculum refertur. Fac siliquae quae enumerantur Ready ΠΈ Running. Potes hoc uti mandato:

kubectl get pods
NAME                    READY STATUS            RESTARTS  AGE
app1                    0/1   ImagePullBackOff  0         47h
app2                    0/1   Error             0         47h
app3-76f9fcd46b-xbv4k   1/1   Running           1         47h

In imperio output supra, ultimum vasculum as . ponitur Running ΠΈ Readyhoc autem non contingit in aliis duobus.

Quomodo intellegi quid erravit?

Siliquae diagnoscendi praecepta utilia sunt quattuor:

  1. kubectl logs <имя pod'а> permittit tibi ligna de vasculis extrahere in vasculo;
  2. kubectl describe pod <имя pod'а> sino te rerum gestarum cum vasculo inspicere;
  3. kubectl get pod <имя pod'а> sino te ut YAML configurationem vasculi in Kubernetis conditum obtinere;
  4. kubectl exec -ti <имя pod'а> bash sino vos mittere an interactive imperium testa in uno vasculi vasculi

Quod quid vis?

Sed contra est quod non est mandatum universale. Horum coniunctio utendum est.

Typical pod problems

Sunt duo genera errorum podagra: startup errores et errores runtime.

Satus errores:

  • ImagePullBackoff
  • ImageInspectError
  • ErrImagePull
  • ErrImageNeverPull
  • RegistryUnavailable
  • InvalidImageName

Errores runtime;

  • CrashLoopBackOff
  • RunContainerError
  • KillContainerError
  • VerifyNonRootError
  • RunInitContainerError
  • CreatePodSandboxError
  • ConfigPodSandboxError
  • KillPodSandboxError
  • SetupNetworkError
  • TeardownNetworkError

Quidam errores aliis sunt communiores. Hic sunt aliquot errores frequentissimi, et quomodo defigantur.

ImagePullBackOff

Hic error incidit cum Kubernetes imaginem unius vasculi vasculi obtinere non potest. Hic sunt tres rationes frequentissimae huius rei;

  1. Nomen imaginis falsum est, verbi gratia, errasti in ea, vel imago non est;
  2. Tag non exsistente pro imagine definitum est;
  3. Imago reposita est in registro privato et Kubernetes ei accessere licentiam non habet.

Duae primae rationes facile sunt ad tollendum - modo nomen imaginis et tag corrigendum. In his, documentorum opus est pro registro clauso in Secreta intrare, et nexus cum siliquis addere. In documentis Kubernetes est exemplum quomodo id fieri possit.

Crash loop Back Off

Kubenetes errat CrashLoopBackOffsi continens incipere non potest. Quod plerumque fit cum;

  1. Cimex est in usu, qui id emittendum prohibet;
  2. continens set male;
  3. Vita test nimium multis temporibus defecit.

Conare ad ligna e continente ad cognoscendam causam deficiendi. Si difficile ad tigna accedere quia nimis cito continens restarts, sequenti imperio uti potes;

kubectl logs <pod-name> --previous

Errorem ostendit nuntii a priori incarnationis continentis.

RunContainerError

Hic error incidit cum continens non committitur. Respondet tempori antequam applicationis emittitur. Solet ex falsa occasus, exempli gratia:

  • conanti conscendere volumen non-exsistentem sicut ConfigMap vel Secreta;
  • conatum conscendere legere solum volumen legere-scribere.

Turma bene apta est ad tales errores dividendos kubectl describe pod <pod-name>.

Siliquae sunt in pendenti

Vasculum semel creatum in re publica manet Pending.

Quid hoc est?

Hic rationes possibilis sunt (sponsorium suppono denique laborat);

  1. Botrus non habet satis facultates, ut processus virtutis et memoriae, ad currendum vasculum.
  2. Obiectum congruis spatiis installatur ResourceQuota et creando vasculum efficiet spatium spatii ultra numerum.
  3. Pod tenetur nibh PersistentVolumeClaim.

In hoc casu commendatur uti mandato kubectl describe deprime sectionem Events:

kubectl describe pod <pod name>

In casu de erroribus ad ResourceQuotasCommendatur videre ligna botri utens imperio

kubectl get events --sort-by=.metadata.creationTimestamp

Siliquae non sunt Promptus

Si vasculum ponitur Runningsed non est in civitate Ready, Significat promptum suum reprehendo (Probe promptum) excidit.

Cum hoc incidit, vasculum ad usum non coniungit neque ad eum negotiatio fluit. Praeparatio probationis defectum per problemata in applicatione causatur. In hoc casu, ut errorem invenias, sectionem resolvere debes Events in imperio output kubectl describe.

2. Diagnostics Service

Si siliquae quae enumerantur Running ΠΈ Readysed nihil adhuc ex applicatione responsum, ut occasus servitutis coerceas.

Officia responsales sunt ad siliquas negotiationes excitandas secundum eorum pittacia. Primum ergo opus faciendum est, quot siliquae operantur, inspicias. Ad hoc faciendum, terminos in servitio reprehendo;

kubectl describe service <service-name> | grep Endpoints

Finis est par valorum formae <IP-адрСс:ΠΏΠΎΡ€Ρ‚>et saltem unum tale par in output adesse debet (id est, unum saltem vasculum cum servitio.

Si sectionem Endpoins vacua sunt duo optiones possibilis;

  1. nullae siliquae cum pittacio recto sunt (monitus: perscriptio si spatia spatiorum recte selecta sunt);
  2. Error est in pittacia ministerio electrix.

Si index punctorum videris sed adhuc applicationem accedere non potest, verisimile reus est cimex in targetPort in servitio descriptio.

Quomodo inhibenda est officia functionis servitii?

Neglegens genus officii, imperio uti potes kubectl port-forward coniungere cum eo;

kubectl port-forward service/<service-name> 3000:80

hic

  • <service-name> β€” nomen muneris;
  • 3000 portus est quem in computatorio aperis;
  • 80 - Portus in parte muneris.

3. Ingress diagnostica

Si hoc longe legeris, tunc;

  • siliquae quae enumerantur Running ΠΈ Ready;
  • ministerium feliciter negotiationis inter siliquas distribuit.

Tamen non potes pervenire ad app.

Hoc significat Ingress moderatorem verisimile non esse recte configuratum. Cum Ingressor moderatoris tertia pars in botro componentia est, variae rationes debugging secundum suum genus sunt.

Sed antequam adhibeas instrumenta specialia ad configurandum Ingress, potes aliquid simplicissimum facere. Ingressus usus serviceName ΠΈ servicePort coniungere ad servitium. Opus est ut reprimas si recte configurantur. Hoc facere potes utens imperio;

kubectl describe ingress <ingress-name>

Si columna Backend vacua est, probabilis est altae configurationis erroris. Si posteriora sunt in loco, sed applicatio adhuc non est adeunda, quaestio potest referri ad:

  • Accessibilitas occasus e publico Interreti ingressus est;
  • botrum accessibility occasus publici interreti.

Potes cognoscere difficultates cum infrastructura coniungendo directe ad podagras Ingress. Ad hoc faciendum, primum vasculum moderatoris Ingress (fortasse in alio spatio nominali invenias);

kubectl get pods --all-namespaces
NAMESPACE   NAME                              READY STATUS
kube-system coredns-5644d7b6d9-jn7cq          1/1   Running
kube-system etcd-minikube                     1/1   Running
kube-system kube-apiserver-minikube           1/1   Running
kube-system kube-controller-manager-minikube  1/1   Running
kube-system kube-proxy-zvf2h                  1/1   Running
kube-system kube-scheduler-minikube           1/1   Running
kube-system nginx-ingress-controller-6fc5bcc  1/1   Running

Utere imperium describeportum proficisci;

kubectl describe pod nginx-ingress-controller-6fc5bcc
--namespace kube-system 
 | grep Ports

Denique coniunge vasculum;

kubectl port-forward nginx-ingress-controller-6fc5bcc 3000:80 --namespace kube-system

Nunc omnes petitiones ad portum 3000 in computatrale redigendas ad 80 vasculi portum.

Nunc operatur?

  • Si sic, quaestio infrastructura est. Omnino explorare necesse est quomodo negotiatio ad botrum funditur.
  • Si non, quaestio est apud Ingress controller.

Si Ingress moderatorem laborare non potes, eam debug habebis.

Multae varietates Ingress moderatoris. In festis sunt Nginx, HAProxy, Traefik, etc. (Pro magis notitia de solutionibus existentium, vide nostra recensionem β€” proxime. transl.) Te referre ad ducem fermentum in documentis moderatoris pertinet. Quod Ingress Nginx est maxime popularis Ingress moderatoris, aliquas apices in articulo ad solvendas difficultates ad ipsum pertinentes includimus.

Debugging in Ingress Nginx controller

Ingress-nginx project habet officialem plugin for kubectl. Team kubectl ingress-nginx adhiberi potest:

  • analyses lignorum, backends, testimoniales, etc.;
  • hospites ad Ingress;
  • configuratione studeo hodiernam.

Tria sequentia mandata te hoc adiuvabunt;

  • kubectl ingress-nginx lint - compescit nginx.conf;
  • kubectl ingress-nginx backend - explorat backend (similis kubectl describe ingress <ingress-name>);
  • kubectl ingress-nginx logs β€” ligna sistit.

Nota quod in quibusdam casibus recte nominare potes opus est ad Ingressorem moderatoris utendi vexillum --namespace <name>.

summary

Troubleshooting Kubernetes provocare potest si nescias ubi committitur. Quaestionem ab imo sursum semper accedere debes: siliquis incipias, et deinde ad ministerium et ingredere. Artes debugging in hoc articulo descriptos applicari possunt ad alia, ut:

  • otiosis Jobs et CronJobs;
  • StatefulSets and DaemonSets.

Gratias ago Gergely Risko, Daniel Weibel ΠΈ Carolus Christyraj pro magni pretii commentationibus et additionibus.

PS ab translator

Lege etiam in nostro diario:

Source: www.habr.com