ืžื™ื ื™ืžื•ื ืงื™ื™ืžื•ืช Kubernetes

ืชืจื’ื•ื ื”ืžืืžืจ ื”ื•ื›ืŸ ืขืจื‘ ืชื—ื™ืœืช ื”ืงื•ืจืก "ืฉื™ื˜ื•ืช ื•ื›ืœื™ื ืฉืœ DevOps".

ืžื™ื ื™ืžื•ื ืงื™ื™ืžื•ืช Kubernetes

ืื ืืชื ืงื•ืจืื™ื ืืช ื–ื”, ื‘ื˜ื— ืฉืžืขืชื ืžืฉื”ื• ืขืœ Kubernetes (ื•ืื ืœื, ืื™ืš ื”ื’ืขืช ืœื›ืืŸ?) ืื‘ืœ ืžื” ื–ื” ื‘ืขืฆื Kubernetes? ื–ึถื” "ืชื–ืžื•ืจ ืฉืœ ืžื›ื•ืœื•ืช ืชืขืฉื™ื™ืชื™ื•ืช"? ืื• "ืžืขืจื›ืช ื”ืคืขืœื” ืขื ืŸ ืžืงื•ืจื™ืช"? ืžื” ื–ื” ืื•ืžืจ ื‘ื›ืœืœ?

ืœืžืขืŸ ื”ืืžืช, ืื ื™ ืœื ื‘ื˜ื•ื— ื‘-100%. ืื‘ืœ ืื ื™ ื—ื•ืฉื‘ ืฉื–ื” ืžืขื ื™ื™ืŸ ืœื—ืคื•ืจ ื‘ืคื ื™ื ื•ืœืจืื•ืช ืžื” ื‘ืืžืช ืงื•ืจื” ื‘-Kubernetes ืžืชื—ืช ืœืฉื›ื‘ื•ืช ื”ื”ืคืฉื˜ื•ืช ื”ืจื‘ื•ืช ืฉืœื•. ืื– ืกืชื ื‘ืฉื‘ื™ืœ ื”ื›ื™ืฃ, ื‘ื•ืื• ื ืกืชื›ืœ ืื™ืš ื‘ืืžืช ื ืจืื” "ืืฉื›ื•ืœ Kubernetes" ืžื™ื ื™ืžืœื™. (ื–ื” ื™ื”ื™ื” ื”ืจื‘ื” ื™ื•ืชืจ ืงืœ ืžืืฉืจ Kubernetes ื‘ื“ืจืš ื”ืงืฉื”.)

ืื ื™ ืžื ื™ื— ืฉื™ืฉ ืœืš ื™ื“ืข ื‘ืกื™ืกื™ ื‘-Kubernetes, Linux ื•ืžื›ื•ืœื•ืช. ื›ืœ ืžื” ืฉืื ื—ื ื• ืžื“ื‘ืจื™ื ืขืœื™ื• ื›ืืŸ ื”ื•ื ืœืžื˜ืจื•ืช ืžื—ืงืจ/ืœืžื™ื“ื” ื‘ืœื‘ื“, ืืœ ืชื›ื ื™ืกื• ืฉื•ื ื“ื‘ืจ ืžื–ื” ืœื™ื™ืฆื•ืจ!

ืกืงื™ืจื”

Kubernetes ืžื›ื™ืœ ืจื›ื™ื‘ื™ื ืจื‘ื™ื. ืœืคื™ ื•ื™ืงื™ืคื“ื™ื”, ื”ืืจื›ื™ื˜ืงื˜ื•ืจื” ื ืจืื™ืช ื›ืš:

ืžื™ื ื™ืžื•ื ืงื™ื™ืžื•ืช Kubernetes

