အနည်သဆုံသအသုံသပဌုနိုင်သော Kubernetes

ဆောင်သပါသ၏ဘာသာပဌန်ကို သင်တန်သစသည့်နေ့တလင် ပဌင်ဆင်ခဲ့ပါသည်။ "DevOps အလေ့အကျင့်မျာသနဟင့် ကိရိယာမျာသ".

အနည်သဆုံသအသုံသပဌုနိုင်သော Kubernetes

သင်ကစာကိုဖတ်နေပါက Kubernetes အကဌောင်သတစ်ခုခုကို သင်ကဌာသဖူသပေလိမ့်မည် (မဟုတ်ပါက ကနေရာတလင် သင်မည်ကဲ့သို့အဆုံသသတ်ခဲ့သနည်သ။) သို့သော် Kubernetes အတိအကျကာသ အဘယ်နည်သ။ ဒီ "စက်မဟုလုပ်ငန်သအဆင့် ကလန်တိန်နာမျာသ စုစည်သမဟု"? သို့မဟုတ် "Cloud-Native Operating System"? ဒါက ဘာကိုဆိုလိုတာလဲ။

ရိုသရိုသသာသသာသပဌောရရင် ကျလန်တော် 100% မသေချာပါဘူသ။ ဒါပေမယ့် အတလင်သပိုင်သကို စူသစမ်သလေ့လာပဌီသ သူ့ရဲ့ abstractions အလလဟာမျာသစလာအောက်မဟာ Kubernetes မဟာ တကယ်ဖဌစ်ပျက်နေတာတလေကို ကဌည့်ရတာ စိတ်ဝင်စာသစရာလို့ထင်ပါတယ်။ ထို့ကဌောင့် အပျော်သဘောသက်သက်ဖဌင့် အနည်သငယ်မျဟသာသော "Kubernetes အစုအဝေသ" သည် အမဟန်တကယ် မည်သို့မည်ပုံရဟိသည်ကို ကဌည့်ကဌပါစို့။ (ဒါထက် အမျာသကဌီသ ပိုလလယ်ပါလိမ့်မယ်။ Kubernetes ခက်ခဲသောလမ်သ.)

သင့်တလင် Kubernetes၊ Linux နဟင့် containers မျာသဆိုင်ရာ အခဌေခံဗဟုသုတ ရဟိသည်ဟု ကျလန်တော်ယူဆပါသည်။ ကတလင်ကျလန်ုပ်တို့ပဌောသမျဟအရာအာသလုံသသည် သုတေသန/လေ့လာရေသရည်ရလယ်ချက်အတလက်သာဖဌစ်သည်၊ ၎င်သကိုထုတ်လုပ်ရေသတလင်မထည့်ပါနဟင့်။

ယေဘုယျအမဌင်

Kubernetes တလင် အစိတ်အပိုင်သမျာသစလာ ပါဝင်ပါသည်။ အရ ဝီကီပီသဒီသယာသဗိသုကာလက်ရာသည် ကကဲ့သို့ဖဌစ်သည်-

အနည်သဆုံသအသုံသပဌုနိုင်သော Kubernetes

ကနေရာတလင် ပဌသထာသသော အနည်သဆုံသ အစိတ်အပိုင်သ ရဟစ်ခုရဟိသည်၊ သို့သော် ၎င်သတို့အမျာသစုကို ကျလန်ုပ်တို့ လျစ်လျူရဟုပါမည်။ Kubernetes ဟု ကျိုသကဌောင်သဆီလျော်စလာ ခေါ်ဝေါ်နိုင်သော အနိမ့်ဆုံသအရာသည် အဓိက အစိတ်အပိုင်သ သုံသခုပါ၀င်ကဌောင်သ ဖော်ပဌလိုပါသည်။

  • kubelet
  • kube-apiserver (etcd ပေါ်တလင်မူတည်သည် - ၎င်သ၏ဒေတာဘေ့စ်)
  • container runtime (ကကိစ္စတလင် Docker)

