sslCertificateCouldNotParseCert - 同步到 GCP 时出错 :

标签 ssl google-cloud-platform terraform kubernetes-helm

我有一个 terraform 代码,它将部署前端应用程序并具有 ingress.yaml helm 图表。

ingress.yaml

{{- if .Values.ingress.enabled -}}
{{- if semverCompare ">=1.14-0" .Capabilities.KubeVersion.GitVersion -}}
apiVersion: networking.k8s.io/v1beta1
{{- else -}}
apiVersion: extensions/v1beta1
{{- end }}
kind: Ingress
metadata:
  name: {{ .Values.global.namespace }}-ingress
  namespace: {{ .Values.global.namespace }}
  labels:
    {{- include "test-frontend.labels" . | nindent 4 }}
  annotations:
    kubernetes.io/ingress.class: "gce-internal"
    kubernetes.io/ingress.allow-http: "false"
spec:
  {{- if .Values.ingress.tls }}
  tls:
    {{- range .Values.ingress.tls }}
    - hosts:
        {{- range .hosts }}
        - {{ . | quote }}
        {{- end }}
      secretName: {{ .secretName }}
    {{- end }}
  {{- end }}
  rules:
    {{- range .Values.ingress.hosts }}
    - host: {{ .host | quote }}
      http:
        paths:
          {{- range .paths }}
          - path: {{ .path }}
            backend:
              serviceName: {{ .servicename }}
              servicePort: {{ .serviceport }}
          {{- end }}
    {{- end }}
  {{- end }}

values.yaml

ingress:
  enabled: true
  annotations:
    kubernetes.io/ingress.class: "gce-internal"
    kubernetes.io/ingress.regional-static-ip-name : "ingress-internal-static-ip"
    kubernetes.io/ingress.allow-http: "false"
  hosts:
    - host: test-dev.test.com
      paths:
      - path: "/*"
        servicename: test-frontend-service
        serviceport: 80
      - path: "/api/*"
        servicename: test-backend-service
        serviceport: 80
  tls:
  - hosts:
    - test-dev.test.com
    secretName: ingress-tls-credential-file
    type: kubernetes.io/tls
    crt: <<test.pem value>>
    key: <<test.key value>>

terraform apply 命令成功运行。在 GCP 中,证书也被接受并进入 GCP 中的 Kubernetes 服务内部并运行。但是如果我将 .crt 和 .key 作为 terraform 代码中 values.yaml 中的文件传递

ingress:
      enabled: true
      annotations:
        kubernetes.io/ingress.class: "gce-internal"
        kubernetes.io/ingress.regional-static-ip-name : "ingress-internal-static-ip"
        kubernetes.io/ingress.allow-http: "false"
      hosts:
        - host: test-dev.test.com
          paths:
          - path: "/*"
            servicename: test-frontend-service
            serviceport: 80
          - path: "/api/*"
            servicename: test-backend-service
            serviceport: 80
      tls:
      - hosts:
        - test-dev.test.com
        secretName: ingress-tls-credential-file
        type: kubernetes.io/tls
        crt: file(../../.secret/test.crt)
        key: file(../../.secret/test.key)

values.yaml 会将证书发送到 helm->template->secret.yaml,它将创建 secret (ingress-tls-credential-file)

secret.yaml

{{- if .Values.ingress.tls }}
{{- $namespace := .Values.global.namespace }}
{{- range .Values.ingress.tls }}
apiVersion: v1
kind: Secret
metadata:
  name: {{ .secretName }}
  namespace: {{ $namespace }}
  labels:
    {{- include "test-frontend.labels" $ | nindent 4 }}
type: {{ .type }}
data:
  tls.crt: {{ toJson .crt | b64enc | quote }}
  tls.key: {{ toJson .key | b64enc | quote }}
{{- end }}
{{- end }}

我们在 GCP -> Kubernetes Engine -> 服务和入口中收到以下错误。如何将文件传递到values.yaml 文件。