ื™ืฉื ื ืœืคื—ื•ืช ืฉืžื•ื ื” ืจื›ื™ื‘ื™ื ื”ืžื•ืฆื’ื™ื ื›ืืŸ, ืืš ื ืชืขืœื ืžืจื•ื‘ื. ืื ื™ ืจื•ืฆื” ืœืฆื™ื™ืŸ ืฉื”ื“ื‘ืจ ื”ืžื™ื ื™ืžืœื™ ืฉื ื™ืชืŸ ืœื›ื ื•ืช ื‘ืื•ืคืŸ ืกื‘ื™ืจ Kubernetes ืžื•ืจื›ื‘ ืžืฉืœื•ืฉื” ืžืจื›ื™ื‘ื™ื ืขื™ืงืจื™ื™ื:

  • ืงื•ื‘ืœื˜
  • kube-apiserver (ืชืœื•ื™ ื‘-etcd - ืžืกื“ ื”ื ืชื•ื ื™ื ืฉืœื•)
  • ื–ืžืŸ ืจื™ืฆื” ืฉืœ ืžื™ื›ืœ (Docker ื‘ืžืงืจื” ื–ื”)

ื‘ื•ื ื ืจืื” ืžื” ืื•ืžืจ ื”ืชื™ืขื•ื“ ืขืœ ื›ืœ ืื—ื“ ืžื”ื (ืจื•ืก., ืื ื’ืœื™ืช.). ื‘ืชื—ื™ืœื” ืงื•ื‘ืœื˜:

ืกื•ื›ืŸ ื”ืคื•ืขืœ ื‘ื›ืœ ืฆื•ืžืช ื‘ืืฉื›ื•ืœ. ื–ื” ืžื•ื•ื“ื ืฉืžื™ื›ืœื™ื ืคื•ืขืœื™ื ื‘ืชืจืžื™ืœ.

ื ืฉืžืข ืคืฉื•ื˜ ืžืกืคื™ืง. ืžื” ืœื’ื‘ื™ ื–ืžื ื™ ืจื™ืฆื” ืฉืœ ืžื™ื›ืœ (ื–ืžืŸ ืจื™ืฆื” ืฉืœ ืžื™ื›ืœ)?

ื–ืžืŸ ืจื™ืฆื” ืฉืœ ืงื•ื ื˜ื™ื™ื ืจ ื”ื™ื ืชื•ื›ื ื™ืช ื”ืžื™ื•ืขื“ืช ืœื”ืคืขื™ืœ ืงื•ื ื˜ื™ื™ื ืจื™ื.

ืžืื•ื“ ืื™ื ืคื•ืจืžื˜ื™ื‘ื™. ืื‘ืœ ืื ืืชื” ืžื›ื™ืจ ืืช Docker, ืื– ืืžื•ืจ ืœื”ื™ื•ืช ืœืš ืžื•ืฉื’ ื›ืœืœื™ ืžื” ื–ื” ืขื•ืฉื”. (ื”ืคืจื˜ื™ื ืฉืœ ื”ืคืจื“ืช ื”ืื—ืจื™ื•ืช ื‘ื™ืŸ ื–ืžืŸ ื”ืจื™ืฆื” ืฉืœ ื”ืžื™ื›ืœ ืœืงื•ื‘ืœื˜ ื”ื ืœืžืขืฉื” ื“ื™ ืขื“ื™ื ื™ื ื•ืœื ืื›ื ืก ืืœื™ื”ื ื›ืืŸ).

ะ˜ ืฉืจืช API?

ืฉืจืช API ื”ื•ื ืจื›ื™ื‘ ืœื•ื— ื”ื‘ืงืจื” ืฉืœ Kubernetes ืฉื—ื•ืฉืฃ ืืช ื”-API ืฉืœ Kubernetes. ืฉืจืช ื”-API ื”ื•ื ืฆื“ ื”ืœืงื•ื— ืฉืœ ืœื•ื— ื”ื‘ืงืจื” ืฉืœ Kubernetes

ื›ืœ ืžื™ ืฉืื™ ืคืขื ืขืฉื” ืžืฉื”ื• ืขื Kubernetes ื ืืœืฅ ืœื™ืฆื•ืจ ืื™ื ื˜ืจืืงืฆื™ื” ืขื ื”-API ื™ืฉื™ืจื•ืช ืื• ื“ืจืš kubectl. ื–ื” ื”ืœื‘ ืฉืœ ืžื” ืฉื”ื•ืคืš ืืช Kubernetes Kubernetes - ื”ืžื•ื— ืฉื”ื•ืคืš ืืช ื”ืจื™ YAML ืฉื›ื•ืœื ื• ืžื›ื™ืจื™ื ื•ืื•ื”ื‘ื™ื (?) ืœืชืฉืชื™ืช ืคื•ืขืœืช. ื ืจืื” ื‘ืจื•ืจ ืฉื”-API ืฆืจื™ืš ืœื”ื™ื•ืช ืงื™ื™ื ื‘ืชืฆื•ืจื” ื”ืžื™ื ื™ืžืœื™ืช ืฉืœื ื•.

