環境構築

kubernetesの応用したリソースの使い方

基本的な操作方法は別の記事で紹介してきましたが、ここではもう少し詳しくPodなどの設定方法を見ていきます。

Podのマニフェストファイルを作成した際に、sepc.containersにイメージを指定して、リポジトリからダウンロードする方法は既にご紹介しています。

そこで、毎回イメージをダウンロードしてくるのか、それともローカルにイメージが無ければエラー処理にするのかなども設定できます。

spec.containers.imagePullPolicy

Always 毎回リポジトリからダウンロードを行う
Never ローカルにあるイメージを利用
IfNotPresent ローカルに存在すればローカルを利用し、
無ければリポジトリからダウンロードする
※デフォルト設定になっている


ホストのフォルダをマウントする方法

ここでは良く使う機能として、ホスト側のフォルダをマウントすることをやってみたいと思います。

手順としては、
1、ホストにフォルダを作成
2、作成したフォルダをマウントしたマニフェストファイルを作成
3、リソースを作成
となります。
それではやっていきましょう。

ホスト側のどこでもいいのですが、空フォルダを作成します。
そして、マウントした時に挙動が正しいか確認するため用のファイルを作成しておきます。

mkdir /data/storage
echo “Hello” >> /data/storage/message.txt

ここからは、マニフェストファイルを作成していきます。

pod.yml

apiVersion: v1
kind: Pod
metadata:
  name: sample
spec:
  containers:
  - name: nginx
    image: nginx:1.17.2-alpine
    volumeMounts:
      - name: storage
        mountPath: /home/nginx
  volumes:
    - name: storage
      hostPath:
        path: /data/storage
        type: Directory

ここで重要なのが、volumeMountsのnameとvolumesのnameを揃える点です。
そうしないと上手くマウントされないので注意が必要です。

マニフェストファイルが作成できたら、リソースを作成してあげます。

kubectl apply -f pod.yml

リソース作成が上手くいったら、コンテナに入りマウントができているかどうか見てみます。

kubectl exec -it pod/sample sh
cat /home/nginx/message.txt
> Hello

無事マウントができることが確認できました。

Replicasetを使ってスケールする方法

確認しておきたいのは、replicas、selector、templateプロパティです。

replicasは、Podを複製する数を指定することができ、値を変更することでスケールアウトやスケールインができます。

selectorは複製するPod数を数えるために使うラベルを指定します。ここでラベルの数とreplicasで指定した数が一致するようにk8sは動作します。

templateは複製するPodのマニフェストを指定するものになります。
中身はPodと全く一緒です。

具体的なReplicaSetを作成する手順をみていきます。

1、ReplicaSetマニフェストファイルを作成
2、リソース作成
3、手動スケールアウト

早速、マニフェストファイルから作成していきます。

pod.yml

apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: sample
spec:
  replicas: 2
  selector:
    matchLabels:
      app: web
      env: study
  template:
    metadata:
      name: nginx
      labels:
        app: web
        env: study
    spec:
      containers:
        - name: nginx
          image: nginx:1.17.2-alpine

マウントする時と同様に、selectorのmatchLabelsに指定した名前と、templateのlabelsが一緒になるようにしてください。

そしたら、リソースを作成し、podが複数立ち上がっているか確認してみます

kubectl apply -f pod.yml
kubectl get all

成功していますね。スケールアウトするには、この状態でpod.ymlのreplicasの値を3に変えて、再びapplyすれば可能です。

Deploymentを使って世代管理する方法

基本的には、ReplicaSetと同じですが、異なる点としてはrevisionHistoryLimitとstrategyプロパティがある点です。

revisionHistoryLimitはReplicaSetの履歴保存数を指定でき、デフォルトは10です。

strategyはデプロイ方法を指定するものです。新しいリリースをしたい時にPodを一気に置き換えてしまうとサービスが停止してしまいます。
そこで、1度に置き換えても良いPod数などを指定することでサービスが停止せずに新しいリリースを出すことができます。

早速Deploymentの使い方をみていきます。

pod.yml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
spec:
  replicas: 2
  selector:
    matchLabels:
      app: web
      env: study
  revisionHistoryLimit: 14
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 1
  template:
    metadata:
      name: nginx
      labels:
        app: web
        env: study
    spec:
      containers:
        - name: nginx
          image: nginx:1.17.2-alpine

maxUnavailableが一度に置き換えていいPod数で、maxSurgeはレプリカ数を超えていいPod数になります。

リソースを作成して、できているか確認します。

kubectl apply -f pod.yml
kubectl get all

Deploymentではロールアウトの履歴確認もできます

kubectl rollout history deploy/nginx

この段階では、1つしか出てきませんが、何回もデプロイしていくと情報が溜まっていきます。
Chane Causeにはコメントが残すことができるので、何をしたかということを書いておくと別の人がみた時にも便利です。

コメントを残す方法は、マニフェストファイルにannotationsというプロパティを加えてあげれば可能です。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
  annotations:
    kubernetes.io/change-cause: "Update nginx 1.17.3"
spec:
  replicas: 2
  selector:
    matchLabels:
      app: web
      env: study
  revisionHistoryLimit: 14
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 1
  template:
    metadata:
      name: nginx
      labels:
        app: web
        env: study
    spec:
      containers:
        - name: nginx
          image: nginx:1.17.3-alpine

この状態で再度applyしてあげて、ロールアウト履歴を見るとコメントが追加されているのが分かります。

ここで良く使うのが、ロールバック機能ですね。これは本当に良く使うので覚えておいた方がいいです。

kubectl rollout undo deploy/nginx

これで直前のバージョンに戻ることができます。

他にもまだたくさんのリソースがあるのですが、次回に紹介していこうと思います。