皆さん、CI/CDツールは何を利用されていますでしょうか?
IBM Cloud Privateはエンドツーエンドの開発環境であるMicroclimateの動作環境として対応しています。
https://Microclimate-dev2ops.github.io/
Microclimate is an end to end development environment that lets you rapidly create, edit, and deploy applications. Applications are run in containers from day one and can be delivered into production on Kubernetes through an automated DevOps pipeline using Jenkins. Microclimate can be installed locally or on IBM Cloud Private, and currently supports Java, Node.js, and Swift.
IBM Cloud Private上のHelmのカタログにもMicroclimateがあるか見てみますと・・・
ありました!
あるなら動かしてみよう!の精神で今回はMicroclimateをインストール(デプロイ)してみます。
参考URL:
https://www.ibm.com/support/knowledgecenter/ja/SSBS6K_3.1.0/featured_applications/Microclimate.html
https://github.com/IBM/charts/blob/master/stable/ibm-Microclimate/README.md
テストした環境
サーバーは全部で3台用意します。
- ICP Master Server
- ICP Worker Server
- NFS Server
Master / Worker Serverのスペック
OS | RedHat Endterprise Linux 7.4 |
物理/仮想 | 仮想 |
CPU(Core) | 8 |
Memory | 24GB |
Disk | 300GB |
NIC | 1つ |
NFS Serverの領域
Persistent Volumeとして20GB以上ご用意ください。
今回はCent OSを用意し、NFS Serverとして稼働させています。
ICP Version
ICPのバージョンは3.1.1になります。
ICPの構築
こちらを参考に構築してください。
Microclimateインストール手順概要
- Name Space の作成
- Microclimate PiplineのName Spaceの作成
- Cluster_CA_Domainの確認
- Cluster Image Policyの作成
- Microclimate registry secret の作成
- Helmで利用するSecretの作成
- Microclimate pipeline secretの作成
- Ingress Domain Name の作成(今回はHostsで逃げます)
- Helmからインストール
- Persistent Volumeの作成
github上のドキュメントでは、9.と10.が逆ですが、動きがわかりやすいようにこの順番でインストールを行っていきます。
Install !!
コマンド実行の作業はMaster Server上にSSH等でログインし実行します。
1. Name Space の作成
ICPではDefaultというNameSpace(ICPのGUI上では「名前空間」)が用意されていますが、Microclimate用に用意する必要があります。
GUI、コマンドどちらからでも設定できます。
NameSpace名は microclimate-space としています。
GUI
GUIから作成する場合は、ICP管理コンソールにログインし、メニューの[管理]-[名前空間]から作成します。
名前は任意となり、「ポッド・セキュリティ・ポリシー」では ibm-restricted-psp を選択してください。
コマンド
コマンドで設定する場合は以下になります。
※最初にICPクラスタにログインします。
cloudctl login -a https://
ユーザー名: admin パスワード: admin
次に作成のコマンドを実行します。
kubectl create namespace <namespace name>
今回は名前を microclimate-space にします。
kubectl create namespace microclimate-space
作成したNameSpaceで作業するように変更します。
cloudctl login -a https://
:8443 -n microclimate-space --skip-ssl-validation
2. Microclimate PiplineのName Spaceの作成
1.と同様にNameSpaceを作成します。
kubectl create namespace microclimate-pipeline-deployments
名前は変えず、このまま使います。 GUIで作成する場合も同様に作成します。「ポッド・セキュリティ・ポリシー」もibm-restricted-psp で問題ありません。
3. Cluster_CA_Domainの確認
これはインストール時に決まっています。Config.yamlで特に指定していなければ、 mycluster.icpがドメインになります。
設定値はConfig.yamlに記載されています。
下記のコマンドで確認できます。
cat /opt/ibm-cloud-private-3.1.1/cluster/config.yaml | grep cluster_name# cluster_name: mycluster# cluster_CA_domain: "{{ cluster_name }}.icp"
4. Cluster Image Policyの作成
ICPではデフォルトで取得できるDocker.ioのイメージがポリシーで設定されています。
MicroclimateのDockerイメージを取得できるように、ポリシーを追加します。
追加する前に 既存のポリシー を確認します。
ポリシーのリストを確認
kubectl get ClusterImagePolicy
結果
NAME | AGE |
ibmcloud-default-cluster-image-policy | 1d |
ポリシーの詳細を確認
kubectl describe ClusterImagePolicy ibmcloud-default-cluster-image-policy
Name: ibmcloud-default-cluster-image-policy
Namespace:
Labels: <none>
Annotations: <none>
API Version: securityenforcement.admission.cloud.ibm.com/v1beta1
Kind: ClusterImagePolicy
Metadata:
Creation Timestamp: 2018-12-25T08:27:11Z
Generation: 1
Resource Version: 3254
Self Link:
/apis/securityenforcement.admission.cloud.ibm.com/v1beta1/clusterimagepolicies/ibm
cloud-default-cluster-image-policy
UID: e00ff4c7-081e-11e9-8cff-00505687010b
Spec:
Repositories:
Name: mycluster.icp:8500/*
Name: registry.bluemix.net/ibm/*
Name: docker.io/ppc64le/*
Name: docker.io/amd64/busybox*
Name: docker.io/vault:*
Name: docker.io/consul:*
Name: docker.io/python:*
Name: docker.io/centos:*
Name: docker.io/postgres:*
Name: docker.io/hybridcloudibm/*
Name: docker.io/ibmcom/*
Name: docker.io/db2eventstore/*
Name: docker.io/icpdashdb/*
Name: docker.io/store/ibmcorp/*
Name: docker.io/alpine*
Name: docker.io/busybox*
Name: docker.io/dduportal/bats:*
Name: docker.io/cassandra:*
Name: docker.io/haproxy:*
Name: docker.io/hazelcast/hazelcast:*
Name: docker.io/library/busybox:*
Name: docker.io/minio/mc:*
Name: docker.io/minio/minio:*
Name: docker.io/nginx:*
Name: docker.io/open-liberty:*
Name: docker.io/rabbitmq:*
Name: docker.io/radial/busyboxplus:*
Name: docker.io/ubuntu*
Name: docker.io/websphere-liberty:*
Name: docker.io/wurstmeister/kafka:*
Name: docker.io/zookeeper:*
Name: docker.io/ibmcloudcontainers/strongswan:*
Name: docker.io/opsh2oai/dai-ppc64le:*
Name: docker.io/redis*
Name: docker.io/f5networks/k8s-bigip-ctlr:*
Name: docker.io/rook/rook:*
Name: docker.io/rook/ceph:*
Name: docker.io/couchdb:*
Name: docker.elastic.co/beats/filebeat:*
Name: docker.io/prom/statsd-exporter:*
Name: docker.elastic.co/elasticsearch/elasticsearch:*
Name: docker.elastic.co/kibana/kibana:*
Name: docker.elastic.co/logstash/logstash:*
Name: quay.io/k8scsi/csi-attacher:*
Name: quay.io/k8scsi/driver-registrar:*
Name: quay.io/k8scsi/nfsplugin:*
Name: k8s.gcr.io/hyperkube:*
Name: registry.bluemix.net/armada-master/ibm-worker-recovery:*
Events: <none>
ポリシーを追加設定
まずは、yamlファイルを作成します。
ファイル名: mycip.yaml
apiVersion: securityenforcement.admission.cloud.ibm.com/v1beta1
kind: ClusterImagePolicy
metadata:
name: microclimate-cluster-image-policy
spec:
repositories:
- name: <cluster_ca_domain>:8500/* # ← ドメインを変えるのを忘れずに。
- name: docker.io/maven:*
- name: docker.io/jenkins/*
- name: docker.io/docker:*
kubectl create -f mycip.yaml
作成されていることを確認します。
kubectl get clusterimagepolicyNAME AGEibmcloud-default-cluster-image-policy 1dMicroclimate-cluster-image-policy 23h
作成したポリシーの詳細も確認してみます。
kubectl describe clusterimagepolicy microclimate-cluster-image-policy
Name: Microclimate-cluster-image-policy
Namespace:
Labels: <none>
Annotations: <none>
API Version: securityenforcement.admission.cloud.ibm.com/v1beta1
Kind: ClusterImagePolicy
Metadata:
Creation Timestamp: 2018-12-26T02:23:52Z
Generation: 1
Resource Version: 123615
Self Link:
/apis/securityenforcement.admission.cloud.ibm.com/v1beta1/clusterimagepolicies/Mic
roclimate-cluster-image-policy
UID: 494d92d8-08b5-11e9-8c84-00505687010b
Spec:
Repositories:
Name: <cluster_ca_domain>:8500/*
Name: docker.io/maven:*
Name: docker.io/jenkins/*
Name: docker.io/docker:*
Events: <none>
5. microclimate registry secretの作成
ICP内にあるPrivate Registryを使うための認証キーを作成します。
実行するコマンドは下記になります。
kubectl create secret docker-registry microclimate-registry-secret \
--docker-server=<cluster_ca_domain>:8500 \
--docker-username=<account-username> \
--docker-password=<account-password> \
--docker-email=<account-email>
それぞれデフォルト値は下記のようになります。
変数名 | デフォルト値 |
---|---|
< cluster_ca_domain > | mycluster.icp |
< account-username > | admin |
< account-password > | admin |
< account-email > | デフォルト値なし。任意の値 |
環境にあわせたサンプルのコマンドは下記になります。
kubectl create secret docker-registry microclimate-registry-secret \
--docker-server=mycluster.icp:8500 \
--docker-username=admin \
--docker-password=admin \
--docker-email=admin@test.local
6. Helmで利用するSecretの作成
MicroclimateのデプロイにHelmを利用します。Helmを利用するのに必要な証明書を含んだSecretを作成します。
下記のコマンドで .Helm/ が見えるか確認します。
見える場合のサンプル
ls -la $HELM_HOME
total 16
drwxr-xr-x 2 root root 51 Dec 27 10:15 .
dr-xr-x---. 10 root root 4096 Dec 26 15:16 ..
-rw------- 1 root root 2004 Dec 27 10:15 ca.pem
-rw------- 1 root root 1424 Dec 27 10:15 cert.pem
-rw------- 1 root root 1704 Dec 27 10:15 key.pem
3つの .pemファイルが表示されていない場合は、$HELM_HOMEにPathが通っているか確認します。
printenv | grep HELM_HOME
なにもリストされない場合は、Pathを設定します。
※今回は root で作業しているので下記になっています。
export HELM_HOME="/root/.helm"
再度、コマンドを実行し .pem ファイルがリストされることを確認します。
ls -la $HELM_HOME
下記のコマンドを実行して、Secretを作成します。
kubectl create secret generic microclimate-helm-secret --from-file=cert.pem=$HELM_HOME/cert.pem --from-file=ca.pem=$HELM_HOME/ca.pem --from-file=key.pem=$HELM_HOME/key.pem
7. Microclimate pipeline secretの作成
NameSpace "microclimate-pipeline-deployments" 用のSecretも必要になりますので作成します。
実行するコマンドは下記になります。
kubectl create secret docker-registry Microclimate-pipeline-secret \
--docker-server=<cluster_ca_domain>:8500 \
--docker-username=<account-username> \
--docker-password=<account-password> \
--docker-email=<account-email> \
--namespace=Microclimate-pipeline-deployments
デフォルトの値は 5. microclimate registry secretの作成 で作成した値と同じです。
変数名 | デフォルト値 |
---|---|
< cluster_ca_domain > | mycluster.icp |
< account-username > | admin |
< account-password > | admin |
< account-email > | デフォルト値なし。任意の値 |
設定のサンプルは下記になります。
kubectl create secret docker-registry microclimate-pipeline-secret \
--docker-server=mycluster.icp:8500 \
--docker-username=admin \
--docker-password=admin \
--docker-email=admin@test.local \
--namespace=microclimate-pipeline-deployments
次にSecretを割り当てます。 まずは現状を確認します。
kubectl describe serviceaccount default --namespace microclimate-pipelinedeployments
Name: default
Namespace: Microclimate-pipeline-deployments
Labels: <none>
Annotations: <none>
Image pull secrets: <none>
Mountable secrets: default-token-2qn78
Tokens: default-token-2qn78
Events: <none>
"Image pull secrets" がnone の場合は下記コマンドを実行します。
kubectl patch serviceaccount default --namespace microclimate-pipeline-deployments -p "{\"imagePullSecrets\": [{\"name\": \"microclimate-pipeline-secret\"}]}"
"Image pull secrets" に Microclimate-pipeline-secret 以外の値(別のSecret)が適用されている場合、下記のコマンドで書き換えます。
kubectl patch sa default -n microclimate-pipeline-deployments --type=json -p="[{\"op\":\"add\",\"path\":\"/imagePullSecrets/0\",\"value\":{\"name\": \"microclimate-pipeline-secret\"}}]"
適用後は下記のようになります。
kubectl describe serviceaccount default --namespace Microclimate-pipelinedeployments
Name: default
Namespace: Microclimate-pipeline-deployments
Labels: <none>
Annotations: <none>
Image pull secrets: Microclimate-pipeline-secret
Mountable secrets: default-token-2qn78
Tokens: default-token-2qn78
Events: <none>
8. Ingress Domain Name の作成(今回はHostsで設定します)
環境上用意が難しいので今回はHostsを使って設定します。
MicroclimateとjenkinsのWebサービス用にサブドメインを自動的につけて、80,443で通信するので、仮にドメイン名が icppoc.local だとすると、
microclimate.icppoc.local
jenkins.icppoc.local
にアクセスすることになります。
今回はデプロイ完了後に接続元PC(Windows)のhostsを書き換えてアクセスさせてしまいます。
9. Helmからインストール
Helmからインストールします。 ここからはGUIで操作してみます。
管理コンソールの[カタログ]に移動し、[Microclimate]で検索します。
表示された項目をクリックします。
[構成]をクリックします。
表示された画面で下記項目を埋めて、[インストール]をクリックします。
項目名 | 値 |
---|---|
Helmリリース名 | 任意の名前(microclimatetest) |
ターゲット名前空間 | [1. Name Space の作成]で作成したNameSpaceを選択 |
使用許諾条件 | チェックする |
ポッドセキュリティー | 入力なし |
Microclimate Ingress Domain | 任意のドメイン |
今回、任意のドメインは icppoc.localと指定します。
デプロイ後、Helmリリースの情報を確認してみます。 管理コンソールのメニューから[ワークロード]-[Helmリリース]に移動します。
microclimate で検索し、対象のHelmリリースをクリックします。
デプロイメントのステータスで”使用可能”のステータスに”1”と表示されていなかったり、ポッドのステータスが"Running" となっていない状態になっています。
また、 Persistent Volume Claim の状況が Pendingになっています。
これは、Persistent Volumeが存在しないため、Persistent Volume Claimがディスクを割り当てできず正常に動作していません。
次のステップでPersistent Volumeを作成します。
10. Persistent Volumeの作成
Microclimateで利用するPersistent Volume (以下、PV)が必要になります。
今回は NFS Server を用意し、NFSボリュームをPVとして利用します。
まず、現時点ではPVを請求する Persistent Volume Claim (以下、PVC) が作成されている状態になりますので、PVCのステータスを確認します。
管理コンソールのメニューで[プラットホーム]-[ストレージ]を開き、「PersistentVolumeClaim」のタブをクリックします。
microclimatetest-ibm-microclimateとmicroclimatetest-jenkinsというエントリがあります。
それぞれのステータスは下記のようになっているかと思います。
名前 | 名前空間 | 状況 | Persistent Volume | 要求 | アクセス・モード |
---|---|---|---|---|---|
microclimatetest-ibm-microclimate | microclimate-space | Pending | - | 8Gi | RWX |
microclimatetest-jenkins | microclimate-space | Pending | - | 8Gi | RWO |
PVが[-]となっていますので割り当てがありません。
MicroclimateのHelmリリースではデフォルトでDynamic Provisioningが有効になっています。これは、PVCが作成されたときに、PVCの内容を満たすPVが存在すれば自動的に割り当てる機能になります。
今回のPVの請求内容は上記図の要求とアクセスモード部分が該当しますので、請求を満たすPVを用意します。
NFS Serverの準備
今回は別途、構築済みのCentOSサーバーにNFS Serverをインストールし利用します。
NFSのパスは2つ作成しました。
NFS Server IP : xxx.xxx.xxx.159
Path1 : /nfs/microclimate
Path2 : /nfs/jenkins
PVの作成
PVを作成します。今回もGUI(管理コンソール)で作成します。
先ほど開いていた管理コンソール画面を開きます。
場所は管理コンソールのメニューから[プラットホーム]-[ストレージ]を開きます。 "PersistentVolume"のタブをクリックします。
PersistentVolumeの作成をクリックします。
まず、PVC microclimatetest-ibm-microclimate 用のPVを作成します。
要求 8Giは容量になります。RWXはアクセスモードでReadWriteManyになります。NFSサーバーはIPとPathが必要になりますので、Path1を使います。
今回設定する値は下記のようになります。
カテゴリ | 設定名 | 設定値 |
---|---|---|
一般 | 名前 | 任意の名前(microclimate-pv) |
容量 | 8Gi | |
アクセス・モード | 何度でも読み取り/書き込み | |
再利用ポリシー | 保持 | |
ストレージタイプ | NFS | |
パラメーター | キー1 | server |
値1 | xxx.xxx.xxx.159 | |
キー2 | path | |
値2 | /nfs/microclimate |
※記載のない設定は設定しません
※パラメーターのキーは"パラメーターの追加"で追加します。
次にPVC microclimatetest-ibm-jenkins用のPVを作成します。 容量は8GiでアクセスモードはRWOです。 RWOはReadWriteOnceです。
カテゴリ | 設定名 | 設定値 |
---|---|---|
一般 | 名前 | 任意の名前(jenkins-pv) |
容量 | 8Gi | |
アクセス・モード | 一度だけの読み取り/書き込み | |
再利用ポリシー | 保持 | |
ストレージタイプ | NFS | |
パラメーター | キー1 | server |
値1 | xxx.xxx.xxx.159 | |
キー2 | path | |
値2 | /nfs/jenkins |
※記載のない設定は設定なし ※パラメーターのキーは"パラメーターの追加"で追加する
どちらも作成すると下記のようにPVにリストが追加されます。
請求の値にそれぞれ値が設定され、状況がBoundになっています。
また、PersistentVolumeClaimのタブを開くとPersistentVolumeの値に作成したPV名が表示され、状況もBoundとなりますので、PVCはPVの割り当てを取得し、ストレージの割り当てが完了しました。
先ほど確認した際にはすべてが動作していなかったHelmリリースの情報を見に行きます。
管理コンソールのメニューから[ワークロード]-[Helmリリース]を開き、「microclimatetest」を開きます。
ポッドのステータスがすべてRunningになり、デプロイメントの使用可能のステータスがすべて1になっていることを確認します。
※ コンテナーがすべて作成されるまでに少し時間がかかります
最後にMicroclimateとJenkinsにログインしてみましょう。 今回、Domainに関して特に設定していませんので、Hostsを編集する必要があります。
管理コンソールのメニューから[ネットワーク・アクセス]-[サービス]を開き、「入口」タブをクリックします。
Microclimatetest-ibm-MicroclimateとMicroclimatetest-jenkinsがリストされています。 それぞれ、ドメインは icppoc.local になり、サブドメインでMicroclimateとjenkinsがついています。
アドレス部分が[-]となっている場合は、proxyノードのIPが使われています。 Proxyノードがどのサーバーか確認するには、管理コンソールの[プラットホーム]-[ノード]から確認ができます。
ここでは、 xxx.xxx.xxx.161 がProxyノードになります。
接続元のPCのHostsに下記を追記します。
xxx.xxx.xxx.161 microclimate.icptest.localxxx.xxx.xxx.161 jenkins.icptest.local
設定後それぞれのURLにアクセスします。
https://microclimate.icptest.local/
https://jenkins.icptest.local/
Microclimate
Jenkins
この先はそれぞれのアプリケーションでの設定となっていきます。
もしアプリケーション開発環境として利用してみたいというユーザー様がいらっしゃれば、なんらかのPV(NFS)さえ用意できれば動きますので、ぜひ試してみてください。
最後に
IBM Cloud PrivateのPoC環境の貸し出しも実施しています。
https://www.networld.co.jp/product/ibm-hardware/trial/
Web上にNFSの用意の記載はありませんが、ご要望があればご用意はできますのでご興味のある方は是非ご連絡ください!
すずきけ