新しい IBM Developer JP サイトへようこそ!サイトのデザインが一新され、旧 developerWorks のコンテンツも統合されました。 詳細はこちら

IBM Cloud Private 内の Kubeflow

このチュートリアルはラーニング・パス「Kubeflow 入門」を構成するコンテンツです。

概要

このチュートリアルではクイックスタート・ガイドとして、シングル・ノード構成の Ubuntu マシン (8 コア、16 GB の RAM、250 GB のストレージ) にインストールした IBM Cloud Private-CE 上に Kubeflow をデプロイします。

Kubernetes 対応の機械学習ツールキットとして知られている Kubeflow は、Kubernetes 上の機械学習ワークフローのデプロイメントを単純化して移植可能にし、スケーラブルにすることを目的とするオープンソース・プロジェクトです。IBM Cloud Private は、オンプレミスのコンテナー化されたアプリケーションを開発、管理するためのプラットフォームです。このチュートリアルでは、次の方法を学びます。

  • シングル・ノード構成の Ubuntu システムに IBM Cloud Private-CE をインストールして構成する
  • Kubernetes Dashboard を起動する
  • Kubeflow をインストールできるよう準備する
  • Kubeflow を IBM Cloud Private-CE にインストールする
  • Kubeflow Dashboard を起動する

前提条件

このチュートリアルに取り組むには、最小要件として 8 基のコア、16 GB の RAM、250 GB のストレージを搭載した Ubuntu 18 マシンが必要です。IBM Cloud Private-CE のシステム要件については、IBM Cloud Private の「ハードウェア要件および推奨」を参照してください。また、チュートリアルの手順は root 権限で実行する必要があります。

所要時間

このチュートリアルの所要時間は約 40 分です。

IBM Cloud Private をインストールして構成する

このチュートリアルでは IBM Cloud Private-CE をインストールして構成する手順を説明します。詳細なインストール手順については、「IBM® Cloud Private-CE のインストール」を参照してください。

  1. Docker Community Edition をインストールします。

    以下のコードを使用して、Docker Community Edition をインストールします。

     apt-get update
    
     apt-get install -y apt-transport-https ca-certificates curl software-properties-common
    
     curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add -
    
     add-apt-repository \
        "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
        $(lsb_release -cs) \
        stable"
    
     apt-get update
    
     apt-get install -y docker-ce
    
  2. IBM Cloud Private-CE をインストールします。

    以下の手順は IBM Cloud Private-CE 3.1.0 を対象としたものです。他のバージョンをインストールする場合は、バージョン番号を該当するバージョンに変更してください。

     docker pull ibmcom/icp-inception:3.1.0
    
     mkdir /opt/ibm-cloud-private-ce-3.1.0;  \
      cd /opt/ibm-cloud-private-ce-3.1.0
    
     docker run -e LICENSE=accept \
      -v "$(pwd)":/data ibmcom/icp-inception:3.1.0 cp -r cluster /data
    
     cp ~/.ssh/id_rsa ./cluster/ssh_key
    
  3. IBM Cloud Private-CE に応じて config.yaml ファイルを編集します。

    1. /opt/ibm-cloud-private-ce-3.1.0/cluster/config.yaml ファイルを編集します。以下のセクションを見つけて、ここに示されているように管理サービスを無効にします (マシンに十分なメモリーとディスク・ストレージがある場合は、無効にする必要はありません)。

      ## You can disable following services if they are not needed:
      #   custom-metrics-adapter
      #   image-security-enforcement
      #   istio
      #   metering
      #   monitoring
      #   service-catalog
      #   storage-minio
      #   storage-glusterfs
      #   vulnerability-advisor
      management_services:
      istio: disabled
      vulnerability-advisor: disabled
      storage-glusterfs: disabled
      storage-minio: disabled
      custom-metrics-adapter: disabled
      service-catalog: disabled
      metering: disabled
      monitoring: disabled
      
    2. config.yaml ファイルの末尾に以下のコードを追加します。

      ansible_user: root
      ansible_ssh_pass: <password>
      ansible_ssh_common_args: "-oPubkeyAuthentication=no"
      
      image-security-enforcement:
      clusterImagePolicy:
      - name: "docker-local.artifactory.swg-devops.com/*"
        policy:
      - name: "docker.io/ibmcom/*"
        policy:
      
  4. /etc/hosts ファイルを編集します。

    以下の行を /etc/hosts ファイルに追加します。ここで、x.xx.xx.xxx はマシンの IP アドレス、mycluster はデフォルトのクラスター名です。

     x.xx.xx.xxx mycluster.icp
    
  5. Python と socat をインストールします。

     apt-get update \
         && apt-get install \
         && apt-get -qqy install \
         default-jre \
         sudo \
         curl \
         wget \
         git \
     python-pip
    
     apt install python-pip
    
     apt-get install socat
    
  6. IBM Cloud Private-CE に含まれている hosts ファイルを編集します。

    /opt/ibm-cloud-private-ce-3.1.0/cluster/hosts ファイルを編集して IP アドレスを追加します。

     [master]
     <ip address>
    
     [worker]
     <ip address>
    
     [proxy]
     <ip address>
    
  7. IBM Cloud Private-CE をデプロイしてインストールします。

     cd /opt/ibm-cloud-private-ce-3.1.0/cluster
     docker run --net=host -t -e LICENSE=accept \
     -v "$(pwd)":/installer/cluster ibmcom/icp-inception:3.1.0 install
    

    デプロイとインストールが正常に完了すると、以下のような出力が表示されます。

     PLAY RECAP *********************************************************************
     x.xx.xxx.xxx               : ok=174  changed=96   unreachable=0    failed=0
     localhost                  : ok=265  changed=161  unreachable=0    failed=0
    
     POST DEPLOY MESSAGE ************************************************************
    
     The Dashboard URL: https://x.xx.xxx.xxx:8443, default username/password is admin/admin
    

    Kubeflow Dashboard のスクリーンショット

