Как настроить безопасный cockroachdb на Kubernetes, чтобы он был доступен из NodeJs

Я новичок как в Kubernetes, так и в CockroachDB. У меня есть защищенная база данных с несколькими узлами, работающая в кластере Kubernetes, и я могу выставить ее извне и отслеживать ее с помощью пользовательского интерфейса таракана.

список услуг

Теперь я хочу получить к нему доступ из приложения узла, используя либо pg для узла, либо сиквелиз. Однако я получаю тайм-ауты соединения.

Я считаю, что мне нужно создать сертификат клиента и использовать его для установления соединения, но я не могу найти конкретных документов Kubernetes о том, как это сделать. Если кому-то это удалось, как вы создали сертификат и как вы использовали его в своем приложении узла?


person bruce    schedule 08.02.2018    source источник
comment
Как вы запустили таракана? Для этого есть рулевая диаграмма. Вы развертываете приложение узла в том же кластере?   -  person Lev Kuznetsov    schedule 08.02.2018
comment
Ваше приложение должно работать в том же кластере kubernetes, чтобы получать клиентские сертификаты (см. документацию), или вы можете запустить с sslmode=require (предупреждение: в этом режиме не будет защиты MITM).   -  person Marc    schedule 08.02.2018
comment
Я использовал метод, задокументированный тараканом. cockreachlabs.com/docs/stable/ . Все работает хорошо для локального встроенного клиента. Теперь я хочу иметь доступ к нему из внешних приложений, а не из какой-либо среды kubernetes.   -  person bruce    schedule 08.02.2018
comment
Если вы хотите получить доступ к безопасному развертыванию из-за пределов kubernetes, вам нужно уменьшить уровень ssl, чтобы пропустить проверку хоста и даже игнорировать ЦС, если у вас нет ca.crt.   -  person Marc    schedule 08.02.2018


Ответы (1)


Я понял, как это сделать, подбирая сертификаты, которые я сгенерировал для локального клиента sql, и повторно используя их в своем приложении узла - вот так

const pool = new Pool({
  host: 'xxxx',
  max: 20,
  idleTimeoutMillis: 30000,
  connectionTimeoutMillis: 2000,
  port:26257,
  user:"root",
  database:"xxxx",
  ssl : {
      rejectUnauthorized : false,
      ca   : fs.readFileSync("./ca/ca.crt").toString(),
      key  : fs.readFileSync("./ca/client.xxxx.key").toString(),
      cert : fs.readFileSync("./ca/client.xxxx.crt").toString()
  }

});

Я представил общедоступный модуль как сервис в kubernetes, как это

kubectl expose service cockroachdb-public --port=26257 --target-port=26257 --name=cp --type=LoadBalancer

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

На самом деле довольно просто, но голова царапается, когда вы приближаетесь к нему в первый раз. Спасибо тем, кто нашел время, чтобы прокомментировать.

@samstride только что заметил ваш комментарий. Вероятно, лучше использовать пользователя, отличного от root, но вы можете получить эти сертификаты вот так (вероятно, и другими способами).

ca (используя модуль cockroachdb-client-secure, если он у вас все еще работает)

kubectl exec cockroachdb-client-secure -it -- cat /cockroach-certs/ca.crt  > ./ca.crt

ключ

kubectl get secret default.client.root -o jsonpath='{.data.key}' | base64 --decode > client.root.key 

сертификат

kubectl get secret default.client.root -o jsonpath='{.data.cert}' | base64 --decode > client.root.crt
person bruce    schedule 08.02.2018
comment
Это действительно лучший способ сделать это? Вы сделали порт общедоступным. Кажется, что этим можно злоупотреблять. Я предполагаю, что nodeJS работает внутри кластера, а это означает, что открывать порт для Интернета не нужно... - person Rambatino; 24.05.2018
comment
Да, вы совершенно правы. API и база данных работают в частном кластере kubernetes и могут обмениваться данными в этой среде, при этом API предоставляется через службу входа, а дБ вообще не раскрывается. Это просто для того, чтобы иметь возможность получить соединение dB с dev dB из внешней среды разработки или клиента dB, такого как postico. - person bruce; 26.05.2018
comment
Привет, у меня похожая ситуация — у меня есть кластер DEV DB на GCP Kubernetes Engine, настроенный с использованием документации по адресу ссылка — я запустил kubectl expose service cockroachdb-public ... для создания балансировщика нагрузки и для того, чтобы быть общедоступным. У меня есть код на моей локальной машине, и мне нужно получить 3 файла для возможности подключения к БД - ca.crt, client.key, client.crt Не могли бы вы поделиться, как вы это сделали, подобрав сертификаты, которые я сгенерировал для локального клиента sql. Заранее спасибо. - person samstride; 15.08.2018
comment
@bruce спасибо, что поделились, как получить ключ и сертификат. Похоже, что управляемая служба БД тараканов сейчас делает то же самое, чтобы люди, использующие их управляемую службу, могли подключаться к БД из-за пределов кластера. Будет полезно узнать, действительно ли они делают то же, что и вы, или есть другой/лучший способ добиться того же конечного результата. - person samstride; 02.11.2018
comment
@samstride Я задокументировал весь процесс настройки защищенной базы данных тараканов в Kubernetes с набором скриптов. См. шаги 9–16, чтобы узнать все о пользовательских сертификатах. ramblings.mcpher.com/Home/excelquirks/cloudplatform/ - person bruce; 04.11.2018