无法使用 Traefik 入口控制器和 AWS HTTPS 负载均衡器在 AWS 上公开 Keycloak 服务器

Can't expose Keycloak Server on AWS with Traefik Ingress Controller and AWS HTTPS Load Balancer

我已经在 AWS 上使用 Traefik Ingress ControllerAWS HTTPS Load Balancer[=67 成功公开了两个微服务=] 在我的注册域名上。

这是源代码: https://github.com/skyglass-examples/user-management-keycloak

我可以使用 https url:

轻松访问这两个微服务
https://users.skycomposer.net/usermgmt/swagger-ui/index.html
https://users.skycomposer.net/whoami

所以,看来 Traefik Ingress ControllerAWS HTTPS Load Balancer 配置正确。

不幸的是,Keycloak 服务器 无法在此环境中工作。 当我尝试通过 https url:

访问它时
https://users.skycomposer.net/keycloak

我收到以下回复:

404 page not found

我的配置中是否遗漏了什么?

这是我使用的一些 keycloak kubernetes 清单

keycloak-config.yaml:

apiVersion: v1
kind: ConfigMap
metadata:
  name: keycloak
data:
  KEYCLOAK_USER: admin@keycloak
  KEYCLOAK_MGMT_USER: mgmt@keycloak
  JAVA_OPTS_APPEND: '-Djboss.bind.address.management=0.0.0.0'
  PROXY_ADDRESS_FORWARDING: 'true'
  KEYCLOAK_LOGLEVEL: INFO
  ROOT_LOGLEVEL: INFO
  DB_VENDOR: H2

keycloak-deployment.yaml:

kind: Deployment
apiVersion: apps/v1
metadata:
  name: keycloak
  labels:
    app: keycloak

spec:
  replicas: 1
  selector:
    matchLabels:
      app: keycloak
  template:
    metadata:
      labels:
        app: keycloak
    spec:
      containers:
        - name: keycloak
          image: jboss/keycloak:12.0.4
          imagePullPolicy: Always
          ports:
            - containerPort: 9990
              hostPort: 9990
          volumeMounts:
            - name: keycloak-data
              mountPath: /opt/jboss/keycloak/standalone/data
          env:
            - name: KEYCLOAK_USER
              valueFrom:
                configMapKeyRef:
                  name: keycloak
                  key: KEYCLOAK_USER
            - name: KEYCLOAK_MGMT_USER
              valueFrom:
                configMapKeyRef:
                  name: keycloak
                  key: KEYCLOAK_MGMT_USER
            - name: JAVA_OPTS_APPEND
              valueFrom:
                configMapKeyRef:
                  name: keycloak
                  key: JAVA_OPTS_APPEND
            - name: DB_VENDOR
              valueFrom:
                configMapKeyRef:
                  name: keycloak
                  key: DB_VENDOR
            - name: PROXY_ADDRESS_FORWARDING
              valueFrom:
                configMapKeyRef:
                  name: keycloak
                  key: PROXY_ADDRESS_FORWARDING
            - name: KEYCLOAK_LOGLEVEL
              valueFrom:
                configMapKeyRef:
                  name: keycloak
                  key: KEYCLOAK_LOGLEVEL
            - name: ROOT_LOGLEVEL
              valueFrom:
                configMapKeyRef:
                  name: keycloak
                  key: ROOT_LOGLEVEL
            - name: KEYCLOAK_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: keycloak
                  key: KEYCLOAK_PASSWORD
            - name: KEYCLOAK_MGMT_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: keycloak
                  key: KEYCLOAK_MGMT_PASSWORD
      volumes:
        - name: keycloak-data
          persistentVolumeClaim:
            claimName: keycloak-pvc

keycloak-service.yaml:

apiVersion: v1
kind: Service
metadata:
  name: keycloak

spec:
  ports:
    - protocol: TCP
      name: web
      port: 80
      targetPort: 9990
  selector:
    app: keycloak

traefik-ingress.yaml:

apiVersion: networking.k8s.io/v1beta1
kind: IngressClass
metadata:
  name: traefik-lb
spec:
  controller: traefik.io/ingress-controller

---
apiVersion: "networking.k8s.io/v1beta1"
kind: "Ingress"
metadata:
  name: "traefik-usermgmt-ingress"
spec:
  ingressClassName: "traefik-lb"
  rules:
  - host: "keycloak.skycomposer.net"
    http:
      paths:
      - path: "/usermgmt"
        backend:
          serviceName: "usermgmt"
          servicePort: 80


---
apiVersion: "networking.k8s.io/v1beta1"
kind: "Ingress"
metadata:
  name: "traefik-whoami-ingress"
