2017年6月28日水曜日

Kubernetes on IBM Bluemix 最速理解


IBM Bluemixのコンテナサービスでkubernetes(クバネティス)が利用できるようになった。bluemixのクラウド上でKubernetes環境を構築し、その手順を残しておく。


◆ Kubernetesクラスターサービスの作成
ブラウザでbluemix環境へアクセスし、bluemixのカタログからKubernetes Clusterサービスを選択する。
https://console.bluemix.net/catalog/
cluster(worker nodesの集合)名は、myClusterとする。



◆ 構築に必要なツールの用意
(Bluemix CLI)
bluemixを操作するコマンドラインのツールを用意する。
手順は公式に従う。
https://clis.ng.bluemix.net/ui/home.html


(Kubernetes CLI)
kubernetesを操作するコマンドラインのツールを用意する。
https://kubernetes.io/docs/tasks/tools/install-kubectl/


(IBM Bluemix Containerプラグイン)
kubernetesの利用には不要だが、namespaceの設定や、bluemix上でのコンテナの作成や管理に必要となる。
$ bx plugin install IBM-Containers -r Bluemix


(IBM Bluemix Container Serviceプラグイン)
Kubernetes クラスターを作成し、ワーカー・ノードを管理するために、
IBM Bluemix Container Serviceプラグインをインストールする。
$ bx plugin install container-service -r Bluemix



◆ 環境設定
(Bluemix環境へのログイン)
今回は米国南部のリージョンをAPIのエンドポイントとする。
使用可能なコンテナー・イメージと Bluemix サービスは、Bluemix 地域によって決まる。
$ bx login -a https://api.ng.bluemix.net


(IBM Bluemix Containerプラグインの初期化)
IBM Bluemix Container プラグインの初期化を行う。
$ bx ic init

環境変数の設定例が出力される。ローカルのdocker環境を上書きする。
$ export DOCKER_HOST=tcp://containers-api.ng.bluemix.net:8443
$ export DOCKER_CERT_PATH=/Users/*****/.ice/certs/containers-api.ng.bluemix.net/f5f0f7aa-2cbd-445c-b57f-a94cbb715bb7
$ export DOCKER_TLS_VERIFY=1


(namespaceの作成)
namespaceを作成する。
$ bx ic namespace-set <namespace>

namespaceの確認を行う。
$ bx ic namespace-get


(IBM Bluemix Container Serviceプラグインの初期化)
IBM Bluemix Container Service プラグインの初期化を行う。
$ bx cs init


(クラスタの作成)
サービス作成時にクラスタの作成をGUIから行っていれば、この手順は不要である。
$ bx cs cluster-create --name myCluster

クラスタの確認を行う。
$ bx cs clusters

クラスタ内のワーカーの確認を行う。
$ bx cs workers myCluster


(Kubernetes構成データと証明書のダウンロード)
この構成データにより、bluemix上のkubernetesクラスターにkubectlコマンドで接続することができるようになる。
$ bx cs cluster-config myCluster

出力でコンフィグの保存先が指定されるため、環境変数に設定する。
$ export KUBECONFIG=/Users/*****/.bluemix/plugins/container-service/clusters/myCluster/kube-config-hou02-myCluster.yml



◆ ダッシュボードの起動
ローカルでWEBブラウザからkubernetesを操作するためダッシュボードを立てておく。
kubernetesサーバへのプロキシとして動作する。
$ kubectl proxy --accept-hosts '.*'

ディフォルトホストは127.0.0.1、ポートは8001である。
引数で変更も可能である。
$ kubectl proxy --address=x.x.x.x --port=yyyy --accept-hosts '.*'

ローカル環境からブラウザ等でアクセスできるはずである。
http://127.0.0.1:8001/ui

ダッシュボードを起動せずとも、コマンドで操作できる。



◆ kubernetesのステータス確認
先ほど立てたプロキシサーバからもkubernetesのステータス確認はできるが、コマンドで一通り操作する。
$ kubectl get nodes
$ kubectl get deployments
$ kubectl get replicasets
$ kubectl get pods

※kubectl delete pod [pod名]



◆ コンテナの作成
kubernetes管理をすることを前提とした、適当なサンプルを元に、コンテナを作成する。
$ git clone https://github.com/IBM/container-service-getting-started-wt.git
$ cd container-service-getting-started-wt/Stage2

