# #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