spec:
  ingressClassName: "traefik-lb"
  rules:
  - host: "keycloak.skycomposer.net"
    http:
      paths:
      - path: "/whoami"
        backend:
          serviceName: "whoami"
          servicePort: 80


---
apiVersion: "networking.k8s.io/v1beta1"
kind: "Ingress"
metadata:
  name: "traefik-keycloak-ingress"
spec:
  ingressClassName: "traefik-lb"
  rules:
  - host: "keycloak.skycomposer.net"
    http:
      paths:
      - path: "/keycloak"
        backend:
          serviceName: "keycloak"
          servicePort: 80

查看我 github 上的所有其他文件:https://github.com/skyglass-examples/user-management-keycloak

我还检查了 keycloak pod 的日志,运行 在我的 K3S Kubernetes 集群上:

20:57:34,147 INFO  [org.jboss.as] (Controller Boot Thread) WFLYSRV0025: Keycloak 12.0.4 (WildFly Core 13.0.3.Final) started in 43054ms - Started 687 of 972 services (687 services are lazy, passive or on-demand)
20:57:34,153 INFO  [org.jboss.as] (Controller Boot Thread) WFLYSRV0060: Http management interface listening on http://127.0.0.1:9990/management
20:57:34,153 INFO  [org.jboss.as] (Controller Boot Thread) WFLYSRV0051: Admin console listening on http://127.0.0.1:9990

一切似乎都很好,管理控制台正在监听 http://127.0.0.1:9990

我也尝试在部署和服务清单中使用 9990 目标端口,而不是 8080,但结果仍然相同。

正确 - 管理控制台正在侦听 127.0.0.1。这是不是外部世界界面。这是“本地主机”。

这里有两个选择。您可以使用如下命令行参数启动 Keycloak:

bin/standalone.sh -Djboss.bind.address.management=0.0.0.0

这将在端口 9990 上启动管理控制台,但在 0.0.0.0 接口上,即所有接口上。所以你仍然可以在本地主机上连接到它,但它现在将在其他(即以太网)接口上监听。

另一种选择是修改standalone/configuration/standalone.xml文件并更改:

<interfaces>
    <interface name="management">
        <inet-address value="${jboss.bind.address.management:127.0.0.1}"/>
    </interface>
    <interface name="public">
        <inet-address value="${jboss.bind.address:127.0.0.1}"/>
    </interface>
</interfaces>

成为:

<interfaces>
    <interface name="management">
        <inet-address value="0.0.0.0"/>
    </interface>
    <interface name="public">
        <inet-address value="${jboss.bind.address:127.0.0.1}"/>
    </interface>
</interfaces>

或您希望 Keycloak 监听的任何地址。当然,如果您愿意,您也可以更改 public 地址。

请注意,端口的控制方式不同。控制这个的标准方法是 运行 像这样:

bin/standalone.sh -Djboss.socket.binding.port-offset=1000

在此示例中,所有端口都添加了 1000。所以管理端口从 9990 变为 10990,因为 1000 添加到基础。

一般来说,我通常会在我所有的 Wildfly 服务器前面放置一个代理(AJP 或 HTTP)。这样 none 很重要,您的代理连接到 127.0.0.1、端口 9990。但是,当然,这取决于您。

我找到了一个小的解决方法,但不幸的是,这不是我的最佳解决方案。

我转发了端口:

kubectl port-forward --address 0.0.0.0 service/keycloak 32080:http

现在 Keycloak 服务器可用于:

http://localhost:32080/auth/

但是如何通过这个 url 使其在外部可用?

https://keycloak.skycomposer.net/keycloak/auth

我仍然不清楚,为什么在我当前的配置下从外面看不到 keycloak。

问题终于解决了。

运行keycloak后面traefik需要如下配置:

  PROXY_ADDRESS_FORWARDING=true
  KEYCLOAK_HOSTNAME=${YOUR_KEYCLOAK_HOSTNAME}

此外,我必须使用根路径“/”作为入口规则:

apiVersion: "networking.k8s.io/v1beta1"
kind: "Ingress"
metadata:
  name: "traefik-keycloak-ingress"
spec:
  ingressClassName: "traefik-lb"
  rules:
  - host: "keycloak.skycomposer.net"
    http:
      paths:
      - path: "/"
        backend:
          serviceName: "keycloak"
          servicePort: 80

在这里,您可以找到您可能会觉得有用的其他配置属性: https://github.com/Artiume/docker/blob/master/traefik-SSO.yml

信不信由你,这是 Internet 上唯一提到 KEYCLOAK_HOSTNAME 来解决我的问题的资源。按关键字“keycloak traefik 404”搜索了两天,没有结果!

您可以在我的 github 上找到完整的固定代码和正确的配置: https://github.com/skyglass-examples/user-management-keycloak