Logto 是一个基于 Kubernetes 部署的身份认证和用户管理平台。它使用 PostgreSQL 作为数据库,并通过 Ingress 暴露服务,支持 HTTPS 访问。Logto 提供了两个主要服务:
3001
。3002
。在开始部署之前,请确保以下环境和工具已准备就绪:
logto.jiufog.space
和 logto-admin.jiufog.space
)和对应的 TLS 证书。强制ReadWriteMany
访问模式的存储类(如 NFS)。将以下 Manifest 文件保存到本地,并根据实际情况替换 {{ }}
中的内容。
logto-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: logto
namespace: dev
spec:
replicas: 1
selector:
matchLabels:
app: logto
template:
metadata:
labels:
app: logto
spec:
initContainers:
- image: ghcr.io/logto-io/logto
command:
- /bin/sh
args:
- '-c'
- 'npm run cli connector add -- --official'
name: init
volumeMounts:
- name: logto-storage
mountPath: /etc/logto/packages/core/connectors
env:
- name: NODE_TLS_REJECT_UNAUTHORIZED
value: "1"
- name: TRUST_PROXY_HEADER
value: "true"
- name: DB_URL
value: "{{ YOUR_DB_URL }}" # 替换为实际的 PostgreSQL 连接字符串
- name: ENDPOINT
value: "{{ YOUR_ENDPOINT }}" # 替换为实际的 Auth 服务端点
- name: ADMIN_ENDPOINT
value: "{{ YOUR_ADMIN_ENDPOINT }}" # 替换为实际的 Admin 服务端点
containers:
- name: logto
image: ghcr.io/logto-io/logto
volumeMounts:
- name: logto-storage
mountPath: /etc/logto/packages/core/connectors
env:
- name: NODE_TLS_REJECT_UNAUTHORIZED
value: "1"
- name: TRUST_PROXY_HEADER
value: "true"
- name: DB_URL
value: "{{ YOUR_DB_URL }}" # 替换为实际的 PostgreSQL 连接字符串
- name: ENDPOINT
value: "{{ YOUR_ENDPOINT }}" # 替换为实际的 Auth 服务端点
- name: ADMIN_ENDPOINT
value: "{{ YOUR_ADMIN_ENDPOINT }}" # 替换为实际的 Admin 服务端点
command: ["sh", "-c", "npm run cli db seed -- --swe && npm start"]
volumes:
- name: logto-storage
persistentVolumeClaim:
claimName: logto-pvc
logto-svc.yaml
apiVersion: v1
kind: Service
metadata:
name: logto-service
namespace: dev
labels:
app: logto
spec:
selector:
app: logto
ports:
- name: auth
port: 3001
- name: admin
port: 3002
type: ClusterIP
logto-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: logto-pvc
namespace: dev
spec:
storageClassName: "{{ YOUR_STORAGE_CLASS }}" # 替换为实际的存储类名称
accessModes:
- ReadWriteMany
resources:
requests:
storage: 5Gi
logto-ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: logto-ingress
namespace: dev
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
ingressClassName: nginx
rules:
- host: "{{ YOUR_AUTH_HOST }}" # 替换为实际的 Auth 服务域名
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: logto-service
port:
number: 3001
tls:
- hosts:
- "{{ YOUR_AUTH_HOST }}" # 替换为实际的 Auth 服务域名
secretName: "{{ YOUR_AUTH_TLS_SECRET }}" # 替换为实际的 TLS Secret 名称
logto-admin-ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: logto-ingress-admin
namespace: dev
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
ingressClassName: nginx
rules:
- host: "{{ YOUR_ADMIN_HOST }}" # 替换为实际的 Admin 服务域名
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: logto-service
port:
number: 3002
tls:
- hosts:
- "{{ YOUR_ADMIN_HOST }}" # 替换为实际的 Admin 服务域名
secretName: "{{ YOUR_ADMIN_TLS_SECRET }}" # 替换为实际的 TLS Secret 名称
如果 dev
Namespace 尚未创建,请先创建:
kubectl create namespace dev
使用 kubectl
部署应用程序:
kubectl apply -f logto-deployment.yaml
kubectl apply -f logto-svc.yaml
kubectl apply -f logto-pvc.yaml
kubectl apply -f logto-ingress.yaml
kubectl apply -f logto-admin-ingress.yaml
检查 Deployment、Service、PVC 和 Ingress 是否成功创建:
kubectl -n dev get deployment,service,pvc,ingress
确保 服务 已成功启动并处于 Running
状态:
kubectl -n dev get pods,svc,ingress
通过浏览器访问以下地址,确保应用程序能够正常加载:
https://{{ YOUR_AUTH_HOST }}
https://{{ YOUR_ADMIN_HOST }}
如果应用程序无法正常工作,可以查看 Pod 日志以排查问题:
kubectl -n dev logs <pod-name>
根据需要调整 Deployment 的副本数:
kubectl -n dev scale deployment logto --replicas=3
如果需要更新应用程序镜像,可以修改 image
字段并重新应用 Manifest:
kubectl apply -f logto-deployment.yaml
建议配置 Prometheus 和 Grafana 对应用程序进行监控,重点关注以下指标:
kubectl logs
查看 Pod 日志以获取更多信息。DB_URL
的值正确。以下是需要用户根据实际情况替换的内容:
{{ YOUR_DB_URL }}
:替换为实际的 PostgreSQL 连接字符串。{{ YOUR_ENDPOINT }}
:替换为实际的 Auth 服务端点。{{ YOUR_ADMIN_ENDPOINT }}
:替换为实际的 Admin 服务端点。{{ YOUR_STORAGE_CLASS }}
:替换为实际的存储类名称。{{ YOUR_AUTH_HOST }}
:替换为实际的 Auth 服务域名。{{ YOUR_ADMIN_HOST }}
:替换为实际的 Admin 服务域名。{{ YOUR_AUTH_TLS_SECRET }}
:替换为实际的 Auth 服务 TLS 证书 Secret 名称。{{ YOUR_ADMIN_TLS_SECRET }}
:替换为实际的 Admin 服务 TLS 证书 Secret 名称。效果图: