我有一个 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 文件,您需要确保它们具有后续步骤中的正确格式
- 您需要首先将它们格式化,创建 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:
- Configure the OAuth consent screen.
- Create OAuth credentials.
- 通过运行以下命令将 ID 和 Secret 转换为 base64:
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/