В Kubernetes (сокращенно k8s), Service Endpoint — абстракция, которая представляет сетевое размещение сервиса. Это внутренний или внешний IP адрес, который может быть использован для доступа к сервисам приложения, работающим в кластере Kubernetes. Рассмотрим, как отобразить список всех подов, принадлежащих сервису.
Подготовка окружения для теста
Перед запуском проверим окружение k8s. Для разворачивания тестового Kubernetes можно использовать minikube, для продакшн используется kubespray, для настроек коменда kubectl. Создадим под Nginx.
apiVersion: v1
kind: Pod
metadata:
name: nginx
namespace: default
labels:
app: nginx
spec:
containers:
- image: nginx:latest
name: nginx
resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"
Создадим Deployment для управления подами, который создаст ещё два пода (число реплик равно 2).
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
labels:
app: nginx
spec:
replicas: 2
selector:
matchLabels:
app: nginx
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 2
maxUnavailable: 1
minReadySeconds: 5
template:
metadata:
labels:
app: nginx
spec:
containers:
- image: nginx:latest
name: nginx
ports:
- containerPort: 80
resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"
Создадим под и деплой, проверим статус подов. Всего три пода:
$ kubectl apply -f nginx-pod.yml # создаст под с именем nginx
$ kubectl apply -f nginx-deploy.yml # создаст 2 поды с именами, которые заканчиваются на какие-то буквы и цифры
# статус
$ kubectl get pods --show-labels
NAME READY STATUS RESTARTS AGE LABELS
nginx 1/1 Running 0 5h40m app=nginx # под, созданный из nginx-pod.yml
nginx-6d7c8c89f7-rrszr 1/1 Running 0 5h7m app=nginx,pod-template-hash=6d7c8c89f7 # под, созданный из nginx-deploy.yml
nginx-6d7c8c89f7-n2n6c 1/1 Running 0 5h7m app=nginx,pod-template-hash=6d7c8c89f7 # аналогично
Создадим 2 сервиса (NodePort + Cluster) для маршрутизации на поды Nginx, свяжем их с подами через selector
. В одном файле можно создать несколько сервисов, если разделять строкой с тремя дефисами.
apiVersion: v1
kind: Service
metadata:
name: nginx
spec:
selector:
app: nginx
ports:
- name: http
protocol: TCP
port: 3000
targetPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: nginx-nodeport
spec:
type: NodePort
selector:
app: nginx
ports:
- name: http
protocol: TCP
port: 8080
targetPort: 80
Создадим сервисы и проверим их статус.
$ kubectl apply -f nginx-svc.yml
# проверка статуса сервиса
$ kubectl get svc -o wide
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
kubernetes ClusterIP 10.43.0.1 <none> 443/TCP 5h49m <none>
nginx ClusterIP 10.43.61.137 <none> 3000/TCP 5h41m app=nginx
nginx-nodeport NodePort 10.43.51.4 <none> 8080:30140/TCP 5h41m app=nginx
Список всех подов, принадлежащих сервису
Сначала посмотрим список Endpoints ткущего сервиса
$ kubectl get endpoints
NAME ENDPOINTS AGE
kubernetes 192.168.5.15:6443 5h51m
nginx-nodeport 172.17.0.6:80,172.17.0.7:80,172.17.0.9:80 5h44m
nginx 172.17.0.6:80,172.17.0.7:80,172.17.0.9:80 5h44m
Как видно выше, сервис nginx маршрутизирует на три пода, сервис nginx-nodeport также маршрутизирует на три пода. Подробности:
$ kubectl get endpoints nginx -o yaml
apiVersion: v1
kind: Endpoints
metadata:
creationTimestamp: "2023-05-21T07:15:41Z"
name: nginx
namespace: default
resourceVersion: "1164"
uid: 686d68e6-a58b-4a12-a2d4-0f4ea88b9b56
subsets:
- addresses:
- ip: 172.17.0.6
nodeName: colima
targetRef:
kind: Pod
name: nginx
namespace: default
uid: e717d901-4319-4ea6-b33d-31dff7c79549
- ip: 172.17.0.7
nodeName: colima
targetRef:
kind: Pod
name: nginx-6d7c8c89f7-n2n6c
namespace: default
uid: b6e7c74c-3d1f-494e-b05d-9242e367cfe3
- ip: 172.17.0.9
nodeName: colima
targetRef:
kind: Pod
name: nginx-6d7c8c89f7-rrszr
namespace: default
uid: 7528bfd6-d6dd-4557-873f-6f8ed9b9ebd4
ports:
- name: http
port: 80
protocol: TCP
Как отсюда выудить имена всех подов:
$ kubectl get endpoints nginx -o jsonpath='{.subsets[*].addresses[*].targetRef.name}'
nginx nginx-6d7c8c89f7-n2n6c nginx-6d7c8c89f7-rrszr
Теперь, зная имена подов, отобразим информацию по ним:
$ kubectl get pods nginx nginx-6d7c8c89f7-n2n6c nginx-6d7c8c89f7-rrszr
Одна обобщающая команда для отображения подов сервиса nginx:
kubectl get pods $(kubectl get endpoints nginx -o jsonpath='{.subsets[*].addresses[*].targetRef.name}')
# или
kubectl get endpoints nginx -o jsonpath='{.subsets[*].addresses[*].targetRef.name}' | xargs kubectl get pods -o wide
Оригинал: https://blog.wu-boy.com/2023/05/list-pods-from-k8s-service/