【问题标题】:Kubernetes issues with ingressKubernetes 的入口问题
【发布时间】:2020-10-20 18:44:54
【问题描述】:

所以我正在尝试使用 pgadmin 访问配置 postgresql,我已经成功部署了 postgresql 和 pgadmin,但是当我尝试登录 pgadmin UI 时出现问题。

我的 k8s 集群在谷歌云平台上。

集群信息。

Client Version: version.Info{Major:"1", Minor:"18", GitVersion:"v1.18.4", GitCommit:"c96aede7b5205121079932896c4ad89bb93260af", GitTreeState:"clean", BuildDate:"2020-06-18T17:02:08Z", GoVersion:"go1.13.12", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"14+", GitVersion:"v1.14.10-gke.36", GitCommit:"34a615f32e9a0c9e97cdb9f749adb392758349a6", GitTreeState:"clean", BuildDate:"2020-04-06T16:33:17Z", GoVersion:"go1.12.12b4", Compiler:"gc", Platform:"linux/amd64"}

这是 pgadmin-deployment.yaml:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: pgadmin
spec:
  selector:
    matchLabels:
      frontend: pgadmin
  replicas: 1
  template:
    metadata:
      labels:
        frontend: pgadmin
    spec:
     containers:
     - name: pgadmin
       image: dpage/pgadmin4
       imagePullPolicy: "IfNotPresent"
       env:
       - name: PGADMIN_DEFAULT_EMAIL
         value: "test@test.com"
       - name: PGADMIN_DEFAULT_PASSWORD
         value: "test!"
       - name: PGADMIN_LISTEN_PORT
         value: "443"
       ports:
       - containerPort: 443

这是我的 pgadmin-service.yaml

apiVersion: v1
kind: Service
metadata:
  name: pgadmin-service
spec:
  type: ClusterIP
  selector:
    frontend: pgadmin
  ports:
    - port: 9210
      targetPort: 443
      protocol: TCP

我还在集群上安装了 certmanager 和 nginx ingress。

Nginx 安装步骤:

helm repo add stable https://kubernetes-charts.storage.googleapis.com/
helm install my-ingress stable/nginx-ingress --set rbac.create=true

Cert-Manager 安装步骤:

kubectl apply --validate=false -f https://github.com/jetstack/cert-manager/releases/download/v0.15.1/cert-manager-legacy.crds.yaml
kubectl create namespace cert-manager
helm repo add jetstack https://charts.jetstack.io
helm repo update
helm install \
  cert-manager jetstack/cert-manager \
  --namespace cert-manager \
  --version v0.15.1 \
  # --set installCRDs=true

我的 issuer.yaml

apiVersion: cert-manager.io/v1alpha2
kind: ClusterIssuer
metadata:
  name: letsencrypt-prod
spec:
  acme:
    server: https://acme-v02.api.letsencrypt.org/directory
    email: "my@email.com"
    privateKeySecretRef:
      name: letsencrypt-prod
    solvers:
      - http01:
          ingress:
            class: nginx

我的证书.yaml

apiVersion: cert-manager.io/v1alpha2
kind: Certificate
metadata:
  name: mydomain.com
spec:
  secretName: cert
  issuerRef:
    name: letsencrypt-prod
    kind: ClusterIssuer
  commonName: mydomain.com
  dnsNames:
    - pgadmin.mydomain.com
  acme:
    config:
      - http01:
          ingressClass: nginx
        domains:
          - pgadmin.mydomain.com

最后是 ingress-service.yaml

 apiVersion: networking.k8s.io/v1beta1 #networking.k8s.io/v1beta1 # for versions before 1.14 use extensions/v1beta1
 kind: Ingress
 metadata:
   name: example-ingress
   namespace: default
   annotations:
     kubernetes.io/ingress.class: nginx
     nginx.ingress.kubernetes.io/rewrite-target: /
     cert-manager.io/cluster-issuer: "letsencrypt-prod"
     nginx.ingress.kubernetes.io/ssl-redirect: 'true'
     nginx.ingress.kubernetes.io/use-regex: 'true'
 spec:
   tls:
    - hosts:
        - pgadmin.mydomain.com
      secretName: cert
   rules:
     - host: pgadmin.mydomain.com
       http:
         paths:
         - path: /
           backend:
             serviceName: pgadmin-service
             servicePort: 9210