$ docker build --tag registry.ng.bluemix.net/<namespace>/hello-world:2 .
※サンプルのStage2のファイルを使っている関係で、タグバージョンを:2としている。

この後のpushは必要ない。先ほどのbuildはローカルではなくbluemix環境で行われているためである。"bx ic init"コマンドとその後のその環境設定の変更でdockerホストが変わっていることを思い出そう。
###$ docker push registry.ng.bluemix.net/<namespace>/hello-world:2

$ docker images



◆ デプロイメント・サービス
デプロイメントのフェーズでは、DeploymentがReplicaSetを生成・管理、ReplicaSetがPodを生成・管理するまでの一連の流れが実行され、最終的にポッドが起動する。

ReplicaSet: 同じ仕様のPodのレプリカ数を管理する。
Pod       : アプリケーションを動かすための最小単位。1つ以上のコンテナと共有されたボリュームで構成される。

その後デプロイされたPodを元にサービスを起動する。

デプロイメント、サービスまでそれぞれコマンドで操作できるが、サンプル内のymlの管理ファイルを利用して実施する。

(healthcheck.yml)
※ mynamespace名部分は変えること。
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: hw-demo-deployment
spec:
  replicas: 3
  template:
    metadata:
      name: pod-liveness-http
      labels:
        run: hw-demo-health
        test: hello-world-demo
    spec:
      containers:
        - name: hw-demo-container
          image: "registry.ng.bluemix.net/<mynamespace>/hello-world:2"
          imagePullPolicy: Always
          livenessProbe:
            httpGet:
              path: /healthz
              port: 8080
            initialDelaySeconds: 5
            periodSeconds: 5
---
apiVersion: v1
kind: Service
metadata:
  name: hw-demo-service
  labels:
    run: hw-demo-health
spec:
  type: NodePort
  selector:
    run: hw-demo-health
  ports:
   - protocol: TCP
     port: 8080
     nodePort: 30072

$ kubectl create -f healthcheck.yml

ステータスを確認する。
$ kubectl get services

アクセス確認を行う(portではなく、nodePortの番号、ここでは30072でアクセスする)。
http://クラスタノードIP:ノードポート/〜

動作させるまでは以上である。
以降は、その他利用しそうな操作手順を確認しておく。



◆ スケーリング
(手動によるpodのスケーリング設定)
$ kubectl scale deployment hw-demo-deployment --replicas=2

pod数が2つに減っているはずである。
$ kubectl get pods


(自動でのpodの数のスケーリング設定)
指定したCPUの利用率をターゲットに、pod数が最低3から最大10までの間でスケーリングされる。
$ kubectl autoscale deployment hw-demo-deployment --cpu-percent=80 --min=3 --max=10

オートスケールの設定が有効になったことが分かる。
hpa: Horizonal Pod Autocaling
$ kubectl get hpa

pod数は3つになっているはずである。
$ kubectl get pods

設定を削除する。
$ kubectl delete hpa hw-demo-deployment



◆ 更新
更新手順も覚えておく。

コンフィグマップを変更する。
例として今回は、適当にimage名でも変えてみる。
$ kubectl edit deployment/hw-demo-deployment
    spec:
      containers:
      - image: gcr.io/google-samples/node-hello:1.0:latest

ロールアウトする。
全て正常に動作していることをkubenetesが確認を行い、その後古いpodは削除される。
$ kubectl rollout status deployment/hw-demo-deployment

ヒストリを確認する
$ kubectl rollout history deployment/watson-talk-pod
deployments "hw-demo-deployment"
REVISION CHANGE-CAUSE
1
2        

トラブルが確認された場合は、切り戻しを行うことができる。
$ kubectl rollout undo deployment/hw-demo-deployment --to-revision=1



◆ クリーンナップ
$ kubectl delete -f healthcheck.yml
$ bx cs cluster-rm myCluster



(参考)
https://console.bluemix.net/docs/containers/cs_tutorials.html#cs_tutorials
https://kubernetes.io/docs/tutorials/
http://qiita.com/tkusumi/items/01cd18c59b742eebdc6a




1 件のコメント:

  1. Really Good blog post.provided a helpful information.I hope that you will post more updates like this.
    Digital marketing company in Chennai

    返信削除