k8sリソースの説明を始まる前に、k8sリソース操作の仕組みを説明しないと、リソースを説明してもどうやって作るの?になって、ピンとこないかもしれないので、まず簡単に仕組みの説明を入れさせていただきたいと思います。
k8sクラスタへの操作
前回k8sのノードについて、説明した通、k8sでは、Kubernetes Masterノードに対して命令を出して、k8sクラスタを操作する流れになります。
Kubernetes MasterのAPIはREST APIで実装されているため、直接RESTAPIでの操作も可能です。
ただ、RESTAPIですべての操作をすると、すごく複雑になってしまいます。
そこで、Kubernetesは専用のコマンドツールが用意されています。
その名は、kubectl
コマンドラインです。
kubectlのインストール
kubectlを使うには、まずクライアント(k8s操作に使うPC)にkubectlをインストールする必要があります。
インストール方法はここでは割愛しますが、参考情報をお出しします。
※ GCPの場合は、cloudshellのコンソールにデフォルトで入っていますので、そのまま使用可能です。
k8sクラスタへの接続
GCPのcloudshellを使用してk8sを操作する場合、操作するGKE(k8sクラスタ)を指定するには、以下のコマンドを使用します。
# kubectl の操作対象の GKE を指定する
gcloud container clusters get-credentials <GKEクラスタ名> [--region=<GKEのRegion>] [--zone=<GKEのZone>]
# 操作対象を確認する
kubectl config current-context
※注意:操作対象が間違いのないように、操作対象の確認を心がけましょう。
GKEに関する他のコマンドについて知りたい方は、公式ドキュメントを確認しましょう。
GCP以外の環境は接続方法いが違いますので、環境に合わせて確認してから使いましょう。
k8sリソースの作成について
k8sの接続ができたら、k8sクラスタへの操作ができるようになります。
k8sでは、リソースの作成は作成コマンドで作成する方法と、manifestファイル(設定ファイル)を適用して作成する方法があります。作成コマンドでの作成は、手間がかかりますし、設定内容はわかりずらいなど多くのデメリットがあります。
k8sとしては、後者のmanifestファイルを適用して作成する方法を推奨しています。
manifestファイル(マニフェスト)とは
manifestファイルは、リソースの設定を事前に定義するファイルです。
DockerのDockerfileと似たような感じになります。
このmanifestのおかげで、Infrastructure as Codeやどこでも同じ環境が作れることを実現できるようになります。
では、manifestってどんなものでしょうか?どう書けばいいでしょうか?
manifestファイル の例
manifestはyaml形式で書かれている設定ファイルです。
じゃ、yamlって何なの?って思っている方もいるかと思いますので、簡単に説明すると、ファイル形式の一種です、中身は平分でデータを書かれていて、拡張子がyaml
かyml
のファイルのことです。
ちなみに、JSONファイル(yamlと似ているもう一種類のファイル)と書き方が違うが、用途は似ています。
説明だけではピンとこないと思いますので、k8sのDeploymentリソースを作成に使うmanifestを例でコメントで説明していきます。
※ #
の後ろの内容はコメントです。
サンプルコード
apiVersion: apps/v1 # apiVersion属性の値が apps/v1
kind: Deployment # kind属性(リソースの種類)の値が Deployment
metadata:
name: nginx-deployment
labels:
app: nginx # metadata.labels.app(.は階層構造を意味する)の値が nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
manifestが何なのかはお分かりいただけましたでしょうか。
それでは、続きを行きましょうか。
k8sリソースの作成
k8sで推奨するリソースの作成方法はmanifestファイルを使っての作成ですが、manifestの使い方がわからないと、意味がないですよね。
実は、使い方はすごくシンプルです。方法は以下の2種類があります。
- manifest通りにリソース作成:
kubectl create -f <manifestファイルのパス>
- manifestを適用する(推奨):
kubectl apply -f <manifestファイルのパス>
createとapplyはリソース作成するという意味で、どちらでもリソースの作成が可能です。
ただ、k8sはローリングアップデート可能なプラットフォームとして、以前設定した時の履歴は残すべきです。
createはリソースを作成するだけで、履歴はデフォルトでは残らないに対して、applyの方は履歴を残してくれます。
※kubectl create
に--save-config
オプションを付けるとapplyと同じ効果が実現できます。--save-config
はannotationに履歴を保存する意味です。
さらに、applyは作成だけではなく、リソースの更新にも使えますので、一つのコマンドだけで何でもできる感じです。
そういうわけで、kubectl apply -f <manifestファイルのパス>
はお勧めします。
kubectl applyの仕組み
kubectl apply
コマンドは基本前回のmanifest内容(履歴)と今回適用するmanifestの内容を見比べて、追加や更新のリソースがあれば、追加で作成する動作をします。
前回のmanifest内容はmetadata.annotations.kubectl.kubernetes.io/last-applied-configuration
に保存されています。
kubectl apply
は追加と変更だけ反映しますが、もし減った分も削るようにしたいであれば、以下のオプション付きで実行するといいです。
kubectl apply --prune -f <manifestファイルのパス>
複数のmanifest同時適用
複数manifestファイルを適用する
kubectl apply -f <manifestファイルのパス> -f <manifestファイルのパス>...
ディレクトリ内のすべてmanifestファイルを適用する
kubectl apply -f <ファイルディレクトリ>
ディレクトリ内再帰的にすべてのmanifestファイルを適用する
kubectl apply -f <ファイルディレクトリ> -R
複数のリソースをまとめて一個のmanifestにまとめて書く
manifest内で、---
文字でリソースの記述を分けることができます。
作成はmanifest内容の上から下へ順番に作成していきます。
k8sリソースの削除
k8sリソースの削除は基本kubectl delete
コマンドを使用します。
よく使われるパターンを以下でまとめます。
# ファイル(manifest或いはjson)で指定されたタイプと名前を使用してPodを削除します
kubectl delete -f <ファイルのパス>
# 名前が「bar」と「foo」のpodとServiceを削除する
kubectl delete pod,service bar foo
# ラベルが「name=myLabel」のpodとserviceを削除する。-lはラベル指定。
kubectl delete pods,services -l name=myLabel
# 「my-ns」のNamespaceにあるすべてのpodとserviceを削除する。-nはNamespace指定。--allはすべて。
kubectl -n my-ns delete pod,svc --all
# awkコマンドのpattern1またはpattern2に一致するすべてのPodを削除します。
kubectl get pods -n my-ns --no-headers=true | awk '/pattern1|pattern2/{print $1}' | xargs kubectl delete -n my-ns pod
その他のコマンド
参考:
最後に
以上で、k8sで基本な使い方を簡単に説明しました。
kubectlのコマンドは沢山ありますが、環境構築に一番使うのはkubectl apply
です。
その他のコマンドについては、今後の説明していくうちに、内容を入れようと思います。
コメント