DeploymentとServiceをyamlファイルで定義する
kubectlコマンドとオプションでnginxをminikube上で動かしました。 今回は、コマンドで起動内容を指定するのではなく、定義ファイルを使って動かすようにします。定義ファイルにすることでgitで管理できるようになります。
コマンドの振り返り
以下のように起動して、接続できるようにしまていました。
# nginxの起動 kubectl run nginx --image=nginx:1.11 --port=80 # Macから接続できるように kubectl expose deploy nginx --name=nginx-nodeport --port=80 --target-port=80 --type="NodePort"
これは実際に何をやっているかというと、Deploymentという機能を使ってnginxコンテナを起動し、Serviceを使ってnginxコンテナにアクセスできるようにしています。
Deployment
Deploymentは、複数のコンテナを並列起動し、世代管理できる仕組みです。今回Deployment(+ReplicaSet, Pod)自体が何かというのはあまり重要ではないので省略。以下の記事で細かく解説されています。
Service
Serviceは複数のコンテナへのアクセスを仲介してくれるロードバランサーです。個々のコンテナのアクセス方法を把握しなくても、Serviceの受付口だけ知っていれば、通信できます。
定義ファイル(yaml)にする
定義ファイルはJSONとyaml形式が使えます。他のプログラムを仲介する場合はJSONが良さそうですが、設定管理なら個人的にはyamlが好きです。(コメントアウトやコメント書ける点が良い)
nginx-deploy.yml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: nginx
spec:
replicas: 2
template:
metadata:
labels:
run: nginx
spec:
containers:
- name: nginx
image: nginx:1.11
ports:
- containerPort: 80
kubectl runで指定していたもの+を定義します。
| プロパティ | 説明 |
|---|---|
| apiVersion | Deploymentはベータ開発中なので、extentions/v1betaだそうです *1 |
| kind | kubectl runで動かしていたので、隠れていましたが、実態はDeploymentなので明示します。 |
| metadata.name | kubectl runの後に指定していた名前 |
| spec.replicas | --replicasオプションで指定できる、レプリカ数(コンテナの並列数) |
| spec.template. metadata.labels |
識別するための任意のKeyValue |
| spec.template.spec. containers.name |
コンテナの名前 |
| spec.template.spec. containers.image |
--imageオプションで指定していたコンテナイメージ |
| spec.template.spec. containers.ports. containerPort |
--portオプションで指定したコンテナの公開しているポート |
続いてSerivce。kubectl exposeで指定したもの+を定義します
service.yml
apiVersion: v1
kind: Service
metadata:
name: nginx-nodeport
spec:
type: NodePort
ports:
- port: 80
protocol: TCP
targetPort: 80
selector:
run: nginx
| プロパティ | 説明 |
|---|---|
| apiVersion | ServiceはDeploymentと異なりv1です。 |
| kind | 同様にkubectl exposeを使っていましたがServiceを明示します。 |
| metadata.name | --nameオプションで指定していたもの |
| spec.type | --typeオプションで指定していたもの |
| spec.ports.port | --portで指定したいたもの |
| spec.ports.protocol | TCPを明示 |
| spec.ports.targetPort | は--target-portで指定していたコンテナに対するポート |
| spec.selector | 前述のDeploymentのlabelと関係します。後で詳しく。 |
起動
kubectl createコマンドで作成(起動)します。
kubectl create -f nginx-deployment.yml kubectl create -f service.yml
-fは同時に複数指定も可能です。
kubectl create -f nginx-deployment.yml -f service.yml
minikube経由でブラウザ起動して確認。nginxのwelcomeページが見れます。
minikube service nginx-nodeport
DeploymentのlabelとServiceのselector
kubectl exposeコマンドは、その後にdeploy nginxと指定していました。これはnginxという名前
のdeploymentをターゲットにするという意味です。定義ファイルの場合は、labelとselectorで紐付けが行われています。
Serviceのselectorで指定したkey:valueと一致するDeployment*2に、リクエストを流すようになります。
run: nginxを指定していますが、特にrunというkeyにしなくても、Deploymentのlabelをapp: httpserverにして、Serviceのselectorも同様に指定することでもリクエストが流れます。一致すればOKです。
Deployment以外にもlabelやselectorを書けるので、nameよりも柔軟に対象を決めることができるようです。
Labels and Selectors | Kubernetes
いろいろなところで、deploy nginxなど、いちいち名前を書いてられないので、labelをつけて、複数のターゲットを同一label名で識別できるようにすることを目的としているようです。でもlabelは多分もうちょっと詳しく調べないとよくわからず。
参考
- kubernetes - apiVersion and beta versions - Stack Overflow
- Labels and Selectors | Kubernetes
- Kubernetes: Deployment の仕組み - Qiita
*1:http://stackoverflow.com/questions/38547229/apiversion-and-beta-versions
*2:DeploymentじゃなくReplicaSetかもしれない?