k8s各種リソース解説編
本セクションでは主要なKubernetesリソースの使い方を学習していきます。
- Pod
- ReplicaSet
- Deployment
- Service
- ConfigMap
- Secret
- PersistentVolume
- PersistentVolumeClaim
- StatefulSet
- Ingress
Kubernetesを使った開発を行っていく上で基本となるリソースの使い方を学習していきます。
各リソースの特徴や記述方法について学習し、使えるようになることを目指しましょう!
Pod
podとは、最小単位。同一環境で動作するdockerコンテナ集合
1つのpodに複数のdockerコンテナが入れられる。
- マニフェストファイル書き方
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
imagePullpolicyの各種オプション
| 種別 | 説明 |
|---|---|
| Always | 毎回リポジトリからダウンロードを行う |
| Never | ローカルのイメージを利用 |
| ifNotpresent | ローカルに存在すればローカルを利用し存在しなければリポジトリからダウンロード |
マニフェスト設定は下記の通り
| 種別 | 説明 |
|---|---|
| spec:containers:name | コンテナ名指定 |
| spec:containers:image | イメージ名指定 |
| spec:containers:command | コンテナへ引き渡すエントリポイントのコマンドを指定 |
| spec:containers:args | コンテナへ引き渡すcmdコマンドを指定 |
| spec:containers:env | コンテナへ引き渡す環境変数を指定 |
| spec:containers:volumeMounts | コンテナへマウントするストレージを指定 |
主要なspecは containersとvolumes
spec:volumes
マウントしたいストレージ先は状況に応じて選択
spec:volumes:name
ストレージ名を指定
spec:volumes:hostPath
保存先がpod実行サーバのフォルダ
spec:volumes:hostPath:typeの各種オプション
| 種別 | 説明 |
|---|---|
| Directory | 存在するディレクトリ |
| DirectoryOrCreate | ディレクトリが存在しなければ作成 |
| File | 存在するファイル |
| FileOrCreate | ファイルが存在しなければ作成 |
spec:volumes:nfs
保存先がnfsサーバのフォルダ
spec:volumes:configmap
configmapリソースをファイルとしてマウントさせる
spec:volumes:sercret
sercretリソースをファイルとしてマウントさせる。
spec:volumes:emptydir
一時的な空フォルダ
演習:pod作成
- ホストにフォルダ、ファイルを作成
- 作成したフォルダをマヌントしたpodマニフェストファイルを作成
- リソース作成
テストファイルとしてmessageファイルを/data/storage配下に置く。
vi /data/storage/message
hello k8s
下記のマニフェストファイルを作業ディレクトリ配下に置く
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
マニフェストファイルを元にpod作成する。
kubectl apply -f pod.yml
作成したpodがマウントされているか確認する。
kubectl exec -it pod/sample sh
続いてマウントしているはずであるフォルダに移動する。
cd /home/nginx/
ls
cat message
うまくいったらpodを削除。
kubectl delete -f pod.yml
ReplicaSet
ReplicaSetとは、podの集合。podをスケールできる。
1つのpodに複数のdockerコンテナが入れられる。
- マニフェストファイル
主要なspecはreplicas,selector,template
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: nginx
spec:
replicas: 3
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
上記のマニフェストファイルを作業ディレクトリに配置してreplicaset.ymlを作成する。
kubectl apply -f replicaset.yml
作成したreplicaset.ymlの動作確認をする。
kubectl get all
NAME DESIRED CURRENT READY AGE
replicaset.apps/nginx 3 0 0 9s
スケールアウトを試し見る。
replicasの数値を2にしてみる(更新)
NAME DESIRED CURRENT READY AGE
replicaset.apps/nginx 2 0 0 9s
削除。
kubectl delete -f replicaset.yml
Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
annotations:
kubernetes.io/change-cause: "First release."
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
上記のマニフェストファイルを作業ディレクトリに配置してDeploymentを作成する。
kubectl apply -f deployment.yml
作成したDeploymentの動作確認をする。
kubectl get all
ロールアウトを試みる。(更新)
kubectl rollout history deploy/nginx
初回は何も表示されない
deployment.extensions/nginx
No rollout history found.
vi deployment.yml
kubernetes.io/change-cause: ここの箇所を書き換えて再apply
kubectl rollout history deploy/nginx
一度試みたロールアウトの履歴が確認できる。
deployment.extensions/nginx
REVISION CHANGE-CAUSE
1 second release.
ロールバックを試みる。(巻き戻り)
kubectl rollout undo deploy/nginx
kubernetes.io/change-cause: ここの箇所を書き換えて再apply
kubectl rollout history deploy/nginx
削除。
kubectl delete -f deployment.yml
Service
apiVersion: v1
kind: Pod
metadata:
name: nginx
labels:
app: web
env: study
spec:
containers:
- name: nginx
image: nginx:1.17.2-alpine
---
apiVersion: v1
kind: Service
metadata:
name: web-svc
spec:
type: NodePort
selector:
app: web
env: study
ports:
- port: 80
targetPort: 80
nodePort: 30000
上記のマニフェストファイルを作業ディレクトリに配置してservice作成する。
kubectl apply -f service.yml
作成したserviceの動作確認をする。
kubectl get all
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 16h
service/web-svc NodePort 10.101.233.192 <none> 80:30000/TCP 48s
仮想サーバのホストにポートを指定する。
192.168.1.10:30000
うまくいったらpodを削除。
kubectl delete -f service.yml
ConfigMap



 08.jpg](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F99495%2F79fee03b-1e1b-3781-efa1-dee58a705db7.jpeg?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=526c9d5db4fffca3990737a06219d051)







