Сервис Kubernetes работает не так, как ожидалось - PullRequest
0 голосов
/ 08 января 2019

Мне не удается развернуть postgres (отдельный узел, официальный образ) на kubernetes и разрешить службам получать доступ к postgres через службу ClusterIP.

Конфигурация довольно проста - Пространство имен, Развертывание, Сервис:

---
apiVersion: v1
kind: Namespace
metadata:
  name: database
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  namespace: database
  name: postgres
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: postgres
    spec:
      containers:
        - name: postgres
          image: postgres:11.1
          imagePullPolicy: "IfNotPresent"
          ports:
            - containerPort: 5432
---
apiVersion: v1
kind: Service
metadata:
  name: pg
  namespace: database
  labels:
    app: postgres
spec:
  selector:
    app: postgres
  ports:
  - protocol: TCP
    name: postgres
    port: 5432
    targetPort: 5432

Для проверки выполняется «/ bin / bash» в модуле и запускается простая команда psql для проверки соединения. Все работает хорошо локально:

kubectl --kubeconfig $k8sconf -n database exec -it $(kubectl --kubeconfig $k8sconf -n database get pods -o jsonpath='{.items[*].metadata.name}') -- psql -U admin postgresdb -c "\t"
Tuples only is on.

Но как только я пытаюсь получить доступ к postgres через службу, команда завершается неудачно:

kubectl --kubeconfig $k8sconf -n database exec -it $(kubectl --kubeconfig $k8sconf -n database get pods -o jsonpath='{.items[*].metadata.name}') -- psql -h pg -U admin postgresdb -c "\t"
psql: could not connect to server: Connection timed out
    Is the server running on host "pg" (10.245.102.15) and accepting
    TCP/IP connections on port 5432?

Это проверено на DigitalOcean с одним узлом кластера (1.12.3).

Postgres прослушивал * на правильном порту, pg_hba.conf по умолчанию выглядит так:

...
local   all             all                                     trust
# IPv4 local connections:
host    all             all             127.0.0.1/32            trust
# IPv6 local connections:
host    all             all             ::1/128                 trust
# Allow replication connections from localhost, by a user with the
# replication privilege.
local   replication     all                                     trust
host    replication     all             127.0.0.1/32            trust
host    replication     all             ::1/128                 trust
host all all all md5

Воспроизвести см. Суть

Выполнить через (пожалуйста, используйте новый кластер и прочитайте через):

export k8sconf=/path/to/your/k8s/confic/file
kubectl --kubeconfig $k8sconf apply -f https://gist.githubusercontent.com/sontags/c364751e7f0d8ba1a02a9805efc68db6/raw/01b1808348541d743d6a861402cfba224bee8971/database.yaml
kubectl --kubeconfig $k8sconf -n database exec -it $(kubectl --kubeconfig $k8sconf -n database get pods -o jsonpath='{.items[*].metadata.name}') -- /bin/bash /reproducer/runtest.sh

Любой намек, почему сервис не позволяет подключиться или выполнить другие тесты?

1 Ответ

0 голосов
/ 08 января 2019

Трудно сказать без доступа к вашему кластеру. Это отлично работает на моем кластере AWS. Некоторые вещи, на которые стоит посмотреть:

  • Работает ли kube-прокси на всех узлах?
  • Ваш сетевой оверлей / CNI работает на всех узлах?
  • Это происходит только с pg pod? а как насчет других стручков?
  • DNS, кажется, в порядке, поскольку pg разрешается в 10.245.102.15
  • Ваши узлы разрешают IP-пересылку со стороны Linux?
  • Ваши правила брандмауэра Digital Ocean разрешают трафик из любого источника через порт 5432? Обратите внимание, что диапазон IP-адресов службы PodCidr и K8s отличается от hostCidr (ваших капель).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...