Skip to content

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 提供托管数据库服务,支持:

数据库版本特性
MySQL5.7 / 8.0主从复制、自动备份
PostgreSQL12 / 14高可用、PITR
Redis6.x / 7.x主从/集群模式
MongoDB4.x / 5.x副本集
Elasticsearch7.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):
    # 临界区操作
    pass

DevOps 流水线(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

褚成志的云与计算笔记