はじめに
Dockerは開発環境構築によく使っていましたが、業務でコンテナを扱うようになってきたため、今更ながらKubernetesを学習を進めようと思います。
本記事は以下の本の覚書となります。
インストール
Docker DesktopはKubernetesをサポートしているためすでにDocker Desktopがインストールされている環境においては、有効化するだけで利用可能となります。
kubernetesの基礎
マニフェストファイルを使って、インスタンスを作成してみます。
1. マニフェストファイルの作成
コンテナの管理に使用するリソースの定義ファイルをyaml形式で作成します。
必須項目は、apiVersion
, kind
, metadata
, spec
です。
kind
のリソースタイプは以下を参照
apiVersion: v1
kind: Pod
metadata:
# Podの名前
name: nginx
spec:
# 実行するコンテナの定義
containers:
- name: nginx
image: nginx:1.15.7
ports:
- containerPort: 80
kind: Deployment
は複数のPodを管理するためのリソース
# APIバージョン
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
selector:
matchLabels:
app: nginx
# 実行するPodの数
replicas: 3
# Pod定義のテンプレード
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.15.7
ports:
- containerPort: 80
APIバージョンはkind
の種類によって異なります。
調べるには、kubectl api-resources
を使います。
2. マニフェストファイルの登録
作成したマニフェストファイルをKubernetesに登録します。
ここでは、マニフェストファイルはdeployment.yaml
として作成しました。
$ kubectl apply -f deployment.yaml
deployment.apps/nginx-deployment created
Podの起動確認をしてみます。
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-deployment-7d4d8467d9-kr6m9 1/1 Running 0 117s
nginx-deployment-7d4d8467d9-mwhdf 1/1 Running 0 117s
nginx-deployment-7d4d8467d9-srb8g 1/1 Running 0 117s
3. Podの負荷分散
先ほど起動した3つのPodへの負荷分散を実現するためのリソースとしてService
を定義します。
まずは、service.yaml
を作成します。
# APIバージョン
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
# 外部からもアクセス可能にする
type: LoadBalancer
selector:
# 先ほど作成したdeploymentのpod(app: nginx)にトラフィックを分散する
app: nginx
# Port8080への通信をPodの80ポートに転送する
ports:
- protocol: TCP
port: 8080
targetPort: 80
Kubernetesへ登録
$ kubectl apply -f service.yaml
service/nginx-service created
serviceの状態の確認
$ kubectl get service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 56m
nginx-service LoadBalancer 10.98.68.206 localhost 8080:32539/TCP 61s
Serviceは負荷分散実現のために、仮想IPアドレス(Cluster IP)を作成します。
EXTERNAL-IPが外部からアクセス可能な仮想IPアドレスです。
DockerからインストールしたKubernetesでのEXTERNAL-IPは常にlocalhost
となります。
ブラウザで、http://localhost:8080
へアクセスしてみます。
nginxの画面が表示されました。
kubenetesオブジェクトの管理方法
以下の3つがあります。
命令型とは
①MySQL5.7.21をDBにインストール②nginxバージョン1.14.2をWEBにインストール、という手順を実際にスクリプトや設定ファイルに書き出し、その手順を管理ツールが手順を実行します。
宣言型とは
①MySQL5.7.21がDBに、nginx1.14.2がWEBにインストールされている、というシステムの望ましい形を定義します。
命令型コマンド
nginxコンテナの単一インスタンスを起動
$ kubectl run nginx --image nginx
同じことを異なる構文で行います
$ kubectl create deployment nginx --image nginx
nginxコンテナのバージョンを更新
$ kubectl create deployment nginx --image nginx:1.14.2
$ kubectl set image deployment/nginx nginx=nginx:1.15.8
nginxコンテナのレプリカを3に変更
$ kubectl create deployment nginx --image nginx
$ kubectl scale deployment/nginx --replicas 3
オブジェクトの削除
$ kubectl delete deployment nginx
命令型オブジェクト設定
設定ファイルに定義されたオブジェクトを作成
$ kubectl create -f nginx.v1.14.2.yaml
設定ファイルに定義された情報で、現行の設定を上書き更新
$ kubectl replace -f nginx.v1.15.8.yaml
設定ファイルに定義されたオブジェクトを削除
$ kubectl delete -f nginx.yaml -f redis.yaml
命令型の問題
$ kubectl create -f nginx.v1.14.2.yaml
$ kubectl scale deployment/nginx --replicas 3
$ kubectl replace -f nginx.v1.15.8.yaml //2つ目のコマンドの変更が消失
このような問題を防止するために、第三者が変更を行わないようにする運用をする必要があります。
宣言型オブジェクト設定
宣言型は、apply
を使います。
また、ディレクトリ指定が可能です。
// 更新前にdiffで確認
$ kubectl diff -R -f configs/
$ kubectl apply -R -f configs/
宣言型の差分計算
差分 | 比較元のソース | 説明 |
---|---|---|
追加分 | 実際のオブジェクト | 実際のオブジェクトにないが、適用するマニフェストファイルに存在するフィールドを追加 |
更新分 | 実際のオブジェクト | 実際のオブジェクトと適用するマニフェストファイルの差分を更新 |
削除分 | 前回適用したマニフェストファイル | 適用するマニフェストファイルに存在しないが前回適用したマニフェストファイルには存在するフィールドを削除 |
注目すべきは、削除分が実際のオブジェクトではなく前回のマニフェストファイルとの比較になる事です。 | ||
これは、実際のオブジェクトへ行われた変更を保持できることを意味します。 | ||
以下は、実際のオブジェクトにreplicas:3 とimage:nginx:1.16 の変更が加えられていた場合です。 |
適用する マニフェストファイル |
前回適用した マニフェストファイル |
実際のオブジェクト | apply後オブジェクト |
---|---|---|---|
kind:Deployment spec: containers: - name:nginx image:nginx:1.15 |
kind:Deployment spec: containers: - name:nginx image:nginx:1.14 |
kind:Deployment spec: replicas:3 containers: - name:nginx image:nginx:1.16 |
kind:Deployment spec: replicas:3 containers: - name:nginx image:nginx:1.15 |
replicas:3
は、適用するマニフェストファイルに存在しないフィールドですが、前回適用のマニフェストファイルにも存在しないため削除されずに残ります。
image:nginx:1.16
は、更新分として今回適用するマニフェストファイルの内容に更新されます。