В прошлой статье мы бодро подняли кластер кубера, состоящего из мастера и 3-х нод. В этой - рассмотрим, что с этим всем делать дальше
В k8s есть основной компонент под названием namespace, который используется для изоляции других ресурсов внутри кластера
Посмотрим содержимое всех namespace’ов командой kubectl get ns
NAME STATUS AGE default Active 57m kube-node-lease Active 57m kube-public Active 57m kube-system Active 57m
При создании какого-либо ресурса, без указания namespace, он помещается в default, что является дурным тоном. По правилам хорошего тона, перед созданием ресурса, создадим отдельный для этого namespace, в котором будем шалить
kubectl create ns test
По уже знакомой команде убедимся, что namespace появился
kubectl get ns NAME STATUS AGE default Active 107m kube-node-lease Active 107m kube-public Active 107m kube-system Active 107m test Active 11s
Видите...?!? Видите...?!? 😀 Вон он мерзавчик, появился в самом низу
Предыдущая команда выводит список абсолютно всех namespace'ов. Если нам нужен конкретный, в данном случае test, так и добавляем в конце test
kubectl get ns test NAME STATUS AGE test Active 102s
А теперь перейдём к основному компоненту кластера kubernetes - pod. Это наименьший компонент кластера, который содержит в себе контейнер или коллекцию контейнеров и который управляется из манифеста формата yaml и который описывает желаемое состояние объектов
Опираясь на офдоку, с хорошо задокументированными параметрами, сваяем минимальный pod
vim test-pod.yml
Вставим содержимое
apiVersion: v1
kind: Pod
metadata:
name: my-first-pod
namespace: test
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"
и для того, чтоб применить pod или правильнее будет - создать, скомандуем
kubectl apply -f test-pod.yml
Посмотрим, что там у нас создалось, непосредственно в созданном нами ранее namespace
kubectl get pods -n test NAME READY STATUS RESTARTS AGE my-first-pod 1/1 Running 0 61s
Для просмотра исчерпывающей информации о pod'е, который мы только что стартанули, можно ввести следующую команду
kubectl describe pod my-first-pod -n test
По команде describe можно вытащить много полезной информации и ею придётся пользоваться на практике достаточно часто
При изменении параметров манифеста, которые меняют (например) версию контейнера, старый pod необходимо удалить
kubectl delete pod my-first-pod -n test
Затем стартануть, с изменёнными параметрами
Для просмотра логов, используем команду
kubectl -n test logs my-first-pod
Если контейнеров в pod'е несколько, то для просмотра логов определённого контейнера добавим ключ -c
kubectl -n test logs my-first-pod -c nginx
Переходим к следующей сущности кластера k8s - Deployment. Это чувак, который, опираясь на содержимое манифеста, контролирует активность количества копий, обновление и откат к предыдущим версиям
Набросаем простой Deployment, опять же опираясь на офдоку - vim test-deployment.yml
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-first-deployment
namespace: test
labels:
app: &app nginx
version: &version 1.31.1-alpine3.23-slim
spec:
replicas: 3
selector:
matchLabels:
app: *app
version: *version
template:
metadata:
labels:
app: *app
version: *version
spec:
containers:
- name: *app
image: nginx:1.31.1-alpine3.23-slim
ports:
- containerPort: 80
resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"
Применим его
kubectl apply -f test-deployment.yml
После запуска, сразу же смотрим, что происходит в нашем namespace
kubectl -n test get all NAME READY STATUS RESTARTS AGE pod/my-first-deployment-57cf6b548d-4c2g2 1/1 Running 0 18s pod/my-first-deployment-57cf6b548d-hxqvk 1/1 Running 0 18s pod/my-first-deployment-57cf6b548d-r2hg2 1/1 Running 0 18s NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/my-first-deployment 3/3 3 3 18s NAME DESIRED CURRENT READY AGE replicaset.apps/my-first-deployment-57cf6b548d 3 3 3 18s
В некоторых случаях необходимо рестартануть приложение, чтоб оно перечитало конфиги. Для этого существует команда rollout, при помощи которой, произойдёт ПРАВИЛЬНЫЙ перезапуск
kubectl -n test rollout restart deployment my-first-deployment
Чтобы удалить deployment, воспользуемся аналогичной удалению командой pod'a
kubectl -n test delete deployment my-first-deployment
Погнали дальше!
Есть у нас nginx deployment с подами, а как получить к нему доступ? Ну сопсна по 80-ому порту, который указан в манифесте + IP-адрес любого пода, но это же ебаный колхоз! Верно? Фен-шуй утверждает, что для это есть ещё одна сущность k8s и звать её Service, которая предоставляет единую точку входа к нашему приложению
Для создания манифеста сервиса, за основу возьмём deployment, созданный на предыдущем шаге
vim test-service.yml
---
apiVersion: v1
kind: Service
metadata:
name: my-first-nginx
namespace: test
labels:
app.kubernetes.io/name: nginx
app.kubernetes.io/version: 1.31.1-alpine3.23-slim
spec:
selector:
app.kubernetes.io/name: nginx
app.kubernetes.io/version: 1.31.1-alpine3.23-slim
ports:
- protocol: TCP
port: 80
targetPort: 80
name: http
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-first-deployment
namespace: test
labels:
app: &app nginx
version: &version 1.31.1-alpine3.23-slim
spec:
replicas: 3
selector:
matchLabels:
app: *app
version: *version
template:
metadata:
labels:
app: *app
version: *version
spec:
containers:
- name: *app
image: nginx:1.31.1-alpine3.23-slim
ports:
- containerPort: 80
resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"
Применяем
kubectl apply -f test-service.yml
Узе знакомой нам командой kubectl -n test get all посмотрим что там есть
NAME READY STATUS RESTARTS AGE pod/my-first-deployment-57cf6b548d-mppp4 1/1 Running 0 114m pod/my-first-deployment-57cf6b548d-vc7lh 1/1 Running 0 114m pod/my-first-deployment-57cf6b548d-wqwb9 1/1 Running 0 114m NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/my-first-nginx ClusterIP 10.110.156.12080/TCP 2m9s NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/my-first-deployment 3/3 3 3 114m NAME DESIRED CURRENT READY AGE replicaset.apps/my-first-deployment-57cf6b548d 3 3 3 114m
Не забываем про описание сервиса
kubectl -n test describe service my-first-nginx
Name: my-first-nginx
Namespace: test
Labels: app.kubernetes.io/name=nginx
app.kubernetes.io/version=1.31.1-alpine3.23-slim
Annotations:
Selector: app.kubernetes.io/name=nginx,app.kubernetes.io/version=1.31.1-alpine3.23-slim
Type: ClusterIP
IP Family Policy: SingleStack
IP Families: IPv4
IP: 10.96.84.222
IPs: 10.96.84.222
Port: http 80/TCP
TargetPort: 80/TCP
Endpoints: 10.244.38.139:80,10.244.234.147:80,10.244.234.148:80
Session Affinity: None
Internal Traffic Policy: Cluster
Events:
Обратите внимание, чтоб в поле Endpoints были IP-адреса подов
А как теперь получить доступ к самому сервису? Для этого, у куба, предусмотрена команда port-forward, которая прокидывает указанный порт на локальную машину
kubectl -n test port-forward svc/my-first-nginx 8080:80