このトピックでは、Compute Nest でコンテナアプリケーションと ApsaraDB RDS データベースを含むサービスを作成する方法について説明します。
前提条件
Container Service for Kubernetes (ACK) クラスターが作成されていること。詳細については、「ACK マネージドクラスターを作成する」をご参照ください。
手順
この例では、プリセットデータベース初期化スクリプトを含む基本コンテナイメージを使用します。サービスインスタンスの作成中に、データベースが自動的に初期化され、次に「ComputeNest」を含むデータエントリがデータベースに挿入されます。サービスインスタンスの作成後、API 操作を呼び出してデータベースをクエリします。Hello ComputeNest が返されます。この手順には、次のステップが含まれます。
ステップ 1: コンテナイメージを準備する
サービスを作成する前に、コンテナイメージを準備し、サービスプロバイダーがイメージを管理する Compute Nest のプライベートイメージリポジトリにコンテナイメージをアップロードする必要があります。
コンテナイメージを準備します。
次のいずれかの方法を使用して、ローカルコンテナイメージを準備します。
Alibaba Cloud が提供するコンテナイメージを使用します。
docker pull compute-nest-registry.cn-hangzhou.cr.aliyuncs.com/bestpractice/springboot-demo:demoソースコードを書き直して、コンテナイメージを作成します。
イメージのソースコード を取得し、ビジネス要件に基づいてコードを書き直します。
ソースコードのルートディレクトリ(pom.xml があるディレクトリ)で、Maven を使用してプログラムを JAR パッケージにパッケージ化します。JAR パッケージは、自動的に target ディレクトリに保存されます。
mvn installイメージをビルドします。
イメージがビルドされると、イメージは自動的にコンピューターにダウンロードされます。
docker build --build-arg JAR_FILE=target/\*.jar -t <your-image-tag> .
コンテナイメージを Compute Nest イメージリポジトリにアップロードします。
イメージリポジトリにログインし、イメージにタグを追加し、イメージをイメージリポジトリにプッシュするために使用される docker コマンドを取得します。
Compute Nest コンソール にログインします。
左側のナビゲーションウィンドウで、[サービスデプロイメントパッケージ] をクリックします。「パッケージ」タブで、[デプロイメントパッケージの作成] をクリックします。
「デプロイメントパッケージの作成」ページで、[デプロイメントパッケージタイプ] パラメーターを「コンテナイメージ」に設定し、[アクセス認証情報の取得] をクリックします。イメージリポジトリにログインし、イメージにタグを追加し、イメージをイメージリポジトリにプッシュするために使用されるコマンドをコピーします。
Docker を実行し、コピーしたコマンドを CLI ターミナルで実行します。