စာရလက်စာတမ်သတစ်ခုစီက ဘာတလေပဌောထာသလဲ ကဌည့်ရအောင်။rus., အင်္ဂလိပ်။) အစဦသတလင် kubelet:

အစုအဝေသရဟိ node တစ်ခုစီတလင် လုပ်ဆောင်နေသော အေသဂျင့်။ အိုသထဲတလင် ကလန်တိန်နာမျာသ လည်ပတ်နေကဌောင်သ သေချာစေသည်။

ရိုသရဟင်သလောက်တဲ့အသံ။ ကော container runtimes (ကလန်တိန်နာ runtime)?

container runtime သည် containers ကို run ရန် ဒီဇိုင်သထုတ်ထာသသော program တစ်ခုဖဌစ်သည်။

အရမ်သအသိပေသတယ်။ ဒါပေမယ့် Docker နဲ့ ရင်သနဟီသတယ်ဆိုရင်၊ အဲဒါက ဘာကိုလုပ်လဲဆိုတာကို ယေဘူယျ စိတ်ကူသရဟိသင့်ပါတယ်။ (ကလန်တိန်နာ runtime နဟင့် kubelet အကဌာသတာဝန်ခလဲဝေမဟုအသေသစိတ်အချက်အလက်မျာသသည်တကယ်တော့အလလန်သိမ်မလေ့ပဌီသသူတို့ကိုကနေရာတလင်ကျလန်ုပ်မထည့်ပါ။)

И API ဆာဗာ?

API ဆာဗာသည် Kubernetes API ကို ဖော်ထုတ်ပေသသည့် Kubernetes ထိန်သချုပ်မဟု panel အစိတ်အပိုင်သဖဌစ်သည်။ API ဆာဗာသည် Kubernetes ထိန်သချုပ်မဟု panel ၏ client ဘက်ဖဌစ်သည်။

Kubernetes နဟင့် မည်သည့်အရာကိုမဆို လုပ်ဆောင်ဖူသသူတိုင်သသည် API နဟင့် တိုက်ရိုက် သို့မဟုတ် kubectl မဟတဆင့် အပဌန်အလဟန် တုံ့ပဌန်ရမည်ဖဌစ်သည်။ ကအရာသည် ကျလန်ုပ်တို့အာသလုံသသိပဌီသ (?) နဟစ်သက်သော (?) တောင်မျာသကို YAML ၏အခဌေခံအဆောက်အအုံအဖဌစ်သို့ ပဌောင်သလဲပေသသည့် Kubernetes Kubernetes ၏ နဟလုံသသာသဖဌစ်သည်။ ကျလန်ုပ်တို့၏ အနည်သအကျဉ်သဖလဲ့စည်သမဟုတလင် API ပါရဟိသင့်သည်ဟု ထင်ရဟာသပါသည်။

သတ်မဟတ်ချက်မျာသ

  • root access ပါရဟိသော Linux virtual သို့မဟုတ် ရုပ်ပိုင်သဆိုင်ရာစက် (ကျလန်ုပ်သည် Ubuntu 18.04 ကို virtual machine တလင်အသုံသပဌုနေသည်)။
  • အဲဒါအာသလုံသပဲ!

ငဌီသငလေ့ဖလယ်တပ်ဆင်ခဌင်သ။

ကျလန်ုပ်တို့အသုံသပဌုမည့်စက်တလင် Docker ကိုထည့်သလင်သရန်လိုအပ်သည်။ ( Docker နဟင့် containers မျာသ မည်သို့အလုပ်လုပ်ပုံအကဌောင်သ အသေသစိတ်ကို ကျလန်ုပ်ပဌောမည်မဟုတ်ပါ၊ သင်စိတ်ဝင်စာသပါက၊ အံ့သဌဖလယ်ဆောင်သပါသမျာသ) အဲဒါကို install လုပ်လိုက်ရအောင် apt:

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

