PaaS 平台层详解
PaaS 概述
PaaS(Platform as a Service,平台即服务)在 IaaS 之上提供应用运行环境,用户无需管理底层 VM 和 OS,直接部署应用代码或使用平台服务。
用户视角:
我要部署一个 Java 应用,需要 MySQL 数据库和 Redis 缓存
↓
CloudOS PaaS 层:
1. 自动创建 K8s 命名空间
2. 部署 MySQL 实例(托管数据库服务)
3. 部署 Redis 实例(托管缓存服务)
4. 创建应用 Deployment,配置环境变量
5. 创建 Service 和 Ingress,暴露访问入口容器云服务(CCI)
H3C CloudOS 集成 Kubernetes,提供容器云服务(Cloud Container Infrastructure,CCI)。
架构概览
┌─────────────────────────────────────────────────────┐
│ CCI 管理控制台 │
├─────────────────────────────────────────────────────┤
│ Kubernetes API Server │
├──────────────┬──────────────┬───────────────────────┤
│ Master 节点 │ Worker 节点 │ 存储(PV/PVC) │
│ (etcd/调度) │ (Pod 运行) │ (Ceph/NFS) │
└──────────────┴──────────────┴───────────────────────┘K8s 核心资源对象
yaml
# Deployment 示例:部署 Nginx
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
namespace: production
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.25
ports:
- containerPort: 80
resources:
requests:
cpu: "100m"
memory: "128Mi"
limits:
cpu: "500m"
memory: "512Mi"
---
# Service:暴露服务
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
selector:
app: nginx
ports:
- port: 80
targetPort: 80
type: ClusterIP
---
# Ingress:配置域名访问
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: nginx-ingress
spec:
rules:
- host: nginx.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: nginx-service
port:
number: 80持久化存储(PV/PVC)
yaml
# StorageClass:定义存储类型
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: ceph-rbd
provisioner: rbd.csi.ceph.com
parameters:
clusterID: <ceph-cluster-id>
pool: kubernetes
imageFormat: "2"
imageFeatures: layering
reclaimPolicy: Delete
allowVolumeExpansion: true
---
# PVC:申请存储
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mysql-pvc
spec:
accessModes:
- ReadWriteOnce
storageClassName: ceph-rbd
resources:
requests:
storage: 100Gi托管数据库服务(DBaaS)
CloudOS PaaS 提供托管数据库服务,支持:
| 数据库 | 版本 | 特性 |
|---|---|---|
| MySQL | 5.7 / 8.0 | 主从复制、自动备份 |
| PostgreSQL | 12 / 14 | 高可用、PITR |
| Redis | 6.x / 7.x | 主从/集群模式 |
| MongoDB | 4.x / 5.x | 副本集 |
| Elasticsearch | 7.x / 8.x | 分布式搜索 |
数据库实例创建流程
1. 选择数据库类型和版本
2. 选择规格(CPU/内存/存储)
3. 配置高可用模式(单机/主从/集群)
4. 设置备份策略(全量/增量,保留天数)
5. 配置访问白名单
6. 获取连接信息(Host/Port/用户名/密码)中间件服务(MWaaS)
消息队列服务
支持 Kafka 和 RabbitMQ 托管服务:
python
# 使用托管 Kafka 服务
from kafka import KafkaProducer, KafkaConsumer
# 生产者
producer = KafkaProducer(
bootstrap_servers=['kafka.paas.example.com:9092'],
value_serializer=lambda v: v.encode('utf-8')
)
producer.send('my-topic', 'Hello H3C PaaS')
# 消费者
consumer = KafkaConsumer(
'my-topic',
bootstrap_servers=['kafka.paas.example.com:9092'],
group_id='my-group',
auto_offset_reset='earliest'
)
for message in consumer:
print(message.value.decode('utf-8'))缓存服务(Redis)
python
import redis
# 连接托管 Redis
r = redis.Redis(
host='redis.paas.example.com',
port=6379,
password='your-password',
decode_responses=True
)
# 基本操作
r.set('key', 'value', ex=3600) # 设置 1 小时过期
value = r.get('key')
# 分布式锁
with r.lock('my-lock', timeout=10):
# 临界区操作
passDevOps 流水线(CI/CD)
CloudOS PaaS 集成 CI/CD 流水线,支持:
代码提交(Git)
↓
触发流水线(Webhook)
↓
代码编译(Maven/Gradle/npm)
↓
单元测试
↓
镜像构建(Docker Build)
↓
镜像推送(Harbor 镜像仓库)
↓
部署到测试环境(K8s Rolling Update)
↓
集成测试
↓
部署到生产环境(蓝绿/金丝雀发布)Dockerfile 最佳实践
dockerfile
# 多阶段构建,减小镜像体积
FROM maven:3.9-openjdk-17 AS builder
WORKDIR /app
COPY pom.xml .
# 先下载依赖(利用缓存层)
RUN mvn dependency:go-offline
COPY src ./src
RUN mvn package -DskipTests
FROM openjdk:17-jre-slim
WORKDIR /app
# 非 root 用户运行
RUN addgroup --system appgroup && adduser --system --ingroup appgroup appuser
COPY --from=builder /app/target/*.jar app.jar
USER appuser
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "app.jar"]服务网格(Service Mesh)
CloudOS 支持 Istio 服务网格,提供:
- 流量管理:灰度发布、流量镜像、熔断限流
- 安全:mTLS 服务间加密通信
- 可观测性:分布式链路追踪(Jaeger)、指标(Prometheus)
yaml
# Istio VirtualService:金丝雀发布(10% 流量到新版本)
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: my-app
spec:
hosts:
- my-app
http:
- route:
- destination:
host: my-app
subset: v1
weight: 90
- destination:
host: my-app
subset: v2
weight: 10