ちょっと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)イメージを作成します。
$ 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など)の作成が必要です。
インストールは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のノードは以下のように分類できます。
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について、細かくみていこうと思いますが、続きは次回にしようと思います。