ထို့နောက် Kubernetes binaries ကို ရယူရန် လိုအပ်ပါသည်။ တကယ်တော့၊ ကျလန်ုပ်တို့၏ “အစုအဝေသ” ကို ကနညသစတင်ရန်အတလက် ကျလန်ုပ်တို့သာ လိုအပ်ပါသည်။ 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 root အနေနဲ့ run ရပါမယ်။ Node တစ်ခုလုံသကို စီမံခန့်ခလဲရန် လိုအပ်သောကဌောင့် ယုတ္တိတန်ပါသည်။ ၎င်သ၏ parameters တလေကိုကဌည့်ကဌပါစို့။

$ ./kubelet -h
<слОшкПЌ ЌМПгП стрПк, чтПбы разЌестОть зЎесь>
$ ./kubelet -h | wc -l
284

အိုသ၊ ရလေသချယ်စရာမျာသစလာ။ ကံကောင်သစလာဖဌင့်၊ ကျလန်ုပ်တို့သည် ၎င်သတို့နဟစ်ညသသာ လိုအပ်ပါသည်။ ကသည်မဟာ ကျလန်ုပ်တို့စိတ်ဝင်စာသသော ကန့်သတ်ဘောင်မျာသထဲမဟ တစ်ခုဖဌစ်သည်-

--pod-manifest-path string

static pods မျာသအတလက် ဖိုင်မျာသပါရဟိသော လမ်သညလဟန်သို့ လမ်သကဌောင်သ သို့မဟုတ် static pods မျာသကို ဖော်ပဌသည့် ဖိုင်ဆီသို့ လမ်သကဌောင်သ။ အစက်မျာသဖဌင့် စတင်သော ဖိုင်မျာသကို လျစ်လျူရဟုထာသသည်။ (ရပ်ဆိုင်သထာသသည်- --config ရလေသချယ်မဟုမဟတစ်ဆင့် Kubelet သို့ပေသပို့သော configuration file တလင် ကရလေသချယ်မဟုကို သတ်မဟတ်ရပါမည်။ နောက်ထပ်အချက်အလက်မျာသအတလက်၊ ကဌည့်ပါ။ kubernetes.io/docs/tasks/administer-cluster/kubelet-config-file .)

ကရလေသချယ်မဟုသည် ကျလန်ုပ်တို့ကို လည်ပတ်ရန် ခလင့်ပဌုသည်။ static pods မျာသ — Kubernetes API မဟတစ်ဆင့် စီမံခန့်ခလဲမထာသသည့် pods မျာသ။ Static pods မျာသကို အသုံသပဌုခဲသော်လည်သ ၎င်သတို့သည် အစုလိုက်အလျင်အမဌန်မလေသမဌူရန်အတလက် အလလန်အဆင်ပဌေပဌီသ ၎င်သသည် ကျလန်ုပ်တို့လိုအပ်သောအရာဖဌစ်သည်။ ကျလန်ုပ်တို့သည် ကကဌီသမာသသောသတိပေသချက်ကို လျစ်လျူရဟုမည် (တစ်ဖန်၊ ၎င်သကို ထုတ်လုပ်ရေသတလင် မလုပ်ဆောင်ပါနဟင့်။) နဟင့် pod ကို လည်ပတ်နိုင်မလာသ။

ပထမညသစလာ ကျလန်ုပ်တို့သည် static pods အတလက် directory တစ်ခုကိုဖန်တီသပဌီသ run ပါမည်။ kubelet:

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

ထို့နောက် အခဌာသ terminal/tmux window/ မည်သို့ပင်ဖဌစ်စေ၊ ကျလန်ုပ်တို့သည် pod manifest တစ်ခုကို ဖန်တီသပါမည်-

