Exposing Services in Kubernetes
Існують різні способи викриття сервісів в Kubernetes, щоб внутрішні та зовнішні точки доступу могли до них звертатися. Ця конфігурація Kubernetes є досить критичною, оскільки адміністратор може надати доступ зловмисникам до сервісів, до яких вони не повинні мати доступ.
Автоматичне перелічення
Перед тим як почати перелікати способи, які пропонує K8s для викриття сервісів для громадського доступу, знайте, що якщо ви можете перелічити простори імен, сервіси та входи, ви зможете знайти все, що викрито для громадського доступу за допомогою:
ClusterIP
ClusterIP - це служба Kubernetes за замовчуванням. Вона надає вам службу всередині вашого кластера, до якої можуть отримати доступ інші додатки всередині вашого кластера. Зовнішній доступ відсутній.
Однак до неї можна отримати доступ за допомогою проксі Kubernetes:
Зараз ви можете перейти до API Kubernetes, щоб отримати доступ до сервісів за допомогою цієї схеми:
http://localhost:8080/api/v1/proxy/namespaces/<NAMESPACE>/services/<SERVICE-NAME>:<PORT-NAME>/
Наприклад, ви можете використати наступний URL:
http://localhost:8080/api/v1/proxy/namespaces/default/services/my-internal-service:http/
для доступу до цього сервісу:
Цей метод вимагає виконання kubectl
як аутентифікованого користувача.
Перелік усіх ClusterIPs:
NodePort
Коли використовується NodePort, вказаний порт стає доступним на всіх вузлах (що представляють віртуальні машини). Трафік, спрямований на цей конкретний порт, систематично маршрутизується до сервісу. Зазвичай цей метод не рекомендується через його недоліки.
Перелік усіх NodePorts:
Приклад специфікації NodePort:
Якщо ви не вказуєте nodePort в yaml (це порт, який буде відкрито), буде використано порт у діапазоні від 30000 до 32767.
LoadBalancer
Використовує зовнішній доступ до Сервісу за допомогою балансувальника навантаження хмарного постачальника. На GKE це запустить Мережевий балансувальник навантаження, який надасть вам одну IP-адресу, яка буде пересилати весь трафік на ваш сервіс. У AWS це запустить Балансувальник навантаження.
Вам потрібно платити за кожен балансувальник навантаження за кожен викритий сервіс, що може бути дорогим.
Перелік усіх балансувальників навантаження:
Зовнішні IP-адреси
Зовнішні IP-адреси викриваються службами типу Load Balancers і, як правило, використовуються, коли використовується зовнішній балансувальник навантаження хмарного постачальника.
Щоб їх знайти, перевірте балансувальники навантаження зі значеннями у полі EXTERNAL-IP
.
Трафік, який входить у кластер з зовнішнім IP-адресою (як IP-адреса призначення), на порт служби буде маршрутизований до одного з кінцевих точок служби. externalIPs
не керуються Kubernetes і є відповідальністю адміністратора кластера.
У специфікації служби можна вказати externalIPs
разом з будь-якими ServiceTypes
. У наведеному нижче прикладі "my-service
" може бути доступний для клієнтів за "80.11.12.10:80
" (externalIP:port
)
ExternalName
З документації: Сервіси типу ExternalName відображають Сервіс на DNS-ім'я, а не на типовий селектор, такий як my-service
або cassandra
. Ви вказуєте ці Сервіси за допомогою параметра spec.externalName
.
Наприклад, це визначення Сервісу відображає Сервіс my-service
в просторі імен prod
на my.database.example.com
:
Під час пошуку хоста my-service.prod.svc.cluster.local
сервіс DNS кластера повертає запис CNAME
зі значенням my.database.example.com
. Доступ до my-service
працює так само, як і до інших сервісів, але з важливою відмінністю, що перенаправлення відбувається на рівні DNS, а не через проксі або пересилання.
Перелік усіх ExternalNames:
Ingress
На відміну від усіх вищезазначених прикладів, Ingress НЕ є типом сервісу. Замість цього він знаходиться перед кількома сервісами і діє як "розумний маршрутизатор" або точка входу в ваш кластер.
Ви можете робити багато різних речей з Ingress, і існують багато типів контролерів Ingress, які мають різні можливості.
Контролер Ingress за замовчуванням GKE запустить HTTP(S) балансувальник навантаження для вас. Це дозволить вам робити як маршрутизацію на основі шляху, так і на основі піддомену до бекенд сервісів. Наприклад, ви можете направляти все на foo.yourdomain.com до сервісу foo, а все під шляхом yourdomain.com/bar/ до сервісу bar.
YAML для об'єкта Ingress на GKE з L7 HTTP балансувальником навантаження може виглядати наступним чином:
Перелік усіх входів:
Хоча в цьому випадку краще отримати інформацію кожного по одному, щоб краще її прочитати:
Посилання
Last updated