Kubernetes Keycloak Operator 基础教程

本文详细介绍了如何在Kubernetes集群中使用Keycloak Operator部署和管理Keycloak身份认证服务,包括Operator安装、PostgreSQL数据库配置、SSL证书创建和Realm导入等完整流程。

Kubernetes Keycloak Operator - 基础教程

Keycloak团队宣布他们将转向新的Operator框架,这将有效管理Kubernetes集群上的Keycloak安装。

什么是Kubernetes Operator?

在Kubernetes上下文中,Operator是一个接管应用程序运维方面的组件。它不像脚本那样管理所有的生命周期和状态,而是以某种方式将运维知识编码到Operator中。对我们来说,Keycloak Operator正是这样做的,在本博客中,我将介绍如何设置一个非常简单的Keycloak安装并为开发做好准备。

如果你不熟悉Keycloak,它是一个开源的身份和访问管理软件。当前版本是22,已经在很多地方使用。它通过OAuth/OIDC、AD、LDAP和SAML v2提供单点登录功能。

安装基本Keycloak实例(使用PostgreSQL数据库)

计划如下:

  • 在OpenShift集群(Red Hat的Kubernetes发行版)上安装Operator
  • 为Keycloak后端安装数据库
  • 创建用于Keycloak后端的SSL证书
  • 安装第一个Keycloak实例
  • 导入Realm

安装Operator

我选择通过Web控制台安装Keycloak Operator,这是一种简单的方法。也可以通过CLI完成。

只需搜索keycloak并按安装。例如:

按下安装后,安装程序会询问要安装到哪个命名空间。在我的情况下是rhbk。

这可能需要几秒钟或几分钟,具体取决于你的集群。

安装数据库

为了让Keycloak服务器存储其状态和数据,它应该有一个数据库。为此,我将使用Crunchy。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: postgresql-db
spec:
  serviceName: postgresql-db-service
  selector:
    matchLabels:
      app: postgresql-db
  replicas: 1
  template:
    metadata:
      labels:
        app: postgresql-db
    spec:
      containers:
        - name: postgresql-db
          image: postgres:latest
          volumeMounts:
            - mountPath: /data
              name: cache-volume
          env:
            - name: POSTGRES_PASSWORD
              value: testpassword
            - name: PGDATA
              value: /data/pgdata
            - name: POSTGRES_DB
              value: keycloak
      volumes:
        - name: cache-volume
          emptyDir: {}
---
apiVersion: v1
kind: Service
metadata:
  name: postgres-db
spec:
  selector:
    app: postgresql-db
  type: LoadBalancer
  ports:
  - port: 5432
    targetPort: 5432

创建用于Keycloak后端的SSL证书

是时候创建自签名证书了,如果是生产环境,假设将通过证书颁发机构获得。但这里我只是测试,我们可以只使用自签名证书。在Linux机器上,我可以这样创建自签名证书,其中keycloak.rhbk.apps.green.demoshift.com是我的keycloak实例地址,O是Test demoshift。它可以是任何你想要表示的内容,在我的情况下是一个测试组织。

1
2
3
4
5
6
openssl req -subj '/CN=keycloak.rhbk.apps.green.demoshift.com/O=Test demoshift./C=US' -newkey rsa:2048 -nodes -keyout key.pem -x509 -days 365 -out certificate.pem

Generating a 2048 bit RSA private key
.....................+++++
.....................+++++
writing new private key to 'key.pem'

让我们使用以下命令将此证书加载到我们的Kubernetes环境中。确保证书的路径正确,在我的情况下,我与证书在同一目录中。

1
kubectl create secret tls example-tls-secret --cert certificate.pem --key key.pem

另一个好做法是将数据库密码作为密钥加载,而不是让它散落在不同的yaml文件中。

1
2
3
kubectl create secret generic keycloak-db-secret \
            --from-literal=username=postgres \
            --from-literal=password=testpassword

安装第一个Keycloak实例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
apiVersion: k8s.keycloak.org/v2alpha1
kind: Keycloak
metadata:
  name: example-kc
spec:
  instances: 1
  db:
    vendor: postgres
    host: postgres-db
    usernameSecret:
      name: keycloak-db-secret
      key: username
    passwordSecret:
      name: keycloak-db-secret
      key: password
  http:
    tlsSecret: example-tls-secret
  hostname:
    hostname: keycloak.rhbk.apps.green.demoshift.com

现在如果我们回到Web控制台,你应该能够看到:

  • Keycloak Operator pod
  • PG数据库pod
  • Keycloak服务器pod

OpenShift有一个很好的功能,一旦你点击你的应用程序,你就可以看到路由。也可见下图。前往你的实例并登录。

要登录,显然需要管理员密码,在这种情况下,它是由Operator自动生成的。让我们通过运行以下命令来获取它。

1
kubectl get secret example-kc-initial-admin -o jsonpath='{.data.password}' | base64 --decode

假设我们有了密码,让我们回到路由并点击管理控制台。用户名是admin,密码应该是我们从上面命令中检索到的。

登录并瞧!我们已经登陆到我们新安装的Keycloak服务器。

导入Realm

此时我们只有master realm。通常,应该保持master realm完整而不做太多更改。这背后的逻辑是不要锁住自己。我们如何导入一个realm呢?这里Operator的力量就显现出来了。我们将创建一个RealmImport CR,这将向Keycloak添加一个新的realm。想象一下,如果Keycloak pod在某个时刻宕机,Operator将确保它被恢复到相同的状态,这个状态将在哪里?在CRs和数据库中。

让我们进一步测试这一点,如何通过KCImportRealm CR添加一个新的realm

让我们回到Operator视图 点击KeycloakRealmImport -> 创建实例

我有一个realm json文件。显然,Operator和K8s中的大多数东西都期望yaml,所以我必须进行转换。我使用了以下yq进行转换。也有在线工具可用,但考虑到realm的敏感性,我不建议使用随机的在线工具转换为yaml。

这是生成的CR

加载yaml并按创建

可能需要几秒钟才能出现。一旦我们创建了CR,Keycloak Operator就会拾取它并将其添加到运行的Keycloak实例中。如果你重新登录到管理控制台,它应该看起来像这样。

如果我们进一步探索并查看客户端,有一个backend-service。这是一个用Java编写的基于Quarkus的REST服务的客户端配置。这将在另一篇文章中讨论。使用Operator可以做更多的事情。

如果你正在寻找更深入的细节,Keycloak文档是一个很好的资源。如果你正在探索更多并尝试此安装,你也可以使用以下Keycloak教程。

关于Keycloak的更多内容将在后面的文章中介绍。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计