Версия kubernetes: 1.5.2
ОС: Centos 7
Версия etcd: 3.4.0

Сначала я создаю pod etcd, файл YAML 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

Файл под ямл

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 и отправки в 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.
Мой сервис ямл:

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.

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

1
Karl Doenitz 29 Апр 2020 в 14:28

2 ответа

Лучший ответ

Измените службу, указав containerPort вместо hostPort

apiVersion: v1
kind: Service
metadata:
  name: storageservice
  namespace: storageplatform
spec:
  type: NodePort
  ports:
    - port: 2379
      targetPort: 2379
      nodePort: 32379
  selector:
    app: etcd
1
Arghya Sadhu 29 Апр 2020 в 13:53

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

Вам необходимо исправить службу, чтобы сопоставить с правильным портом контейнера: targetPort должен соответствовать модулю containerPort (и порту в файле docker).

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

3
Thomas 29 Апр 2020 в 14:14