本文介绍容器服务部署wordpress实现托管版多租户的流程,本示例对应的Git仓库地址:wordpress-managed-ack-yaml-demo。
根据该服务模板构建的服务默认包含三种套餐:
套餐名 | vCPU与内存 |
---|---|
低配版 | 1vCPU 1GiB |
基础版 | 2vCPU 2GiB |
高配版 | 2vCPU 4GiB |
本示例需要提前准备容器集群,需要到容器服务控制台 提前创建。 本示例创建过程大约持续1分钟,当服务变成待提交后构建成功。
本部署架构为容器多租户部署,架构如下图所示: 1. 使用ingress根据域名路由到各个租户的wordpress 2. 每个租户一个k8s namespace,用namespace隔离 3. wordpress和mysql使用yaml部署
测试本服务构建无需任何费用,创建服务实例涉及的费用参考服务实例计费说明。
本服务需要对ECS、VPC等资源进行访问和创建操作,若您使用RAM用户创建服务实例,需要在创建服务实例前,对使用的RAM用户的账号添加相应资源的权限。添加RAM权限的详细操作,请参见为RAM用户授权。所需权限如下表所示:
权限策略名称 | 备注 |
---|---|
AliyunCSFullAccess | 管理容器服务服务(CS)的权限 |
AliyunROSFullAccess | 管理资源编排服务(ROS)的权限 |
AliyunComputeNestUserFullAccess | 管理计算巢服务(ComputeNest)的用户侧权限 |
AliyunComputeNestSupplierFullAccess | 管理计算巢服务(ComputeNest)的服务商侧权限 |
测试本服务在计算巢上的费用主要涉及:
参数组 | 参数项 | 说明 |
---|---|---|
服务实例 | 服务实例名称 | 长度不超过64个字符,必须以英文字母开头,可包含数字、英文字母、短划线(-)和下划线(_)。 |
地域 | 服务实例部署的地域 |
服务实例创建完成后,用户侧有配置修改的需求,可以点击右上角的修改配置进行变配操作,本服务支持的变配操作有以下三种: 1. 扩容磁盘,对wordpress中关联的mysql磁盘进行扩容,磁盘只能进行扩容操作,这里从20Gi扩容到40Gi。 2. 更改套餐,这个可以对套餐规格进行变更,不同的套餐Pod可用的CPU和内存数量不同。 3. 更改副本数,这个可以对wordpress副本数进行扩缩容操作。
当前服务因为没有配置售卖链路,所以用户侧部署时候需要服务商的二次确认,当服务上架到阿里云云市场后,就可以不经过服务商的二次确认就可以完成部署。
通过ALIYUN::CS::ClusterApplication部署yaml到k8s,并给每个租户的对应到不同namespace上。
详细对应到template.yaml的代码片段如下所示: 1. 部署wordpress + mysql。 2. 部署ingress根据域名将endpoint对应到新创建的wordpress的service上。
通过配置我们完成了基于容器集群的托管版部署。
ClusterApplication:
Type: ALIYUN::CS::ClusterApplication
Properties:
WaitUntil:
- Kind: Deployment
Name: wordpress
JsonPath: $.status.readyReplicas
Operator: Equals
Value:
Ref: ReplicaCount
Timeout: 300
ValueType: Json
FirstMatch: true
- Kind: Deployment
Name: wordpress-mysql
JsonPath: $.status.readyReplicas
Operator: Equals
Value: '1'
Timeout: 300
ValueType: Json
FirstMatch: true
YamlContent:
Fn::Sub:
- |
apiVersion: v1
kind: Secret
metadata:
name: mysql-pass
data:
password: bWFyaWFkYg==
---
apiVersion: v1
kind: Service
metadata:
name: wordpress-mysql
labels:
app: wordpress
spec:
ports:
- port: 3306
selector:
app: wordpress
tier: mysql
clusterIP: None
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mysql-pv-claim
labels:
app: wordpress
spec:
accessModes:
- ReadWriteOnce
storageClassName: alicloud-disk-essd
resources:
requests:
storage: ${Storage}
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: wordpress-mysql
labels:
app: wordpress
spec:
selector:
matchLabels:
app: wordpress
tier: mysql
strategy:
type: Recreate
template:
metadata:
labels:
app: wordpress
tier: mysql
spec:
containers:
- image: mysql:8.0
name: mysql
resources:
limits:
cpu: ${Vcpu}
memory: ${Memory}
requests:
cpu: ${Vcpu}
memory: ${Memory}
env:
- name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-pass
key: password
- name: MYSQL_DATABASE
value: wordpress
- name: MYSQL_USER
value: wordpress
- name: MYSQL_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-pass
key: password
ports:
- containerPort: 3306
name: mysql
volumeMounts:
- name: mysql-persistent-storage
mountPath: /var/lib/mysql
volumes:
- name: mysql-persistent-storage
persistentVolumeClaim:
claimName: mysql-pv-claim
---
apiVersion: v1
kind: Service
metadata:
name: wordpress
labels:
app: wordpress
spec:
ports:
- port: 80
selector:
app: wordpress
tier: frontend
type: ClusterIP
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: wordpress
labels:
app: wordpress
spec:
replicas: ${ReplicaCount}
selector:
matchLabels:
app: wordpress
tier: frontend
strategy:
type: Recreate
template:
metadata:
labels:
app: wordpress
tier: frontend
spec:
containers:
- image: wordpress:6.2.1-apache
name: wordpress
resources:
limits:
cpu: ${Vcpu}
memory: ${Memory}
requests:
cpu: ${Vcpu}
memory: ${Memory}
env:
- name: WORDPRESS_DB_HOST
value: wordpress-mysql
- name: WORDPRESS_DB_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-pass
key: password
- name: WORDPRESS_DB_USER
value: wordpress
ports:
- containerPort: 80
name: wordpress
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: wordpress
spec:
rules:
- host: ${Name}.${ClusterId}.${RegionId}.alicontainer.com
http:
paths:
- path: /
backend:
service:
name: wordpress
port:
number: 80
pathType: ImplementationSpecific
- Name:
Ref: ALIYUN::StackName
RegionId:
Ref: ALIYUN::Region
ClusterId:
Ref: ClusterId
ClusterId:
Ref: ClusterId
DefaultNamespace:
Ref: ALIYUN::StackName