helloworlds

not a noun, it's a verb

【k8s】kubernetes 入門 - #03

ちょっとDockerの話

Docker: Accelerated, Containerized Application Development

kubernetesのデフォルトのコンテナランタイムであるDocker。

ここでは復習程度に重要な項目をみていきます。

※ インストール方法やDockerの詳細な使い方はここでは割愛します。

Docker image

Dockerのイメージフォーマットは、ファイルシステムレイヤが重なってできています。

この仕組をオーバレイファイルシステムといい、各レイヤはファイルシステムの前にレイヤに対して変更・削除・追加などを行っていくことになります。

この仕組みがあることにより、イメージを作成する際、意識したいポイントがいくつかあります。

  • 後続のレイヤで削除したファイルは、イメージ内に存在している
  • 各レイヤは、前のレイヤからの差分でる(=依存している)

以下のような場合、レイヤCにはFileAが含まれていないよにういに思いますが、 実際には含まれている。

.
├──  レイヤ A ("FileA"というファイルが存在)
│  └── レイヤ B ("FileA"というファイルを削除) 
│      └── レイヤ C 

レイヤの構成をよく考慮することは、後々の効率性繋がるでしょう。

アプリケーションコンテナ

サンプル用のDockerfileを作成します。

本書にのっとり、kuard (Kubernetes up and running)イメージを作成します。

github.com

$ git clone https://github.com/kubernetes-up-and-running/kuard.git
$ cd kuard/
$ make build
$ mv Dockerfile Dockerfile_org
$ vim Dockerfile

FROM alpine
COPY bin/blue/amd64/kuard /kuard
ENTRYPOINT [ "/kuard" ]

$  docker build -t kuard-amd64:blue .
$ docker images 

REPOSITORY    TAG       IMAGE ID       CREATED          SIZE
kuard-amd64   blue      c92b95bcf844   17 seconds ago   24.4MB
kuard-build   latest    c28cec9a0481   54 minutes ago   438MB

コンテナを実行

$  docker run -d --name kuard -p 8080:8080 -it kuard-amd64

ブラウザからlocalhost:8080にアクセスできたらOKです。

docker run のオプションは以下。

docker run — Docker-docs-ja 20.10 ドキュメント

クラスタのデプロイ

上記まではdockerのイメージから実際にコンテナを作成することができました。

続いては無課金で利用できるminikubeを使用して、クラスタ作成を行っていきます。

※ minikubeはシングルノードです。つまり、ノード1台分しか構築できないので、今後k8sの分散された機能を試すには、クラウドリソース(AWS, GCPなど)の作成が必要です。

github.com

インストールはbrewで↓

$ brew install minikube

インストールが終わったら、

$ minikube start

・
・
・
🏄  終了しました!kubectl がデフォルトで「minikube」クラスターと「default」ネームスペースを使用するよう設定されました

ここまできたらOK!

kubectlコマンドの確認

kubectlのインストールおよびセットアップ | Kubernetes

公式からもインストール方法はありますが、AWSのドキュメントもわかりやすいと思うのでリンクを貼っておきます↓

kubectl のインストールまたは更新 - Amazon EKS

例:(1.23 - aws手順)

$ curl -o kubectl https://s3.us-west-2.amazonaws.com/amazon-eks/1.23.7/2022-06-29/bin/darwin/amd64/kubectl
$ chmod +x ./kubectl
$ mkdir -p $HOME/bin && cp ./kubectl $HOME/bin/kubectl && export PATH=$HOME/bin:$PATH
$ echo 'export PATH=$PATH:$HOME/bin' >> ~/.bash_profile
$  kubectl version --short --client
Client Version: v1.23.7-eks-4721010

クラスタを見学

ようやく実際にkubectlコマンドを使用します。

$ kubectl get componentstatuses
NAME                 STATUS    MESSAGE                         ERROR
scheduler            Healthy   ok                              
controller-manager   Healthy   ok                              
etcd-0               Healthy   {"health":"true","reason":""}  

クラスタを構成しているコンポーネントを確認しました。

  • controller-manager:クラスタ上での様々なコントローラを動かす役割
  • scheduler:各Podをクラスタ内のそれぞれのノードに配置する役割
  • etcd:クラスタのsyベテにAPIオブジェクトが保存されるストレージ

今は大体これくらいを理解しておけば良さそう。

続いてノードを取得してみる。

$ kubectl get node
NAME       STATUS   ROLES           AGE   VERSION
minikube   Ready    control-plane   17m   v1.26.1

1つしかないw

本来、Kubernetesのノードは以下のように分類できます。

  • マスターノード:クラスタを管理するためのAPIサーバやスケジューラなどがある
  • ワーカーノード:ユーザが作成したコンテナが動くノード

AWSのEKSであれば、EKSを作成するとマスターノード(AWSがマネージドしている)が作成され、

ユーザが作成したノードはワーカーノードになりますね。

ちなみに上記のコマンド"node"は"nodes"複数形でも単数形でもkubectl は理解してくれます。

確認できたノードについて詳細をみていきます。

$ kubectl describe node minikube
Name:               minikube
Roles:              control-plane
Labels:             beta.kubernetes.io/arch=amd64
                    beta.kubernetes.io/os=linux
                    kubernetes.io/arch=amd64
                    kubernetes.io/hostname=minikube
                    kubernetes.io/os=linux
                    minikube.k8s.io/commit=ddac20b4b34a9c8c857fc602203b6ba2679794d3
                    minikube.k8s.io/name=minikube
                    minikube.k8s.io/primary=true
                    minikube.k8s.io/updated_at=2023_01_29T13_51_31_0700
                    minikube.k8s.io/version=v1.29.0
                    node-role.kubernetes.io/control-plane=
                    node.kubernetes.io/exclude-from-external-load-balancers=

ノードの基本的な情報が最初に記載されていますね。

  • Conditions:ノード上で動いているオペレーションの情報
  • Capacity:キャパシティ
  • Allocatable:キャパシティ(割り当て可能)

なんだかCapacityとAllocatableの違いが気になったので、調べてみました。

https://kubernetes.io/docs/tasks/administer-cluster/reserve-compute-resources/#node-allocatable

k8s公式のドキュメント から、 Capacityはノードのリソース量で、 Allocatableは、スケジューリング用に利用可能となるリソースの量(Podに対して割り当てられる量)だと思います。

  • Non-terminated Pods:ノード内にあるPod

いったんまとめ

ここまでクラスタを作成し、ノードの中身をちょっとみていきました。

本来AWSのやGCPを利用して、クラスタ作成をすればより実践的に理解ができるとは思うのですが、

ちょっと仕事から離れ、プライベートにてk8sの仕組みに焦点をあてたいので、minikubeにしました。

また、いきなりkubectlコマンドが出てきたりしましたが、ここでは一旦疑問なしにインストールして使用しました。

後々学んでいくk8sの構成などを理解していく時に、より詳しくみていこうと思います。

最後に当ノードにあるPodについて、細かくみていこうと思いますが、続きは次回にしようと思います。