Ruby on rails 带有GCP Cloud SQL的Kubernetes应用程序不接受任何连接。Github上提供完整的源代码

Ruby on rails 带有GCP Cloud SQL的Kubernetes应用程序不接受任何连接。Github上提供完整的源代码,ruby-on-rails,kubernetes,google-cloud-sql,google-kubernetes-engine,cloud-sql-proxy,Ruby On Rails,Kubernetes,Google Cloud Sql,Google Kubernetes Engine,Cloud Sql Proxy,我创建了一个示例Rails 5应用程序,它使用谷歌云PostgreSQL。 我可以使用docker compose up在本地运行该应用程序,但当我将其部署到GCP时,我无法远程连接到该应用程序。 我尝试在他们使用的地方复制targetPort:http服务器 rails应用程序是。 我是不是做错了什么-| 在本地运行应用程序可以正常工作 创建一个GKE集群 设置PostgreSQL云SQL 我听从了老师的指示 并用这些值更新了我的config/database.yml和k8s/colors.y

我创建了一个示例Rails 5应用程序,它使用谷歌云PostgreSQL。 我可以使用docker compose up在本地运行该应用程序,但当我将其部署到GCP时,我无法远程连接到该应用程序。 我尝试在他们使用的地方复制
targetPort:http服务器

rails应用程序是。 我是不是做错了什么-|

在本地运行应用程序可以正常工作 创建一个GKE集群 设置PostgreSQL云SQL 我听从了老师的指示 并用这些值更新了我的config/database.yml和k8s/colors.yml

已部署但仍停留在ContainerCreating上 kubectl获得部署 但无法连接到应用程序 kubectl描述部署

