domain-admin容器化部署进阶:Kubernetes StatefulSet配置指南
在当今云原生时代,容器化部署已成为应用交付的标准方式。对于domain-admin这样的域名SSL证书监测平台,采用Kubernetes StatefulSet进行部署能够提供更稳定的服务可用性和数据持久性。本文将详细介绍如何使用StatefulSet在Kubernetes集群中部署domain-admin,解决有状态应用在容器编排中的关键挑战。
为什么选择StatefulSet
domain-admin作为一个需要持久化存储和稳定网络标识的应用,传统的Deployment部署方式难以满足其需求。StatefulSet提供的固定网络标识和持久存储特性,使其成为domain-admin的理想部署方案。
StatefulSet vs Deployment
| 特性 | StatefulSet | Deployment |
|---|---|---|
| 网络标识 | 固定DNS名称 | 随机生成 |
| 存储 | 稳定持久卷 | 临时存储 |
| 更新策略 | 有序部署/回滚 | 并行更新 |
| 适用场景 | 数据库、监控系统 | 无状态服务 |
准备工作
在开始部署前,请确保您的环境满足以下要求:
- Kubernetes集群版本1.19+
- kubectl命令行工具已配置
- 集群中已部署StorageClass
- 已创建专用的命名空间(建议使用
domain-admin)
基础镜像分析
domain-admin官方提供了Dockerfile用于构建基础镜像,我们先来分析其关键内容:
Dockerfile定义了基于Python 3.7.15-alpine3.16的镜像构建过程,主要包含以下步骤:
- 设置工作目录为
/app - 安装系统依赖和Python包
- 配置时区为Asia/Shanghai
- 使用gunicorn作为WSGI服务器
FROM python:3.7.15-alpine3.16
ADD . /app
WORKDIR /app
RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
&& apk add --no-cache --virtual .build-deps gcc musl-dev libffi-dev openssl-dev bash \
&& apk add --no-cache libffi openssl \
&& pip install --no-cache-dir --upgrade pip setuptools wheel gunicorn \
&& pip install --no-cache-dir -r requirements/production.txt \
&& apk del .build-deps
CMD gunicorn --bind '0.0.0.0:8000' --timeout 120 'domain_admin.main:app'
存储配置
domain-admin使用SQLite作为默认数据库,存储路径配置在domain_admin/config/default_config.py中:
# 默认数据库链接
DEFAULT_DB_CONNECT_URL = "sqlite:///database/database.db"
为确保数据持久化,我们需要为domain-admin配置持久卷。
创建PersistentVolumeClaim
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: domain-admin-data
namespace: domain-admin
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
storageClassName: standard
StatefulSet配置
下面是domain-admin的StatefulSet配置文件,我们将逐步解析关键部分:
完整配置文件
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: domain-admin
namespace: domain-admin
spec:
serviceName: "domain-admin"
replicas: 1
selector:
matchLabels:
app: domain-admin
template:
metadata:
labels:
app: domain-admin
spec:
containers:
- name: domain-admin
image: gitcode.com/GitHub_Trending/doma/domain-admin:latest
ports:
- containerPort: 8000
name: web
volumeMounts:
- name: data
mountPath: /app/database
env:
- name: TZ
value: "Asia/Shanghai"
- name: DEFAULT_SECRET_KEY
valueFrom:
secretKeyRef:
name: domain-admin-secrets
key: secret-key
- name: DEFAULT_DB_CONNECT_URL
value: "sqlite:////app/database/database.db"
livenessProbe:
httpGet:
path: /
port: 8000
initialDelaySeconds: 30
periodSeconds: 10
readinessProbe:
httpGet:
path: /
port: 8000
initialDelaySeconds: 5
periodSeconds: 5
volumeClaimTemplates:
- metadata:
name: data
spec:
accessModes: [ "ReadWriteOnce" ]
storageClassName: "standard"
resources:
requests:
storage: 1Gi
关键配置解析
持久化存储
通过volumeClaimTemplates为每个实例自动创建PVC,确保数据持久化:
volumeClaimTemplates:
- metadata:
name: data
spec:
accessModes: [ "ReadWriteOnce" ]
storageClassName: "standard"
resources:
requests:
storage: 1Gi
环境变量配置
使用环境变量覆盖默认配置,包括时区、密钥和数据库连接:
env:
- name: TZ
value: "Asia/Shanghai"
- name: DEFAULT_SECRET_KEY
valueFrom:
secretKeyRef:
name: domain-admin-secrets
key: secret-key
- name: DEFAULT_DB_CONNECT_URL
value: "sqlite:////app/database/database.db"
健康检查
配置存活探针和就绪探针,确保应用正常运行:
livenessProbe:
httpGet:
path: /
port: 8000
initialDelaySeconds: 30
periodSeconds: 10
readinessProbe:
httpGet:
path: /
port: 8000
initialDelaySeconds: 5
periodSeconds: 5
服务暴露
创建Service资源,使domain-admin能够在Kubernetes集群内部和外部访问:
apiVersion: v1
kind: Service
metadata:
name: domain-admin
namespace: domain-admin
spec:
selector:
app: domain-admin
ports:
- port: 80
targetPort: 8000
clusterIP: None # Headless Service
如果需要从集群外部访问,可以创建Ingress资源:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: domain-admin
namespace: domain-admin
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- host: domain-admin.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: domain-admin
port:
number: 80
初始化数据库
domain-admin在首次启动时会自动初始化数据库结构,相关代码位于domain_admin/model/database.py:
def init_database():
"""
初始化数据表
:return:
"""
base_model.db.connect()
db_tables = base_model.db.get_tables()
for model, init_func in tables:
# if not model.table_exists():
if model._meta.table_name not in db_tables:
logger.info('create table: %s', model._meta.table_name)
model.create_table()
if init_func:
init_func()
base_model.db.close()
系统会创建必要的表结构并初始化默认管理员账户(admin/123456),该配置在domain_admin/config/default_config.py中定义:
# 管理员默认的 账号,用户名
DEFAULT_ADMIN_USERNAME = 'admin'
DEFAULT_ADMIN_PASSWORD = '123456'
部署验证
部署完成后,可以通过以下步骤验证服务是否正常运行:
- 检查StatefulSet状态:
kubectl get statefulset -n domain-admin
- 查看Pod状态:
kubectl get pods -n domain-admin
- 查看服务日志:
kubectl logs -f statefulset/domain-admin -n domain-admin
- 访问Web界面: 通过Ingress配置的域名或直接通过Service IP访问domain-admin服务。
升级策略
使用StatefulSet部署的应用可以实现有序升级,确保服务不中断。以下是推荐的升级步骤:
- 创建新版本镜像
- 更新StatefulSet的镜像版本:
kubectl set image statefulset/domain-admin domain-admin=gitcode.com/GitHub_Trending/doma/domain-admin:new-version -n domain-admin
- 监控升级过程:
kubectl rollout status statefulset/domain-admin -n domain-admin
备份策略
为确保数据安全,建议定期备份domain-admin的数据卷:
kubectl exec -it statefulset/domain-admin -n domain-admin -- sh -c "tar -czf - /app/database" > domain-admin-backup.tar.gz
可以将此命令添加到定时任务中,实现自动备份。
总结
本文详细介绍了如何使用Kubernetes StatefulSet部署domain-admin,通过StatefulSet的特性解决了有状态应用在容器化部署中的关键挑战。主要内容包括:
- StatefulSet相比Deployment的优势
- 持久化存储配置
- 完整的StatefulSet部署清单
- 服务暴露和访问方式
- 数据库初始化和系统配置
- 部署验证和升级策略
通过这种部署方式,domain-admin能够获得稳定的网络标识和持久化存储,为域名和SSL证书的监控提供可靠保障。
官方文档:doc/source/manual/install.md 配置参考:domain_admin/config/ 数据库模型:domain_admin/model/
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考