ืชื ืื™ื ืžื•ืงื“ืžื™ื

  • ืžื›ื•ื ื” ื•ื™ืจื˜ื•ืืœื™ืช ืื• ืคื™ื–ื™ืช ืฉืœ ืœื™ื ื•ืงืก ืขื ื’ื™ืฉืช ืฉื•ืจืฉ (ืื ื™ ืžืฉืชืžืฉ ื‘ืื•ื‘ื•ื ื˜ื• 18.04 ื‘ืžื›ื•ื ื” ื•ื™ืจื˜ื•ืืœื™ืช).
  • ื•ื”ื›ืœ!

ื”ืชืงื ื” ืžืฉืขืžืžืช

ืื ื—ื ื• ืฆืจื™ื›ื™ื ืœื”ืชืงื™ืŸ ืืช Docker ืขืœ ื”ืžื—ืฉื‘ ืฉื‘ื• ื ืฉืชืžืฉ. (ืื ื™ ืœื ืžืชื›ื•ื•ืŸ ืœื”ื™ื›ื ืก ืœืคืจื˜ื™ื ืœื’ื‘ื™ ืื•ืคืŸ ื”ืคืขื•ืœื” ืฉืœ Docker ื•ืžื›ื•ืœื•ืช; ืื ืืชื” ืžืขื•ื ื™ื™ืŸ, ื™ืฉ ืžืืžืจื™ื ื ืคืœืื™ื). ื‘ื•ืื• ืคืฉื•ื˜ ื ืชืงื™ืŸ ืืช ื–ื” ืขื apt:

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

ืœืื—ืจ ืžื›ืŸ, ืขืœื™ื ื• ืœืงื‘ืœ ืืช ื”ืงื‘ืฆื™ื ื”ื‘ื™ื ืืจื™ื™ื ืฉืœ Kubernetes. ืœืžืขืฉื”, ืขื‘ื•ืจ ื”ื”ืฉืงื” ื”ืจืืฉื•ื ื™ืช ืฉืœ ื”"ืืฉื›ื•ืœ" ืฉืœื ื• ืื ื—ื ื• ืฆืจื™ื›ื™ื ืจืง 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

ื ืชื™ื‘ ืœืกืคืจื™ื™ื” ื”ืžื›ื™ืœื” ืงื‘ืฆื™ื ืขื‘ื•ืจ ืชืจืžื™ืœื™ื ืกื˜ื˜ื™ื™ื, ืื• ื ืชื™ื‘ ืœืงื•ื‘ืฅ ื”ืžืชืืจ ืชืจืžื™ืœื™ื ืกื˜ื˜ื™ื™ื. ืžืชืขืœืžื™ื ืžืงื‘ืฆื™ื ืฉืžืชื—ื™ืœื™ื ื‘ื ืงื•ื“ื•ืช. (ืžื‘ื•ื˜ืœ: ื™ืฉ ืœื”ื’ื“ื™ืจ ืืคืฉืจื•ืช ื–ื• ื‘ืงื•ื‘ืฅ ื”ืชืฆื•ืจื” ื”ืžื•ืขื‘ืจ ืœ-Kubelet ื“ืจืš ื”ืืคืฉืจื•ืช --config. ืœืžื™ื“ืข ื ื•ืกืฃ, ืจืื” kubernetes.io/docs/tasks/administer-cluster/kubelet-config-file .)

