Appearance
Cloud Native Adapterの拡張
本章では、Qmonus Value Streamを使って、Cloud Native Adapterを編集し、ステージング環境にデプロイしたシンプルなAPIサーバの構成を変更する手順を解説します。
Getting StartedでのHTTP APIサーバの構築を前提とします。
以降のステップでは下記の作業を通じて、Cloud Native Adapterを拡張できることを確認していきます。
- Cloud Native Adapter のComposite機能を用いて、Kubernetesのヘルスチェック機能であるreadinessProbe、livenessProbeを追加します。
- CI/CDパイプラインを実行して新たにデリバリされるリソースを確認します。
1. Cloud Native Adapterの編集
本チュートリアルではGetting Startedのチュートリアル で作成した持ち込みのプライベートリポジトリと、getting-started
ブランチをそのまま利用します。 ここでは、Cloud Native Adapterの特徴の一つである、Composite機能を用いて、Cloud Native AdapterにreadinessProbe、livenessProbeの機能を追加します。
以下のようにCloud Native Adapterを編集し、アプリケーションの構成を変更します。 まずはComposite元となるhealthcheck.cueを新たに作成します。
bash
# localディレクトリに移動
cd .valuestream/local
# Composite元となるhealthcheck.cueを作成する
vim healthcheck.cue
go
package healthcheck
DesignPattern: {
name: "healthcheck"
parameters: {
port: int
probePath: string
}
resources: app: {
deployment: _portConfig
}
_portConfig: spec: template: spec: containers: [{
readinessProbe: {
httpGet: {
path: parameters.probePath
port: parameters.port
}
timeoutSeconds: 5
successThreshold: 2
failureThreshold: 2
periodSeconds: 10
}
livenessProbe: {
httpGet: {
path: parameters.probePath
port: parameters.port
scheme: "HTTP"
}
initialDelaySeconds: 60
periodSeconds: 10
successThreshold: 1
timeoutSeconds: 5
}
}, ...]
}
前回チュートリアルで使用していたmain.cueを編集して、作成したhealthcheck.cueをCompositeします。
bash
# Composite機能を使ってDesgin Patternを編集する
vim main.cue # 以下のdiffのように変更する
go
@@ -1,8 +1,13 @@
package local
+import (
+ "github.com/qmonus/sample/local:healthcheck"
+)
_const: {
#name: "nginx-demo"
#port: 80
+ #healthcheckPath: "/"
}
DesignPattern: {
@@ -68,6 +73,16 @@
}
}
+ composites: [
+ {
+ pattern: healthcheck.DesignPattern
+ params: {
+ port: _const.#port
+ probePath: _const.#healthcheckPath
+ }
+ },
+ ]
// apply namespace
_deployment: metadata: namespace: parameters.k8sNamespace
_service: metadata: namespace: parameters.k8sNamespace
}
go
package local
import (
"github.com/qmonus/sample/local:healthcheck"
)
_const: {
#name: "nginx-demo"
#port: 80
#healthcheckPath: "/"
}
DesignPattern: {
name: "local"
parameters: {
k8sNamespace: string
imageName: string
}
resources: app: {
deployment: _deployment
service: _service
}
let _selector = {
app: _const.#name
}
let _container = {
name: _const.#name
image: parameters.imageName
ports: [{
containerPort: _const.#port
}]
resources: {
requests: {
cpu: "5m"
memory: "32Mi"
}
limits: {
cpu: "10m"
memory: "64Mi"
}
}
}
_deployment: {
apiVersion: "apps/v1"
kind: "Deployment"
metadata: name: _const.#name
spec: {
replicas: 1
selector: matchLabels: _selector
template: {
metadata: labels: _selector
spec: containers: [
_container,
]
}
}
}
_service: {
apiVersion: "v1"
kind: "Service"
metadata: name: _const.#name
spec: {
type: "LoadBalancer"
ports: [{
name: "http"
port: 8080
targetPort: _const.#port
}]
selector: _selector
}
}
composites: [
{
pattern: healthcheck.DesignPattern
params: {
port: _const.#port
probePath: _const.#healthcheckPath
}
},
]
// apply namespace
_deployment: metadata: namespace: parameters.k8sNamespace
_service: metadata: namespace: parameters.k8sNamespace
}
2. Cloud Native Adapterの動作確認
本手順では、動作確認に利用するパラメータファイルとして params.json を作成します。
params.json
実際にQmonus Value Streamを通してCI/CDを実行する際は、AssemblyLineの動作の中でパラメータが自動的に渡されるため、params.jsonというファイルを意識する必要はありません。 今回はコンパイルが正しく動作することを確認するために、params.jsonというパラメータファイルを一時的に作成します。
bash
# .valuestream ディレクトリに移動
cd ../
# params.jsonを作成する(実際にはQmonus Value Streamの中で自動的に作成される)
vim params.json
json
{
"params": [
{
"name": "k8sNamespace",
"value": "dummyns"
},
{
"name": "imageName",
"value": "dummyimage"
}
]
}
Cloud Native Adapterが正しくコンパイルできるかどうかを確認します。
bash
# qvsctlでApplication Manifestにコンパイル
qvsctl manifest compile -m . -c qvs.yaml -p params.json
less output/manifests.yml
YAML
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-demo
namespace: dummyns
spec:
replicas: 1
selector:
matchLabels:
app: nginx-demo
template:
metadata:
labels:
app: nginx-demo
spec:
containers:
- name: nginx-demo
image: dummyimage
ports:
- containerPort: 80
readinessProbe:
httpGet:
path: /
port: 80
timeoutSeconds: 5
successThreshold: 2
failureThreshold: 2
periodSeconds: 10
resources:
requests:
cpu: 5m
memory: 32Mi
limits:
cpu: 10m
memory: 64Mi
livenessProbe:
httpGet:
path: /
port: 80
scheme: HTTP
initialDelaySeconds: 60
periodSeconds: 10
successThreshold: 1
timeoutSeconds: 5
---
apiVersion: v1
kind: Service
metadata:
name: nginx-demo
namespace: dummyns
spec:
type: LoadBalancer
ports:
- port: 8080
name: http
targetPort: 80
selector:
app: nginx-demo
git add、 git commit、 git pushを行い、リモートリポジトリに変更を反映します。
bash
# リモートリポジトリにpushする
git add local/healthcheck.cue local/main.cue
git commit -m "Cloud Native Adapter Extension QVS Tutorial"
git push origin getting-started
git log -n 1 # commit番号を控えておいて後の手順3で入力する
3. AssemblyLineの実行 (GUI)
Getting Startedで実施したのと同様に、登録したAssemblyLineを実行し、再度、Simple APIアプリケーションをKubernetesにデプロイします。
- 左メニューより、AssemblyLineを選択します。
- 画面中央に表示される staging-deploy を選択します。
- Pipelines (Stages) に表示されている deploy カードを選択し、全てのパラメータが埋まっていることを確認します。
- 以下のInput Parameterを入力し、 RUN ボタンを押下してAssemblyLineを実行します。
- gitRevision: (手順2でのgit commit時のコミット番号)
- imageName: nginx:latest
4. デプロイされたサンプルアプリケーションの確認 (CLI)
Kubernetesにアクセスして、デプロイに成功したアプリケーションを確認します。
- Serviceリソースを確認することで、サンプルアプリケーションに割り当てられたグローバルIPアドレスを確認できます。
- そのIPアドレスを指定して、HTTPリクエストを送ることで、サンプルアプリケーションのAPIを確認します。
- describeコマンドを使用することで、追加したreadinessProbe、livenessProbeを確認することが出来ます。
以下の手順では、Kubeconfigをoutput.kubeconfig.yaml
としていますが、適宜ご利用しているKubeconfig名に読み替えて実行してください。
bash
# Podの確認 (Runningになっていることを確認)
kubectl --kubeconfig output.kubeconfig.yaml get pod
# 新たにCompositeされたreadinessProbe、livenessProbeを確認する
kubectl --kubeconfig output.kubeconfig.yaml describe pod nginx-demo
--略--
Liveness: http-get http://:80/ delay=60s timeout=5s period=10s #success=1 #failure=3
Readiness: http-get http://:80/ delay=0s timeout=5s period=10s #success=2 #failure=2
AssemblyLine Resultsに表示されているIPアドレスへ自身のWEBブラウザからアクセスします。 http://${ipAddress}:8080
WEBブラウザ上からNginxのwelcomeページにアクセスできれば完了です。
リソースの削除
チュートリアルで作成したリソースは、Getting Startedで作成したQVS ConfigのInfrastructure Adapterの定義をコメントアウトし、リモートリポジトリに変更を反映した後に、再度AssemblyLineを実行することで削除できます。詳しくは、デプロイしたリソースの削除を参照してください。
解説
本チュートリアルではGetting Startedで使用したCloud Native Adapterを拡張して新たにreadinessProbe、livenessProbeによるヘルスチェック機能を追加しました。
このように、Qmonus Value Streamでは、Cloud Native AdapterのComposite機能を用いて、異なるCloud Native Adapterを再利用できます。また、Cloud Native Adapterを適切なサイズでモジュール化し、再利用することで、マニフェストを拡張できます。