Kubernetes Dashboard を起動する

Kubernetes Dashboard のグラフィカル・インターフェースには、Kubernetes のリソース (ポッド、デプロイメントなど) とイベントが表示されます。Kubernetes のコマンド・ライン・ツールを使い慣れていない場合は、このインターフェースが役立ちます。Dashboard はデフォルトではデプロイされないので、以下のコードを実行してデプロイする必要があります。

kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0-beta1/aio/deploy/recommended.yaml

リモート・システムからポート 9090 を使用して Kubernetes Dashboard を表示するには、以下のコードを実行します。

kubectl proxy --address="0.0.0.0" --port=9090 --accept-hosts '.*'&

Dashboard にアクセスするには、アクセス・トークンまたは構成ファイル (Kubeconfig) が必要です。アクセス・トークンを作成するには、以下のコードを使用します。

kubectl apply -f - <<EOF
apiVersion: v1
kind: ServiceAccount
metadata:
  name: admin-user
  namespace: kube-system
EOF

kubectl apply -f - <<EOF
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: admin-user
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- kind: ServiceAccount
  name: admin-user
  namespace: kube-system
EOF

以下のコマンドを実行して管理者ユーザー・トークンを取得します。

kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep admin-user | awk '{print $1}')

以下のような出力が表示されます。

Name:         admin-user-token-p59xx
Namespace:    kube-system
Labels:       <none>
Annotations:  kubernetes.io/service-account.name=admin-user
              kubernetes.io/service-account.uid=0520d73d-d3f1-11e9-876f-00163e01d092

Type:  kubernetes.io/service-account-token

Data
====
ca.crt:     2004 bytes
namespace:  11 bytes
token:      eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY…
…
…
-YqTWoEB1n5KduJEBUeZj2iajL7zjpEVUySMRZw-EsjYYxHVMAS6P34MloK3uM7CAGjnHQ

HTTP を使用して Kubernetes Dashboard にアクセスする場合、デフォルトでサポートされるのは localhost のみです。ご使用の環境で localhost を使用できない場合、IBM Cloud Private-CE がリモート・マシンにインストールされているとしたら、ローカル・マシンで以下のコマンドを実行することで、この制約を回避できます。

