Блог-шпаргалка

Картинка

Kubernetes и как его готовить

Категория -> linux
Обновлено: 2026-05-29

В прошлой статье мы бодро подняли кластер кубера, состоящего из мастера и 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.120           80/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