Skip to main content

Command Palette

Search for a command to run...

Kubernetes 中用 Sidecar 为应用添加 Oauth 功能

Updated
2 min read

Kubernetes 的 Pod 中可以同时运行共享网络栈的多个容器,使得 Sidecar 这种服务协作方式更加易于实施。这里我们就使用 Sidecar 方式,将 Keycloak 集成到 httpbin 服务上去,为没有认证的 httpbin 服务添加认证功能。

概要

Keycloak(链接 1) 是 JBoss 的一个认证服务软件,使用代理的方式,为其他应用提供认证能力,除了本文说到的 Oauth 之外,还提供二次认证、LDAP 等丰富的相关功能。

在 Kubernetes 上部署 Keycloak 服务,对其进行初始化,建立用户和认证系统,然后将 Keycloak-Proxy 和 Httpbin 集成在同一个 Pod 中进行部署运行,测试集成效果。

集成后的访问路径如图所示:

Keycloak 服务的初始化

Keycloak 支持多种数据库存储,这里为了方便,就直接使用内置的 H2 数据库了。这里选用的镜像是jboss/keycloak:3.4.2.Final,开放服务端口 8080,并设置了三个环境变量:

  • KEYCLOAK_USER:KeyCloak 初始管理员账号

  • KEYCLOAK_PASSWORD:KeyCloak 初始管理员密码

  • PROXY_ADDRESS_FORWARDING:KeyCloak 部署在反向代理之后(Kubernetes 部署方式就在此列),就必须设置此变量为true

接下来部署相关的 Service,如果有必要,还需要部署相关的 Ingress。

设置 Keycloak 服务器

启动 Keycloak Server 之后,我们访问https://[keycloak service url]/auth/admin/,使用环境变量中设置的用户名密码登录,进行后续的安全设置,界面如图所示:

创建登录域

  1. 鼠标在左上角的Master字样上悬停,在弹出的菜单中选择Add Realm

  2. 在左侧菜单Configure下面,打开Clients项,点击Create设置httpbin作为 Client ID 并保存。

  3. 设置Access TypeconfidentialValid Redirect URIs设置为*,并保存。

  4. 打开Installation标签,选择Keycloak OIDC JSON,并拷贝显示出来的 JSON 代码,其中的部分内容可能不一致。

{
    "realm": "httpbin",
    "auth-server-url": "https://[keycloak-server]/auth",
    "ssl-required": "external",
    "resource": "httpbin",
    "credentials": {
      "secret": "d97cfa70-8eb1-443a-8320-4cde9da34de6"
    },
    "confidential-port": 0
  }

创建用户

  1. 在左侧的Configure菜单上打开Roles页面,点击Add role

  2. 设置角色名称为httpbin-role,保存。

  3. 在左手的Manage菜单中,打开Users页面,点击Add user

  4. 填写表单,设置Email verifiedON,保存内容。

  5. 打开这一用户的Role mappings标签,在Available Roles列表中选择角色httpbin-role,点击Add selected

这样我们就完成了登录域的创建,并为后面将要启动的 httpbin 应用创建了相关的角色和用户。

部署应用

根据前面的流程图,我们需要把 keycloak-proxy 组件用 sidecar 的方式和 httpbin 集成在一起,用反向代理的形式拦截请求,完成登录任务。

创建 proxy 配置

Proxy 配置文件内容可以参考官方文档(链接 2)

keycloak-proxy 需要一个配置文件/opt/jboss/conf,这里我们使用 configmap 的形式将其加载进来,配置文件的内容如下:

{
    "target-url": "http://localhost:8000",
    "send-access-token": true,
    "bind-address": "0.0.0.0",
    "http-port": "8080",
    "applications": [
        {
            "base-path": "/",
            "adapter-config": {
                "realm": "httpbin",
                "auth-server-url": "https://[keycloak-server]/auth",
                "ssl-required": "external",
                "resource": "httpbin",
                "credentials": {
                "secret": "d97cfa70-8eb1-443a-8320-4cde9da34de6"
                }
            }
        ,
        "constraints": [
                {
                    "pattern": "/*",
                    "roles-allowed": [
                        "httpbin-role"
                    ]
                }
            ]
        }
    ]
}

这一配置要求 Proxy 代理本机 8000 端口(httpbin 的服务端口)的通信,并以 0.0.0.0:8080 对外提供服务,secret 字段内容来自于上面Keycloak OIDC JSON的输出。

创建 httpbin deployment

在原有的应用部署的基础上,需要加入两个内容:

  • 加载 ConfigMap

  • 加入 Sidecar

节选 yaml 代码:

containers:
- image: citizenstig/httpbin
imagePullPolicy: IfNotPresent
name: httpd
ports:
- containerPort: 8000
    name: http-httpbin