ステップ 2: コンテナイメージタイプのデプロイメントパッケージを作成する
サービスを作成する前に、コンテナイメージタイプのデプロイメントパッケージを作成して配布する必要があります。
Compute Nest コンソール にログインします。
左側のナビゲーションウィンドウで、[サービスデプロイメントパッケージ] をクリックします。「パッケージ」タブで、[デプロイメントパッケージの作成] をクリックします。
[基本情報]、[デプロイメントパッケージの内容]、[配布設定] セクションのパラメーターを「デプロイメントパッケージの作成」ページで設定します。
パラメーター
例
名前
Spring Boot コンテナデプロイメント
バージョン名
Spring Boot コンテナデプロイメントバージョン 1
説明
コンテナイメージタイプの Spring Boot デプロイメントパッケージ
デプロイメントパッケージタイプ
コンテナイメージ
製品を選択
最初のドロップダウンリストから springbootdemo を選択します。
2 番目のドロップダウンリストから最新バージョンを選択します。
[デプロイメントパッケージの公開] をクリックします。
[デプロイメントパッケージの公開] をクリックすると、[パッケージ] タブでデプロイメントパッケージを見つけることができます。デプロイメントパッケージをクリックして詳細ページに移動し、デプロイメントパッケージのステータスを表示します。
デプロイメントパッケージが「使用可能」状態になると、デプロイメントパッケージは公開されます。
ステップ 3: サービスを作成する
Compute Nest コンソール にログインします。
左側のナビゲーションウィンドウで、[マイサービス] をクリックします。[マイサービス] ページの [作成済みサービス] タブで、[サービスの作成] をクリックします。
[サービスの作成] ページで、ビジネス要件に基づいてパラメーターを設定します。
次のセクションでは、コンテナイメージの関連付けに関連するパラメーターのみについて説明します。詳細については、「プライベートサービスを作成する」をご参照ください。
[テンプレートの内容] フィールドに、テンプレートの内容を入力します。 次のテンプレートの内容では、コンテナイメージの関連付けに関連するパラメーターのみについて説明します。テンプレートの完全なサンプルコードについては、このトピックのサンプルテンプレートセクションを参照してください。
コンテナがデプロイされると、コンテナイメージは Compute Nest のプライベートイメージリポジトリからプルされます。ACK クラスターは、Compute Nest のプライベートイメージリポジトリにアクセスできる必要があります。そのため、テンプレートには dockerconfigjson タイプのシークレットが定義されており、Compute Nest 識別子 {{ computenest::acr::dockerconfigjson }} が使用されます。
ClusterApplication: DependsOn: Database Type: ALIYUN::CS::ClusterApplication Properties: ClusterId: Ref: ClusterId YamlContent: Fn::Sub: - | # 省略されたコンテンツ。 apiVersion: v1 data: .dockerconfigjson: {{ computenest::acr::dockerconfigjson }} kind: Secret metadata: name: computenestrepo namespace: ${NameSpace} type: kubernetes.io/dockerconfigjson # 省略されたコンテンツ。テンプレートで、{{ computenest:: acriimage::springbootdemo }} 識別子を使用して、テンプレート内のイメージを作成したデプロイメントパッケージに関連付けます。
ClusterApplication: DependsOn: Database Type: ALIYUN::CS::ClusterApplication Properties: ClusterId: Ref: ClusterId YamlContent: Fn::Sub: - | # 省略されたコンテンツ。 apiVersion: apps/v1 kind: Deployment metadata: labels: app: springboot-demo-deployment name: springboot-demo-deployment namespace: ${NameSpace} spec: progressDeadlineSeconds: 600 replicas: 2 revisionHistoryLimit: 10 selector: matchLabels: app: springboot-demo-pod template: metadata: labels: app: springboot-demo-pod spec: containers: - env: - name: DB_HOST value: ${RdsConnectString} - name: DB_USER value: ${DbUser} - name: DB_PASSWORD value: ${DbPassword} image: {{ computenest::acrimage::springbootdemo }} imagePullPolicy: Always name: springboot-demo-container ports: - containerPort: 8080 protocol: TCP imagePullSecrets: - name: computenestrepo restartPolicy: Always # 省略されたコンテンツ。
[デプロイメントパッケージの関連付け] セクションの [コンテナイメージの関連付けの設定] セクションで、作成したコンテナイメージタイプのデプロイメントパッケージを選択し、バージョンを選択します。
[サービスの作成] をクリックします。
サービスをテストします。
サービスを作成したら、サービスをテストして正しく動作することを確認する必要があります。詳細については、「サービスをテストする」をご参照ください。
サービスを公開します。
サービステストに合格したら、サービスをレビューに提出します。レビューに合格したら、サービスを公開します。詳細については、「サービスを公開する」をご参照ください。
ステップ 4: サービスインスタンスを作成し、データベースをクエリする
顧客としてサービスインスタンスを作成して、サービスに設定されたコンテナイメージが正しくデプロイされるかどうかを確認できます。
サービスインスタンスを作成します。
詳細については、「プライベートサービスインスタンスを作成する」をご参照ください。
サービスインスタンスが正常にデプロイされると、コンテナイメージタイプのデプロイメントパッケージもサービスインスタンスに正常にデプロイされます。
データベースをクエリします。
kubectl CLI を使用して LoadBalancer エンドポイントをクエリし、取得したパブリック IP アドレスを使用してアプリケーションにアクセスし、返された結果を表示します。

