【发布时间】:2020-12-06 01:10:17
【问题描述】:
我正在尝试完成以下在 GKE 上部署 Wordpress 的教程: https://cloud.google.com/kubernetes-engine/docs/tutorials/persistent-disk
我使用 terraform 来配置 gcp 资源,而不是教程推荐的 gcp。这是导致 CrashLoopBackOff 状态的部署。
apiVersion: apps/v1
kind: Deployment
metadata:
name: wordpress
labels:
app: wordpress
spec:
replicas: 1
selector:
matchLabels:
app: wordpress
template:
metadata:
labels:
app: wordpress
spec:
containers:
- image: wordpress
name: wordpress
env:
- name: WORDPRESS_DB_HOST
value: 127.0.0.1:3306
# These secrets are required to start the pod.
- name: WORDPRESS_DB_USER
valueFrom:
secretKeyRef:
name: cloudsql-db-credentials
key: username
- name: WORDPRESS_DB_PASSWORD
valueFrom:
secretKeyRef:
name: cloudsql-db-credentials
key: password
ports:
- containerPort: 80
name: wordpress
volumeMounts:
- name: wordpress-persistent-storage
mountPath: /var/www/html
# Change archtek-wordpress:us-west1:archtek-wordpress-postgres-instance here to include your GCP
# project, the region of your Cloud SQL instance and the name
# of your Cloud SQL instance. The format is
# ::
- name: cloudsql-proxy
image: gcr.io/cloudsql-docker/gce-proxy:1.11
command: ["/cloud_sql_proxy",
"-instances=archtek-wordpress:us-west1:archtek-wordpress-mysql-instance=tcp:3306",
# If running on a VPC, the Cloud SQL proxy can connect via Private IP. See:
# https://cloud.google.com/sql/docs/mysql/private-ip for more info.
# "-ip_address_types=PRIVATE",
"-credential_file=/secrets/cloudsql/key.json"]
securityContext:
runAsUser: 2 # non-root user
allowPrivilegeEscalation: false
volumeMounts:
- name: cloudsql-instance-credentials
mountPath: /secrets/cloudsql
readOnly: true
imagePullPolicy: Always
volumes:
- name: wordpress-persistent-storage
persistentVolumeClaim:
claimName: wordpress-volumeclaim
- name: cloudsql-instance-credentials
secret:
secretName: cloudsql-instance-credentials
当我描述 pod 时,我在日志中看到以下内容:
wordpress-54c68dbf59-5djfx wordpress MySQL Connection Error: (2002) Connection refused
为了排除凭据无效的想法,我使用了用于创建 cloudsql-db-credentials 的用户名和密码,即我的部署 yaml 中引用的 k8s 机密,并运行了它。
$: gcloud sql connect archtek-wordpress-mysql-instance -u wordpress
我可以连接,没问题。但我发现我也不能这样做:
$: mysql -u wordpress -p'$CLOUD_SQL_PASSWORD' \ ()
-h 35.197.7.98 -P 3306 \
-D archtek-wordpress:us-west1:archtek-wordpress-mysql-instance -v
返回:
ERROR 2003 (HY000): Can't connect to MySQL server on '35.197.7.98' (60)
我知道,当使用gcloud 客户端连接到 cloudsql 数据库时,它会在身份验证前 5 分钟将 ip 列入白名单,这可能解释了为什么 mysql 客户端无法进行身份验证。但是,我不确定这个理由是否适用于我在集群中的部署。是否也需要将其列入白名单,cloudsql 才能接受身份验证请求?
这是用于配置 cloudsql 实例的 terraform 文件:
resource "google_sql_database_instance" "postgres" {
name = "archtek-wordpress-mysql-instance"
database_version = "MYSQL_5_7"
settings {
tier = "db-f1-micro"
availability_type = "ZONAL"
}
}
【问题讨论】:
-
试试
kubectl exec <pod name> -- mysql -u wordpressb -p '$CLOUD_SQL_PASSWORD' -h 35.197.7.98 -P 3306 -D archtek-wordpress:us-west1:archtek-wordpress-mysql-instance -v -
如果上述方法失败,请尝试相同的命令,但以明文形式输入密码,而不是使用 CLOUD_SQL_PASSWORD 变量
-
两者都返回以下内容:
ERROR 2003 (HY000): Can't connect to MySQL server on '35.197.7.98' (110) -
您是否启用了白名单?
-
我按照本教程进行操作,无需任何额外的重新配置、gcloud 命令和
mysql命令(在添加要连接的 IP 后)从 wordpress pod 使用代理连接到cloudsql实例)。您能否展示负责创建此cloudsql实例的 Terraform 文件?此外,您在mysql命令中有错字:“wordpressb”。
标签: mysql kubernetes google-cloud-platform google-kubernetes-engine google-cloud-sql