文章目录

Toggle

- 前置条件
- Authentik 简介
- Authentik 安装
- 使用Sealos 命令行工具快速构建Kubernetes
- Kubernetes 1.29使用群辉dsm7 NFS存储创建StorageClass持久化
- Authentik 初始化配置
- Authentik 配置域名访问
- Authentik 集成Harbor

前置条件


- Kubernetes 1.28.0
- Helm v3.9.4
- Containerd 1.7.27
- StorageClass 设置默认配置
- Harbor集群

Authentik 简介


Authentik 是一个开源的身份验证和授权框架,用于保护和授权对应用程序的访问

**Authentik 的主要特点包括:**

- 身份验证:Authentik 支持多种身份验证机制,包括用户名 / 密码、JWT(JSON Web Tokens)、OAuth 2.0 等,可以满足不同场景下的需求。
- 授权:Authentik 提供基于策略的授权功能,可以定义各种访问规则和限制,以确保只有具有足够权限的用户才能访问应用程序。
- 多租户支持:Authentik 可以支持多个租户(Tenants),这意味着多个客户可以在同一个部署中使用该框架,并且每个客户可以独立管理其用户和权限。
- 可扩展性:Authentik 提供了丰富的插件和扩展机制,可以轻松地与其他身份验证和授权解决方案集成,例如 LDAP、Active Directory 等。
- 安全性和隐私保护:Authentik 在处理敏感信息时确保了足够的安全性和隐私保护,例如加密密码、防止跨站点请求伪造(CSRF)攻击等。

**界面**

- 管理界面:用于创建和管理用户和组、令牌和凭证、应用程序集成、事件以及定义标准和可自定义登录和身份验证流程的流程的可视化工具。易于阅读的可视化仪表板显示系统状态、最近的登录和身份验证事件以及应用程序使用情况。
- 用户界面:authentik 中的此控制台视图显示您在其中实施了 authentik 的所有应用程序和集成。单击要访问的应用程序以将其打开,或向下钻取以在管理界面中编辑其配置。

1760358647299.png

1760358656911.png

1760358664003.png

**技术架构**

1760358755124.png

authentik 由少量组件组成

- Server 容器由两个子组件组成,即实际服务器本身和嵌入式前哨。轻量级路由器将传入服务器容器的请求路由到核心服务器或嵌入式前哨。此路由器还处理对任何静态文件(例如 JavaScript 和 CSS 文件)的请求。
- Core 子组件处理 authentik 的大部分逻辑,例如 API 请求、流执行、任何类型的 SSO 请求等。
- Embedded outpost 与其他 Outpost 类似,此 Outpost 允许使用代理提供商,而无需部署单独的 Outpost。
- /media 用于存储 icon 等,但不是必需的,如果未挂载,authentik 将允许设置图标的 URL 来代替文件上传
- Background Worker 此容器执行后台任务,例如发送电子邮件、事件通知系统以及可以在前端的 System Tasks 页面上看到的所有内容。
- /certs 用于 authentik 导入外部证书,在大多数情况下,这些证书不应用于 SAML,但如果使用 authentik 而不使用反向代理,则可以将其用于 Let's Encrypt 集成
- /templates 用于自定义电子邮件模板,并且与其他模板一样,完全可选

中间件

- PostgreSQL 数据库 /var/lib/postgresql/data 用于存储 PostgreSQL 数据库
- Redis,authentik 使用 Redis 作为消息队列和缓存。Redis 中的数据不需要持久化,重新启动 Redis 将导致所有会话丢失。/data 用于存储 Redis 数据

> 这里我将redis、pg数据库进行持久化,其它默认即可

Authentik 安装


官方默认支持使用helm部署

> 截止2025年10月10日,helm下载Authentik镜像不需要特殊渠道,直接下载即可

helm repo add authentik https://charts.goauthentik.io
helm repo update


使用openssl创建secret私钥

root@k8s-master-01:~/authentik# openssl rand 60 | base64 -w 0
Geu5gUw/TO5RrIk6vKrFNgqpZxfg7J2aWr8DtpldD1AuNVkSKrZlNAgEfyNJ7rNo92eLKi0e0hN8oratt


创建value.yaml

authentik:
    secret_key: "Geu5gUw/TO5RrIk6vKrFNgqpZxfg7J2aWr8DtpldD1AuNVkSKrZlNAgEfyNJ7rNo92eLKi0e0hN8oratt"
    # This sends anonymous usage-data, stack traces on errors and
    # performance data to sentry.io, and is fully opt-in
    error_reporting:
        enabled: true
    postgresql:
        password: "[此处填写PG数据库密码]]"