ssh -L 9090:localhost:9090 <userid>@<remote_host>

これで、ローカル・マシンの Web ブラウザーで管理者ユーザー・トークンを使用して Kubernetes Dashboard にアクセスできるようになります。

http://localhost:9090/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/#/overview?namespace=default

システムの概要を示す画面のスクリーンショット

Kubeflow をインストールできるよう準備する

NFS のデフォルト storageclass をインストールして構成する

IBM Cloud Private-CE にはデフォルトの storageclass が同梱されていません。動的にプロビジョニングできるよう、デフォルトの storageclass を作成することをお勧めします。

  1. helm のバージョンを確認します。

     helm version –-tls
    

    以下のような出力が表示されるはずです。

     Client: &version.Version{SemVer:"v2.9.1", GitCommit:"20adb27c7c5868466912eebdf6664e7390ebe710", GitTreeState:"clean"}
     Server: &version.Version{SemVer:"v2.9.1+icp", GitCommit:"843201eceab24e7102ebb87cb00d82bc973d84a7", GitTreeState:"clean"}
    

    サーバーまたは tiller に接続できないと、以下のようなエラーが表示されます。

     could not read x509 key pair (cert: "/root/.helm/cert.pem", key: "/root/.helm/key.pem"): can't load key pair from cert /root/.helm/cert.pem and key /root/.helm/key.pem: open /root/.helm/cert.pem: no such file or directory`
    

    エラーが表示された場合は、以下のコマンドを試してください (ここで、x.xx.xxx.xxx は IP アドレスです)。

     export MASTERNODE=x.xx.xxx.xxx
     export CLUSTERNAME=mycluster
     cloudctl login -n kube-system -u admin -p admin -a https://$MASTERNODE:8443 --skip-ssl-validation -c "id-$CLUSTERNAME-account"
    

    これで、以下のコマンドを使用して NFS サーバーおよびクライアントをインストールできます。

     apt install nfs-kernel-server
     mkdir /nfsroot
    
  2. /etc/exports ファイルを編集して、ファイルの末尾に以下の行を追加します (ここで、x.xx.xxx.xxx は IP アドレスです)。

     /nfsroot 192.168.0.0/16(rw,no_root_squash,no_subtree_check)
     /nfsroot x.xx.xxx.xxx /16(rw,no_root_squash,no_subtree_check)  
    
     exportfs -a
    
     systemctl restart nfs-kernel-server
    
     apt install nfs-common
    
     helm install  --tls --name nfs-client-provisioner \
       --set nfs.server= x.xx.xxx.xxx \
       --set nfs.path=/nfsroot \
       --set storageClass.name=nfs \
       --set storageClass.defaultClass=true \
       stable/nfs-client-provisioner
    
     ufw allow from x.xx.xxx.xxx/16 to any port nfs
    
  3. 以下のコードを使用して、nfs という名前の storageclass が作成されたことを確認します。

     kubectl get sc
    
     You should see something like this:
     NAME                       PROVISIONER                            AGE
     image-manager-storage      kubernetes.io/no-provisioner           1d
     kafka-storage              kubernetes.io/no-provisioner           1d
     logging-storage-datanode   kubernetes.io/no-provisioner           1d
     mariadb-storage            kubernetes.io/no-provisioner           1d
     minio-storage              kubernetes.io/no-provisioner           1d
     mongodb-storage            kubernetes.io/no-provisioner           1d
     nfs (default)              cluster.local/nfs-client-provisioner   1d
     zookeeper-storage          kubernetes.io/no-provisioner           1d
    

ポッドの数を増やす

ポッドとは、1 つ以上のアプリケーション・コンテナー (Docker など) のグループを表す、Kubernetes の抽象化です。1 つのノードで複数のポッドを使用することができます。IBM Cloud Private のデフォルト・インストールでは、コアごとに使用できるポッドは 10 個だけです。以下のコードを使用して確認してください。

kubectl describe node

8 基のコアを使用している場合、以下に示されているように、80 個のコアを割り当てることができます。

…
Capacity:
 cpu:                8
 ephemeral-storage:  246397392Ki