ืืคืฉืจื•ืช ื–ื• ืžืืคืฉืจืช ืœื ื• ืœืจื•ืฅ ืชืจืžื™ืœื™ื ืกื˜ื˜ื™ื™ื - ืคื•ื“ื™ื ืฉืื™ื ื ืžื ื•ื”ืœื™ื ื‘ืืžืฆืขื•ืช ื”-API ืฉืœ Kubernetes. ืœืขืชื™ื ืจื—ื•ืงื•ืช ืžืฉืชืžืฉื™ื ื‘ืชืจืžื™ืœื™ื ืกื˜ื˜ื™ื™ื, ืื‘ืœ ื”ื ืžืื•ื“ ื ื•ื—ื™ื ืœื”ืขืœืื” ืžื”ื™ืจื” ืฉืœ ืืฉื›ื•ืœ, ื•ื–ื” ื‘ื“ื™ื•ืง ืžื” ืฉืื ื—ื ื• ืฆืจื™ื›ื™ื. ื ืชืขืœื ืžื”ืื–ื”ืจื” ื”ื’ื“ื•ืœื” ื”ื–ื• (ืฉื•ื‘, ืืœ ืชืคืขื™ืœ ืืช ื–ื” ื‘ื™ื™ืฆื•ืจ!) ื•ื ืจืื” ืื โ€‹โ€‹ื ื•ื›ืœ ืœื”ืคืขื™ืœ ืืช ื”ืคื•ื“.

ืจืืฉื™ืช ื ื™ืฆื•ืจ ืกืคืจื™ื™ื” ืขื‘ื•ืจ ืคื•ื“ื™ื ืกื˜ื˜ื™ื™ื ื•ื ืคืขื™ืœ kubelet:

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

ืœืื—ืจ ืžื›ืŸ, ื‘ื˜ืจืžื™ื ืœ/ื—ืœื•ืŸ tmux/whatever ืื—ืจ, ื ื™ืฆื•ืจ ืžื ื™ืคืกื˜ ืคื•ื“:

$ 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 ืงืจืืชื™ ืืช ื”ืžื ื™ืคืกื˜ ืฉืœ ื”ืคื•ื“ ื•ื ืชืชื™ ืœ-Docker ืืช ื”ืคืงื•ื“ื” ืœื”ืฉื™ืง ื›ืžื” ืžื›ื•ืœื•ืช ืœืคื™ ื”ืžืคืจื˜ ืฉืœื ื•. (ืื ืืชื” ืชื•ื”ื” ืœื’ื‘ื™ ืžื™ื›ืœ ื”"ื”ืฉื”ื”", ื–ื” ืคืจื™ืฆืช Kubernetes - ืจืื” ื”ื‘ืœื•ื’ ื”ื–ื”.) Kubelet ืชืฉื™ืง ืืช ื”ืžื›ื•ืœื” ืฉืœื ื• busybox ืขื ื”ืคืงื•ื“ื” ืฉืฆื•ื™ื ื” ื•ื™ืคืขื™ืœ ืื•ืชื• ืžื—ื“ืฉ ืœืœื ื”ื’ื‘ืœืช ื–ืžืŸ ืขื“ ืฉื”ืคื•ื“ ื”ืกื˜ื˜ื™ ื™ื™ืžื—ืง.

ื‘ืจืš ืืช ืขืฆืžืš. ื–ื” ืขืชื” ืžืฆืื ื• ืืช ืื—ืช ื”ื“ืจื›ื™ื ื”ืžื‘ืœื‘ืœื•ืช ื‘ื™ื•ืชืจ ืœื”ื•ืฆื™ื ื˜ืงืกื˜ ืœืžืกื•ืฃ!

ื”ืคืขืœื” ื•ื›ื•'

ื”ืžื˜ืจื” ื”ืกื•ืคื™ืช ืฉืœื ื• ื”ื™ื ืœื”ืคืขื™ืœ ืืช ื”-API ืฉืœ Kubernetes, ืืš ืœืฉื ื›ืš ืขืœื™ื ื• ืงื•ื“ื ื›ืœ ืœื”ืคืขื™ืœ ื•ื›ื• '. ื‘ื•ืื• ื ืชื—ื™ืœ ืืฉื›ื•ืœ 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 ืืœื• ืืžื•ืจื™ื ืœื”ื™ื•ืช ืžื•ื›ืจื™ื ืœืš. ื™ืฉ ื›ืืŸ ืจืง ืฉืชื™ ื ืงื•ื“ื•ืช ืฉื›ื“ืื™ ืœืฉื™ื ืœื‘ ืืœื™ื”ืŸ:

ื”ืจื›ื‘ื ื• ืืช ืชื™ืงื™ื™ืช ื”ืžืืจื— /var/lib/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

ื”ืคืขืœืช ืฉืจืช 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 ืžืจืื” ืฉื”-API ืฉืœ Kubernetes ืžืื–ื™ืŸ ื‘ื™ืฆื™ืื” 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.

