概要
- PodやらDeploymentやら、k8sのリソースは種類がいっぱいあってよくわからないのでまとめてみる
- 基本的に以下の書籍の内容をなぞる
- Docker/Kubernetes 実践コンテナ入門
Node
- k8sクラスタが最も大きいリソース単位
- クラスタの管理下にNodeがある
- AWSでいうEC2のインスタンス
$ kubectl get nodes
でクラスタ内nodeを確認
Namespace
- クラスタ内ではnamespaceごとに仮想的なクラスタを作成できる。
namespaceの一覧を見るには
$ kubectl get namespace
と打てばいい。
今後出てくるコマンドでnamespaceを指定したい場合は基本的に
-n {namespame}
のオプションをつければどうにかなる。
Pod
- 1個以上のコンテナの集合体
例
apiVersion: v1
kind: Pod
metadata:
name: my-echo
spec:
containers:
- name: nginx
image: gihyodockernginx
ports:
- containerPort: 80
- name: echo
image: gihyodocker/echo:latest
ports:
- containerPort: 8080
kindでリソースの種類を指定。今回はPod
metadata.nameにPodの名前をつける
spec.containers以下にコンテナとそのイメージを書いていく。
上の場合だとnginxとechoという2つのコンテナを1つのPodとしてまとめている。
Pod関連のコマンド
podを作成する際は
$ kubectl apply -f myPod.yaml
-fオプションの場合はyaml fileを指定、-kの場合はdirectoryを指定。
削除する場合は
$ kubectl delete pod my-echo
ログを表示したい場合は
$ kubectl logs -f my-echo -c echo
-cでコンテナを指定する。
-fはなくても実行できた。
とは打てばよい。
できたPodを確認するには
$ kubectl get pods
とうつ。
$ kubectl describe pod my-echo
でPodの内容を詳細に表示。
PodはどこかのNodeに配置され、1つのPodが複数Nodeにまたがることはない。
ReplicaSet
- 上記のPodの場合は1つのPodしか作成できないが、実際には何個も作りたいことが多い
- その場合はReplicaSetを使う
apiVersion: apps/v1
kind: ReplicaSet # リソースの名前
metadata:
name: echo # ReplicaSetに名前をつける
labels:
app: echo
spec: # 以下Podの設定
replicas: 3 # いくつPodをつくるか
selector:
matchLabels:
app: echo
template: # template以下はPodリソースにおけるspec定義と同じ
metadata:
labels:
app: echo
spec: # 以下Podを構成するコンテナの設定(さっきと同じ)
containers:
- name: nginx
image: gihyodocker/nginx:latest
env:
- name: BACKEND_HOST
value: localhost:8080
ports:
- containerPort: 80
- name: echo
image: gihyodocker/echo:latest
ports:
- containerPort: 8080
こんな感じで書く。
envの部分は環境変数を設定してる。
kubecltコマンドを使った作成の仕方はさっきと同様なので割愛。
Deployment
- ぱっと見ReplicaSetと似てる
- ReplicaSetの世代管理を行う
apiVersion: apps/v1
kind: Deployment # ここの名前が変わってる以外はほぼReplicasetと同じ
metadata:
name: echo
labels:
app: echo
spec:
replicas: 3
selector:
matchLabels:
app: echo
template: # template以下はPodリソースにおけるspec定義と同じ
metadata:
labels:
app: echo
spec:
containers:
- name: nginx
image: gihyodocker/nginx:latest
env:
- name: BACKEND_HOST
value: localhost:8080
ports:
- containerPort: 80
- name: echo
image: gihyodocker/echo:patched
env:
- name: HOGE
value: fuga
ports:
- containerPort: 8080
こんな感じで書く。
Deploymentは名前の通りデプロイの単位として使われ、ReplicaSetがそのまま使われることはあまりない。
Deploymentはリビジョンを使ってReplicaSetの世代管理を行える。
そのため問題があった場合に一つ前のversionにロールバックしたりとかできる。
Podの数を増やしたり減らしたりとかもよしなにやってくれて便利。
Service
- Podを複数つくった場合、一つ一つのPodには別々のIPが割り当てられる
- Serviceを使えばそれらのアクセスポイントをひとつにまとめあげられる
apiVersion: v1
kind: Service # リソースの名前
metadata:
name: echo # Serviceの名前
spec:
selector:
app: echo # appの名前。これに一致するapp, releaseを指定したPodと疎通できる
release: summer
ports:
- name: http
port: 80 # 80番ポートを公開
こんな感じで書く。
これでhttp://echo/
にHTTPリクエストを通してPodに疎通できる。
厳密にはhttp://echo.{namespace}.svc.local
だが、svc.localは省略可能。
namespaceはデフォルトだとdefaultになる。
Ingress
- Serviceはクラスター外には公開されない
- 外部に公開するにはIngressを使う
apiVersion: extensions/v1beta1
kind: Ingress # リソースの名前
metadata:
name: echo # Ingress名前
spec:
rules:
- host: ch05.gihyo.local # ここに外部からアクセスできる
http:
paths:
- path: /
backend:
serviceName: echo # echoという名前のサービスの80番ポートを公開する
servicePort: 80
まとめ
- 本の内容を自分なりにまとめた