Name:                   colors
Namespace:              default
CreationTimestamp:      Fri, 13 Jul 2018 10:37:06 +0200
Labels:                 app=colors
Annotations:            deployment.kubernetes.io/revision=1
                        kubectl.kubernetes.io/last-applied-configuration={"apiVersion":"apps/v1","kind":"Deployment","metadata":{"annotations":{},"labels":{"app":"colors"},"name":"colors","namespace":"default"},"spec":{"repl...
Selector:               app=colors
Replicas:               2 desired | 2 updated | 2 total | 0 available | 2 unavailable
StrategyType:           RollingUpdate
MinReadySeconds:        0
RollingUpdateStrategy:  25% max unavailable, 25% max surge
Pod Template:
  Labels:  app=colors
  Containers:
   colors:
    Image:  docker.io/stabenfeldt/colors:latest
    Port:   3000/TCP
    Environment:
      POSTGRES_HOST:      127.0.0.1:5432
      POSTGRES_USER:      <set to the key 'username' in secret 'cloudsql-db-credentials'>  Optional: false
      POSTGRES_PASSWORD:  <set to the key 'password' in secret 'cloudsql-db-credentials'>  Optional: false
    Mounts:               <none>
   cloudsql-proxy:
    Image:  gcr.io/cloudsql-docker/gce-proxy:1.11
    Port:   <none>
    Command:
      /cloud_sql_proxy
      -instances=MY-INSTANCE:europe-west1:staging=tcp:5432
      -credential_file=/secrets/cloudsql/credentials.json
    Environment:  <none>
    Mounts:
      /secrets/cloudsql from cloudsql-instance-credentials (ro)
  Volumes:
   cloudsql-instance-credentials:
    Type:        Secret (a volume populated by a Secret)
    SecretName:  cloudsql-instance-credentials
    Optional:    false
Conditions:
  Type           Status  Reason
  ----           ------  ------
  Available      False   MinimumReplicasUnavailable
  Progressing    True    ReplicaSetUpdated
OldReplicaSets:  <none>
NewReplicaSet:   colors-d9f744dc (2/2 replicas created)
Events:
  Type    Reason             Age   From                   Message
  ----    ------             ----  ----                   -------
  Normal  ScalingReplicaSet  1m    deployment-controller  Scaled up replica set colors-d9f744dc to 2
名称:颜色
名称空间:默认值
CreationTimestamp:2018年7月13日星期五10:37:06+0200
标签:app=colors
注释:deployment.kubernetes.io/revision=1
kubectl.kubernetes.io/last applicated configuration={“apiVersion”:“apps/v1”,“kind”:“Deployment”,“metadata”:{“annotations”:{},“labels”:{“app”:“colors”},“name”:“colors”,“namespace”:“default”},“spec”:{“repl…”。。。
选择器:app=colors
副本:需要2份|更新2份|共2份|可用0份|不可用2份
策略类型:RollingUpdate
最小就绪秒:0
滚动更新策略:最多25%不可用,最多25%喘振
Pod模板:
标签:app=colors
容器:
颜色:
图片:docker.io/stabenfeldt/colors:latest
端口:3000/TCP
环境:
POSTGRES_主持人:127.0.0.1:5432
POSTGRES_用户:可选:false
POSTGRES_密码:可选:false
挂载:
cloudsql代理:
图片:gcr.io/cloudsqldocker/gce代理:1.11
端口:
命令:
/云sql代理
-instances=MY-INSTANCE:europe-west1:staging=tcp:5432
-凭证文件=/secrets/cloudsql/credentials.json
环境:
挂载:
/来自cloudsql实例凭据(ro)的机密/cloudsql
卷数:
cloudsql实例凭据:
类型:Secret(由Secret填充的卷)
SecretName:cloudsql实例凭据
可选:false
条件:
类型状态原因
----           ------  ------
可用的错误最小值ReplicaSunAvailable
正在进行的真实复制
旧复制集:
NewReplicaSet:colors-d9f744dc(创建了2/2个副本)
活动:
从消息中键入原因年龄
----    ------             ----  ----                   -------
正常缩放复制集1m部署控制器将复制集颜色-d9f744dc缩放为2
kubectl描述服务

名称:颜色
名称空间:默认值
标签:
注释:kubectl.kubernetes.io/last applicated configuration={“apiVersion”:“v1”,“种类”:“服务”,“元数据”:{“注释”:{},“名称”:“颜色”,“命名空间”:“默认”},“规范”:{“端口”:[{“端口”:80,“目标端口”:3000}]。。。
选择器:app=colors
类型:负载平衡器
IP:10.55.252.91
负载平衡器入口:35.228.203.46
端口:80/TCP
目标端口:3000/TCP
节点端口:30964/TCP
端点:
会话关联:无
外部流量策略:群集
活动:
从消息中键入原因年龄
----    ------                ----  ----                -------
普通型4m服务控制器集群->负载平衡器
正常确保负载平衡器4m服务控制器确保负载平衡器
正常确保负载平衡器3m服务控制器确保负载平衡器
姓名:kubernetes
名称空间:默认值
标签:组件=apiserver
提供者=kubernetes
注释:
选择器:
类型:集群
IP:10.55.240.1
端口:https 443/TCP
目标端口:443/TCP
终点:35.228.79.249:443
会话关联:ClientIP
活动:

我看不出有任何错误,但这里有一些技巧可以验证Kubernetes对象与YAML相比的外观:

使用该命令可获取有关对象的详细信息,并确保对象设置正确

例如,如果您执行
kubectl description deployment
,则应验证是否存在以下行:

Port:       3000/TCP
对于您的服务-
kubectl描述服务

由于您使用此标签作为选择器,它可能会做一些古怪的事情,并尝试将负载平衡添加到自身,而不是包含应用程序的容器中

另外,作为术语的旁注,GCP(谷歌云平台)是谷歌服务的总称,GKE(谷歌Kubernetes引擎)是为您提供托管Kubernetes集群的服务


希望这能有所帮助。

我的电脑中可以有一个工作设置

k8s/colors.yml
您的POSTGRES_主机环境变量必须是localhost,而不是127.0.0.01:5432。您不需要在POSTGRES_主机中添加端口。我用您建议的命令的输出更新了我的帖子。不过,我无法从中获得任何进一步帮助的指针。@martins您是否尝试删除了该应用程序从loadbalancer添加标签?尝试删除loadbalancer(
kubetctl delete services colors
),并使用此命令重新创建它:
kubectl expose deployment colors--type“loadbalancer“--port 80--target port 8080
你好@kurtisvg,谢谢!我也试过了,但没有成功。现在它在容器创建中卡住了。请从导出项目中签出代码。\u ID=“your ID”./更新vars并运行.sh:-)1.您的bash脚本看起来不正确
kubectl apply -f k8s/colors.yml
kubectl get pods

NAME                    READY     STATUS              RESTARTS   AGE
colors-d9f744dc-d5l5v   0/2       ContainerCreating   0          5m
colors-d9f744dc-spmws   0/2       ContainerCreating   0          5m


kubectl logs d9f744dc-d5l5v -c colors  # => Nothing logged
NAME      DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
colors    2         2         2            0           7m
kubectl get svc
NAME         TYPE           CLUSTER-IP      EXTERNAL-IP      PORT(S)        AGE
colors       LoadBalancer   10.55.245.192   35.228.111.217   80:30746/TCP   1h
kubernetes   ClusterIP      10.55.240.1     <none>           443/TCP        1h
Name:                     colors
Namespace:                default
Labels:                   <none>
Annotations:              kubectl.kubernetes.io/last-applied-configuration={"apiVersion":"v1","kind":"Service","metadata":{"annotations":{},"name":"colors","namespace":"default"},"spec":{"ports":[{"port":80,"targetPort":3000}]...
Selector:                 app=colors
Type:                     LoadBalancer
IP:                       10.55.252.91
LoadBalancer Ingress:     35.228.203.46
Port:                     <unset>  80/TCP
TargetPort:               3000/TCP
NodePort:                 <unset>  30964/TCP
Endpoints:                <none>
Session Affinity:         None
External Traffic Policy:  Cluster
Events:
  Type    Reason                Age   From                Message
  ----    ------                ----  ----                -------
  Normal  Type                  1m    service-controller  ClusterIP -> LoadBalancer
  Normal  EnsuringLoadBalancer  1m    service-controller  Ensuring load balancer
  Normal  EnsuredLoadBalancer   30s   service-controller  Ensured load balancer
apiVersion: apps/v1
kind: Deployment
metadata:
  name: colors
  labels:
    app: colors

spec:
  replicas: 2
  selector:
    matchLabels:
      app: colors
  template:
    metadata:
      labels:
        app: colors
    spec:
      containers:
        - name: colors
          image: docker.io/stabenfeldt/colors:latest
          ports:
            - name: http-server
              containerPort: 3000


          env:
            - name: POSTGRES_HOST
              value: 127.0.0.1:5432
            - name: POSTGRES_USER
              valueFrom:
                secretKeyRef:
                  name: cloudsql-db-credentials
                  key: username
            - name: POSTGRES_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: cloudsql-db-credentials
                  key: password

        - name: cloudsql-proxy
          image: gcr.io/cloudsql-docker/gce-proxy:1.11
          command: ["/cloud_sql_proxy",
                    "-instances=PROJECT_ID:europe-west1:staging=tcp:5432",
                    "-credential_file=/secrets/cloudsql/credentials.json"]
          volumeMounts:
            - name: cloudsql-instance-credentials
              mountPath: /secrets/cloudsql
              readOnly: true

      volumes:
        - name: cloudsql-instance-credentials
          secret:
            secretName: cloudsql-instance-credentials

---


apiVersion: v1
kind: Service
metadata:
  name: colors
spec:
  type: LoadBalancer
  ports:
  - port: 80
    targetPort: 3000
  selector:
    app: colors
Name:                   colors
Namespace:              default
CreationTimestamp:      Fri, 13 Jul 2018 10:37:06 +0200
Labels:                 app=colors
Annotations:            deployment.kubernetes.io/revision=1
                        kubectl.kubernetes.io/last-applied-configuration={"apiVersion":"apps/v1","kind":"Deployment","metadata":{"annotations":{},"labels":{"app":"colors"},"name":"colors","namespace":"default"},"spec":{"repl...
Selector:               app=colors
Replicas:               2 desired | 2 updated | 2 total | 0 available | 2 unavailable
StrategyType:           RollingUpdate
MinReadySeconds:        0
RollingUpdateStrategy:  25% max unavailable, 25% max surge
Pod Template:
  Labels:  app=colors
  Containers:
   colors:
    Image:  docker.io/stabenfeldt/colors:latest
    Port:   3000/TCP
    Environment:
      POSTGRES_HOST:      127.0.0.1:5432
      POSTGRES_USER:      <set to the key 'username' in secret 'cloudsql-db-credentials'>  Optional: false
      POSTGRES_PASSWORD:  <set to the key 'password' in secret 'cloudsql-db-credentials'>  Optional: false
    Mounts:               <none>
   cloudsql-proxy:
    Image:  gcr.io/cloudsql-docker/gce-proxy:1.11
    Port:   <none>
    Command:
      /cloud_sql_proxy
      -instances=MY-INSTANCE:europe-west1:staging=tcp:5432
      -credential_file=/secrets/cloudsql/credentials.json
    Environment:  <none>
    Mounts:
      /secrets/cloudsql from cloudsql-instance-credentials (ro)
  Volumes:
   cloudsql-instance-credentials:
    Type:        Secret (a volume populated by a Secret)
    SecretName:  cloudsql-instance-credentials
    Optional:    false
Conditions:
  Type           Status  Reason
  ----           ------  ------
  Available      False   MinimumReplicasUnavailable
  Progressing    True    ReplicaSetUpdated
OldReplicaSets:  <none>
NewReplicaSet:   colors-d9f744dc (2/2 replicas created)
Events:
  Type    Reason             Age   From                   Message
  ----    ------             ----  ----                   -------
  Normal  ScalingReplicaSet  1m    deployment-controller  Scaled up replica set colors-d9f744dc to 2
Name:                     colors
Namespace:                default
Labels:                   <none>
Annotations:              kubectl.kubernetes.io/last-applied-configuration={"apiVersion":"v1","kind":"Service","metadata":{"annotations":{},"name":"colors","namespace":"default"},"spec":{"ports":[{"port":80,"targetPort":3000}]...
Selector:                 app=colors
Type:                     LoadBalancer
IP:                       10.55.252.91
LoadBalancer Ingress:     35.228.203.46
Port:                     <unset>  80/TCP
TargetPort:               3000/TCP
NodePort:                 <unset>  30964/TCP
Endpoints:                <none>
Session Affinity:         None
External Traffic Policy:  Cluster
Events:
  Type    Reason                Age   From                Message
  ----    ------                ----  ----                -------
  Normal  Type                  4m    service-controller  ClusterIP -> LoadBalancer
  Normal  EnsuringLoadBalancer  4m    service-controller  Ensuring load balancer
  Normal  EnsuredLoadBalancer   3m    service-controller  Ensured load balancer


Name:              kubernetes
Namespace:         default
Labels:            component=apiserver
                   provider=kubernetes
Annotations:       <none>
Selector:          <none>
Type:              ClusterIP
IP:                10.55.240.1
Port:              https  443/TCP
TargetPort:        443/TCP
Endpoints:         35.228.79.249:443
Session Affinity:  ClientIP
Events:            <none>
Port:       3000/TCP
LoadBalancer Ingress:     <PUBLIC_IP>
Port:                     <unset>  80/TCP
TargetPort:               3000/TCP
  labels:
    app: colors
# Remember to update MY-INSTANCE

apiVersion: v1
kind: Service
metadata:
  name: colors-frontend
  labels:
    app: colors
    tier: frontend
spec:
  type: LoadBalancer
  ports:
  - port: 80
    targetPort: http-server
  selector:
    app: colors
    tier: frontend

---

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: colors-frontend
  labels:
    app: colors
    tier: frontend
spec:
  replicas: 3
  template:
    metadata:
      labels:
        app: colors
        tier: frontend
    spec:
      volumes:
        - name: cloudsql-instance-credentials
          secret:
            secretName: cloudsql-instance-credentials

      containers:
        - name: cloudsql-proxy
          image: gcr.io/cloudsql-docker/gce-proxy:1.11
          command: ["/cloud_sql_proxy",
                    "-instances=MY-INSTANCE:europe-west1:development=tcp:5432",
                    "-credential_file=/secrets/cloudsql/credentials.json"]
          volumeMounts:
              - name: cloudsql-instance-credentials
                mountPath: /secrets/cloudsql
                readOnly: true


        - name: colors-app
          image: docker.io/stabenfeldt/colors:1
          imagePullPolicy: Always

          env:
            - name: RAILS_LOG_TO_STDOUT
              value: "true"
            - name: RAILS_ENV
              value: development
            - name: POSTGRES_HOST
              value: 127.0.0.1
            - name: POSTGRES_USERNAME
              valueFrom:
                secretKeyRef:
                  name: cloudsql-db-credentials
                  key: username
            - name: POSTGRES_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: cloudsql-db-credentials
                  key: password

          ports:
          - name: http-server
            containerPort: 3000