目前我的问题是当我尝试登录我的 pgadmin UI 时,我收到以下错误: error

容器日志:logs

我的域位于 CloudFlare 后面。 tls settings

如果还有什么需要请告诉我。

【问题讨论】:

    标签: nginx kubernetes configuration


    【解决方案1】:

    不要使用端口 443 .. 使用 80 并且不要在 pod 中使用 ssl。请在入口处终止

    【讨论】:

    • 我试过了,但没有运气。出现同样的错误。
    【解决方案2】:

    这是因为您没有将 TLS 证书传递给 pgadmin pod。

    documentation中提到,需要提供证书和密钥:

    PGADMIN_ENABLE_TLS

    默认值:

    如果未设置,容器将在端口 80 上侦听纯文本连接。如果设置为任何值,容器将在端口 443 上侦听 TLS 连接。

    启用 TLS 后,必须提供证书和密钥。 通常这些应存储在主机文件系统上并从容器中挂载。预期的路径是 /certs/server.crt 和 /certs/server.key

    你有两个选择:

    1. 使用volumes 在您的部署上提供密钥,如提到的here
    2. 在部署时使用端口 80 并在 Ingress 中配置 SSL。

    根据您提供的规范,您应该将部署文件更改为:

    ..
          env:
           - name: PGADMIN_DEFAULT_EMAIL
             value: "test@test.com"
           - name: PGADMIN_DEFAULT_PASSWORD
             value: "test!"
           ports:
           - containerPort: 80
    

    更改service 规范以指向正确的端口:

    apiVersion: v1
    kind: Service
    metadata:
      name: pgadmin-service
    spec:
      selector:
        frontend: pgadmin
      ports:
        - port: 80
          targetPort: 80
          protocol: TCP
    

    然后,将入口更改为正确的端口:

     spec:
       tls:
        - hosts:
            - pgadmin.mydomain.com
          secretName: cert
       rules:
         - host: pgadmin.mydomain.com
           http:
             paths:
             - path: /
               backend:
                 serviceName: pgadmin-service
                 servicePort: 80
    

    由于您使用的是nginx.ingress.kubernetes.io/ssl-redirectannotation,因此入口会将所有请求从端口 80 重定向到 443

    【讨论】:

    • 您好,我试过这种方法,但结果是一样的。 Console logs: https://imgur.com/a/6zvDnRECookie: https://imgur.com/a/Sy0CSICPayload: next=%2Fbrowser%2F&csrf_token=Ijk0NDU3ZjQ3ODYwNDEzMmIxODIwYTk4OGFmZjJkZjg3M2M3M2VjMTMi.XvxbGg.habrY5SqFPWmvBS99BEvLei_aLg&email=test%test.com&password=mypass%21&language=enResponse is error code 400 BAD REQUEST@KoopaKiller
    • 您可以使用kubectl port-forward svc pgadmin-service 8080:80 确保服务正常工作,此命令会将端口8080 从您的机器映射到服务端口,您可以使用localhost:8080 访问它们。只是为了消除 Ingress 错误配置。您能否确认一切正常?
    • 嗨,我已经尝试过了,它按预期工作。我能够毫无问题地登录。
    • 好的,在确定应用程序运行正常后,让我们把精力放在 ingress 上。您可以在没有 Cloudflare 的情况下测试域入口吗?此外,确保证书是使用命令kubectl describe certificate 颁发的。请分享结果
    • 好的,我对 Cloudflare 如何使用 TLS 模式没有太多经验,也许你可以在 Cloudflare 支持中打开一个代码。但是现在您可以确定问题不在您的 kubernetes 部署中。 =)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-20
    • 2019-09-01
    • 2021-11-02
    • 2022-08-02
    • 1970-01-01
    • 2022-01-01
    • 2020-01-09
    相关资源
    最近更新 更多