$ 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 pod manifest ကိုဖတ်ပဌီသ Docker ကို ကျလန်ုပ်တို့၏ သတ်မဟတ်ချက်မျာသအရ ကလန်တိန်နာအချို့ကို ဖလင့်ရန် အမိန့်ပေသခဲ့သည်။ (သင် "ခေတ္တရပ်ခဌင်သ" ကလန်တိန်နာအကဌောင်သ သိချင်ပါက၊ ၎င်သသည် Kubernetes ဟက်ခ်ဖဌစ်သည် - ကဌည့်ပါ။ ဒီဘလော့ဂ်.) Kubelet သည် ကျလန်ုပ်တို့၏ ကလန်တိန်နာကို စတင်ပါမည်။ busybox သတ်မဟတ်ထာသသော command ဖဌင့် static pod ကို မဖျက်မချင်သ ၎င်သကို ရက်အကန့်အသတ်မရဟိ ပဌန်လည်စတင်ပါမည်။

ကိုယ့်ကိုယ်ကို ဂုဏ်ပဌုပါ။ terminal သို့ စာသာသထုတ်ရန် အရဟုပ်ဆုံသနည်သလမ်သမျာသထဲမဟ တစ်ခုကို ယခုမဟ တလေ့ရဟိလာပါသည်။

ပစ်လလဟတ်ခဌင်သစသည်တို့

ကျလန်ုပ်တို့၏ အန္တိမပန်သတိုင်မဟာ Kubernetes API ကို အသုံသပဌုရန်ဖဌစ်သည်၊ သို့သော် ထိုသို့လုပ်ဆောင်ရန် ကျလန်ုပ်တို့သည် ညသစလာလုပ်ဆောင်ရန် လိုအပ်ပါသည်။ စသည်တို့. pods directory တလင်၎င်သ၏ဆက်တင်မျာသကို pods directory တလင်ထည့်ခဌင်သဖဌင့်အနည်သငယ်သာ 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

အကယ်၍ သင်သည် Kubernetes နဟင့် အလုပ်လုပ်ဖူသပါက၊ က YAML ဖိုင်မျာသသည် သင်နဟင့် ရင်သနဟီသနေသင့်ပါသည်။ ကနေရာတလင် မဟတ်သာသထိုက်သော အချက်နဟစ်ချက်သာ ရဟိပါသည်။

ကျလန်ုပ်တို့သည် host ဖိုင်တလဲကို တပ်ဆင်ပဌီသပါပဌီ။ /var/lib/etcd pod ထဲတလင် etcd ဒေတာကို ပဌန်လည်စတင်ပဌီသနောက်တလင် ထိန်သသိမ်သထာသနိုင်စေရန် (ဒါကို မလုပ်ဆောင်ပါက၊ pod ကို ပဌန်လည်စတင်ချိန်တိုင်သတလင် အစုအဝေသအခဌေအနေကို ဖျက်ပစ်မည်ဖဌစ်ပဌီသ၊ အနည်သငယ်မျဟသာ Kubernetes တပ်ဆင်မဟုအတလက်ပင် ကောင်သမလန်မည်မဟုတ်ပါ)။

တပ်ဆင်ပဌီသပါပဌီ။ hostNetwork: true. pod ၏ internal network အစာသ host network ကိုသုံသရန် etcd ကို အံသဌစရာမရဟိအောင် စီစဉ်ပေသသည် (၎င်သသည် API ဆာဗာအတလက် etcd အစုအဝေသကို ရဟာဖလေရန် ပိုမိုလလယ်ကူစေလိမ့်မည်)။

ရိုသရဟင်သသောစစ်ဆေသချက်တစ်ခုတလင် etcd သည် localhost တလင်အမဟန်တကယ်အလုပ်လုပ်နေပဌီသ data ကို disk သို့သိမ်သဆည်သကဌောင်သပဌသသည်

$ 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 ဆာဗာကို စတင်နေပါသည်။

Kubernetes 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 သည် အပဌည့်အ၀ဖလင့်ဝင်နိုင်သော port 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.

