Проблема с отображением приложения Rails на конечной точке с помощью автопилота GKE

# #ruby-on-rails #nginx #kubernetes #google-kubernetes-engine

Вопрос:

Проблема в том, что конечная точка балансировщика нагрузки зависает и не выдает никаких журналов, которые я могу найти.

Chrome отображает: Этот сайт недоступен 35.213.138.112 слишком долго не отвечал.

Я застрял на этом в течение 6 часов и изо всех сил пытался найти соответствующую документацию по Kubernetes и Ruby on Rails. Я предполагаю, что проблема в чем-то простом и решается с помощью моей конфигурации Kubernetes..

Мой файл docker:

 FROM ruby:2.6.8
RUN apt-get update -qq amp;amp; apt-get install -y nodejs npm postgresql-client
RUN npm install --global yarn
WORKDIR /src/app
COPY Gemfile ./
ADD . /src/app
Copy vendor/gems/* /src/app/vender/gems/
ENV RAILS_ENV production
RUN bundle install --deployment --without development test

# ENV RAILS_ENV production
RUN bundle exec rake assets:precompile

# Start the main process.
CMD ["bundle", "exec", "rails", "server", "-b", "0.0.0.0"]
 

Моя конфигурация развертывания:

 apiVersion: apps/v1
kind: Deployment
metadata:
  labels: 
    name: "test-2"
  name: "test-2"
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      app: "test-2"
  template:
    metadata:
      labels:
        app: "test-2"
    spec:
      containers:
      - name: "test1-sha256-1"
        image: "gcr.io/path-to-image"
        ports:
        - containerPort: 3000
          protocol: TCP
        env:
          - name: PORT
            value: "3000"
          - name: RAILS_SERVE_STATIC_FILES
            value: "true"
      serviceAccountName: test-ksa
---
apiVersion: "autoscaling/v2beta1"
kind: "HorizontalPodAutoscaler"
metadata:
  name: "test-2-hsdfsdf"
  namespace: "default"
  labels:
    app: "test-2"
spec:
  scaleTargetRef:
    kind: "Deployment"
    name: "test-2"
    apiVersion: "apps/v1"
  minReplicas: 1
  maxReplicas: 5
  metrics:
  - type: "Resource"
    resource:
      name: "cpu"
      targetAverageUtilization: 80
 

Мой журнал модуля (кажется, работает нормально):

 Puma starting in single mode...
* Puma version: 5.5.0 (ruby 2.6.8-p205) ("Zawgyi")
*  Min threads: 5
*  Max threads: 5
*  Environment: production
*          PID: 1
* Listening on http://0.0.0.0:3000
 

Моя конфигурация балансировщика нагрузки:

 apiVersion: v1
kind: Service
metadata:
  annotations:
    cloud.google.com/neg: '{"ingress":true}'
  creationTimestamp: "2021-10-02T02:39:22Z"
  finalizers:
  - service.kubernetes.io/load-balancer-cleanup
  labels:
    name: test-no-nginx
  managedFields:
  - apiVersion: v1
    fieldsType: FieldsV1
    fieldsV1:
      f:metadata:
        f:labels:
          .: {}
          f:name: {}
      f:spec:
        f:externalTrafficPolicy: {}
        f:ports:
          .: {}
          k:{"port":80,"protocol":"TCP"}:
            .: {}
            f:port: {}
            f:protocol: {}
            f:targetPort: {}
        f:selector:
          .: {}
          f:app: {}
        f:sessionAffinity: {}
        f:type: {}
    manager: GoogleCloudConsole
    operation: Update
    time: "2021-10-02T02:39:22Z"
  - apiVersion: v1
    fieldsType: FieldsV1
    fieldsV1:
      f:metadata:
        f:finalizers:
          .: {}
          v:"service.kubernetes.io/load-balancer-cleanup": {}
      f:status:
        f:loadBalancer:
          f:ingress: {}
    manager: kube-controller-manager
    operation: Update
    time: "2021-10-02T02:40:05Z"
  name: test-no-nginx-service
  namespace: default
  resourceVersion: "83916"
  uid: 9b560670-1f4d-41f7-8301-fd6b5c0e18d2
spec:
  clusterIP: 10.95.123.231
  clusterIPs:
  - 10.95.123.231
  externalTrafficPolicy: Cluster
  ports:
  - nodePort: 32663
    port: 80
    protocol: TCP
    targetPort: 3000
  selector:
    app: test-2
  sessionAffinity: None
  type: LoadBalancer
status:
  loadBalancer:
    ingress:
    - ip: 35.233.233.11
 

Если я добавлю контейнер nginx в конфигурацию развертывания и не установлю целевой порт для балансировщика нагрузки, я смогу увидеть «Добро пожаловать в nginx!» просто отлично.

конфигурация для контейнера nginx в deployment.yml:

 containers:
 - name: "nginx-1"
   image: "nginx:latest"
 

Спасибо за потраченное время, я вам очень признателен.

Ответ №1:

Я решил эту проблему, настроив ingress-nginx с помощью команды install из https://kubernetes.github.io/ingress-nginx/deploy/

Входное отверстие:

 apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress-test
  annotations:
    ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  - host: domain.com
    http:
      paths:
        - path: /
          pathType: ImplementationSpecific
          backend:
            service:
              name: test
              port:
                number: 80
  ingressClassName: nginx
---
apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
  name: nginx
spec:
  controller: k8s.io/ingress-nginx
 

И узловой порт

 apiVersion: v1
kind: Service
metadata:
  name: test
  namespace: default
  annotations:
    cloud.google.com/neg: '{"ingress": true}'
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 3000
  selector:
    app: test
  type: NodePort