…
 memory:             16424796Ki
 pods:               80
Allocatable:
 cpu:                8
 ephemeral-storage:  227079836092
…
 memory:             16322396Ki
 pods:               80
…

IBM Cloud Private-CE のデフォルト・インストールで必要となるポッドは約 40 個ですが、Kubeflow のデフォルト・インストールでは約 45 個のポッドが必要です。したがって、ポッドの数を増やす必要があります (ポッドが 80 個しかない場合)。

ポッドの数を増やすには、/etc/cfc/kubelet/kubelet-service-config ファイルを編集して podsPerCore の値を 10 から 20 に増やします。

podsPerCore: 20

変更を保存してから kubelet を再起動します。

systemctl restart kubelet

以下のコマンドを実行すると、その出力を調べて、割り当て可能なポッドの数を確認できます。

kubectl describe node

IBM Cloud Private 内の必須ではないサービス/デプロイメントを無効にする

十分なメモリーがある場合、このステップは不要です。16 GB のメモリーしかない場合は、IBM Cloud Private-CE 内のいくつかの必須ではないサービスを無効にする必要があります。こうしなければ、Kubeflow Dashboard が正常に動作しません。

kubectl -n kube-system patch ds logging-elk-filebeat-ds  --patch '{ "spec": { "template": { "spec": { "nodeSelector": { "switch": "down" } } } } }'
kubectl -n kube-system patch ds nvidia-device-plugin  --patch '{ "spec": { "template": { "spec": { "nodeSelector": { "switch": "down" } } } } }'
kubectl -n kube-system patch ds audit-logging-fluentd-ds  --patch '{ "spec": { "template": { "spec": { "nodeSelector": { "switch": "down" } } } } }'

kubectl -n kube-system scale deploy logging-elk-client --replicas=0
kubectl -n kube-system scale deploy logging-elk-kibana --replicas=0
kubectl -n kube-system scale deploy logging-elk-logstash --replicas=0
kubectl -n kube-system scale deploy logging-elk-master --replicas=0
kubectl -n kube-system scale deploy secret-watcher --replicas=0

無効にしたサービスを再び有効にするには、必要に応じて以下のコマンドを実行します。

kubectl -n kube-system patch ds logging-elk-filebeat-ds --patch '{ "spec": { "template": { "spec": { "nodeSelector": { "switch": "up" } } } } }'
  kubectl -n kube-system patch ds nvidia-device-plugin  --patch '{ "spec": { "template": { "spec": { "nodeSelector": { "switch": "up" } } } } }'
  kubectl -n kube-system patch ds audit-logging-fluentd-ds  --patch '{ "spec": { "template": { "spec": { "nodeSelector": { "switch": "up" } } } } }'

  kubectl -n kube-system scale deploy logging-elk-client --replicas=1
  kubectl -n kube-system scale deploy logging-elk-kibana --replicas=1
  kubectl -n kube-system scale deploy logging-elk-logstash --replicas=1
  kubectl -n kube-system scale deploy logging-elk-master --replicas=1
  kubectl -n kube-system scale deploy secret-watcher --replicas=1

Kubeflow 用のイメージ・ポリシー・ファイルを作成する

image-policy.yaml という名前のファイルを作成して、以下の内容を含めます。

apiVersion: securityenforcement.admission.cloud.ibm.com/v1beta1
kind: ImagePolicy
metadata:
  name: image-policy