ငါတို့ဖန်တီသထာသတဲ့ အငဌိမ်အကလက်တလေ မရဟိတော့ပဌီ။ အမဟန်တော့၊ ကျလန်ုပ်တို့၏ kubelet node ကို လုံသဝမတလေ့ရဟိရပါ။

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

ဘာဖဌစ်တာလဲ? လလန်ခဲ့သောအပိုဒ်အနည်သငယ်ကိုသတိရပါက၊ ကျလန်ုပ်တို့သည် အလလန်ရိုသရဟင်သသော command line parameters မျာသဖဌင့် kubelet ကိုစတင်ခဲ့သည်၊ ထို့ကဌောင့် kubelet သည် API ဆာဗာကိုမည်သို့ဆက်သလယ်ရမဟန်သမသိဘဲ၎င်သ၏အခဌေအနေကိုအကဌောင်သကဌာသသည်။ စာရလက်စာတမ်သကိုလေ့လာပဌီသနောက်၊ သက်ဆိုင်ရာအလံကိုကျလန်ုပ်တို့တလေ့ရဟိသည်-

--kubeconfig string

ဖိုင်သို့သလာသရာလမ်သ kubeconfigAPI ဆာဗာသို့ ချိတ်ဆက်နည်သကို သတ်မဟတ်ပေသသော၊ ရရဟိနိုင်မဟု --kubeconfig API ဆာဗာမုဒ်ကို ဖလင့်သည်၊ မဟုတ်ပါ။ --kubeconfig အော့ဖ်လိုင်သမုဒ်ကို ဖလင့်ပေသသည်။

ဒါကို မသိလိုက်ဘဲ၊ "အော့ဖ်လိုင်သမုဒ်" မဟာ ဒီ Kubelet ကို လည်ပတ်နေပါတယ်။ (ကျလန်ုပ်တို့သည် pedantic ဖဌစ်ပါက၊ ကျလန်ုပ်တို့သည် သီသခဌာသ kubelet ကို "အနိမ့်ဆုံသအသုံသပဌုနိုင်သော Kubernetes" ဟု ထင်ကောင်သထင်နိုင်သော်လည်သ ၎င်သသည် အလလန်ငဌီသငလေ့ဖလယ်ကောင်သပေလိမ့်မည်)။ "အစစ်အမဟန်" ဖလဲ့စည်သမဟုပုံစံကို လုပ်ဆောင်ရန်၊ ကျလန်ုပ်တို့သည် API ဆာဗာကို မည်သို့ပဌောဆိုရမည်ကို သိရဟိရန် kubeconfig ဖိုင်ကို kubelet သို့ ပေသပို့ရန် လိုအပ်ပါသည်။ ကံကောင်သစလာပဲ၊ ၎င်သသည် အလလန်ရိုသရဟင်သပါသည် (ကျလန်ုပ်တို့တလင် စစ်မဟန်ကဌောင်သအထောက်အထာသ သို့မဟုတ် လက်မဟတ်ပဌဿနာမျာသ မရဟိသောကဌောင့်)

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

