#ruby-on-rails #kubernetes #websocket #ruby-on-rails-6 #actioncable
Вопрос:
Я пытаюсь настроить некоторые зонды для контейнера websocket (рельсы с action_cable)
Я не уверен, как настроить такие зонды (и если это вообще возможно), я нахожу мало документации по этому варианту использования в k8s
Вот соответствующий раздел конфигурации моего файла развертывания
containers:
- name: {{ .Chart.Name }}
image: xxx
ports:
- name: action-cable
containerPort: 28080
protocol: TCP
command: ["/bin/sh"]
args:
- -c
- |
passenger start
--environment {{ .Values.global.appEnvironment }}
--port 28080
-R cable/config.ru
--max-pool-size 2
# See recommended sidekik_alive config on github
livenessProbe:
httpGet:
path: /cable
port: action-cable
httpHeaders:
- name: Origin
value: "https://{{ .Values.global.hostname }}"
- name: Upgrade
value: Websocket
- name: Connection
value: Upgrade
(и аналогичная конфигурация для readinessProbe и startupProbe)
Я получаю следующие ошибки (в начале по какой-то причине включен 1 запрос, не относящийся к WebSocket /
, но затем он повторяется с GET /cable
[WebSocket]
App 191 output: Started HEAD "/"[non-WebSocket] for 127.0.0.1 at 2021-10-06 09:58:53 0000
App 191 output: Failed to upgrade to WebSocket (REQUEST_METHOD: HEAD, HTTP_CONNECTION: , HTTP_UPGRADE: )
App 191 output: Finished "/"[non-WebSocket] for 127.0.0.1 at 2021-10-06 09:58:53 0000
# -- then loop on the following:
App 191 output: Started GET "/cable" [WebSocket] for 10.42.0.197 at 2021-10-06 09:58:53 0000
App 191 output: Request origin not allowed: https://api.lb.k8s.dev.example.com
App 191 output: Failed to upgrade to WebSocket (REQUEST_METHOD: GET, HTTP_CONNECTION: upgrade, HTTP_UPGRADE: Websocket)
App 191 output: Finished "/cable" [WebSocket] for 10.42.0.197 at 2021-10-06 09:58:53 0000
Я думаю Request origin not allowed:
, что это может иметь значение, а может и не иметь, я перепробовал несколько конфигураций, включая ноль или фактический URL
В моей конфигурации rails application.rb я попробовал следующее (что все еще дает `
config.action_cable.allowed_request_origins = [
nil, # kubernetes hack
# I have also tried 'https://api.lb.k8s.dev.example.com'
]
config.action_cable.disable_request_forgery_protection = true
If it is not possible, should I resort to using some other type of probe ? (like a process alive probe ?)
EDIT: I was able to fix it somehow, but now my probe seems to be stuck by the ongoing websocket connection, I have
App 191 output: Successfully upgraded to WebSocket (REQUEST_METHOD: GET, HTTP_CONNECTION: upgrade, HTTP_UPGRADE: Websocket)
Но kubernetes остается в состоянии «Сбой при запуске», и я больше не вижу дополнительных проверок работоспособности (похоже, что k8s застрял с открытым подключением к websocket ?)