server:
    ingress:
        # Specify kubernetes ingress controller class name
        ingressClassName: nginx | traefik | kong
        enabled: false    [这里我没有Ingress,所以直接修改为false]
        hosts:
            - authentik.domain.tld

postgresql:
    enabled: true     [开启pg]
    auth:
        password: "[此处填写PG数据库密码,和上面相同]]"
redis:
    enabled: true


> 我这里没有配置Ingress,所以使用NodePort进行演示,如果有Ingress可以直接对接Ingress,和普通的服务暴露没有区别,包括后续在创建Ingress也不受影响





https://i4t.com/25651.htmljavascript:void(0))

使用Sealos 命令行工具快速构建Kubernetes


新闻联播老司机

- 25年7月2日
- 喜欢:0
- 浏览:511

使用helm创建

- 这里namespace我使用tools,如果需要修改自行替换

helm upgrade --install authentik authentik/authentik -f values.yaml --namespace tools


1760083982087.png

查看helm部署状态

root@k8s-master-01:~/authentik# helm list -n tools|grep auth
authentik               tools       2           2025-10-10 07:55:12.743654318 +0000 UTC deployed    authentik-2025.8.4          2025.8.4


查看Pod状态

root@k8s-master-01:~/authentik# kubectl get all -n tools|grep auth
pod/authentik-postgresql-0              1/1     Running   0               40m
pod/authentik-redis-master-0            1/1     Running   0               18m
pod/authentik-server-565d4b9b9c-7dhgv   1/1     Running   0               40m
pod/authentik-worker-d8896b65c-phv5m    1/1     Running   9 (19m ago)     40m
service/authentik-postgresql                                         ClusterIP   10.96.0.231   <none>        5432/TCP         40m
service/authentik-postgresql-hl                                      ClusterIP   None          <none>        5432/TCP         40m
service/authentik-redis-headless                                     ClusterIP   None          <none>        6379/TCP         55m
service/authentik-redis-master                                       ClusterIP   10.96.1.63    <none>        6379/TCP         40m
service/authentik-server                                             ClusterIP   10.96.3.58    <none>        80/TCP,443/TCP   40m
deployment.apps/authentik-server                             1/1     1            1           40m
deployment.apps/authentik-worker                             1/1     1            1           40m
replicaset.apps/authentik-server-565d4b9b9c                             1         1         1       40m
replicaset.apps/authentik-worker-d8896b65c                              1         1         1       40m
statefulset.apps/authentik-postgresql     1/1     40m
statefulset.apps/authentik-redis-master   1/1     18m






https://i4t.com/25654.htmljavascript:void(0))

Kubernetes 1.29使用群辉dsm7 NFS存储创建StorageClass持久化


新闻联播老司机

- 25年7月2日
- 喜欢:0
- 浏览:321

检查PVC持久化数据状态

- 默认情况下会给我们redis、postgresql创建PVC持久卷并挂载

root@k8s-master-01:~/authentik# kubectl get pvc -n tools|grep auth
data-authentik-postgresql-0           Bound    pvc-991cd9c1-ca36-41be-93e2-6508f61fab12   8Gi        RWO            dsm7-nfs-client   <unset>                 40m
redis-data-authentik-redis-master-0   Bound    pvc-07aa8c4f-7efc-4e9f-93fc-5999c3a6b1b7   8Gi        RWO            dsm7-nfs-client   <unset>                 19m


Authentik 初始化配置


默认情况下,我们可以看到Authentik为Cluster IP无法在容器外部访问,接下来我们修改为Nodeport方式

root@k8s-master-01:~/authentik# kubectl get svc -n tools|grep authentik-server
authentik-server                                             ClusterIP   10.96.3.58    <none>        80/TCP,443/TCP   43m

#编辑SVC
root@k8s-master-01:~/authentik# kubectl edit svc -n tools authentik-server
...
  type: ClusterIP     #这里将ClusterIP修改为NodePort
...


1760084317254.png

接下来再次查看svc

root@k8s-master-01:~/authentik# kubectl get svc -n tools|grep authentik-server
authentik-server                                             NodePort    10.96.3.58    <none>        80:31112/TCP,443:30747/TCP   45m


目前就可以使用浏览器访问31112端口

b008174ac04fd61d823462c408c420b9.png

安装完成后,访问 authentik http://nodeportIP:port/if/flow/initial-setup/,在这里可以为默认akadmin用户设置密码。

