无法使用 Traefik 入口控制器和 AWS HTTPS 负载均衡器在 AWS 上公开 Keycloak 服务器
Can't expose Keycloak Server on AWS with Traefik Ingress Controller and AWS HTTPS Load Balancer
我已经在 AWS 上使用 Traefik Ingress Controller 和 AWS 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 Controller 和 AWS 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
我已经在 AWS 上使用 Traefik Ingress Controller 和 AWS 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 Controller 和 AWS 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