Это старая версия документа!
Minikube
$ curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64 $ minikube start $ curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl" $ curl -LO https://dl.k8s.io/release/v1.31.0/bin/linux/amd64/kubectl $ echo "7c27adc64a84d1c0cc3dcf7bf4b6e916cc00f3f576a2dbac51b318d926032437" > kubectl.sha256 $ echo "$(cat kubectl.sha256) kubectl" | sha256sum --check $ sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl $ chmod +x kubectl $ mkdir -p ~/.local/bin $ mv ./kubectl ~/.local/bin/kubectl $ kubectl version --client $ source /usr/share/bash-completion/bash_completion $ echo 'source <(kubectl completion bash)' >>~/.bashrc $ echo 'alias k=kubectl' >>~/.bashrc $ echo 'complete -o default -F __start_kubectl k' >>~/.bashrc $ source ~/.bashrc $ kubectl $ k get pods $ k get pods -A $ k get svc -A $ kubectl completion bash | sudo tee /etc/bash_completion.d/kubectl > /dev/null
Сервисы
ClusterIP
ClusterIP — это дефолтный тип сервиса в кубах, он поднимает вам сервис внутри кластера на внутрекластеровом IP. Доступа для внешнего трафика нет, только внутри кластера.
YAML для ClusterIP выглядит как-то так:
apiVersion: v1 kind: Service metadata: name: my-internal-service spec: selector: app: my-app type: ClusterIP ports: - name: http port: 80 targetPort: 80 protocol: TCP
$ kubectl proxy --port=8080
Когда использовать ClusterIP для открытия внешнего доступа? Есть парочка вариантов применения, когда стоит пускать трафик на сервис через kubernetes proxy:
- Когда надо дебажить сервисы, подключаясь к ним напрямую
- Когда надо получить доступ к какому-либо сервису
NodePort
NodePort — наиболее простой и “тупой” способ пустить внешний трафик на сервис. Название “NodePort” говорит само за себя — просто открывается порт на ноде для доступа извне, а трафик уже маршрутизируется на сам сервис.
apiVersion: v1 kind: Service metadata: name: my-nodeport-service spec: selector: app: my-app type: NodePort ports: - name: http port: 80 targetPort: 80 nodePort: 30036 protocol: TCP
Как можно было заметить, в описании фигурирует параметр nodePort, который задаёт номер порта для открытия. Если его не задавать, то выберется рандомный порт в диапазоне 30000-32767.
Когда использовать NodePort? Для начала, у этого метода сразу несколько минусов:
- Один порт — один сервис
- Диапазон 30000-32767 (хоть и изменяемый, но делать это надо крайне осторожно)
- Если IP ноды может измениться (например, в GKE или AWS при автоскейлинге), то это тоже надо учитывать
В общем, не рекомендую использовать этот метод в продакшне. Конечно, если это какой-то демо-сервис и от него не требуется 100% доступность, вполне можно использовать NodePort.
LoadBalancer
LoadBalancer — это, можно сказать, стандартный и самый простой способ пустить внешний трафик на сервис. Правда, работает он только в облаках, т.к. использует нативные облачные решения текущего провайдера. Например, при использовании в GKE будет поднят Network Load Balancer с отдельным внешним IP-адресом, который будет маршрутизировать весь трафик на указанный сервис.
Когда использовать LoadBalancer?
- Элемент ненумерованного списка
- Если надо дать прямой доступ к сервису извне, это ваш выбор. Весь трафик на выбранный порт будет маршрутизироваться на сервис. Это значит, что можно пускать практически любой вид трафика: HTTP, TCP, UDP, Websockets, gRPC и т.п.
Огромный минус в том, что для каждого сервиса будет использоваться свой LoadBalancer со своим внешним IP, и придётся в результате платить сразу за несколько LoadBalancer’ов.
Ingress
В отличие от других приведённых выше примеров Ingress — вообще не сервис как таковой. Его нельзя задать как type в описании сервиса. На деле Ingress поднимается между сервисами и внешним миром и выступает в роли некоего умного маршрутизатора, который является точкой входа в кластер.
С Ingress’ом можно делать очень много разных штук, т.к. существует множество Ingress Controller’ов с разными возможностями. Например, в GKE дефолтный Ingress Controller поднимет HTTP(S) Load Balancer. Он позволяет роутить трафик на сервисы по путям URL’ов и поддоменам. Например, можно отправить всё, что приходит на foo.yourdomain.com на сервис foo, а всё, что приходит на yourdomain.com/bar/ на сервис bar