На цій сторінці показано, як створити обʼєкт Service у Kubernetes, за допомогою якого зовнішні клієнти можуть отримати доступ до застосунку, що працює в кластері. Service забезпечує балансування навантаження для застосунку, який має два запущені екземпляри.
Вам треба мати кластер Kubernetes, а також інструмент командного рядка kubectl має бути налаштований для роботи з вашим кластером. Рекомендується виконувати ці настанови у кластері, що має щонайменше два вузли, які не виконують роль вузлів управління. Якщо у вас немає кластера, ви можете створити його, за допомогою minikube або використовувати одну з цих пісочниць:
Ось файл конфігурації Deployment застосунку:
apiVersion: apps/v1
kind: Deployment
metadata:
name: hello-world
spec:
selector:
matchLabels:
run: load-balancer-example
replicas: 2
template:
metadata:
labels:
run: load-balancer-example
spec:
containers:
- name: hello-world
image: us-docker.pkg.dev/google-samples/containers/gke/hello-app:2.0
ports:
- containerPort: 8080
protocol: TCP
Запустіть застосунок Hello World у кластері: створіть Deployment застосунку за допомогою наведеного вище файлу:
kubectl apply -f https://k8s.io/examples/service/access/hello-application.yaml
Попередня команда створює Deployment і повʼязаний ReplicaSet. ReplicaSet має два Podʼи, кожен з яких запускає застосунок Hello World.
Перегляньте інформацію про Deployment:
kubectl get deployments hello-world
kubectl describe deployments hello-world
Перегляньте інформацію про ваші обʼєкти ReplicaSet:
kubectl get replicasets
kubectl describe replicasets
Створіть обʼєкт Service, який відкриває доступ до Deployment:
kubectl expose deployment hello-world --type=NodePort --name=example-service
Перегляньте інформацію про Service:
kubectl describe services example-service
Вивід подібний до такого:
Name: example-service
Namespace: default
Labels: run=load-balancer-example
Annotations: <none>
Selector: run=load-balancer-example
Type: NodePort
IP: 10.32.0.16
Port: <unset> 8080/TCP
TargetPort: 8080/TCP
NodePort: <unset> 31496/TCP
Endpoints: 10.200.1.4:8080,10.200.2.5:8080
Session Affinity: None
Events: <none>
Занотуйте значення NodePort для Service. Наприклад, у попередньому виводі значення NodePort становить 31496.
Виведіть Podʼи, на яких працює застосунок Hello World:
kubectl get pods --selector="run=load-balancer-example" --output=wide
Вивід подібний до такого:
NAME READY STATUS ... IP NODE
hello-world-2895499144-bsbk5 1/1 Running ... 10.200.1.4 worker1
hello-world-2895499144-m1pwt 1/1 Running ... 10.200.2.5 worker2
Отримайте публічну IP-адресу одного з вузлів, на якому працює Pod Hello World. Спосіб отримання цієї адреси залежить від того, як налаштовано кластер. Наприклад, якщо ви використовуєте Minikube, адресу вузла можна побачити, виконавши kubectl cluster-info. Якщо ви використовуєте екземпляри Google Compute Engine, переглянути публічні адреси вузлів можна командою gcloud compute instances list.
На вибраному вузлі створіть правило фаєрвола, яке дозволяє TCP-трафік на порт вузла. Наприклад, якщо значення NodePort вашого Service — 31568, створіть правило фаєрвола, яке дозволяє TCP-трафік на порт 31568. Різні хмарні провайдери пропонують різні способи налаштування правил фаєрвола.
Використовуйте адресу вузла та порт вузла для доступу до застосунку Hello World:
curl http://<public-node-ip>:<node-port>
де <public-node-ip> — публічна IP-адреса вашого вузла, а <node-port> — значення NodePort вашого сервісу. Відповідь на успішний запит — вітальне повідомлення:
Hello, world!
Version: 2.0.0
Hostname: hello-world-cdd4458f4-m47c8
Замість kubectl expose можна використати файл конфігурації Service, щоб створити Service.
Щоб видалити Service, введіть цю команду:
kubectl delete services example-service
Щоб видалити Deployment, ReplicaSet і Podʼи, на яких працює застосунок Hello World, введіть цю команду:
kubectl delete deployment hello-world
Скористайтеся навчальним матеріалом Підключення застосунків за допомогою Services.