将它连接到 istio 后,如何为我的 keycloak 实例创建一个 URL 前端

Posted

技术标签:

【中文标题】将它连接到 istio 后,如何为我的 keycloak 实例创建一个 URL 前端【英文标题】:How do I create a URL frontend to my keycloak instance after connecting it up to istio 【发布时间】:2020-07-23 17:20:38 【问题描述】:

我已经安装了 istio,可以在 Rancher 上看到它。我也安装了keycloak。我正在尝试连接两者并设置网关,以便我可以通过 URL 访问 keycloak 前端。 在我的 keycloak 清单中,我有

# Source: keycloak/templates/statefulset.yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: keycloak
. 
. #Many other lines here
.
          ports:
            - name: http
              containerPort: 8080
              protocol: TCP

然后我用命令设置网关 -

kubectl apply -f networking/custom-gateway.yaml

在我的 custom-gateway.yaml 文件中,我有 -

apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: keycloak-gateway
spec:
  selector:
    istio: ingressgateway # use istio default controller
  servers:
  - port:
      number: 80
      name: http
      protocol: HTTP
    hosts:
    - "*"

---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: keycloak
spec:
  hosts:
  - "*"
  gateways:
  - keycloak-gateway
  http:
  - match:
    - uri:
        exact: /keycloak 
    rewrite:
      uri: "/" # Non context aware backend
    route:
    - destination:
        host: keycloak
        port:
          number: 80
    websocketUpgrade: true

现在当我尝试使用http://node_ip_address:port/keycloak 访问URL 时,我发现我无法访问前端。我已经验证了 keycloak 已经安装并且 pod 已经在 Rancher 上启动并运行。 我还将我的 istio 实例连接到 bookinfo application,并且能够运行 bookinfo-gateway 并使用类似于 here 描述的网关连接到 http://node_ip_address:port/productpage。我正在尝试仅为 keycloak 设置相同的网关。 我在我的 yaml 文件中做错了什么。我该如何解决?任何帮助表示赞赏。我是否正确连接了端口?

【问题讨论】:

【参考方案1】:

据我所知,您应该修复您的虚拟服务。

我用helm和keycloak helm chart准备了一个小例子。


另存为keycloak.yaml,你可以在这里配置你的keycloak密码。

keycloak:
  service:
    type: ClusterIP
  password: mykeycloakadminpasswd
  persistence:
    deployPostgres: true
    dbVendor: postgres

使用上面准备的 helm 和值安装 keycloak。


helm upgrade --install keycloak stable/keycloak -f keycloak.yml

创建网关和虚拟服务


apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: keycloak-gateway
spec:
  selector:
    istio: ingressgateway # use istio default controller
  servers:
  - port:
      number: 80
      name: http
      protocol: HTTP
    hosts:
    - "*"

---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: keycloak
spec:
  hosts:
  - "*"
  gateways:
  - keycloak-gateway
  http:
  - match:
    - uri:
        prefix: /auth
    - uri:
        prefix: /keycloak
    rewrite:
      uri: /auth
    route:
    - destination:
        host: keycloak-http
        port:
          number: 80

virtual service route.host 是 kubernetes keycloak pod service的名称。

kubectl 获取服务

NAME                  TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)    AGE
keycloak-http         ClusterIP   10.0.14.36    <none>        80/TCP     22m

您应该能够通过您的 ingress_gateway_ip/keycloak 或 ingress_gateway_ip/auth 连接到 keycloak 并使用 keycloak 凭据登录,在我的示例中是 login: keycloakpassword: mykeycloakadminpasswd

注意,您需要为 /auth 添加前缀,因为它是默认的 keycloak web 来执行所有操作。 Keycloak 前缀只是在这里重写为 /auth。

【讨论】:

以上是关于将它连接到 istio 后,如何为我的 keycloak 实例创建一个 URL 前端的主要内容,如果未能解决你的问题,请参考以下文章

如何将流星连接到现有后端?

idou老师教你学istio:如何为服务提供安全防护能力

创建 QWidget 宽度 HWND 父级

idou老师教你学istio1:如何为服务提供安全防护能力

如何为未接听的电话设置操作?

Istio技术与实践05:如何用istio实现流量管理