కనీస ఆచరణీయ కుబెర్నెట్స్

వ్యాసం యొక్క అనువాదం కోర్సు ప్రారంభం సందర్భంగా తయారు చేయబడింది "DevOps అభ్యాసాలు మరియు సాధనాలు".

కనీస ఆచరణీయ కుబెర్నెట్స్

మీరు ఇది చదువుతున్నారంటే, మీరు బహుశా కుబెర్నెటీస్ గురించి విని ఉంటారు (ఒకవేళ వినకపోతే, ఇక్కడికి ఎలా వచ్చారు?) అయితే అసలు కుబెర్నెటీస్ అంటే ఏమిటి? అది "పారిశ్రామిక-స్థాయి కంటైనర్ ఆర్కెస్ట్రేషన్"? లేదా "క్లౌడ్-నేటివ్ ఆపరేటింగ్ సిస్టమ్"అసలు దీని అర్థం ఏమిటి?

నిజం చెప్పాలంటే, నాకు నూటికి నూరు శాతం ఖచ్చితంగా తెలియదు. కానీ, కుబెర్నెటీస్‌లోని అనేక అబ్‌స్ట్రాక్షన్ పొరల కింద అసలు ఏం జరుగుతుందో లోతుగా పరిశీలించడం ఆసక్తికరంగా ఉంటుందని నేను అనుకుంటున్నాను. కాబట్టి, సరదాగా, ఒక కనీస "కుబెర్నెటీస్ క్లస్టర్" నిజానికి ఎలా ఉంటుందో చూద్దాం. (ఇది చాలా సరళంగా ఉంటుంది) కుబెర్నెటెస్: కష్టమైన పద్ధతి.)

మీకు కుబెర్నెటెస్, లైనక్స్ మరియు కంటైనర్ల గురించి ప్రాథమిక అవగాహన ఉందని నేను భావిస్తున్నాను. మనం ఇక్కడ చర్చించే విషయాలన్నీ కేవలం పరిశోధన/అధ్యయన ప్రయోజనాల కోసం మాత్రమే; దయచేసి వీటిలో దేనినీ ప్రొడక్షన్‌లో అమలు చేయవద్దు!

పర్యావలోకనం

కుబెర్నెటీస్‌లో అనేక భాగాలు ఉంటాయి. దీని ప్రకారం వికీపీడియా, నిర్మాణం ఈ విధంగా కనిపిస్తుంది:

కనీస ఆచరణీయ కుబెర్నెట్స్

ఇక్కడ కనీసం ఎనిమిది భాగాలు చూపబడ్డాయి, కానీ మనం వాటిలో చాలావాటిని విస్మరిద్దాం. సహేతుకంగా కుబెర్నెటెస్ అని పిలవబడే కనీస విషయం మూడు ప్రధాన భాగాలను కలిగి ఉంటుందని నేను వాదించాలనుకుంటున్నాను:

  • క్యూబ్లెట్
  • kube-apiserver (ఇది etcd, దాని డేటాబేస్‌పై ఆధారపడి ఉంటుంది)
  • కంటైనర్ రన్‌టైమ్ (ఈ సందర్భంలో, డాకర్)

వాటిలో ప్రతి దాని గురించి డాక్యుమెంటేషన్ ఏమి చెబుతుందో చూద్దాం (రష్యన్., ఇంగ్లీష్.). మొదట క్యూబ్లెట్:

క్లస్టర్‌లోని ప్రతి నోడ్‌లో ఒక ఏజెంట్ నడుస్తుంది. ఇది పాడ్‌లో కంటైనర్‌లు నడుస్తున్నాయని నిర్ధారిస్తుంది.

వింటుంటే చాలా సులభంగానే అనిపిస్తుంది. మరి దాని సంగతేంటి? కంటైనర్ రన్‌టైమ్ పరిసరాలు (కంటైనర్ రన్‌టైమ్)?

కంటైనర్ రన్‌టైమ్ అనేది కంటైనర్‌లను నడపడానికి రూపొందించబడిన ఒక ప్రోగ్రామ్.

చాలా సమాచారప్రదంగా ఉంది. కానీ మీకు డాకర్‌తో పరిచయం ఉంటే, అది ఏమి చేస్తుందనే దానిపై మీకు ఒక సాధారణ అవగాహన ఉండాలి. (కంటైనర్ రన్‌టైమ్ మరియు క్యూబ్‌లెట్ మధ్య బాధ్యతల విభజన వివరాలు వాస్తవానికి చాలా సూక్ష్మమైనవి, మరియు నేను వాటి గురించి ఇక్కడ వివరించను.)

И API సర్వర్?