Error syncing to GCP: error running load balancer syncing routine: loadbalancer 6370cwdc-isp-isp-ingress-ixjheqwi does not exist: Cert creation failures - k8s2-cr-6370cwdc-q0ndkz9m629eictm-ca5d0f56ba7fe415 Error:googleapi: Error 400: The SSL certificate could not be parsed., sslCertificateCouldNotParseCert

最佳答案

因此 Google 可以接受您的证书和 key 文件,您需要确保它们具有后续步骤中的正确格式

  1. 您需要首先将它们格式化,创建 Self Managed SSL Certificate resource使用 GCP 处理现有文件 Cloud Shell
gcloud compute ssl-certificates create CERTIFICATE_NAME \
    --certificate=CERTIFICATE_FILE \
    --private-key=PRIVATE_KEY_FILE \
    --region=REGION \
    --project=PROJECT_ID

然后,您需要完成更多步骤,以确保您拥有 .yaml 文件中所需的所有参数,并且您拥有适当的服务来接受来自该文件的信息(您可能已经完成了这些步骤):

  • 通过运行以下命令启用 Kubernetes Engine API:
  • gcloud services enable container.googleapis.com \
      --project=PROJECT_ID
    
  • 创建 GKE 集群:
  • gcloud container clusters create CLUSTER_NAME \
        --release-channel=rapid \
        --enable-ip-alias \
        --network=NETWORK_NAME \
        --subnetwork=BACKEND_SUBNET_NAME \
        --scopes=https://www.googleapis.com/auth/cloud-platform \
        --region=REGION --machine-type=MACHINE_TYPE \
        --project=PROJECT_ID
    
    • 集群是在 BACKEND_SUBNET_NAME 中创建的。
    • 集群使用的 GKE 版本为 1.18.9-gke.801 或更高版本。
    • 集群是在 Cloud Platform 范围内创建的。
    • 集群是使用您想要用来运行应用程序的所需服务帐户创建的。
    • 集群正在使用 n1-standard-4 机器类型或更好的机器类型。
  • 通过执行以下步骤启用 IAP:
  • echo -n 'CLIENT_ID' | base64
    echo -n 'CLIENT_SECRET' | base64
    
  • 创建内部静态 IP 地址,并为负载均衡器保留静态 IP 地址
  • gcloud compute addresses create STATIC_ADDRESS_NAME \
        --region=REGION --subnet=BACKEND_SUBNET_NAME \
        --project=PROJECT_ID
    
  • 通过运行以下命令获取静态 IP 地址:
  • gcloud compute addresses describe STATIC_ADDRESS_NAME \
        --region=REGION \
        --project=PROJECT_ID
    

    7.通过复制 gke_internal_ip_config_example.yaml 并将其重命名为 PROJECT_ID_gke_config.yaml 来创建值 YAML 文件:

    clientIDEncoded:之前步骤中的 Base64 编码的 CLIENT_ID。
    clientSecretEncoded:之前步骤中的 Base64 编码的 CLIENT_SECRET。
    certificate.name:您之前创建的CERTIFICATE_NAME。
    initialEmail:将设置自定义治理的初始用户的 INITIAL_USER_EMAIL 电子邮件地址。
    staticIpName:您之前创建的 STATIC_ADDRESS_NAME。

    完成上述步骤后再次尝试部署。

    关于sslCertificateCouldNotParseCert - 同步到 GCP 时出错 :,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66968287/

    相关文章:

    macos - 如何重写 httpd-vhosts.conf 以允许 SSL 连接到私有(private) Web 服务器?

    ssl - curl 和对话框弹出窗口

    google-compute-engine - 我的GCE实例每天都会重启,我想知道原因

    java - 如何从网站运行基于云的java程序

    amazon-cloudfront - Terraform,使用和不使用多个 Origins 创建一个 CloudFront 分发可重用模块

    node.js - TLS + NodeJS,如何在服务器端获取客户端的公钥字节

    java - Google Storage API 中的死锁

    terraform - 重构 terraform 代码时,是否有一种理智的方法来更新相应的 terraform 状态?

    azure - 错误 : Failed to get existing workspaces: containers. 客户端#ListBlobs:

    java - 使用 RSAL Toolkit 的 SSL 未被 jar 错误封装