【问题标题】:Keycloak in Kubernetes: 503 Service Temporarily UnavailableKubernetes 中的 Keycloak:503 服务暂时不可用
【发布时间】:2021-02-24 08:30:48
【问题描述】:

按照下面 Keycloak 文档站点上的说明,我正在尝试将 Keycloak 设置为在 Kubernetes 集群中运行。我设置了一个入口控制器,它成功地适用于一个简单的测试页面。 Cloudflare 将域指向入口控制器 IP。

Keycloak 部署成功 (Admin console listening on http://127.0.0.1:9990),但在访问域时,我收到一条来自 NGINX 的消息:503 Service Temporarily Unavailable

https://www.keycloak.org/getting-started/getting-started-kube

这是 Kubernetes 配置:

apiVersion: v1
kind: Service
metadata:
  name: keycloak-cip
spec:
  type: ClusterIP
  ports:
    - port: 80
      targetPort: 8080
  selector:
    name: keycloak
---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: test-ingress
  annotations:
    kubernetes.io/ingress.class: nginx
    service.beta.kubernetes.io/linode-loadbalancer-default-protocol: https
    service.beta.kubernetes.io/linode-loadbalancer-port-443: '{ "tls-secret-name": "my-secret", "protocol": "https" }'
spec:
  rules:
    - host: my.domain.com
      http:
        paths:
          - backend:
              serviceName: keycloak-cip
              servicePort: 8080
  tls:
    - hosts:
        - my.domain.com
      secretName: my-secret
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: keycloak
  namespace: default
  labels:
    app: keycloak
spec:
  replicas: 1
  selector:
    matchLabels:
      app: keycloak
  template:
    metadata:
      labels:
        app: keycloak
    spec:
      containers:
        - name: keycloak
          image: quay.io/keycloak/keycloak:12.0.3
          env:
            - name: KEYCLOAK_USER
              value: "admin"
            - name: KEYCLOAK_PASSWORD
              value: "admin"
            - name: PROXY_ADDRESS_FORWARDING
              value: "true"
          ports:
            - name: http
              containerPort: 8080
            - name: https
              containerPort: 8443
          readinessProbe:
            httpGet:
              path: /auth/realms/master
              port: 8080
            initialDelaySeconds: 90
            periodSeconds: 5
            failureThreshold: 30
            successThreshold: 1
  revisionHistoryLimit: 1


编辑:

TLS 应该由入口控制器处理。

--

编辑 2:

如果我使用 kubectl exec 进入控制器,我可以使用 curl -L http://127.0.0.1:8080/auth 成功检索页面: <title>Welcome to Keycloak</title>。所以我确定keycloak正在运行。只是流量没有到达pod,或者keycloak没有响应。

如果我改用 ClusterIP 但保持上面的调用不变,我会得到一个Connection timed out。我尝试了 80 和 8080 端口,结果相同。

【问题讨论】:

    标签: docker ssl kubernetes network-programming keycloak


    【解决方案1】:

    入口控制器后面运行keycloak需要以下配置:

    - name: PROXY_ADDRESS_FORWARDING
      value: "true"
    - name: KEYCLOAK_HOSTNAME
      value: "my.domain.com"
    

    所以我认为添加正确的 KEYCLOAK_HOSTNAME 值应该可以解决您的问题。

    我对 Traefik Ingress Controller 也有类似的问题: Can't expose Keycloak Server on AWS with Traefik Ingress Controller and AWS HTTPS Load Balancer

    您可以在此处找到我的配置的完整代码: https://github.com/skyglass-examples/user-management-keycloak

    【讨论】:

      【解决方案2】:

      您好,您是否尝试添加此行:

      nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
      

      您的配置文件中似乎缺少它导致 503 错误,请查看 this 以获取有关 K8s 配置的更多输入。

      【讨论】:

      • 我尝试了 http 和 https,但不幸的是都没有帮助。我应该指出 Keycloak 本身应该使用 http。 TLS 应该在入口处终止。
      • 但是您是否尝试过正确的语法,我的意思是引号和所有内容?
      • 是的,我复制粘贴了该行。虽然我认为它应该是“http”,以便 TLS 在入口处终止。顺便说一句,我将它放在 Ingress 中 metadata > annotations 下的其他注释之后。我想知道这是否与端口错误有关,或者 Keycloak 根本没有在监听。至少在独立模式下,它只会绑定到本地地址。不过,我在上面的文档中没有看到任何相关内容。
      猜你喜欢
      • 1970-01-01
      • 2018-08-18
      • 2011-12-19
      • 2018-09-16
      • 1970-01-01
      • 2019-12-29
      • 2013-10-31
      • 2021-10-03
      • 2023-04-06
      相关资源
      最近更新 更多