Azure Container Service に Kubernetes を展開して、Helm を使ってアプリケーションをデプロイしてみます。
Helm とは
Kubernetes のパッケージマネージャーです。
Kubernetes にデプロイする YAML ファイルをまとめたパッケージは、Charts と呼ばれます。Helm の公式リポジトリとして、KubeApps が提供されていて、WordPress や Jenkins など100以上のアプリケーションの Charts が公開されています。
Helm をインストールする
こちらのドキュメントに従ってインストールします。
まず、Azure Portal から Azure Container Service を作成します。Kubernetes の Master Node に SSH で接続して、Helm のバイナリをダウンロードします。
$ curl -O https://storage.googleapis.com/kubernetes-helm/helm-v2.6.1-linux-amd64.tar.gz $ tar -zxvf helm-v2.6.1-linux-amd64.tar.gz $ sudo mv linux-amd64/helm /usr/local/bin/helm
次に、helm init コマンドを実行します。
$ helm init
これで、Helm のインストールが完了です。
Helm を使って WordPress をデプロイする
KubeApps で公開されている Charts を使って、WordPress をデプロイしてみます。
WordPress の Charts を指定して、helm install コマンドを実行します。
$ helm install --name my-wp stable/wordpress NAME: my-wp LAST DEPLOYED: Sat Sep 23 17:43:09 2017 NAMESPACE: default STATUS: DEPLOYED RESOURCES: ==> v1/PersistentVolumeClaim NAME STATUS VOLUME CAPACITY ACCESSMODES STORAGECLASS AGE my-wp-wordpress Bound pvc-493f1d91-a03b-11e7-944e-000d3a72a60e 10Gi RWO default 13s my-wp-mariadb Bound pvc-4942547b-a03b-11e7-944e-000d3a72a60e 8Gi RWO default 13s ==> v1/Service NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE my-wp-mariadb 10.0.73.148 <none> 3306/TCP 13s my-wp-wordpress 10.0.193.167 <pending> 80:30912/TCP,443:30683/TCP 13s ==> v1beta1/Deployment NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE my-wp-mariadb 1 1 1 0 13s my-wp-wordpress 1 1 1 0 13s ==> v1/Secret NAME TYPE DATA AGE my-wp-wordpress Opaque 3 14s my-wp-mariadb Opaque 2 14s ==> v1/ConfigMap NAME DATA AGE my-wp-mariadb 1 14s NOTES: 1. Get the WordPress URL: NOTE: It may take a few minutes for the LoadBalancer IP to be available. Watch the status with: 'kubectl get svc --namespace default -w my-wp-wordpress' export SERVICE_IP=$(kubectl get svc --namespace default my-wp-wordpress -o jsonpath='{.status.loadBalancer.ingress[0].ip}') echo http://$SERVICE_IP/admin 2. Login with the following credentials to see your blog echo Username: user echo Password: $(kubectl get secret --namespace default my-wp-wordpress -o jsonpath="{.data.wordpress-password}" | base64 --decode)
WordPress と MariaDB がデプロイされたことが分かります。Kubernetes の5つのオブジェクトで構成されています。
- PersistentVolumeClaim
- Service
- Deployment
- Secret
- ConfigMap
これらのオブジェクトを1つのパッケージとして、Helm Install コマンドだけでデプロイできました。Charts の内容は、GitHub で確認することができます。
数分待つと、デプロイが完了するので、サービスの EXTERNAL IP にブラウザからアクセスしてみます。
削除するときは、Helm delete コマンドを使います。
$ helm delete my-wp --purge
Helm Charts を作ってみる
自分が作った ASP.NET Core のアプリケーションをデプロイする Charts を作ってみます。
helm create コマンドを実行すると、Charts のテンプレートが作成されます。
$ helm create mvcapp
deployment.yaml と service.yaml を確認します。
apiVersion: extensions/v1beta1 kind: Deployment metadata: name: {{ template "fullname" . }} labels: chart: "{{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}" spec: replicas: {{ .Values.replicaCount }} template: metadata: labels: app: {{ template "fullname" . }} spec: containers: - name: {{ .Chart.Name }} image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}" imagePullPolicy: {{ .Values.image.pullPolicy }} ports: - containerPort: {{ .Values.service.internalPort }} livenessProbe: httpGet: path: / port: {{ .Values.service.internalPort }} readinessProbe: httpGet: path: / port: {{ .Values.service.internalPort }} resources: {{ toYaml .Values.resources | indent 12 }}
apiVersion: v1 kind: Service metadata: name: {{ template "fullname" . }} labels: chart: "{{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}" spec: type: {{ .Values.service.type }} ports: - port: {{ .Values.service.externalPort }} targetPort: {{ .Values.service.internalPort }} protocol: TCP name: {{ .Values.service.name }} selector: app: {{ template "fullname" . }}
この yaml を見ると分かるように、Charts に対して外部からパラメータを指定できるようになっています。
values.yaml を編集して、ASP.NET Core のアプリケーションをデプロイできるようにします。
replicaCount: 1 image: repository: thara0402/mvcapp tag: v1 pullPolicy: IfNotPresent service: name: mvcapp-service type: LoadBalancer externalPort: 80 internalPort: 5000 resources:
この Charts を指定して、helm install コマンドを実行します。
$ helm install --name my-mvc ./mvcapp NAME: my-mvc LAST DEPLOYED: Sat Sep 23 17:43:18 2017 NAMESPACE: default STATUS: DEPLOYED RESOURCES: ==> v1/Service NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE my-mvc-mvcapp 10.0.124.120 <pending> 80:30617/TCP 4s ==> v1beta1/Deployment NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE my-mvc-mvcapp 1 1 1 0 4s NOTES: 1. Get the application URL by running these commands: NOTE: It may take a few minutes for the LoadBalancer IP to be available. You can watch the status of by running 'kubectl get svc -w my-mvc-mvcapp' export SERVICE_IP=$(kubectl get svc --namespace default my-mvc-mvcapp -o jsonpath='{.status.loadBalancer.ingress[0].ip}') echo http://$SERVICE_IP:80
ASP.NET Core アプリケーションがデプロイされたことを確認できます。
まとめ
Kubernetes に Helm を使って、アプリケーションをデプロイしてみました。
使いたいアプリケーションが KubeApps にあればすぐにデプロイできますし、自分で Charts を作ることもできます。Kubernetes の Service や Deployment だけなく、アプリとデータベースをまとめることもできます。
Helm は、Kubernetes にデプロイするアプリケーションを管理できる便利なツールなので、積極的に活用していきたいです。