- image: jboss/keycloak-proxy:3.4.2.Final
name: httpbin-proxy
volumeMounts:
- mountPath: /opt/jboss/conf
    name: config
ports:
- containerPort: 8080
    name: http-proxy
volumes:
- name: config
configMap:
    name: httpbin-proxy

这里完成了上述的任务。

创建服务

上面创建的 Deployment 之中有了两个端口,8080 是 keycloak 端口;8000 是 httpbin 端口,为了达到认证目的,服务应该指向 keycloak proxy 所在的 8080 端口。

测试

依次完成业务应用部署之后,就可以进行测试了。

在浏览器打开 httpbin 服务,会看到对这一服务的访问会被转向 Keycloak 的登录页面。如果输入的是管理员的账号密码,是无法成功访问服务的;而输入我们新建账号的登录凭据,则可以顺利返回。

所有 yaml 代码(链接 3)

链接

  1. https://www.keycloak.org/

  2. http://www.keycloak.org/docs/3.0/server_installation/topics/proxy.html

  3. https://gist.github.com/fleeto/e4d2996b3c0dba41831504747974cf0a

More from this blog

龙虾恐慌:AIOps 又要改名了?

ChatGPT 开始,把 AI 拉近到普罗大众的面前,让无数人感受到 AI 的亲民魅力。而龙虾,则把大模型驱动的自动化能力,突然间变得水灵灵、活泼泼地走进千家万户。它不只是“风口上的猪”,而是风口本身。热度高到让 Mac mini 一度断货,不知道这在不在库克的预料之内。 每代人都有每代人的鸡蛋,春节期间,我就领了我的鸡蛋。翻出古老的 MacBook Air M1,充值各种大模型。当然了,这个工具

Mar 9, 20261 min read

再见 2025

我猜不少人以为这个号废了吧?并没有,只是今年变化有点大,一直有种抄起键盘,无从说起的感觉,所以一直偷懒到今天,2025 的最后一天。 今年是我的第四个本命年,去年末一期播客里,大内说本命年不是灾年,是变化年,有危也有机。可是讲真啊,只看到危,没看到机。 各种因缘际会,从鹅厂跳槽到前东家,已经接近四年,第一个合同期已经进入尾声。除了前两年还在云原生领域嗷嗷叫,后两年基本都是些鸡零狗碎的东西了,用老东家的术语说是——偏离主航道,可谓是前景暗淡了。 一旦确定要滚蛋,反倒心思轻松起来,每天骑着我的小红车...

Jan 5, 20261 min read

辅助编程?dora 说:我知道你很急可是请你别急

从 OpenGPT 把大模型的火烧旺了之后,这三年来,相信很多组织或摩拳擦掌、或躬身入局,希望借助聪明能干的大模型,或想偿还技术宅,或想降本增效,或想弯道超车。一时间,沉寂许久的 AIxx 又活过来了,LLM Ops、Vibe Coding、中医大模型、GPT 算命等等,全都老树发新芽,焕发了勃勃生机。那么视角拉回从业者最关注的饭碗相关的领域之一——AI 辅助开发,产生了什么触动,应该如何拥抱呢? DORA 的年度报告中给出了很有意思的结论——强者恒强。 执行摘要部分总结了几个有趣的点: 问题...

Oct 6, 20251 min read

[译]dora:ai 辅助软件开发状态报告

执行摘要 在 2025 年,科技领导者面临的核心问题已不再是“是否要采用 AI”,而是“如何实现其价值”。 DORA 的研究基于超过 100 小时的定性访谈和来自全球近 5,000 名技术专业人士的问卷调查。研究揭示了一个关键事实:AI 在软件开发中的主要角色是“放大器”。它会放大高效能组织的优势,也会凸显组织的缺陷。 关键结论:AI 是放大器 AI 投资的最大回报并非来自工具本身,而是来自组织底层系统的战略性建设: 高质量的内部平台 清晰的工作流 团队的协同能力 缺少这些基础,AI ...

Oct 2, 202514 min read

僭越了,有人在用 Rust 写 Kubernetes

一个新语言问世,最爱做的事情之一,就是重写存量软件了。 云原生喝酒 SIG 重点扶持项目——rk8s(https://github.com/rk8s-dev/rk8s) 也可以归在这个范畴里,只不过这个项目重写的东西比较大,是 Kubernetes。 从 2025 年 1 月第一个 Commit 开始,到现在有了 200 多次 Commit,十几万行代码。当然距离 Kubernetes 的几百万行代码还差得远——老马就是喜欢整这种大无畏项目。 另外该项目也是国内第一个脱离 Cargo 转向使用 ...

Sep 27, 20253 min read

【伪】架构师

342 posts