Не удалось позвонить в сервис Kubernetes - PullRequest
1 голос
/ 29 апреля 2020

версия kubernetes: 1.5.2
os: centos 7
версия etcd: 3.4.0

Сначала я создаю модуль etcd, файл etcd dockerfile и etcd pod:
etcd dockerfile:

FROM alpine

COPY . /usr/bin
WORKDIR /usr/bin

CMD etcd --listen-client-urls http://0.0.0.0:2379 --advertise-client-urls http://0.0.0.0:2379

EXPOSE 2379

файл pod yaml

apiVersion: v1
kind: Pod
metadata:
  name: etcd
  namespace: storageplatform
  labels:
    app: etcd
spec:
  containers:
    - name: etcd
      image: "karldoenitz/etcd:3.4.0"
      ports:
        - containerPort: 2379
          hostPort: 12379

После создания образа docker и pu sh в dockerhub я запускаю команду kubectl apply -f etcd.yaml для создать модуль etcd. Ip пакета etcd 10.254.140.117, я выполнил команду use ETCDCTL_API=3 etcdctl --endpoints=175.24.47.64:12379 put 1 1 и получил OK.
Мой сервис yaml:

apiVersion: v1
kind: Service
metadata:
  name: storageservice
  namespace: storageplatform
spec:
  type: NodePort
  ports:
    - port: 12379
      targetPort: 12379
      nodePort: 32379
  selector:
    app: etcd

применил файл yaml для создания service.run команда kubectl get services -n storageplatform, я получил эту информацию.

NAMESPACE         NAME                   CLUSTER-IP       EXTERNAL-IP   PORT(S)           AGE
storageplatform   storageservice         10.254.140.117   <nodes>       12379:32379/TCP   51s

В конце концов, я запускаю команду

ETCDCTL_API=3 etcdctl --endpoints=10.254.140.117:32379 get 1

или

ETCDCTL_API=3 etcdctl --endpoints={host-ip}:32379 get 1

Я получил Error: context deadline exceeded.

В чем дело ? Как сделать услугу полезной?

Ответы [ 2 ]

3 голосов
/ 29 апреля 2020

Вы определили службу, которая доступна внутри сети kubernetes, используя имя службы / ip (10.254.140.117) и порт службы (12379) и которая доступна на ВСЕХ узлах кластера kubernetes даже вне сети kubernetes с помощью порт узла (32379)

Необходимо исправить службу для сопоставления с правильным портом контейнера: targetPort должен совпадать с модулем containerPort (и портом в файле Docker).

Если ошибка Error: context deadline exceeded сохраняется, это указывает на проблему со связью. Это может быть объяснено при использовании внутреннего сервиса ip с портом внешнего узла (ваш первый get 1). Для порта узла (ваша вторая команда) я предполагаю, что либо модуль etcd работает неправильно, либо порт защищен брандмауэром на узле.

1 голос
/ 29 апреля 2020

Измените услугу на containerPort вместо hostPort

apiVersion: v1
kind: Service
metadata:
  name: storageservice
  namespace: storageplatform
spec:
  type: NodePort
  ports:
    - port: 2379
      targetPort: 2379
      nodePort: 32379
  selector:
    app: etcd
...