最小実行可胜Kubernetes

蚘事の翻蚳は、コヌス「DevOpsの実践ずツヌル」の開始に先立っお䜜成されたした。










これを読んでいるなら、おそらくKubernetesに぀いお䜕か聞いたこずがあるでしょうそうでない堎合は、どうやっおここにたどり着いたのですかしかし、Kubernetesずは正確には䜕ですかこれは「工業甚グレヌドのコンテナオヌケストレヌション」ですかたたは「クラりドネむティブオペレヌティングシステム」ずにかくこれはどういう意味ですか



正盎なずころ、100確信はありたせん。しかし、内郚を掘り䞋げお、Kubernetesの倚くの抜象化局の䞋で実際に䜕が起こっおいるのかを芋るのは興味深いず思いたす。楜しみのために、最小限の「Kubernetesクラスタヌ」が実際にどのように芋えるかを芋おみたしょう。 これは、Kubernetes The Hard Wayよりもはるかに簡単です。



Kubernetes、Linux、およびコンテナの基本的な知識があるこずを前提ずしおいたす。ここで説明するこずはすべお、調査/研究のみを目的ずしおいたす。これを本番環境で実行しないでください。



抂芁抂芁



Kubernetesには倚くのコンポヌネントが含たれおいたす。りィキペディアによるず、アヌキテクチャは次のようになりたす。







ここには少なくずも8぀のコンポヌネントが瀺されおいたすが、それらのほずんどは無芖したす。Kubernetesず合理的に呌ぶこずができる最小のものには、3぀の䞻芁なコンポヌネントがあるこずを述べたいず思いたす。



  • kubelet
  • kube-apiserveretcdに䟝存-そのデヌタベヌス
  • コンテナランタむムこの堎合はDocker


それらのそれぞれに぀いおドキュメントが䜕を蚀っおいるか芋おみたしょうロシア語、英語。最初にkubelet



クラスタヌ内のすべおのノヌドで実行されおいる゚ヌゞェント。圌は、コンテナがポッド内で実行されおいるこずを確認したす。



簡単そうに聞こえたす。䜕に぀いおの実行時のコンテナコンテナ・ランタむム



コンテナランタむムは、コンテナを実行するために蚭蚈されたプログラムです。



非垞に有益です。ただし、Dockerに粟通しおいる堎合は、Dockerの機胜に぀いお基本的な知識が必芁です。 コンテナランタむムずkubeletの間の懞念の分離の詳现は実際には非垞に埮劙なので、ここでは説明したせん。



そしおサヌバヌAPI



APIサヌバヌ-KubernetesAPIを衚すKubernetesダッシュボヌドコンポヌネント。APIサヌバヌはKubernetesダッシュボヌドのフロント゚ンドです



。Kubernetesで䜕かをしたこずがある人は、盎接たたはkubectlを介しおAPIず察話する必芁がありたした。これが、Kubernetes Kubernetes私たち党員が知っおいお愛しおいるYAMLの山を機胜するむンフラストラクチャに倉える脳の栞心です。APIが最小限の構成で存圚する必芁があるこずは明らかなようです。



前提条件



  • ルヌト化されたLinux仮想たたは物理マシン仮想マシンでUbuntu 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


うわヌ、たくさんのオプションがありたす幞いなこずに、必芁なのはそのうちの2぀だけです。これが私たちが興味を持っおいるパラメヌタの1぀です



--pod-manifest-path string


静的ポッドのファむルを含むディレクトリぞのパス、たたは静的ポッドを説明するファむルぞのパス。ピリオドで始たるファむルは無芖されたす。 非掚奚このパラメヌタヌは、-configオプションを介しおKubeletに枡される構成ファむルで蚭定する必芁がありたす。詳现に぀いおは、kubernetes.io / docs / tasks / administer-cluster / kubelet-config-fileを参照しおください。



このパラメヌタヌを䜿甚するず、静的に実行できたす。ポッド-KubernetesAPIを介しお管理されないポッド。静的ポッドはめったに䜿甚されたせんが、クラスタヌをすばやく䞊げるのに非垞に䟿利であり、たさにこれが必芁です。この倧きな譊告は無芖したす繰り返したすが、これを本番環境で実行しないでくださいそしお、実行できるかどうかを確認したす。



たず、静的ポッド甚のディレクトリを䜜成しお実行したす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いく぀かの譊告を曞き始めたしたが、䜕も起こっおいないようです。しかし、そうではありたせん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、指定されたコマンドでコンテナを起動し、静的ポッドが削陀されるたで無期限に再起動したす。



おめでずうございたす。タヌミナルにテキストを出力するための最も耇雑な方法の1぀を思い぀いたずころです。



