このブログは、コンテナのオーケストレーターであるkubernetesについて
自分の知識をまとめることを目的として記事を書いています。
もともとなが~くvSphereのあれやこれやに携わってきたのでvSphereとの類似点や相違点についてもちょっと混ぜていけたりしたらいいかなぁとかも思っています。
今回は前回説明した、Pod、Service、Podへ外部ストレージ領域の追加を実際にどうやったらいいのかという説明をしたいと思います。
まずはPodとServiceについて解説します。
Kubernetesクラスタ内部で何かを作成するとき、コマンドラインでの作成も一応できるのですが基本はymalファイルというものを使います。
yamlファイルとはなにかというと、これから作りたいものの設計図です。
yamlには大きく分けて4つのセクションがあり、それぞれ以下のような役割を持ちます。
apiVersion:リソース作成時に使用するAPIのバージョンの設定
kind:どの種類のリソース(Pod、Service等)を作成するかの設定
metadata:リソースを一意にするための設定(名前、namespace、UID等が該当)
spec:リソースの状態を設定(Podなら開放するportやCPU、メモリのサイズ等)
実際のPod、Serviceのyamlの例を見てみましょう。
Pod用ymalファイルの例
==========
---
kind: Pod
apiVersion: v1
metadata:
name: nginx-pod
labels:
app: wcp-demo
spec:
containers:
- image: nginx
name: nginx-container
==========
Kind → Podを作成するのでPodを記載
apiVersion → Podが所属しているAPIがv1であるため、v1を記載
metadata → nameには一意となる名前を設定、labelsにはPodに付与するラベル(app: wcp-demo)を設定
spec → containersはコンテナに関する設定を行うフィールド
imageで作成するコンテナのイメージを指定、nameにはコンテナの名前を設定
Service用ymalファイルの例
==========
---
kind: Service
apiVersion: v1
metadata:
name: nginx-svc
spec:
type: NodePort
ports:
- port: 80
protocol: TCP
targetPort: 80
selector:
app: wcp-demo
Kind → Serviceを作成するのでServiceを記載
apiVersion → Serviceが所属しているAPIがv1であるため、v1を記載
metadata → nameには一意となる名前を設定
spec → typeで作成するServiceのタイプを設定
※ここでは、クラスタのノード全てでアクセスを受け取れるNodePortを指定
portsはポートに関する設定を行うフィールド
portはportからtargetPortへのマッピングを行います。利便性のため基本的にはtargetPortと同じ値を入れます。
protocolは使用する通信のプロトコルを指定
targetPortはコンテナに転送するportを指定
selectorは一致するラベルを持ったPodを探し転送先として認識します。
==========
このようなyamlを用意するわけですが、どのようにこのファイルからPodやServiceを作成するのかというと
以下のコマンドを使用します。
kubectl apply -f <yamlファイルまでのパス>
ここではAdministratorのデスクトップに配置したyamlを使用して実行した例を紹介します。
■Podの作成
PS C:\Users\Administrator> kubectl apply -f "C:\Users\Administrator\Desktop\nginx-pod.yml"
pod/nginx-pod created
■Serviceの作成
PS C:\Users\Administrator> kubectl apply -f "C:\Users\Administrator\Desktop\nginx-pod-svc.yml"
service/nginx-svc created
作成したPodとServiceはkubectl get <確認したいリソース> で確認可能です。
複数のリソースを確認したい場合は、「,」で区切ります。
■Podの確認
kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx-pod 1/1 Running 0 14m
■Serviceの確認
kubectl get service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/nginx-svc NodePort 10.108.236.173 <none> 80:32074/TCP 4s
■PodとService両方確認
kubectl get pod,svc
NAME READY STATUS RESTARTS AGE
nginx-pod 1/1 Running 0 14m
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/nginx-svc NodePort 10.108.236.173 <none> 80:32074/TCP 4s
ここで、Serviceの PORT(S) に表示されている80:32074が<Podへ転送するport>:<ユーザーがアクセスするport>
となります。
<ユーザーがアクセスするport>は自動で付与されるため環境によって異なります。
ServiceのタイプがNodePortというKubernetesクラスタを構成しているノードの、どのIPアドレスどれでも
アクセス可能なServiceとなっているため、どれか一台のIPアドレスに<ユーザーがアクセスするport>を
くっつけてブラウザからhttpでアクセスしてみましょう。
例
http://192.168.0.100:32074
nginxのページが確認できたと思います。
今回はここまでとなります。
次回は、このpodを削除してもデータが残せるよう永続ボリュームをくっつくけるための内容を説明したいと思います。