創(chuàng)建包含容器應(yīng)用和RDS數(shù)據(jù)庫(kù)的服務(wù)
本文介紹如何在計(jì)算巢創(chuàng)建容器應(yīng)用+RDS數(shù)據(jù)庫(kù)的場(chǎng)景的服務(wù)。
前提條件
已創(chuàng)建ACK集群。更多信息,請(qǐng)參見創(chuàng)建ACK集群。
操作流程
本示例使用一個(gè)基本的容器鏡像,并在該鏡像中預(yù)置了數(shù)據(jù)庫(kù)初始化腳本,在服務(wù)創(chuàng)建的過程中自動(dòng)初始化數(shù)據(jù)庫(kù)并在數(shù)據(jù)庫(kù)初始化完成后,向數(shù)據(jù)庫(kù)中插入一條包含ComputeNest名字的數(shù)據(jù)。服務(wù)實(shí)例創(chuàng)建完成后,可以使用API名稱查詢數(shù)據(jù)庫(kù)并返回結(jié)果Hello ComputeNest
。步驟如下:
步驟一:準(zhǔn)備容器鏡像
創(chuàng)建服務(wù)前,您需要先準(zhǔn)備容器鏡像并將已準(zhǔn)備好的容器鏡像上傳至計(jì)算巢用于服務(wù)商托管鏡像的私有鏡像倉(cāng)庫(kù)中。
準(zhǔn)備容器鏡像。
使用以下任一方法準(zhǔn)備本地容器鏡像。
直接使用阿里云提供的容器鏡像。
docker pull compute-nest-registry.cn-hangzhou.cr.aliyuncs.com/bestpractice/springboot-demo:demo
重新編寫源代碼創(chuàng)建容器鏡像。
獲取鏡像源代碼,根據(jù)業(yè)務(wù)需求完成編寫。
在源代碼根目錄(即pom.xml所在目錄)下,使用Maven將程序打包為Jar包,Jar包會(huì)自動(dòng)生成到target目錄中。
mvn install
構(gòu)建鏡像。
完成構(gòu)建后,鏡像會(huì)自動(dòng)下載到您本地電腦。
docker build --build-arg JAR_FILE=target/\*.jar -t <your-image-tag> .
上傳容器鏡像至計(jì)算巢鏡像倉(cāng)庫(kù)。
獲取計(jì)算巢鏡像倉(cāng)庫(kù)訪問憑證、打標(biāo)鏡像和推送鏡像Docker命令。
在左側(cè)導(dǎo)航欄中選擇服務(wù)部署物,然后單擊創(chuàng)建部署物。
在創(chuàng)建部署物界面的部署物類型下,單擊獲取訪問憑證。在彈出的界面中獲取登錄鏡像倉(cāng)庫(kù)、打標(biāo)鏡像和推送鏡像的命令。
在Docker命令行工具,登錄鏡像倉(cāng)庫(kù)、打標(biāo)鏡像和推送鏡像。
步驟二:創(chuàng)建容器鏡像部署物
創(chuàng)建服務(wù)前,需要先完成容器鏡像部署物的創(chuàng)建和發(fā)布。
在左側(cè)導(dǎo)航欄中,單擊服務(wù)部署物。然后在部署物管理界面,單擊創(chuàng)建部署物。
在創(chuàng)建部署物界面,填寫部署物信息、部署物內(nèi)容和設(shè)置分發(fā)的信息。
配置項(xiàng)
配置示例
部署物名稱
springboot容器部署
部署物版本名稱
springboot容器部署版本1
部署物描述
springboot鏡像容器部署物
部署物類型
容器鏡像
選擇鏡像
部署物名稱:springbootdemo
部署物版本:latest
單擊發(fā)布部署物。
單擊發(fā)布部署物后,可在部署物管理頁(yè)面,單擊部署物名稱,進(jìn)入部署物詳情界面,查看部署物的部署進(jìn)度。
當(dāng)部署物狀態(tài)為可用時(shí),表示部署物發(fā)布成功。
步驟三:創(chuàng)建服務(wù)
在左側(cè)導(dǎo)航欄中,單擊我的服務(wù),并在我的服務(wù)頁(yè)面中選擇我創(chuàng)建的服務(wù),然后單擊創(chuàng)建新服務(wù)。
在創(chuàng)建新服務(wù)界面,根據(jù)需求配置相關(guān)參數(shù)。
此處只列舉創(chuàng)建服務(wù)需要特別配置的參數(shù),其他參數(shù)配置,請(qǐng)參見創(chuàng)建私有部署服務(wù)。
在錄入模板區(qū)域的模板內(nèi)容處,填寫服務(wù)模板內(nèi)容。此處描述模板內(nèi)容中特別配置的參數(shù),詳細(xì)的模板內(nèi)容,請(qǐng)參見模板示例。
在容器部署時(shí),需要拉取計(jì)算巢私有鏡像倉(cāng)庫(kù)中的鏡像。ACK集群需要具備訪問計(jì)算巢私有鏡像倉(cāng)庫(kù)的能力。因此在模板中定義了一個(gè)dockerconfigjson類型的Secret,并使用計(jì)算巢標(biāo)識(shí)符{{ 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::acrimage::springbootdemo }}標(biāo)識(shí)符將模板中的image關(guān)聯(lián)至計(jì)算巢部署物。
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 # 省略...
在部署應(yīng)用區(qū)域的容器鏡像關(guān)聯(lián)處,關(guān)聯(lián)已創(chuàng)建的鏡像部署物,并選擇部署物的版本。
單擊保存服務(wù)。
測(cè)試服務(wù)。
服務(wù)保存后,您需要對(duì)創(chuàng)建的服務(wù)實(shí)例進(jìn)行測(cè)試,保證其正常可用。更多信息,請(qǐng)參見測(cè)試服務(wù)功能。
發(fā)布服務(wù)。
服務(wù)測(cè)試通過后,再提交審核,審核通過后即可發(fā)布上線。更多信息,請(qǐng)參見上線服務(wù)。
步驟四:創(chuàng)建服務(wù)實(shí)例并查詢數(shù)據(jù)庫(kù)
該步驟是服務(wù)商以用戶的身份驗(yàn)證服務(wù)中配置的容器鏡像是否能夠在服務(wù)實(shí)例中正確部署。
創(chuàng)建服務(wù)實(shí)例。
更多信息,請(qǐng)參考創(chuàng)建私有部署服務(wù)實(shí)例。
服務(wù)實(shí)例部署成功,則表示鏡像部署物也已經(jīng)在服務(wù)實(shí)例中部署成功。
查詢數(shù)據(jù)庫(kù)。
使用kubectl命令行工具查詢LoadBalancer訪問端點(diǎn),并使用獲取到的公網(wǎng)IP訪問應(yīng)用,并查看返回結(jié)果。
模板示例
您可以通過如下內(nèi)容,查看本場(chǎng)景中必須的ROS資源和函數(shù)。
本場(chǎng)景詳細(xì)的模板示例如下。
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: 新建一個(gè)RDS實(shí)例并向ACK中部署容器應(yīng)用。容器應(yīng)用使用RDS實(shí)例作為數(shù)據(jù)庫(kù)。
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: 可用區(qū)ID
Label:
en: VSwitch Available Zone
zh-cn: 可用區(qū)
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: 付費(fèi)類型
Default: PostPaid
AllowedValues:
- PostPaid
- PrePaid
PayPeriod:
Type: Number
Description:
en: The subscription period. Unit is months.
zh-cn: 購(gòu)買時(shí)長(zhǎng),單位(月)
Label:
en: The subscription period. Unit is months.
zh-cn: 購(gòu)買時(shí)長(zhǎng),單位(月)
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 實(shí)例規(guī)格
Type: String
Description:
zh-cn: 根據(jù)數(shù)據(jù)庫(kù)引擎的類型和可用的區(qū)域支持選擇實(shí)例規(guī)格
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 實(shí)例大小,范圍為 20 - 2000,每 5 個(gè)增量,單位為 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 Account Password
Description:
zh-cn: |-
長(zhǎng)度為8~32個(gè)字符。由大寫英文字母、小寫英文字母、數(shù)字、特殊字符中的任意三種組成。支持的特殊字符如下:
!@#$&%^*()_+-= 。
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: >-
部署應(yīng)用程序的K8s集群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必須由小寫字母或者數(shù)字組成'
NameSpace:
Type: String
Description:
en: >-
The NameSpace in which application deployed.
zh-cn: >-
部署應(yīng)用程序的K8s命名空間
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
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: 網(wǎng)絡(luò)參數(shù)配置
- Parameters:
- ClusterId
- NameSpace
Label:
en: ACK Configuration
zh-cn: ACK參數(shù)配置
- Parameters:
- RdsInstanceClass
- RdsInstanceStorage
- RdsAccountName
- RdsAccountPassword
Label:
en: Database Configuration
zh-cn: 數(shù)據(jù)庫(kù)參數(shù)配置
- Parameters:
- PayType
- PayPeriod
Label:
en: Payment Configuration
zh-cn: 支付配置