spec:
  repositories:
    - name: docker.io/*
      policy: null
    - name: k8s.gcr.io/*
      policy: null
    - name: gcr.io/*
      policy: null
    - name: ibmcom/*
      policy: null
    - name: quay.io/*
      policy: null

次に、以下のコードを実行して Kubeflow 名前空間を作成し、上記のイメージ・ポリシーを適用します。

kubectl create namespace kubeflow
kubectl create -n kubeflow -f image-policy.yaml

Kubeflow を IBM Cloud Private-CE にインストールする

ルート・ディレクトリーの下に kubeflow という名前のディレクトリーを作成します (任意のディレクトリーを使用するのでもかまいません)。以下の手順では、Kubeflow 0.6.2 をインストールします。現在のところ、デフォルト・インストールでの問題を回避するために --config オプションを使用する必要があります (--config オプションを使用しないと問題が発生します)。

mkdir /root/kubeflow
cd /root/kubeflow
wget https://github.com/kubeflow/kubeflow/releases/download/v0.6.2/kfctl_v0.6.2_linux.tar.gz

tar -xvf kfctl_v0.6.2_linux.tar.gz
export PATH=$PATH:/root/kubeflow
export KFAPP=kfapp
export CONFIG="https://raw.githubusercontent.com/kubeflow/kubeflow/v0.6-branch/bootstrap/config/kfctl_k8s_istio.0.6.2.yaml"
kfctl init ${KFAPP} --config=${CONFIG} -V

cd ${KFAPP}
kfctl generate all -V
kfctl apply all -V

インストールが失敗した場合は、以下のコマンドを実行して Kubeflow を削除できます。

cd ${KFAPP}
kfctl delete all -V --delete_storage

: Kubeflow を削除しても istio はアンインストールされません。そのため、インストール・プログラムが Istio 内でのポート競合を検出すると、Kubeflow の再インストールが失敗します。この問題を回避するには、以下のコマンドを使用します。

wget https://raw.githubusercontent.com/kubeflow/kubeflow/v0.6-branch/bootstrap/config/kfctl_k8s_istio.0.6.2.yaml

cp kfctl_k8s_istio.0.6.2.yaml noistio.yaml

noistio.yaml ファイルを編集して、以下のように istio-crdsistio-install をコメント化します。

…
    # Istio install. If not needed, comment out istio-crds and istio-install.
    #- kustomizeConfig:
    #    parameters:
    #      - name: namespace
    #        value: istio-system
    #    repoRef:
    #      name: manifests
    #      path: istio/istio-crds
    #  name: istio-crds
    #- kustomizeConfig:
    #    parameters:
    #      - name: namespace
    #        value: istio-system
    #    repoRef:
    #      name: manifests
    #      path: istio/istio-install
    #  name: istio-install
    # This component is the istio resources for Kubeflow (e.g. gateway), not about installing istio.
…

変更を保存してから、もう一度インストールを開始します。

export CONFIG=/root/kubeflow/noistio.yaml
kfctl init ${KFAPP} --config=${CONFIG} -V
cd ${KFAPP}
kfctl generate all -V
kfctl apply all -V

Kubeflow Dashboard を起動する

Kubeflow Dashboard には、istio-ingressgateway サービスを介してアクセスできます。istio-ingressgateway サービスの設定を確認するには、以下のコードを実行します。

kubectl get svc istio-ingressgateway -n istio-system
You may see output like this:
NAME                   TYPE       CLUSTER-IP   EXTERNAL-IP   PORT(S)                                                                                                                                      AGE
istio-ingressgateway   NodePort   10.0.0.179   <none>        15020:30757/TCP,80:31380/TCP,443:31390/TCP,31400:31400/TCP,15029:30116/TCP,15030:30132/TCP,15031:31653/TCP,15032:30341/TCP,15443:31423/TCP   2h

上記の出力では、EXTERNAL-IP の値が <none> となっているため、NodePort 転送が必要です。詳細については、Ingress Gateway ガイドを参照してください。

次に、Web ブラウザーで Kubeflow Dashboard にアクセスします。

http://$INGRESS_HOST:$INGRESS_PORT

Kubeflow Dashboard のスクリーンショット

まとめ

このチュートリアルでは、IBM Cloud Private-CE をインストールする方法と、Kubernetes および Kubeflow Dashboard を起動する方法を説明しました。この記事で Kubeflow に興味を持って調査を開始していただけることを願います。

このチュートリアルはラーニング・パス「Kubeflow 入門」を構成するコンテンツです。引き続きこのラーニング・パスに従うには、シリーズの次のチュートリアル「Minikube 内の Kubeflow」に取り組んでください。

謝辞

このチュートリアルをレビューしてくださった Weiqiang Zhuang 氏に深く感謝します。