1760089366037.png

设置完毕后,就登录到后台界面

1760089435237.png

> 认证基本只有我自己使用,我目前觉得不需要开启邮箱认证,这里就没有配置,如有需要可自行查看配置

Authentik 配置域名访问


默认情况下还是使用NodePort访问,用起来比较不方便,我这里使用宝塔配置Nginx进行演示

创建反向代理配置
1760348178688.png

这里根据后端实际地址填写IP
1760348239899.png

开启websocket
1760348274853.png

在配置个证书即可,都宝塔安装了,这里不细说了。最后效果如下
1760348325154.png

Authentik 集成Harbor


目前我们Authentik已经配置好了,接下来我们通过集成Harbor进行演示

- 先天条件需要把Harbor部署完毕

1760335527314.png

本文参考官方文档配置说明https://integrations.goauthentik.io/infrastructure/harbor/#harbor-configuration

**Authentik创建应用程序**

点击Application 创建应用程序
1760348424022.png

配置格式如下

- 名称 #平台可视化的名称
- Slug #英文名称,我建议直接写项目名称即可
- 策略引擎模式 #这里都默认

1760348541002.png

这里建议打开新窗口

- 图表描述选填,就是为了在平台方便展示

1760348662469.png

最后点击创建即可

1760348791543.png

**Authentik创建提供程序**

刚刚的创建的实际上是方便在Authentik上观看识别的,我们还需要创建提供程序用于认证

点击Application选择provider 然后创建提供程序
1760348858594.png

选择提供商类型:选择OAuth2/OpenID Connect作为提供商类型。

1760348887308.png

- 名称,我这里方便好记都是以项目名称为开头
- 授权流程选择: default-provider-authorization-explicit-consent (Authorize Application)

> default-provider-authorization-explicit-consent (Authorize Application)
> 显式授权(Explicit Consent)
> 用户交互要求:必须明确展示授权页面,用户需手动点击同意按钮才能完成授权
> 安全性:更安全,适用于需要高安全级别的场景,如访问敏感数据
> 流程:通常用于授权码模式(Authorization Code Flow),授权服务器会返回授权码,客户端需用授权码换取令牌
> default-provider-authorization-implicit-consent (Authorize Application)
> 隐式授权(Implicit Consent)
> 用户交互要:无需用户显式点击同意,授权服务器直接返回令牌(如ID Token或Access
> 适用场景:适用于单页应用(SPA)等公共客户端,简化流程但安全性较低
> 风险: 令牌直接暴露在URL中,可能被截获,需配合短期令牌等机制降低风险

1760348997017.png

- Select ID #保留不变。不做修改 (本次保存一下后续Harbor需要使用)
- Select token #保留不变。不做修改 (本次保存一下后续Harbor需要使用)

只需要创建重定向
1760349281030.png

严格的:https://harbor.company/c/oidc/callback/


这里请根据实际的Harbor地址填写 (注意不要加/线)
2

1760357930034.png

高级协议设置
范围:添加authentik default OAuth Mapping: OpenID 'offline_access'到选定范围

1760349485011.png

Subject模式选择基于用户名,这样后续配置权限也是使用用户名登录的

1760358265851.png

接下来保存即可,保存完毕后还需要关联应用程序,否则就是下面提示

1760349528985.png

返回应用程序,配置应用程序提供着

1760349585949.png

1760349641060.png

**Harbor配置**

上面配置完毕后就登录到Harbor后台,配置Harbor信息

1760349934695.png

认证选择OIDC

- OIDC 提供商名称:authentik (这里可随意修改)
- OIDC 端点:https://sso.frps.cn/application/o/harbor/ (要注意是/线)
- OIDC 客户端 ID:来自 authentik 的客户端 ID
- OIDC 客户端密钥:来自 authentik 的客户端密钥
- OIDC范围:openid,profile,email,offline_access
- 用户名声明:preferred_username
- 验证证书:取消勾选 (如果开启可能验证失败)

> OIDC认证信息在提供者程序中查看

配置截图如下

1760350254977.png

配置完成后我们保存退出,返回首页就可以看到多了一个窗口
1760358064095.png

点击新配置的登录测试,默认会跳转到认证页面,我们点击允许

1760358111273.png

点击允许后会自动跳转到Harbor地址

1760358127411.png

点击用户中心,测试用户是否正常

1760358150267.png

测试用户登陆
1760346265483.png

[root@ops ~]# docker login harbor.frps.cn
Username: akadmin
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded


1760346312196.png