この記事は、「オンプレミス、Kubernetesで、マイクロサービスを意識したWebアプリをデプロイするまでの軌跡」の一部です。
はじめに
Kubernetesの設定が終わったら、実際に作ったアプリをKubernetes上にデプロイしていきます。
前提として、アプリはDockerイメージ化されており、Kubernetesが動いているサーバーからアクセスできるDockerレジストリに登録されている必要があります。
ここでは、プライベートなDockerレジストリが192.168.0.xxx:5000
で動いていると想定して進めていきます。
yamlを書いて、デプロイ
今までのシリーズ記事でも使ってきましたが、Kubernetesではyaml形式でデプロイするアプリについての情報を書くことが出来ます。
yamlファイルでは複数の設定を一つにまとめる事が出来るので、以下のようなファイルで1つのアプリを表現することが出来ます。
apiVersion: v1
kind: Service
metadata:
name: sample-service
namespace: sample-namespace
labels:
app: sample-service
spec:
type: NodePort
ports:
- port: 80 <---- アプリが動作するポート
targetPort: 80 <---- アプリが動作するポート
protocol: TCP
selector:
app: sample-deployment
---
apiVersion: apps/v1beta1
kind: Deployment
metadata:
name: sample-deployment
namespace: sample-namespace
spec:
replicas: 1
revisionHistoryLimit: 3
template:
metadata:
namespace: sample-namespace
labels:
app: sample-deployment
version: latest
spec:
containers:
- name: sample-deployment
image: 192.168.0.xxx:5000/sample/sampmle-image:latest
ports:
- containerPort: 80 <---- アプリが動作するポート
今回は80番で動作するアプリが動いているので80番を指定していますが、4000番で動いているなら4000を、8080が動いているなら8080を指定してください。
Kubernetesでは色々な機能があるのですが、僕の理解では、以下の2つがあればとりあえずアプリを公開することが出来ます。
- Deployment
コンテナイメージを持ってきて、適切なノードの上に展開してくれます。アプリを更新する際も、サービスを止める事無く更新できるように配慮してくれます。
また、同じコンテナを複数立ち上げたり、逆に不要なものを削除したりして、スケーラビリティを確保します。しかし、コンテナが増えたり減ったりする状況で、我々ユーザーはどのコンテナにアクセスすれば良いのでしょうか?
これを解決するのがServiceです。
- Service
自分が管理するコンテナに対する通信を一手に引き受け、状況に応じて適切なコンテナにアクセスを割り振ってくれます。
ひとまず、このセットがあれば最低限アプリは動くと思います。
$ kubectl apply -f app.yaml
今回のyamlではnamespaceを指定しているので、もし存在しない場合は先に作成してください。
$ kubectl create namespace sample-namespace
デプロイされたポートを確認
デプロイされると、今回の設定では、自動的に外部からアクセスするためのポートが割り振られます。Serviceの情報を見ると、振られたポートが確認できます。
$ kubectl get services -n sample-namespace
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
sample-service NodePort 10.107.212.223 <none> 80:30380/TCP 71m
今回の場合は、以下のアドレスでアクセスできます。
<Kubernetesが動いているip>:30380
アクセスした結果、想定通りの挙動が得られれば成功です。
お疲れさまでした!