当前位置: 首页 > 知识库问答 >
问题:

无法在带有Traefik Ingress Controller和AWS HTTPS负载平衡器的AWS上公开Keyclope服务器

申奇希
2023-03-14

我已经在我注册的域上使用Traefik Ingress Controller和AWS HTTPS负载平衡器成功公开了AWS上的两个微服务。

以下是源代码: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入口控制器和AWS HTTPS负载均衡器配置正确。

不幸的是,Keyclope服务器在这种环境下无法工作。当我尝试通过https url访问它时:

https://users.skycomposer.net/keycloak

我收到以下回复:

404 page not found

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

以下是我使用的一些Keyclope 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

Keyclope部署。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

Keyclope服务。yaml:

apiVersion: v1
kind: Service
metadata:
  name: keycloak

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

traefik入口。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

我还检查了在我的K3S库伯内特斯集群上运行的密钥斗篷吊舱的日志:

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,但结果仍然相同。

共有3个答案

彭风华
2023-03-14

右-管理控制台正在监听127.0.0.1。这不是外部世界的接口。这是“localhost”。

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

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

这将在端口9990上启动管理控制台,但在0.0.0.0接口上,也就是说所有接口。因此,您仍然可以在localhost上连接到它,但它现在将监听其他(即以太网)接口。

另一个选项是修改独立/配置/独立。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>

或者任何你想让Keyclope监听的地址。当然,如果你愿意,你也可以更改公共广播。

请注意,端口的控制方式不同。控制这种情况的标准方法是使用以下内容运行:

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

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

作为一般声明,我通常会在我所有的Wildfly服务器前放置一个代理(AJP或HTTP)。这样这些都不重要,您的代理连接到例如127.0.0.1,端口9990。但是,当然,这取决于您。

刘德义
2023-03-14

终于解决了这个问题。

在traefik后面运行Keyclope需要以下配置:

  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

信不信由你,这是互联网上唯一的资源,它提到了keydave\u主机名来解决我的问题。通过关键字“Keyclope traefik 404”搜索两天,没有结果!

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

宁良平
2023-03-14

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

我转发了端口:

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

现在,Keyclope服务器在以下位置可用:

http://localhost:32080/auth/

但是如何通过这个网址让它在外部可用呢?

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

以我目前的配置,我仍然不清楚为什么从外面看不到密钥斗篷。

 类似资料:
  • 目标:将弹性/静态IP分配给负载平衡器(LB),以服务于处理DNS(端口53)、HTTPS(端口443)、HTTP(端口80)的EC2实例。 需要静态IP来正确配置DNS记录(即A记录)。需要在后端/服务器上终止TLS,以提供无限制的 经典的负载平衡器允许自定义安全规则,并允许在EC2实例上终止SSL。问题是静态IP不能分配给经典LB,只能分配给其中的单个实例,这无法平衡负载。 要分配静态IP,我

  • 我们在AWS EKS kubernetes集群中运行了一个Hazelcast 3.12集群。 您知道如何将运行在AWS EKS kubernetes群集内部的具有多个pod的Hazelcast群集暴露到kubernetes群集外部吗? Hazelcast集群有6个吊舱,暴露在kubernetes集群之外,具有LoadBalancer(AWS经典负载平衡器)类型的kubernetes“服务”。 当我

  • nginx入口控制器: 这就是入口资源:

  • 试图自学如何使用库伯内特斯,但有一些问题。 我的下一步是尝试使用LoadBalancer类型的服务来访问nginx。 我建立了一个新的集群并部署了nginx映像。 然后,我为LoadBalancer设置服务 设置完成后,我尝试使用LoadBalancer入口(我在描述LoadBalancer服务时发现)访问nginx。我收到一个此页面无法工作的错误。 不太确定我哪里出错了。 kubectl获得sv

  • 我配置了Google Cloud load balancer和无服务器NEG来让我的app engine在静态IP中工作,但它无论如何都不起作用。下面是我用于配置的命令。 请帮我拿这个。 提前感谢!

  • 这意味着Zookeeper将负载均衡器理解为一个客户机,并与之建立联系。但是负载均衡器只是ping TCP2181就出来了。