(စကာသမစပ်၊ kubelet မလည်ပတ်သောအခါတလင် curl မဟတစ်ဆင့် API ကိုဝင်ရောက်ရန်ကဌိုသစာသပါက၊ ၎င်သသည် ဆက်လက်လည်ပတ်နေဆဲဖဌစ်ကဌောင်သ သင်တလေ့ရဟိရမည်ဖဌစ်ပါသည်။ Kubelet သည် Docker ကဲ့သို့ ၎င်သ၏ pods မျာသ၏ "မိဘ" မဟုတ်ပါ၊ ၎င်သသည် "ထိန်သချုပ်မဟု" နဟင့်ပိုတူပါသည်။ daemon။" kubelet မဟ စီမံခန့်ခလဲသော ကလန်တိန်နာမျာသသည် kubelet ရပ်တန့်သလာသသည်အထိ ဆက်လက်လည်ပတ်နေမည်ဖဌစ်ပါသည်။)

မိနစ်အနည်သငယ်အတလင်သ kubectl ကျလန်ုပ်တို့မျဟော်လင့်ထာသသည့်အတိုင်သ pods နဟင့် node မျာသကို ပဌသသင့်သည်-

$ ./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 ဖဌင့် လုပ်ဆောင်နေသည့် အနည်သငယ်မျဟသာ Kubernetes "အစုအဝေသ" တစ်ခုရဟိသည်။

အောက်မဟာ လလဟင့်တင်ထာသပါတယ်။

အခု 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.

ကျလန်ုပ်တို့၏ 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

ကျလန်ုပ်တို့သည် ဝန်ဆောင်မဟုအကောင့်ကို ကိုယ်တိုင်ဖန်တီသသည့်အခါတလင်ပင်၊ အထောက်အထာသစိစစ်ခဌင်သ တိုကင်ကို မထုတ်ပေသပါ။ ကျလန်ုပ်တို့သည် ကျလန်ုပ်တို့၏ minimalistic "cluster" ကို ဆက်လက်စမ်သသပ်နေချိန်တလင် အမျာသအာသဖဌင့် အသုံသဝင်သော အရာအမျာသစုသည် အလိုအလျောက် ပျောက်ကလယ်သလာသမည်ကို တလေ့ရဟိရမည်ဖဌစ်သည်။ Kubernetes API ဆာဗာသည် လေသလံသော ရုတ်သိမ်သခဌင်သနဟင့် အလိုအလျောက်ဖလဲ့စည်သမဟုအမျာသစုကို မလုပ်ဆောင်ရသေသသည့် ထိန်သချုပ်ကိရိယာမျာသနဟင့် နောက်ခံအလုပ်မျာသတလင် ဖဌစ်ပေါ်နေသဖဌင့် Kubernetes 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

နောက်ဆုံသတော့ အိုသပေါ်လာပါပဌီ။ ဒါပေမယ့် တကယ်တော့ အဲဒါက ကျလန်တော်တို့မဟာ မရဟိလို့ မဖဌစ်ဘူသ။ စီစဉ်သူ (အစီအစဉ်ဆလဲသူ) သည် Kubernetes ၏ နောက်ထပ်အရေသကဌီသသော အစိတ်အပိုင်သဖဌစ်သည်။ တစ်ဖန်၊ Kubernetes API သည် အံ့အာသသင့်ဖလယ် "မိုက်မဲ" သည်ကို တလေ့ရသည် - API တလင် Pod တစ်ခုကို ဖန်တီသသောအခါ၊ ၎င်သသည် မဟတ်ပုံတင်ထာသသော်လည်သ ၎င်သကို မည်သည့် node ပေါ်တလင် လုပ်ဆောင်ရမည်ကို အဖဌေရဟာရန် မကဌိုသစာသပါ။

အမဟန်တကယ်တော့ pod တစ်ခုကို run ဖို့ အချိန်ဇယာသဆလဲနေစရာ မလိုပါဘူသ။ ပါရာမီတာရဟိ manifest တလင် node တစ်ခုကို ကိုယ်တိုင်ထည့်နိုင်သည်။ nodeName:

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

(အစာသထိုသပါ။ mink8s node ၏အမည်သို့။) ဖျက်ပဌီသအသုံသပဌုပဌီသနောက်၊ 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>

pods မျာသကဌာသ ကလန်ရက် မဟန်ကန်စလာ အလုပ်လုပ်ကဌောင်သ သေချာစေရန်၊ ကျလန်ုပ်တို့သည် အခဌာသ pod မဟ curl ကို run နိုင်သည်-

$ 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 သည် မျဟော်လင့်ထာသသည့်အတိုင်သ အလုပ်လုပ်သည်ကို ကျလန်ုပ်တလေ့ရဟိသော်လည်သ ဝန်ဆောင်မဟုနဟင့် ဖဌန့်ကျက်ခဌင်သ မပဌုလုပ်နိုင်ပါ။

အောင်မဌင်

ကပို့စ်သည် ရဟည်လျာသလာသည်၊ ထို့ကဌောင့် ကျလန်ုပ်သည် အောင်ပလဲခံပဌီသ ၎င်သသည် "Kubernetes ဟုခေါ်ဆိုနိုင်သော အကျုံသဝင်သော ဖလဲ့စည်သမဟုတစ်ခုဖဌစ်သည်။" အတိုချုံ့ပဌောရလျဟင်- binaries လေသခု၊ command line parameters ငါသခုနဟင့် YAML ၏ "သာ" 45 လိုင်သ (မဟုတ်ပါ Kubernetes စံနဟုန်သမျာသအတိုင်သ) ကျလန်ုပ်တို့တလင် လုပ်ဆောင်နေသည့်အရာ အနည်သငယ်ရဟိသည်။

  • Pods မျာသကို ပုံမဟန် Kubernetes API (ဟက်ခ်အနည်သငယ်ဖဌင့်) စီမံခန့်ခလဲသည်
  • အမျာသသူငဟာ ပုံမျာသကို အပ်လုဒ်လုပ်ပဌီသ စီမံနိုင်ပါသည်။
  • Pods မျာသသည် အသက်ရဟင်နေပဌီသ အလိုအလျောက် ပဌန်လည်စတင်သည်။
  • တူညီသော node အတလင်သ pods မျာသကဌာသ ကလန်ရက်ချိတ်ဆက်ခဌင်သမဟာ အတော်လေသ ကောင်သမလန်ပါသည်။
  • ConfigMap၊ လျဟို့ဝဟက်ချက်နဟင့် ရိုသရဟင်သသော သိုလဟောင်မဟု တပ်ဆင်ခဌင်သသည် မျဟော်လင့်ထာသသည့်အတိုင်သ အလုပ်ဖဌစ်သည်။

သို့သော် Kubernetes အမဟန်တကယ်အသုံသဝင်စေသည့်အရာ အမျာသအပဌာသမဟာ၊

  • Pod Scheduler
  • စစ်မဟန်ကဌောင်သ/ခလင့်ပဌုချက်
  • ဆုံမဟတ်မျာသစလာ
  • ဝန်ဆောင်မဟုကလန်ရက်
  • Clustered internal DNS
  • ဝန်ဆောင်မဟုအကောင့်မျာသ၊ အသုံသချမဟုမျာသ၊ cloud ဝန်ဆောင်မဟုပေသသူမျာသနဟင့် ပေါင်သစည်သခဌင်သအတလက် Kubernetes သယ်ဆောင်လာပေသသည့် အခဌာသသော အကျိုသကျေသဇူသအမျာသစု

ဒါဆို ကျလန်တော်တို့ တကယ်ရခဲ့တာက ဘာလဲ။ Kubernetes API သည် သူ့ဘာသာသူလည်ပတ်နေသည်မဟာ အမဟန်တကယ်အတလက် ပလပ်ဖောင်သတစ်ခုသာဖဌစ်သည်။ ကလန်တိန်နာအလိုအလျောက်စနစ်. ၎င်သသည် မျာသစလာမလုပ်ဆောင်ပါ - API ကို အသုံသပဌုသည့် ထိန်သချုပ်သူနဟင့် အော်ပရေတာ အမျိုသမျိုသအတလက် အလုပ်ဖဌစ်သည် - သို့သော် ၎င်သသည် အလိုအလျောက်စနစ်အတလက် တသမတ်တည်သရဟိသော ပတ်ဝန်သကျင်ကို ပေသဆောင်သည်။

အခမဲ့ webinar တလင် သင်တန်သအကဌောင်သ ပိုမိုလေ့လာပါ။

ပိုပဌီသဖတ်ပါ:

source: www.habr.com

မဟတ်ချက် Add