etcdを実行したす



私たちの最終的な目暙はKubernetesAPIを実行するこずですが、そのためには最初にetcdを実行する必芁がありたす。 podsディレクトリたずえばpods/etcd.yamlに蚭定を配眮しお、最小限のetcdクラスタヌを開始したしょう。



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ファむルに粟通しおいる必芁がありたす。ここで泚意すべき点は2぀だけです。再起動埌にetcdデヌタが保存



されるように、ホストフォルダヌ/var/lib/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 APIServerの起動はさらに簡単です。枡す必芁がある唯䞀のパラメヌタヌは--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サヌバヌが起動したす。ヘルプによる怜蚌は、curlKubernetes 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.


䜜成した静的ポッドはなくなりたした。実際、kubeletノヌドはたったく衚瀺されたせん。



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


どうしたの芚えおいるかず思いたすが、数段萜前に、非垞に単玔なコマンドラむンパラメヌタのセットでkubeletを開始したため、kubeletはAPIサヌバヌに接続しおその状態を通知する方法を知りたせん。ドキュメントを調べた埌、察応するフラグが芋぀かりたした。APIサヌバヌぞの接続方法を瀺す



--kubeconfig string



ファむルぞのパスkubeconfig。存圚--kubeconfigするずAPIサヌバヌモヌドが--kubeconfig有効になり、存圚しないずオフラむンモヌドが有効になりたす。



この間ずっず、知らないうちに「オフラむンモヌド」でkubeletを実行しおいたした。私たちがペダンティックだった堎合、kubeletスタンドアロンモヌドを「実行可胜な最小のKubernetes」ず芋なすこずができたすが、それは非垞に退屈です。「実際の」構成を機胜させるには、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


ちなみに、kubeletがダりンしおいるずきにcurlを䜿甚しおAPIにアクセスしようずするず、それでも機胜するこずがわかりたす。Kubeletは、Dockerのようにポッドの「芪」ではなく、「制埡デヌモン」のようなものです。 kubeletによっお管理されるコンテナヌは、kubeletがそれらを停止するたで実行されたす。



数分埌、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で動䜜する最小限のKubernetes「クラスタヌ」がありたす



䞋で実行



それでは、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


サヌビスアカりントを手動で䜜成した堎合でも、認蚌トヌクンは生成されたせん。最小限の「クラスタヌ」で実隓を続けるず、通垞は自動的に発生する䟿利なこずのほずんどが倱われるこずがわかりたす。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のもう1぀の重芁なコンポヌネントがないため、起動したせん。繰り返しになりたすが、Kubernetes 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は機胜したせん。



成功



この投皿は倧きくなっおいるので、勝利を発衚し、これが「Kubernetes」を呌び出すための実行可胜な構成であるこずを宣蚀したす。芁玄するず、4぀のバむナリ、5぀のコマンドラむンパラメヌタ、および「ちょうど」45行のYAML暙準では倚くありたせん Kubernetesそしお私たちはたくさんのこずが働いおいたす



  • ポッドは、通垞のKubernetes APIを䜿甚しお管理されたすいく぀かのハックがありたす
  • パブリックコンテナむメヌゞをアップロヌドおよび管理できたす
  • ポッドは存続し、自動的に再起動したす
  • 単䞀ノヌド内のポッド間のネットワヌクは非垞にうたく機胜したす
  • ConfigMap、リポゞトリの秘密で最も簡単なマりントは期埅どおりに機胜したす


しかし、Kubernetesを本圓に䟿利にするもののほずんどは、ただ䞍足しおいたす。たずえば、次のずおりです。



  • ポッドプランナヌ
  • 認蚌/承認
  • 耇数のノヌド
  • サヌビスネットワヌク
  • クラスタヌ化された内郚DNS
  • サヌビスアカりント、展開、クラりドプロバむダヌの統合、およびKubernetesがもたらすその他のほずんどの機胜のコントロヌラヌ


では、実際に䜕を埗たのでしょうか。Kubernetes APIは、それ自䜓で動䜜し、実際には単なるコンテナ自動化プラットフォヌムです。APIを䜿甚するさたざたなコントロヌラヌやオペレヌタヌに察しおは機胜したすが、自動化のための䞀貫したフレヌムワヌクを提䟛したす。



無料のりェビナヌでコヌスの詳现をご芧ください。






続きを読む



  • sysadmin、開発者、テスタヌがDevOpsの実践を孊ぶ必芁があるのはなぜですか
  • Thanos — Prometheus
  • QA- GitLab GitLab Performance Tool
  • Loki — , Prometheus
  • DevOps



All Articles