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 にデプロイするアプリケーションを管理できる便利なツールなので、積極的に活用していきたいです。

書籍「新しい Linux の教科書」の感想

これまで Windows を使ってきたのですが、最近仕事で Linux を使うことが多くなってきたので、「新しい Linux の教科書」を読みました。

新しいLinuxの教科書

新しいLinuxの教科書

どんな書籍なのか?

この書籍は、これから Linux を学ぼうとしている初心者に向けた入門書です。他にも多くの Linux 入門書が出版されていますが、CLI を利用したシェルの活用に絞って解説しています。主に、CentOS を利用した例をベースに、Ubuntu では差異があるケースのみ追加する形式となっています。

Windows 経験者が押さえておきたいポイント

Linux のディレクトリ構造

Windows とは違ってシステム全体で1つのディレクトリツリーしかありませんし、各ディレクトリ(/etc、/usr、/var など)の役割を知っておく必要があります。

テキストエディタの操作

Linux のデフォルトのエディタである「Vim」の操作です。vi コマンドで起動し、終了させる方法をはじめとして、カーソルキーを使わない、h、j、k、lを利用したカーソル移動は慣れが必要です。

ファイルとディレクトリのパーミッション

ls -l コマンドで表示されるパーミッションや chmod コマンドでのパーミッション設定は重要です。ファイルの r:読み取り、w:書き込み、x:実行権限は、ディレクトリだと違った意味になりますし、パーミッションは数値モード(r:4, w:2, x:1)でも設定できます。

標準入出力とパイプライン

Linux は、1つ1つのコマンドが小さくシンプルですが、リダイレクトとパイプラインを組み合わせて連携させることで、さまざまなシェルスクリプトを作成できます。シェルスクリプトを作れば、同じ処理を再利用できますし、操作ミスをなくすことができます。

アーカイブと圧縮

Windows の zip ファイルは、Linux の tar ファイルや gzip ファイルのようにアーカイブと圧縮を区別していないので、違いを押さえておきたいです。

Linux の環境を Azure に構築する

読んだ内容の理解を深めるには、実際に Linux の環境を用意して、コマンドやシェルスクリプトを試してみるのが良いです。
Azure を活用すれば、簡単に Linux の環境を構築できます。

f:id:TonyTonyKun:20170827161849p:plain

Azure ポータルにログインして、Compute を選択して「centos-base」などで検索するといくつかイメージがヒットします。シンプルな「CentOS-base 7.3」などを選択すれば、5分ぐらいで Linux の環境を構築できます。
使わないときは、仮想マシンを停止しておくことで、無駄な課金を防ぐことができます。

まとめ

この書籍では、初心者を対象とした Linux の基本操作だけでなく、「Linux らしい考え方」を解説しているため、どうやって Linux を使えば良いわからない人にお勧めできる内容だと思います。

オンライン トレーニングの Azure Skills を試してみた

Microsoft Azure のようなクラウドのテクノロジーは、提供されているサービス数も多いので何を使えばいいのか、どれを組み合わせて使えばいいのかが分かりづらく、また進化も早いのでキャッチアップは容易ではありません。
Azure に関する最新のスキルを身につける手助けとなるコンテンツとして、Azure Skills というオンライン トレーニングが提供されているので、試してみました。

Azure Skills とは?

Microsoft が提供している Azure に関するオンライン コンテンツです。
Azure Training Courses | Microsoft Learning

英語版のコンテンツがベースですが、11タイトルが日本語化されています。今後も順次日本語化されていくそうです。

  • Azure 基礎
  • AWS の専門家のための Microsoft Azure
  • Azure Paas 上の DevOps
  • Azure ワークロードの自動化
  • Azure のデータベース
  • Azure ワークロードの管理
  • Azure セキュリティとコンプライアンス
  • Microsoft Azure Identity
  • Microsoft Azure Storage
  • Microsoft Azure Virtual Machines
  • Microsoft Azure Virtual Networks

ドキュメントやビデオによる解説があり、コンテンツの章ごとに確認問題、最後には最終試験も用意されています。

Microsoft Azure Storage

今回は、「Microsoft Azure Storage」を受講しました。
aka.ms

オンプレミスの SQL Server のようなリレーショナルデータベースもいいのですが、クラウドらしい性能を持つストレージを正しく使いこなしてこそクラウドのメリットを受けることができます。Paas でのアプリケーションからの利用だけでなく、Iaas の仮想マシンのストレージとしても使われているので、基本的かつ重要なテクノロジーであるという理由で選択しました。

ストレージアカウントとは?の基礎から始まり、

f:id:TonyTonyKun:20170628054927p:plain

3つの領域に分類して説明されており、概念的に整理して理解することができます。

f:id:TonyTonyKun:20170627010631p:plain

理解度を確認できる復習問題も用意されています。

f:id:TonyTonyKun:20170628055343p:plain

合計16 〜 24時間かかると記載されていますが、実際には2時間ほどで完了しました。

まとめ

オンライン コンテンツなので気軽に試すことができますし、コンテンツのボリュームもちょうど良いと思います。
一部日本語の翻訳がおかしい部分がありますが、そこは改善を期待したいです。
これから Azure を学習したい人、少し Azure を使っているので復習したい人は、Azure Skills を活用してみてはいかがでしょうか?