跳到主内容

部署到 Kubernetes

在 Kubernetes 上部署 Casdoor

Casdoor 仓库在项目根目录下包含一个示例清单 k8s.yaml,其中包含一个 Deployment 和一个 Service。 对于生产或自定义设置,建议改用【Helm图表】(/docs/basic/try-with-helm)。

部署前:

  1. 更新conf/app.conf,以便Casdoor能够连接到您的数据库。
  2. 确保数据库正在运行,并且集群能够拉取Casdoor镜像。

使用以下方式部署:

kubectl apply -f k8s.yaml

使用kubectl get pods检查部署状态。

以下是 k8s.yaml 的内容:

# Example: deploying Casdoor on Kubernetes
# Adjust this file for your environment
apiVersion: v1
kind: Service
metadata:
# EDIT: set namespace if not using default
#namespace: casdoor
name: casdoor-svc
labels:
app: casdoor
spec:
# EDIT: set namespace if not using default
type: NodePort
ports:
- port: 8000
selector:
app: casdoor
---
apiVersion: apps/v1
kind: Deployment
metadata:
# EDIT: set namespace if not using default
#namespace: casdoor
name: casdoor-deployment
labels:
app: casdoor
spec:
# EDIT: use 1 replica if not using Redis
replicas: 1
selector:
matchLabels:
app: casdoor
template:
metadata:
labels:
app: casdoor
spec:
containers:
- name: casdoor-container
image: casbin/casdoor:latest
imagePullPolicy: Always
ports:
- containerPort: 8000
volumeMounts:
# the mounted directory path in THE CONTAINER
- mountPath: /conf
name: conf
env:
- name: RUNNING_IN_DOCKER
value: "true"
#if you want to deploy this in real prod env, consider the config map
volumes:
- name: conf
hostPath:
#EDIT IT: the mounted directory path in THE HOST
path: /conf

此文件仅作示例。 根据需要进行调整(命名空间、服务类型、用于配置的ConfigMap)。 在生产环境中,建议使用ConfigMap来存储配置文件。

通过Ingress公开Casdoor

Casdoor部署完成后,通常希望将其对外公开。 有几种方法可用于处理您应用程序的身份验证:

直接入口访问

对于希望公开 Casdoor 本身的简单设置,请创建一个 Ingress 资源:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: casdoor-ingress
annotations:
nginx.ingress.kubernetes.io/ssl-redirect: "true"
spec:
ingressClassName: nginx
rules:
- host: auth.yourdomain.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: casdoor-svc
port:
number: 8000
tls:
- hosts:
- auth.yourdomain.com
secretName: casdoor-tls-secret

您的应用随后可直接使用SDK或OAuth 2.0/OIDC协议与Casdoor集成。 这是大多数用例的推荐方法,因为它让您能够完全掌控应用代码中的认证流程。

使用ingress-nginx身份验证注解进行身份验证

尽管ingress-nginx通过注解提供了外部身份验证功能,但这种方法在与Casdoor等OAuth2/OIDC提供商配合使用时存在显著局限性。 nginx.ingress.kubernetes.io/auth-url 注解适用于简单的令牌验证端点,而非需要重定向和会话管理的完整 OAuth2 流程。

为了在入口级别保护应用程序,您应使用oauth2-proxy或类似的认证代理。 这些工具可处理完整的OAuth2/OIDC流程,包括:

  • 启动向Casdoor的登录重定向
  • 处理带有授权码的OAuth2回调
  • 使用Cookie管理用户会话
  • 令牌刷新与验证

以下是将 oauth2-proxy 与您的应用程序一起部署的方法:

apiVersion: apps/v1
kind: Deployment
metadata:
name: oauth2-proxy
spec:
replicas: 1
selector:
matchLabels:
app: oauth2-proxy
template:
metadata:
labels:
app: oauth2-proxy
spec:
containers:
- name: oauth2-proxy
image: quay.io/oauth2-proxy/oauth2-proxy:v7.5.1
args:
- --provider=oidc
- --oidc-issuer-url=https://auth.yourdomain.com
- --client-id=YOUR_CLIENT_ID
- --client-secret=YOUR_CLIENT_SECRET
- --redirect-url=https://app.yourdomain.com/oauth2/callback
- --cookie-secret=RANDOM_SECRET_32_CHARS
- --email-domain=*
- --upstream=http://your-app-service:8080
- --http-address=0.0.0.0:4180
ports:
- containerPort: 4180
---
apiVersion: v1
kind: Service
metadata:
name: oauth2-proxy-svc
spec:
ports:
- port: 4180
targetPort: 4180
selector:
app: oauth2-proxy
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: app-ingress
spec:
ingressClassName: nginx
rules:
- host: app.yourdomain.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: oauth2-proxy-svc
port:
number: 4180
tls:
- hosts:
- app.yourdomain.com
secretName: app-tls-secret

这种方法可确保正确处理OAuth2/OIDC流程,同时在入口层保护您的应用程序。

安全注意事项

在Kubernetes中部署身份验证时:

  • 始终使用 HTTPS/TLS - OAuth2 需要安全连接。 使用 cert-manager 或类似工具为您的入口资源配置 TLS 证书。
  • 保护敏感值 - 将客户端密钥、Cookie 密钥及其他敏感数据存储在 Kubernetes Secret 中,而非直接存储在普通 ConfigMap 或部署清单中。
  • 使用正确的RBAC - 利用Kubernetes RBAC策略限制对身份验证配置和密钥的访问。
  • 会话管理 - 对于具有多个副本的生产部署,配置oauth2-proxy使用Redis进行会话存储,以确保会话在Pod重启和多实例之间正常工作。