API సర్వర్ అనేది కుబెర్నెటెస్ APIని బహిర్గతం చేసే ఒక కుబెర్నెటెస్ కంట్రోల్ ప్యానెల్ భాగం. API సర్వర్ అనేది కుబెర్నెటెస్ కంట్రోల్ ప్యానెల్ యొక్క క్లయింట్ వైపు.

Kubernetesతో ఎప్పుడైనా ఏదైనా పని చేసిన ప్రతి ఒక్కరూ, నేరుగా గానీ లేదా kubectl ద్వారా గానీ, APIతో ఇంటరాక్ట్ అవ్వాల్సి వచ్చింది. Kubernetesను Kubernetesగా నిలబెట్టే దానికి అదే గుండెకాయ—మనందరికీ తెలిసిన, మనం ఇష్టపడే కొండంత YAML కోడ్‌ను పనిచేసే ఇన్‌ఫ్రాస్ట్రక్చర్‌గా మార్చే మెదడు. మన కనీస కాన్ఫిగరేషన్‌లో API ఉండాలనేది స్పష్టంగా కనిపిస్తుంది.

ముందస్తు అవసరాలు

  • రూట్ యాక్సెస్ ఉన్న వర్చువల్ లేదా ఫిజికల్ లినక్స్ మెషీన్ (నేను వర్చువల్ మెషీన్‌లో ఉబుంటు 18.04 వాడుతున్నాను).
  • మరియు అది అంతే!

బోరింగ్ ఇన్‌స్టాలేషన్

మనం ఉపయోగించబోయే మెషీన్‌లో డాకర్‌ను ఇన్‌స్టాల్ చేయాలి. (డాకర్ మరియు కంటైనర్‌లు ఎలా పని చేస్తాయనే దాని గురించి నేను వివరంగా చెప్పబోవడం లేదు; మీకు ఆసక్తి ఉంటే, ఇక్కడ ఉంది) అద్భుతమైన వ్యాసాలు) మనం దీన్ని ఉపయోగించి ఇన్‌స్టాల్ చేద్దాం apt:

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

ఆ తర్వాత, మనం కుబెర్నెటెస్ బైనరీలను పొందాలి. నిజానికి, మన "క్లస్టర్"ను ప్రారంభించి, పనిచేయించడానికి, మనకు కేవలం ఇవి మాత్రమే అవసరం. 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

స్టాటిక్ పాడ్‌ల కోసం ఫైల్‌లను కలిగి ఉన్న డైరెక్టరీకి మార్గం, లేదా స్టాటిక్ పాడ్‌లను వివరించే ఫైల్‌కు మార్గం. చుక్కలతో ప్రారంభమయ్యే ఫైల్‌లు విస్మరించబడతాయి. (నిలిపివేయబడింది: ఈ పరామితిని --config ఎంపిక ద్వారా Kubeletకు పంపబడిన కాన్ఫిగరేషన్ ఫైల్‌లో సెట్ చేయాలి. మరింత సమాచారం కోసం, చూడండి) kubernetes.io/docs/tasks/administer-cluster/kubelet-config-file .)

ఈ పరామితి మనకు అమలు చేయడానికి అనుమతిస్తుంది స్టాటిక్ పాడ్స్ — Kubernetes API ద్వారా నిర్వహించబడని పాడ్‌లు. స్టాటిక్ పాడ్‌లు అరుదుగా ఉపయోగించబడతాయి, కానీ క్లస్టర్‌ను త్వరగా ప్రారంభించడానికి అవి చాలా సౌకర్యవంతంగా ఉంటాయి, మనకు సరిగ్గా అదే అవసరం. మనం ఈ గట్టి హెచ్చరికను విస్మరించి (మళ్ళీ చెబుతున్నాం, దీన్ని ప్రొడక్షన్‌లో అమలు చేయవద్దు!) పాడ్‌ను రన్ చేయగలమో లేదో చూద్దాం.

మొదట మనం స్టాటిక్ పాడ్స్ కోసం ఒక డైరెక్టరీని సృష్టించి రన్ చేస్తాము 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 ఇది కొన్ని హెచ్చరికలను రాయడం ప్రారంభిస్తుంది మరియు ఏమీ జరగనట్లు అనిపిస్తుంది. కానీ అది నిజం కాదు! డాకర్‌ను పరిశీలిద్దాం:

$ 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 పాడ్ మానిఫెస్ట్‌ను చదివి, మా నిర్దేశాల ప్రకారం రెండు కంటైనర్‌లను ప్రారంభించమని డాకర్‌కు సూచించాము. (మీకు "పాజ్" కంటైనర్ గురించి ఆసక్తి ఉంటే, అది ఒక కుబెర్నెటెస్ హ్యాక్—వివరాల కోసం చూడండి) ఈ బ్లాగ్.) క్యూబ్‌లెట్ మన కంటైనర్‌ను ప్రారంభిస్తుంది busybox పేర్కొన్న ఆదేశంతో, స్టాటిక్ పాడ్ తొలగించబడే వరకు అది నిరవధికంగా పునఃప్రారంభించబడుతుంది.

