ROMANCE DAWN for the new world

Microsoft Azure を中心とした技術情報を書いています。

Azure Container Service の Kubernetes に Helm を使ってアプリケーションをデプロイする

Azure Container Service に Kubernetes を展開して、Helm を使ってアプリケーションをデプロイしてみます。

Helm とは

Kubernetes のパッケージマネージャーです。

docs.helm.sh

Kubernetes にデプロイする YAML ファイルをまとめたパッケージは、Charts と呼ばれます。Helm の公式リポジトリとして、KubeApps が提供されていて、WordPress や Jenkins など100以上のアプリケーションの Charts が公開されています。

Helm をインストールする

こちらのドキュメントに従ってインストールします。

docs.helm.sh

まず、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 で確認することができます。

github.com

数分待つと、デプロイが完了するので、サービスの EXTERNAL IP にブラウザからアクセスしてみます。

f:id:TonyTonyKun:20170930163933p:plain

削除するときは、Helm delete コマンドを使います。

$ helm delete my-wp --purge

Helm Charts を作ってみる

自分が作った ASP.NET Core のアプリケーションをデプロイする Charts を作ってみます。
helm create コマンドを実行すると、Charts のテンプレートが作成されます。

$ helm create mvcapp

f:id:TonyTonyKun:20170930164003p:plain

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 アプリケーションがデプロイされたことを確認できます。

f:id:TonyTonyKun:20170930164049p:plain

まとめ

Kubernetes に Helm を使って、アプリケーションをデプロイしてみました。
使いたいアプリケーションが KubeApps にあればすぐにデプロイできますし、自分で Charts を作ることもできます。Kubernetes の Service や Deployment だけなく、アプリとデータベースをまとめることもできます。
Helm は、Kubernetes にデプロイするアプリケーションを管理できる便利なツールなので、積極的に活用していきたいです。