apiVersion: v1
kind: PersistentVolume
metadata:
name: volume-01
labels:
env: study
spec:
storageClassName: slow
accessModes:
- ReadWriteOnce
capacity:
storage: 1Gi
persistentVolumeReclaimPolicy: Retain
hostPath:
path: "/data/storage"
type: Directory
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: volume-claim
labels:
env: study
spec:
storageClassName: slow
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
上記のマニフェストファイルを作業ディレクトリに配置してstorage作成する。
kubectl apply -f storage.yml
storage.ymlの動作を確認する。
kubectl get pvc,pv
マウントされていることが確認できる。
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
persistentvolumeclaim/volume-claim Pending slow 73s
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
persistentvolume/volume-01 1Gi RWO Retain Pending slow 74s
削除。
kubectl delete -f storage.yml
StatefulSet
apiVersion: v1
kind: PersistentVolume
metadata:
name: volume-01
spec:
storageClassName: slow
accessModes:
- ReadWriteMany
capacity:
storage: 1Gi
persistentVolumeReclaimPolicy: Retain
hostPath:
path: /data/storage
type: Directory
---
apiVersion: v1
kind: Service
metadata:
name: sample-svc
spec:
clusterIP: None
selector:
app: web
env: study
ports:
- port: 80
targetPort: 80
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: nginx
spec:
replicas: 1
selector:
matchLabels:
app: web
env: study
revisionHistoryLimit: 14
serviceName: sample-svc
template:
metadata:
name: nginx
labels:
app: web
env: study
spec:
containers:
- name: nginx
image: nginx:1.17.2-alpine
volumeMounts:
- name: storage
mountPath: home/nginx
volumeClaimTemplates:
- metadata:
name: storage
spec:
storageClassName: slow
accessModes:
- ReadWriteMany
resources:
requests:
storage: 1Gi
上記のマニフェストファイルを作業ディレクトリに配置してstatefulset.yml作成する。
kubectl apply -f statefulset.yml
作成したstatefulset.ymlの動作確認をする。
kubectl get all
続いて、centospodを起動してアクセスする。
kubectl run debug --image-centos:7 -it --rm --restart=Never -- sh
うまくいったらstatefulset.ymlを削除。
kubectl delete -f statefulset.yml
Ingress
apiVersion: v1
kind: Service
metadata:
name: web-svc
spec:
selector:
app: web
env: study
ports:
- port: 80
targetPort: 80
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
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
---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: frontend
annotations:
kubernetes.io/ingress.class: "nginx"
nginx.ingress.kubernetes.io/ssl-redirect: "false"
spec:
rules:
- http:
paths:
- path: /
backend:
serviceName: web-svc
servicePort: 80
上記のマニフェストファイルを作業ディレクトリに配置してingress作成する。
kubectl apply -f ingress.yml
作成したingressの動作確認をする。
kubectl get ing,svc,deploy
下記のように外部アドレスが表示されない場合、設定されるまで数分待つ。
NAME HOSTS ADDRESS PORTS AGE
ingress.extensions/frontend * 80 3m8s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 15h
service/web-svc ClusterIP 10.110.116.66 <none> 80/TCP 3m8s
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.extensions/nginx 0/2 2 0 3m9s
うまくいったらingress.ymlを削除。
kubectl delete -f ingress.yml
本セクションではKubernetesリソースの使い方を学習しました。
このまとめでは各リソースのサンプルコードおよびコード中にポイントとなる箇所をまとめます。
◆ワークロード
○Pod
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
- name: storage
hostPath:
path: "/data/storage"
type: Directory
○ReplicaSet
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: nginx
spec:
replicas: 3
selector:
matchLabels:
app: web
env: study
template: # Podと同じものを記述
metadata:
name: nginx
labels:
app: web
env: study
spec:
containers:
- name: nginx
image: nginx:1.17.2-alpine
○Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
annotations:
kubernetes.io/change-cause: "First release."
spec:
replicas: 2
selector:
matchLabels:
app: web
env: study
revisionHistoryLimit: 14 # デフォルト 10
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1 # 余分に生成してよいPod数
maxUnavailable: 1 # 一度に消失してよいPod数
template:
metadata:
name: nginx
labels:
app: web
env: study
spec:
containers:
- name: nginx
image: nginx:1.17.2-alpine
○StatefulSet
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: nginx
spec:
replicas: 1
selector:
matchLabels:
app: web
env: study
revisionHistoryLimit: 14
serviceName: sample-svc # HeadlessServiceと紐づける
template:
metadata:
name: nginx
labels:
app: web
env: study
spec:
containers:
- name: nginx
image: nginx:1.17.2-alpine
volumeMounts:
- name: storage
mountPath: home/nginx
volumeClaimTemplates: # PersistentVolumeClaimと同じものを記述
- metadata:
name: storage
spec:
storageClassName: slow
accessModes:- ReadWriteMany
resources:
requests:
storage: 1Gi
- ReadWriteMany
◆サービス
○Service
apiVersion: v1
kind: Service
metadata:
name: web-svc
spec:
type: NodePort # ClasterIP(デフォルト), NodePort, LoadBalancer, ExternalName
selector:
app: web
env: study
ports:
- port: 80 # 受付ポート
targetPort: 80 # 転送先ポート
nodePort: 30000 # ノード上にマッピングするポート(type: NodePort 時のみ)
○Ingress
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: frontend
annotations:
kubernetes.io/ingress.class: "nginx"
nginx.ingress.kubernetes.io/ssl-redirect: "false"
spec:
rules:
- http:
paths:- path: /
backend:
serviceName: web-svc
servicePort: 80
- path: /
◆設定
○ConfigMap
apiVersion: v1
kind: ConfigMap
metadata:
name: sample-config
data:
sample.cfg: |
user: tsuyoshi.tanaka
type: "application"
○Secret
apiVersion: v1
kind: Secret
metadata:
name: sample-secret
data:
message: SGVsbG8gV29ybGQgIQ== # echo -n 'Hello World !' | base64
keyfile: WU9VUi1TRUNSRVQtS0VZ # cat ./keyfile | base64
◆ストレージ
○PersistentVolume
apiVersion: v1
kind: PersistentVolume
metadata:
name: volume-01
labels:
env: study
spec:
storageClassName: slow
accessModes:
- ReadWriteOnce # ReadWriteOnce, ReadOnlyMany, ReadWriteMany
capacity:
storage: 1Gi
persistentVolumeReclaimPolicy: Retain # Retain, Delete, Recycle(非推奨)
hostPath:
path: "/data/storage"
type: Directory
○PersistentVolumeClaim
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: volume-claim
labels:
env: study
spec:
storageClassName: slow
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
記述のポイントはおさえられたでしょうか?
これから実践に入っていく際、基本となりますので忘れたときにはここへ立ち返って復習しながら進めましょう!