サンプルテンプレート
このシナリオで必要な Resource Orchestration Service (ROS) リソースと関数については、次のトピックを参照してください。
次のサンプルコードは、このシナリオに固有の完全なテンプレートの内容を示しています。
ROSTemplateFormatVersion: '2015-09-01'
Description:
en: A simple demo that deploys a RDS instance and a container-base app into ack. The app use RDS instance as a persistence storage.
zh-cn: 新建一个RDS实例并向ACK中部署容器应用。 容器应用使用RDS实例作为数据库。
Parameters:
ZoneId:
Type: String
AssociationProperty: ALIYUN::ECS::Instance:ZoneId
Description:
en: Availability zone ID,<br><b>note: <font color='blue'>Before selecting, please confirm that the Availability Zone supports the specification of creating ECS resources</font></b>
zh-cn: 可用区ID
Label:
en: VSwitch Available Zone
zh-cn: 可用区
VpcId:
Type: String
AssociationProperty: ALIYUN::ECS::VPC::VPCId
VSwitchId:
Type: String
AssociationProperty: ALIYUN::ECS::VSwitch::VSwitchId
AssociationPropertyMetadata:
VpcId: ${VpcId}
ZoneId: ${ZoneId}
PayType:
AssociationProperty: ChargeType
Type: String
Label:
en: ECS Instance Charge Type
zh-cn: 付费类型
Default: PostPaid
AllowedValues:
- PostPaid
- PrePaid
PayPeriod:
Type: Number
Description:
en: The subscription period. Unit is months.
zh-cn: 购买时长,单位(月)
Label:
en: The subscription period. Unit is months.
zh-cn: 购买时长,单位(月)
Default: 1
AllowedValues:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 12
- 24
- 36
AssociationPropertyMetadata:
Visible:
Condition:
Fn::Or:
- Fn::Equals:
- ${PayType}
- PrePaid
- Fn::Equals:
- ${PayType}
- undefined
RdsInstanceClass:
Label: MySQL インスタンス仕様
Type: String
Description:
zh-cn: 根据数据库引擎的类型和可用的区域支持选择实例规格
en: 'Select the instance specification based on the type of database engine and the available area support'
Default: rds.mysql.s2.large
RdsInstanceStorage:
Label: ディスクサイズ
Type: Number
Description:
zh-cn: RDS 实例大小,范围为 20 - 2000,每 5 个增量,单位为 GB
en: The size range of RDS instances is 20 - 2000, Incrementing in every 5, unit GB
MinValue: 20
MaxValue: 2000
ConstraintDescription: The size range of RDS instances is 20 - 2000, Incrementing in every 5, unit GB
Default: 30
RdsAccountName:
Type: String
Label:
zh-cn: ユーザー名
en: Account Name
Description:
zh-cn: MySQL 管理ユーザー名
en: Account Name
Default: db_root
RdsAccountPassword:
Type: String
NoEcho: true
Label:
zh-cn: ユーザーパスワード
en: DB アカウントパスワード
Description:
zh-cn: |-
長さは 8 ~ 32 文字です。大文字、小文字、数字、特殊文字の任意の 3 種類で構成されます。サポートされている特殊文字は次のとおりです。
!@#$&%^*()_+-= 。
en: |-
The length is 8 ~ 32 characters. It is composed of uppercase English letters, lowercase English letters, numbers and special characters. The special characters supported are as follows:
!@#$& amp;%^* ()_+-= .
ClusterId:
Type: String
Description:
en: >-
The ID of Kubernetes ClusterId in which application deployed.
zh-cn: >-
アプリケーションがデプロイされている Kubernetes ClusterId の ID
AllowedPattern: '[0-9a-z]+$'
Label:
en: Kubernetes ClusterId
zh-cn: K8s クラスター ID
AssociationProperty: ALIYUN::CS::Cluster::ClusterId
ConstraintDescription:
en: >-
must be lowercase letters or numbers
zh-cn: 'クラスター ID は小文字または数字で構成する必要があります'
NameSpace:
Type: String
Description:
en: >-
The NameSpace in which application deployed.
zh-cn: >-
アプリケーションがデプロイされている名前空間
Resources:
EcsSecurityGroup:
Type: ALIYUN::ECS::SecurityGroup
Properties:
VpcId:
Ref: VpcId
SecurityGroupIngress:
- PortRange: '-1/-1'
Priority: 1
SourceCidrIp: 0.0.0.0/0
IpProtocol: all
NicType: intranet
SecurityGroupEgress:
- PortRange: '-1/-1'
Priority: 1
IpProtocol: all
DestCidrIp: 0.0.0.0/0
NicType: intranet
DBInstance:
Type: ALIYUN::RDS::DBInstance
Properties:
ZoneId:
Ref: ZoneId
VPCId:
Ref: VpcId
VSwitchId:
Ref: VSwitchId
Engine: MySQL
EngineVersion: "5.7"
DBInstanceClass:
Ref: RdsInstanceClass
DBInstanceStorage:
Ref: RdsInstanceStorage
PayType:
Ref: PayType
PeriodType: Month
Period:
Ref: PayPeriod
SecurityIPList: '0.0.0.0/0'
RdsAccount:
DependsOn: DBInstance
Type: ALIYUN::RDS::Account
Properties:
DBInstanceId:
Ref: DBInstance
AccountType: Super
AccountName:
Ref: RdsAccountName
AccountPassword:
Ref: RdsAccountPassword
RdsParameter:
Type: ALIYUN::RDS::DBInstanceParameterGroup
Properties:
DBInstanceId:
Ref: DBInstance
Parameters:
- Key: innodb_large_prefix
Value: 'ON'
- Key: innodb_adaptive_flushing_lwm
Value: '10'
Database:
Type: ALIYUN::RDS::Database
Properties:
CharacterSetName: UTF8
DBInstanceId:
Ref: DBInstance
DBName: springboot_demo
DependsOn:
- DBInstance
ClusterApplication:
DependsOn: Database
Type: ALIYUN::CS::ClusterApplication
Properties:
ClusterId:
Ref: ClusterId
YamlContent:
Fn::Sub:
- |
apiVersion: v1
kind: Namespace
metadata:
name: ${NameSpace}
---
apiVersion: v1
data:
.dockerconfigjson: {{ computenest::acr::dockerconfigjson }}
kind: Secret
metadata:
name: computenestrepo
namespace: ${NameSpace}
type: kubernetes.io/dockerconfigjson
---
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: springboot-demo-deployment
name: springboot-demo-deployment
namespace: ${NameSpace}
spec:
progressDeadlineSeconds: 600
replicas: 2
revisionHistoryLimit: 10
selector:
matchLabels:
app: springboot-demo-pod
template:
metadata:
labels:
app: springboot-demo-pod
spec:
containers:
- env:
- name: DB_HOST
value: ${RdsConnectString}
- name: DB_USER
value: ${DbUser}
- name: DB_PASSWORD
value: ${DbPassword}
image: {{ computenest::acrimage::springbootdemo }} # コンテナイメージの指定
imagePullPolicy: Always
name: springboot-demo-container
ports:
- containerPort: 8080
protocol: TCP
imagePullSecrets:
- name: computenestrepo # imagePullSecrets の restartPolicy: Always
---
apiVersion: v1
kind: Service
metadata:
labels:
app: springboot-demo-svc
name: springboot-demo-svc
namespace: ${NameSpace}
spec:
ports:
- name: http
port: 80
protocol: TCP
targetPort: 8080
selector:
app: springboot-demo-pod
type: LoadBalancer
- NameSpace:
Ref: NameSpace
DbUser:
Ref: RdsAccountName
DbPassword:
Ref: RdsAccountPassword
RdsConnectString:
Fn::GetAtt:
- DBInstance
- InnerConnectionString
AppExternalIp:
Type: DATASOURCE::CS::ClusterApplicationResources
Properties:
Kind: Service
Name: springboot-demo-svc
ClusterId:
Ref: ClusterApplication
Namespace:
Ref: NameSpace
JsonPath: $.status.loadBalancer.ingress
FirstMatch: true
DependsOn: ClusterApplication
Outputs:
ExternalIp:
Value:
Ref: AppExternalIp
Metadata:
ALIYUN::ROS::Interface:
ParameterGroups:
- Parameters:
- VpcId
- ZoneId
- VSwitchId
Label:
en: Network Configuration
zh-cn: ネットワーク設定
- Parameters:
- ClusterId
- NameSpace
Label:
en: ACK Configuration
zh-cn: ACK 設定
- Parameters:
- RdsInstanceClass
- RdsInstanceStorage
- RdsAccountName
- RdsAccountPassword
Label:
en: Database Configuration
zh-cn: データベース設定
- Parameters:
- PayType
- PayPeriod
Label:
en: Payment Configuration
zh-cn: 支払い設定