LINUX.ORG.RU
решено ФорумAdmin

знакомство с k8s: не получается экспортировать сервис наружу

 


0

1

Доброго времени суток

Есть тестовый кластер k8s, установленный по книге Маркелова. Соответсвенно, сетевой ( CNI ) модуль - flannel

Pod'ы создаются, но expose работает частично - не назначается внешний адрес, и соответственно сервисы доступны только изнутри самого кластера. Что бесполезно чуть менее, чем полностью

  • при "--type=NodePort" external-ip просто пустой
  • при "--type=LoadBalancer" в external-ip висит «pending»

Гугл подсказывает, что LoadBalancer предустановлен только во взрослых облаках вроде aws, gce, aks и т.д. А для своих кластеров нужно ставить ingress. При этом документация подсказывает, что н ставится через сетевую policy, а flannel не поддерживает сетевые политики

То ли лыжи не едут, то ли я дурак. Но начинаю подозревать, что книжку я взял не очень хорошую... Кто-нибудь смог настроить expose на собственном кластере k8s ?

★★★★★

Последнее исправление: router (всего исправлений: 2)

Кто-нибудь смог настроить expose на собственном кластере k8s ?

«Что дозволено Юпитеру…»

Вообще, сервис с типом NodePort по умолчанию доступен по ip любой физической тачки из твоего кластера. Как ему присвоен внешний порт - смотри ч/з kubectl get svc

anonymous
()
Ответ на: комментарий от anonymous

Вообще, сервис с типом NodePort по умолчанию доступен по ip любой физической тачки из твоего кластера

У меня не так. Назначается рандомный адрес кластера ( его можно выбирать ), он ведёт на endpoint'ы, которые уже мапятся на адреса pod'ов

Как ему присвоен внешний порт - смотри ч/з kubectl get svc

Спасибо, так и делал. Вместе с «get ep» даст информацию о том, на какие pod'ы и их порты ведёт адрес кластера.

Постепенно до меня дошло - то, что я хочу ( примапить порт контейнера к адресам нод ) видимо не является типичным сценарием работы с kubernetes.

Вместо этого мне нужно детально разобраться в работе сетевого модуля ( и возможно не только flannel ), чтобы понимать как сделать адреса кластеров доступными снаружи, и вообще как вписать облако в сетевую инфраструктуру.

А пока для изучения можно поднять любой балансировщик, но не в контейнере, а на самих нодах, и уже через него иметь возможность попасть в приложения. Теоретически есть ещё kubectl proxy + ssh forwarding, но это уже слишком

В общем, Маркелов в книге хорошо рассказал про то, как использовать коммерческие облака на примере microsoft aks, а вся информация по докеру и куберу просто для возможности отладки. Чтобы поднять своё облако этого не достаточно, нужно серьёзно раскуривать официальную документацию по CNI модулям и хорошо разбираться в сетевой архитектуре.

router ★★★★★
() автор топика
Последнее исправление: router (всего исправлений: 2)
Ответ на: комментарий от router

Не могу подтвердить, т.к. живу не в РФ. Но сайт сам по себе работает.

ugoday ★★★★★
()
Ответ на: комментарий от router

В РФ робит. Как минимум два прова.

anc ★★★★★
()
Ответ на: комментарий от anonymous

Вообще, сервис с типом NodePort по умолчанию доступен по ip любой физической тачки из твоего кластера. Как ему присвоен внешний порт - смотри ч/з kubectl get svc

Нашёл! :) Может я просто тебя ( и книгу по k8s ) не так понял, но похоже они все переиграли

Да, доступен через внешний порт, но этот рандомный порт не имеет никакого отношения к тому, что было указано в expose

просто мапится на рандомный порт, который я пока могу увидеть только в iptables

[root@vm-docker-test-n1 ~]# kubectl expose deployment/nginx-deploy --port=80 --type=NodePort

[root@vm-docker-test-n1 ~]# iptables -nvx -t nat -L KUBE-NODEPORTS
Chain KUBE-NODEPORTS (1 references)
    pkts      bytes target     prot opt in     out     source               destination
       0        0 KUBE-MARK-MASQ  tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            /* default/nginx-deploy: */ tcp dpt:31264
       0        0 KUBE-SVC-KPPNLP6EKXQHRN5P  tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            /* default/nginx-deploy: */ tcp dpt:31264

[root@vm-docker-test-n1 ~]# kubectl version
Client Version: version.Info{Major:"1", Minor:"15", GitVersion:"v1.15.0", GitCommit:"e8462b5b5dc2584fdcd18e6bcfe9f1e4d970a529", GitTreeState:"clean", BuildDa}
Server Version: version.Info{Major:"1", Minor:"15", GitVersion:"v1.15.0", GitCommit:"e8462b5b5dc2584fdcd18e6bcfe9f1e4d970a529", GitTreeState:"clean", BuildDa}

[root@vm-docker-test-n1 ~]# docker version
Client:
 Version:           18.09.7
 API version:       1.39
 Go version:        go1.10.8
 Git commit:        2d0083d
 Built:             Thu Jun 27 17:56:06 2019
 OS/Arch:           linux/amd64
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          18.09.7
  API version:      1.39 (minimum version 1.12)
  Go version:       go1.10.8
  Git commit:       2d0083d
  Built:            Thu Jun 27 17:26:28 2019
  OS/Arch:          linux/amd64
  Experimental:     false


[root@vm-docker-test-n1 ~]# kubectl get svc -o wide
NAME           TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE    SELECTOR
kubernetes     ClusterIP   10.96.0.1       <none>        443/TCP        10d    <none>
nginx-deploy   NodePort    10.108.80.117   <none>        80:31264/TCP   5d6h   app=nginx-deploy

[root@vm-docker-test-n1 ~]# kubectl get ep
NAME           ENDPOINTS         AGE
kubernetes     10.73.7.10:6443   10d
nginx-deploy   10.244.1.5:80     5d6h

router ★★★★★
() автор топика
Ответ на: комментарий от router
ok@vk:~/Документы/scripts/iptables_map$ curl http://vm-docker-test-n1:31264
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
router ★★★★★
() автор топика

А для своих кластеров нужно ставить ingress.

Да. Посмотри на traefik. nginx жирный слишком, как по мне.

При этом документация подсказывает, что н ставится через сетевую policy, а flannel не поддерживает сетевые политики

Эм, что?

anonymous
()
Ответ на: комментарий от anonymous

Эм, что?

я уже забыл, где это нашёл. возможно на серверфолт, но это не точно. голова пухнет от того, что я вкурил за эти полторы недели

router ★★★★★
() автор топика
Ответ на: комментарий от anonymous

Посмотри на traefik

Спасибо, посмотрю

router ★★★★★
() автор топика
Ответ на: комментарий от router

Может ты про плагин portmap? (нужен чтобы мапить порты контейнера ingress-сервера на хост)

Да, его не было во flannel v0.9.1 (и ранее). В версии v0.10.0 плагин есть.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.