ืžื” ื”ื‘ืขื™ื”? ืื ืืชื ื–ื•ื›ืจื™ื ืœืคื ื™ ื›ืžื” ืคืกืงืื•ืช, ื”ืชื—ืœื ื• ืืช kubelet ืขื ืกื˜ ืคืฉื•ื˜ ื‘ื™ื•ืชืจ ืฉืœ ืคืจืžื˜ืจื™ื ืฉืœ ืฉื•ืจืช ื”ืคืงื•ื“ื”, ื›ืš ืฉื”-kubelet ืœื ื™ื•ื“ืข ืื™ืš ืœื™ืฆื•ืจ ืงืฉืจ ืขื ืฉืจืช ื”-API ื•ืœื”ื•ื“ื™ืข โ€‹โ€‹ืœื• ืขืœ ืžืฆื‘ื•. ืœืื—ืจ ืœื™ืžื•ื“ ื”ืชื™ืขื•ื“, ืื ื• ืžื•ืฆืื™ื ืืช ื”ื“ื’ืœ ื”ืžืชืื™ื:

--kubeconfig string

ื”ื ืชื™ื‘ ืœืงื•ื‘ืฅ kubeconfig, ื”ืžืคืจื˜ ื›ื™ืฆื“ ืœื”ืชื—ื‘ืจ ืœืฉืจืช ื”-API. ื–ืžื™ื ื•ืช --kubeconfig ืžืืคืฉืจ ืžืฆื‘ ืฉืจืช API, ืœื --kubeconfig ืžืืคืฉืจ ืžืฆื‘ ืœื ืžืงื•ื•ืŸ.

ื›ืœ ื”ื–ืžืŸ ื”ื–ื”, ืžื‘ืœื™ ืฉื™ื“ืขื ื• ื–ืืช, ื”ืจืฆื ื• ืืช ื”ืงื•ื‘ืœื˜ ื‘"ืžืฆื‘ ืœื ืžืงื•ื•ืŸ". (ืื ื”ื™ื™ื ื• ืคื“ื ื˜ื™ื™ื, ื”ื™ื™ื ื• ื™ื›ื•ืœื™ื ืœื—ืฉื•ื‘ ืขืœ ืงื•ื‘ืœื˜ ืขืฆืžืื™ ื›ืขืœ "ืžื™ื ื™ืžื•ื ืงื™ื™ื‘ืจื ื˜ืก", ืื‘ืœ ื–ื” ื”ื™ื” ืžืื•ื“ ืžืฉืขืžื). ื›ื“ื™ ืฉื”ืงื•ื ืคื™ื’ื•ืจืฆื™ื” ื”"ืืžื™ืชื™ืช" ืชืขื‘ื•ื“, ืื ื—ื ื• ืฆืจื™ื›ื™ื ืœื”ืขื‘ื™ืจ ืืช ืงื•ื‘ืฅ kubeconfig ืœ-kubelet ื›ื“ื™ ืฉื”ื•ื ื™ื™ื“ืข ืœื“ื‘ืจ ืขื ืฉืจืช ื”-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