మిమ్మల్ని మీరు అభినందించుకోండి. టెర్మినల్‌కు టెక్స్ట్‌ను అవుట్‌పుట్ చేయడానికి అత్యంత క్లిష్టమైన మార్గాలలో ఒకదాన్ని మనం ఇప్పుడే కనుగొన్నాము!

లాంచ్ మొదలైనవి

కుబెర్నెటెస్ APIని పనిచేయించడమే మా అంతిమ లక్ష్యం, కానీ అలా చేయడానికి మనం ముందుగా దానిని పనిచేయించాలి. మొదలైనవిpods డైరెక్టరీలో దాని సెట్టింగ్‌లను ఉంచడం ద్వారా ఒక కనీస etcd క్లస్టర్‌ను ప్రారంభిద్దాం (ఉదా. 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

మీరు ఎప్పుడైనా కుబెర్నెటీస్‌తో పనిచేసి ఉంటే, ఈ YAML ఫైల్స్ మీకు సుపరిచితంగా ఉండాలి. ఇక్కడ గమనించదగ్గ రెండు విషయాలు ఉన్నాయి:

మేము హోస్ట్ ఫోల్డర్‌ను మౌంట్ చేసాము /var/lib/etcd పాడ్‌లోకి etcd డేటాను చేర్చండి, తద్వారా పునఃప్రారంభాల అంతటా 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 సర్వర్‌ను ప్రారంభించడం మరింత సులభం. మీరు పంపించవలసిన ఏకైక పరామితి ఏమిటంటే --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 Kubernetes API పోర్ట్ 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 ఆఫ్‌లైన్ మోడ్‌ను ప్రారంభిస్తుంది.

ఇంతకాలం, మనకు తెలియకుండానే, మనం క్యూబ్‌లెట్‌ను "స్టాండ్‌అలోన్ మోడ్"లో నడుపుతున్నాము. (మనం చాలా సూక్ష్మంగా ఆలోచిస్తే, క్యూబ్‌లెట్ స్టాండ్‌అలోన్ మోడ్‌ను "కనీస ఆచరణీయ క్యూబర్నెటీస్" అని పరిగణించవచ్చు, కానీ అది చాలా విసుగు పుట్టిస్తుంది.) "అసలైన" కాన్ఫిగరేషన్‌ను పని చేయించడానికి, మనం క్యూబ్‌లెట్‌కు ఒక క్యూబ్‌కాన్ఫిగ్ ఫైల్‌ను అందించాలి, అప్పుడే అది 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

(అన్నట్టు, క్యూబ్‌లెట్ పనిచేయనప్పుడు మీరు కర్ల్ ద్వారా ఏపీఐని యాక్సెస్ చేయడానికి ప్రయత్నిస్తే, అది ఇంకా నడుస్తూనే ఉందని మీరు గమనిస్తారు! క్యూబ్‌లెట్ అనేది డాకర్ లాగా దాని పాడ్‌లకు "పేరెంట్" కాదు; ఇది ఒక "మేనేజ్‌మెంట్ డీమన్" లాంటిది. క్యూబ్‌లెట్ ద్వారా నిర్వహించబడే కంటైనర్‌లు, క్యూబ్‌లెట్ వాటిని ఆపేంత వరకు నడుస్తూనే ఉంటాయి.)

కొన్ని నిమిషాల్లో 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

ఈసారి మనల్ని మనం నిజంగా అభినందించుకుందాం (నేనైతే ఇదివరకే అభినందించుకున్నాను) – మన దగ్గర పూర్తిస్థాయిలో పనిచేసే APIని నడుపుతున్న ఒక కనీస స్థాయి కుబెర్నెటీస్ "క్లస్టర్" ఉంది!

ప్రారంభిద్దాం

ఇప్పుడు API ఏమి చేయగలదో చూద్దాం. nginx pod తో ప్రారంభిద్దాం:

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.

మన కుబెర్నెటెస్ వాతావరణం ఎంత దారుణంగా అసంపూర్ణంగా ఉందో ఇక్కడ మనం చూడవచ్చు—మనకు సర్వీస్ ఖాతాలు లేవు. ఒక సర్వీస్ ఖాతాను మాన్యువల్‌గా సృష్టించి, ఏమి జరుగుతుందో చూద్దాం:

$ 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 సర్వర్ చాలా మినిమలిస్ట్‌గా ఉంటుంది, ఇందులో అధిక శ్రమతో కూడిన ఆటోమేటిక్ కాన్ఫిగరేషన్ పనులన్నీ ఇంకా రన్ కాని వివిధ కంట్రోలర్‌లు మరియు బ్యాక్‌గ్రౌండ్ జాబ్‌లలో జరుగుతాయి.

ఆప్షన్‌ను సెట్ చేయడం ద్వారా మనం ఈ సమస్యను అధిగమించవచ్చు 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

చివరికి, పాడ్ కనిపించింది! కానీ అది నిజానికి ప్రయోగించబడదు ఎందుకంటే మన దగ్గర లేవు ప్రణాళికకర్త (షెడ్యూలర్) అనేది మరో ముఖ్యమైన కుబెర్నెటెస్ భాగం. మళ్ళీ, కుబెర్నెటెస్ API ఆశ్చర్యకరంగా "తెలివి తక్కువగా" ఉంటుందని మనం చూస్తాము—మీరు APIలో ఒక పాడ్‌ను సృష్టించినప్పుడు, అది దానిని రిజిస్టర్ చేస్తుంది కానీ దానిని ఏ నోడ్‌లో నడపాలో గుర్తించడానికి ప్రయత్నించదు.

నిజానికి, పాడ్‌ను ప్రారంభించడానికి మీకు షెడ్యూలర్ అవసరం లేదు. మీరు పారామీటర్‌ను ఉపయోగించి మాన్యువల్‌గా నోడ్‌ను మానిఫెస్ట్‌కు జోడించవచ్చు. 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 ఆశించిన విధంగా పనిచేస్తాయని, కానీ Service మరియు Deployment పనిచేయవని నేను కనుగొన్నాను.

విజయం!

ఈ పోస్ట్ చాలా పెద్దదిగా అవుతోంది, కాబట్టి నేను విజయం సాధించానని ప్రకటిస్తూ, దీనిని "కుబెర్నెటెస్" అని పిలవదగిన ఒక ఆచరణీయమైన కాన్ఫిగరేషన్ అని చెబుతున్నాను. సంగ్రహంగా చెప్పాలంటే: నాలుగు బైనరీలు, ఐదు కమాండ్-లైన్ ఆప్షన్లు, మరియు "కేవలం" 45 లైన్ల YAML (కుబెర్నెటెస్ ప్రమాణాల ప్రకారం ఇది పెద్ద మొత్తం కాదు), అయినా కూడా మనకు చాలా విషయాలు పనిచేస్తున్నాయి:

  • పాడ్‌లు సాధారణ కుబెర్నెటెస్ APIని ఉపయోగించి (కొన్ని ఉపాయాలతో) నిర్వహించబడతాయి.
  • మీరు పబ్లిక్ కంటైనర్ ఇమేజ్‌లను డౌన్‌లోడ్ చేసి, నిర్వహించవచ్చు.
  • పాడ్‌లు సజీవంగా ఉంటాయి మరియు స్వయంచాలకంగా పునఃప్రారంభించబడతాయి
  • ఒకే నోడ్‌లోని పాడ్‌ల మధ్య నెట్‌వర్కింగ్ చాలా బాగా పనిచేస్తుంది.
  • కాన్ఫిగ్‌మ్యాప్, సీక్రెట్ మరియు సాధారణ స్టోరేజ్ మౌంటింగ్ ఆశించిన విధంగా పనిచేస్తాయి.

కానీ కుబెర్నెటీస్‌ను నిజంగా ఉపయోగకరంగా మార్చే అనేక అంశాలు ఇప్పటికీ లోపించాయి, ఉదాహరణకు:

  • పాడ్ షెడ్యూలర్
  • ప్రామాణీకరణ/అధికారం
  • అనేక నోడ్లు
  • సేవల నెట్‌వర్క్
  • క్లస్టర్డ్ ఇంటర్నల్ DNS
  • సర్వీస్ ఖాతాలు, డిప్లాయ్‌మెంట్‌లు, క్లౌడ్ ప్రొవైడర్ ఇంటిగ్రేషన్‌లు మరియు కుబెర్నెటెస్ అందించే ఇతర అనేక ప్రయోజనాల కోసం కంట్రోలర్‌లు

మరి మనకు అసలు లభించింది ఏమిటి? స్వతంత్రంగా పనిచేసే కుబెర్నెటెస్ API అనేది నిజానికి కేవలం ఒక ప్లాట్‌ఫారమ్ మాత్రమే. కంటైనర్ ఆటోమేషన్ఇది పెద్దగా ఏమీ చేయదు—అది APIని ఉపయోగించే వివిధ కంట్రోలర్‌లు మరియు ఆపరేటర్‌ల పని—కానీ ఇది ఆటోమేషన్ కోసం ఒక స్థిరమైన వాతావరణాన్ని అందిస్తుంది.

ఉచిత వెబినార్‌లో కోర్సు గురించి మరింత తెలుసుకోండి.

ఇంకా చదవండి:

మూలం: www.habr.com