(ืื’ื‘, ืื ืชื ืกื” ืœื’ืฉืช ืœ-API ื‘ืืžืฆืขื•ืช curl ื›ืฉื”-kubelet ืœื ืคื•ืขืœ, ืชื’ืœื” ืฉื”ื•ื ืขื“ื™ื™ืŸ ืคื•ืขืœ! Kubelet ื”ื•ื ืœื "ื”ื•ืจื”" ืฉืœ ื”ืคื•ื“ื™ื ืฉืœื• ื›ืžื• Docker, ื–ื” ื™ื•ืชืจ ื›ืžื• "ืฉืœื™ื˜ื”" ื“ืžื•ืŸ." ืžื™ื›ืœื™ื ื”ืžื ื•ื”ืœื™ื ืขืœ ื™ื“ื™ ืงื•ื‘ืœื˜ ื™ืžืฉื™ื›ื• ืœืคืขื•ืœ ืขื“ ืฉื”ืงื•ื‘ืœื˜ ื™ืขืฆื•ืจ ืื•ืชื.)

ื‘ืขื•ื“ ื›ืžื” ื“ืงื•ืช 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

ื‘ื•ืื• ื‘ืืžืช ื ื‘ืจืš ืืช ืขืฆืžื ื• ื”ืคืขื (ืื ื™ ื™ื•ื“ืข ืฉื›ื‘ืจ ื‘ื™ืจื›ืชื™ ืืช ืขืฆืžื ื•) - ื™ืฉ ืœื ื• "ืืฉื›ื•ืœ" ืžื™ื ื™ืžืœื™ ืฉืœ Kubernetes ืฉืจืฅ ืขื API ืžืชืคืงื“ ื‘ืžืœื•ืื•!

ืื ื—ื ื• ืžืฉื™ืงื™ื ืชื—ืช

ืขื›ืฉื™ื• ื‘ื•ืื• ื ืจืื” ืœืžื” ื”-API ืžืกื•ื’ืœ. ื ืชื—ื™ืœ ืขื ืชืจืžื™ืœ nginx:

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

ื’ื ื›ืืฉืจ ื™ืฆืจื ื• ืืช ื—ืฉื‘ื•ืŸ ื”ืฉื™ืจื•ืช ื‘ืื•ืคืŸ ื™ื“ื ื™, ืืกื™ืžื•ืŸ ื”ืื™ืžื•ืช ืœื ื ื•ืฆืจ. ื›ื›ืœ ืฉื ืžืฉื™ืš ืœื”ืชื ืกื•ืช ื‘"ืืฉื›ื•ืœ" ื”ืžื™ื ื™ืžืœื™ืกื˜ื™ ืฉืœื ื•, ื ื’ืœื” ืฉืจื•ื‘ ื”ื“ื‘ืจื™ื ื”ืฉื™ืžื•ืฉื™ื™ื ืฉื‘ื“ืจืš ื›ืœืœ ืงื•ืจื™ื ืื•ื˜ื•ืžื˜ื™ืช ื™ื—ืกืจื•. ืฉืจืช ื”-API ืฉืœ Kubernetes ื”ื•ื ื“ื™ ืžื™ื ื™ืžืœื™ืกื˜ื™, ื›ืืฉืจ ืจื•ื‘ ื”ื”ืจืžื” ื”ื›ื‘ื“ื” ื•ื”ืชืฆื•ืจื” ื”ืื•ื˜ื•ืžื˜ื™ืช ืžืชืจื—ืฉื•ืช ื‘ื‘ืงืจื™ื ืฉื•ื ื™ื ื•ื‘ืขื‘ื•ื“ื•ืช ืจืงืข ืฉืขื“ื™ื™ืŸ ืœื ืคื•ืขืœื•ืช.

ื ื•ื›ืœ ืœืขืงื•ืฃ ื‘ืขื™ื” ื–ื• ืขืœ ื™ื“ื™ ื”ื’ื“ืจืช ื”ืืคืฉืจื•ืช 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 ื”ื•ื "ื˜ื™ืคืฉ" ื‘ืื•ืคืŸ ืžืคืชื™ืข - ื›ืฉืืชื” ื™ื•ืฆืจ Pod ื‘-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 ืขื•ื‘ื“ื™ื ื›ืฆืคื•ื™, ืื‘ืœ ื”ืฉื™ืจื•ืช ื•ื”ืคืจื™ืกื” ืœื.

ื”ึทืฆืœึธื—ึธื”!

ื”ืคื•ืกื˜ ื”ื–ื” ืžืชืืจืš, ืื– ืื ื™ ื”ื•ืœืš ืœื”ื›ืจื™ื– ืขืœ ื ื™ืฆื—ื•ืŸ ื•ืœื•ืžืจ ืฉื–ื• ืชืฆื•ืจื” ื‘ืช ืงื™ื™ืžื ืฉืืคืฉืจ ืœืงืจื•ื ืœื” "Kubernetes". ืœืกื™ื›ื•ื: ืืจื‘ืขื” ืงื‘ืฆื™ื ื‘ื™ื ืืจื™ื™ื, ื—ืžื™ืฉื” ืคืจืžื˜ืจื™ื ืฉืœ ืฉื•ืจืช ืคืงื•ื“ื” ื•"ืจืง" 45 ืฉื•ืจื•ืช ืฉืœ YAML (ืœื ืขื“ ื›ื“ื™ ื›ืš ืœืคื™ ืกื˜ื ื“ืจื˜ื™ื Kubernetes) ื•ื™ืฉ ืœื ื• ืœื ืžืขื˜ ื“ื‘ืจื™ื ืฉืขื•ื‘ื“ื™ื:

  • ื”ืคื•ื“ ืžื ื•ื”ืœ ื‘ืืžืฆืขื•ืช ื”-API ื”ืจื’ื™ืœ ืฉืœ Kubernetes (ืขื ื›ืžื” ืคืจื™ืฆื•ืช)
  • ืืชื” ื™ื›ื•ืœ ืœื”ืขืœื•ืช ื•ืœื ื”ืœ ืชืžื•ื ื•ืช ืžื›ื™ืœื•ืช ืฆื™ื‘ื•ืจื™ื•ืช
  • ื”ืชืจืžื™ืœื™ื ื ืฉืืจื™ื ื‘ื—ื™ื™ื ื•ืžืคืขื™ืœื™ื ืžื—ื“ืฉ ื‘ืื•ืคืŸ ืื•ื˜ื•ืžื˜ื™
  • ืจืฉืช ื‘ื™ืŸ ืชืจืžื™ืœื™ื ื‘ืชื•ืš ืื•ืชื• ืฆื•ืžืช ืขื•ื‘ื“ ื“ื™ ื˜ื•ื‘
  • ConfigMap, ื”ืจื›ื‘ืช ืื—ืกื•ืŸ ืกื•ื“ื™ืช ื•ืคืฉื•ื˜ื” ืคื•ืขืœืช ื›ืฆืคื•ื™

ืื‘ืœ ื”ืจื‘ื” ืžืžื” ืฉื”ื•ืคืš ืืช Kubernetes ืœืฉื™ืžื•ืฉื™ ื‘ืืžืช ืขื“ื™ื™ืŸ ื—ืกืจ, ื›ื’ื•ืŸ:

  • ืžืชื–ืžืŸ ืชืจืžื™ืœื™ื
  • ืื™ืžื•ืช/ื”ืจืฉืื”
  • ืžืกืคืจ ืฆืžืชื™ื
  • ืจืฉืช ืฉื™ืจื•ืชื™ื
  • DNS ืคื ื™ืžื™ ืžืงื•ื‘ืฅ
  • ื‘ืงืจื™ื ืœื—ืฉื‘ื•ื ื•ืช ืฉื™ืจื•ืช, ืคืจื™ืกื•ืช, ืื™ื ื˜ื’ืจืฆื™ื” ืขื ืกืคืงื™ ืขื ืŸ ื•ืจื•ื‘ ื”ื“ื‘ืจื™ื ื”ื˜ื•ื‘ื™ื ื”ืื—ืจื™ื ืฉ-Kubernetes ืžื‘ื™ืื”

ืื– ืžื” ื‘ืขืฆื ืงื™ื‘ืœื ื•? ื”-API ืฉืœ Kubernetes, ื”ืคื•ืขืœ ื‘ืคื ื™ ืขืฆืžื•, ื”ื•ื ืœืžืขืฉื” ืจืง ืคืœื˜ืคื•ืจืžื” ืขื‘ื•ืจ ืื•ื˜ื•ืžืฆื™ื” ืฉืœ ืžื™ื›ืœื™ื. ื–ื” ืœื ืขื•ืฉื” ื”ืจื‘ื” - ื–ื• ืขื‘ื•ื“ื” ืขื‘ื•ืจ ื‘ืงืจื™ื ื•ืžืคืขื™ืœื™ื ืฉื•ื ื™ื ื”ืžืฉืชืžืฉื™ื ื‘-API - ืื‘ืœ ื–ื” ืžืกืคืง ืกื‘ื™ื‘ื” ืขืงื‘ื™ืช ืœืื•ื˜ื•ืžืฆื™ื”.

ืœืžื“ ืขื•ื“ ืขืœ ื”ืงื•ืจืก ื‘ืกืžื™ื ืจ ื”ืžืงื•ื•ืŸ ื”ื—ื™ื ืžื™.

ืงืจื ืขื•ื“:

ืžืงื•ืจ: www.habr.com

ื”ื•ืกืคืช ืชื’ื•ื‘ื”