Skip to content

Commit cbd85b8

Browse files
authored
Merge pull request #20226 from lex111/ru-concepts-overview-working-with-objects
Translate Working with Kubernetes Objects section into Russian
2 parents cd3886c + ae9eb70 commit cbd85b8

File tree

12 files changed

+1007
-0
lines changed

12 files changed

+1007
-0
lines changed
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
title: "Работа с объектами Kubernetes"
3+
weight: 40
4+
---
5+
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
---
2+
title: Аннотации
3+
content_template: templates/concept
4+
weight: 50
5+
---
6+
7+
{{% capture overview %}}
8+
Аннотации Kubernetes можно использовать для добавления собственных метаданных к объектам. Такие клиенты, как инструменты и библиотеки, могут получить эти метаданные.
9+
{{% /capture %}}
10+
11+
{{% capture body %}}
12+
13+
## Добавление метаданных к объектам
14+
15+
Вы можете использовать метки или аннотации для добавления метаданных к объектам Kubernetes. Метки можно использовать для выбора объектов и для поиска коллекций объектов, которые соответствуют определенным условиям. В отличие от них аннотации не используются для идентификации и выбора объектов. Метаданные в аннотации могут быть маленькими или большими, структурированными или неструктурированными, кроме этого они включать символы, которые не разрешены в метках.
16+
17+
Аннотации, как и метки, являются коллекциями с наборами пар ключ-значение:
18+
19+
```json
20+
"metadata": {
21+
"annotations": {
22+
"key1" : "value1",
23+
"key2" : "value2"
24+
}
25+
}
26+
```
27+
28+
Некоторые примеры информации, которая может быть в аннотациях:
29+
30+
* Поля, управляемые декларативным уровнем конфигурации. Добавление этих полей в виде аннотаций позволяет отличать их от значений по умолчанию, установленных клиентами или серверами, а также от автоматически сгенерированных полей и полей, заданных системами автоматического масштабирования.
31+
32+
* Информация о сборке, выпуске или образе, например, метка времени, идентификаторы выпуска, ветка git, номера PR, хеши образов и адрес реестра.
33+
34+
* Ссылки на репозитории логирования, мониторинга, аналитики или аудита.
35+
36+
* Информация о клиентской библиотеке или инструменте, которая может использоваться при отладке (например, имя, версия и информация о сборке).
37+
38+
* Информация об источнике пользователя или инструмента/системы, например, URL-адреса связанных объектов из других компонентов экосистемы.
39+
40+
* Небольшие метаданные развертывания (например, конфигурация или контрольные точки).
41+
42+
* Номера телефонов или пейджеров ответственных лиц или записи в справочнике, в которых можно найти нужную информацию, например, сайт группы.
43+
44+
* Инструкции от конечных пользователей по исправлению работы или использования нестандартной функциональности.
45+
46+
Вместо использования аннотаций, вы можете сохранить такого рода информацию во внешней базе данных или директории, хотя это усложнило бы создание общих клиентских библиотек и инструментов развертывания, управления, самодиагностики и т.д.
47+
48+
## Синтаксис и набор символов
49+
50+
_Аннотации_ представляют собой пары ключ-значение. Разрешенные ключи аннотации имеют два сегмента, разделённые слешем (`/`): префикс (необязательно) и имя. Сегмент имени обязателен и должен содержать не более 63 символов, среди которых могут быть буквенно-цифровые символы(`[a-z0-9A-Z]`), а также дефисы (`-`), знаки подчеркивания (`_`), точки (`.`). Префикс не обязателен, но он быть поддоменом DNS: набор меток DNS, разделенных точками (`.`), общей длиной не более 253 символов, за которыми следует слеш (`/`).
51+
52+
Если префикс не указан, ключ аннотации считается закрытым для пользователя. Компоненты автоматизированной системы (например, `kube-scheduler`, `kube-controller-manager`, `kube-apiserver`, `kubectl` или другие сторонние), которые добавляют аннотации к объектам пользователя, должны указывать префикс.
53+
54+
Префиксы `kubernetes.io/` и `k8s.io/` зарезервированы для использования основными компонентами Kubernetes.
55+
56+
Например, ниже представлен конфигурационный файл объекта Pod с аннотацией `imageregistry: https://hub.docker.com/`:
57+
58+
```yaml
59+
60+
apiVersion: v1
61+
kind: Pod
62+
metadata:
63+
name: annotations-demo
64+
annotations:
65+
imageregistry: "https://hub.docker.com/"
66+
spec:
67+
containers:
68+
- name: nginx
69+
image: nginx:1.14.2
70+
ports:
71+
- containerPort: 80
72+
73+
```
74+
75+
{{% /capture %}}
76+
77+
{{% capture whatsnext %}}
78+
Узнать подробнее про [метки и селекторы](/ru/docs/concepts/overview/working-with-objects/labels/).
79+
{{% /capture %}}
Lines changed: 165 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,165 @@
1+
---
2+
title: Рекомендуемые метки
3+
content_template: templates/concept
4+
---
5+
6+
{{% capture overview %}}
7+
8+
Вы можете визуализировать и управлять объектами Kubernetes не только с помощью kubectl и панели управления. С помощью единого набора меток можно единообразно описывать объекты, что позволяет инструментам согласованно работать между собой.
9+
10+
В дополнение к существующим инструментам, рекомендуемый набор меток описывают приложения в том виде, в котором они могут быть получены.
11+
12+
{{% /capture %}}
13+
14+
{{% capture body %}}
15+
16+
17+
Метаданные сосредоточены на понятии _приложение_. Kubernetes — это не платформа как услуга (PaaS), поэтому не закрепляет формальное понятие приложения.
18+
Вместо этого приложения являются неформальными и описываются через метаданные. Определение приложения довольно расплывчатое.
19+
20+
{{< note >}}
21+
22+
Это рекомендуемые для использования метки. Они облегчают процесс управления приложениями, но при этом не являются обязательными для основных инструментов.
23+
24+
{{< /note >}}
25+
26+
Общие метки и аннотации используют один и тот же префикс: `app.kubernetes.io`. Метки без префикса являются приватными для пользователей. Совместно используемый префикс гарантирует, что общие метки не будут влиять на пользовательские метки.
27+
28+
## Метки
29+
30+
Чтобы извлечь максимум пользы от использования таких меток, они должны добавляться к каждому ресурсному объекту.
31+
32+
| Ключ | Описание | Пример | Тип |
33+
| ----------------------------------- | --------------------- | -------- | ---- |
34+
| `app.kubernetes.io/name` | Имя приложения | `mysql` | string |
35+
| `app.kubernetes.io/instance` | Уникальное имя экземпляра приложения | `wordpress-abcxzy` | string |
36+
| `app.kubernetes.io/version` | Текущая версия приложения (например, семантическая версия, хеш коммита и т.д.) | `5.7.21` | string |
37+
| `app.kubernetes.io/component` | Имя компонента в архитектуре | `database` | string |
38+
| `app.kubernetes.io/part-of` | Имя основного приложения, частью которого является текущий объект | `wordpress` | string |
39+
| `app.kubernetes.io/managed-by` | Инструмент управления приложением | `helm` | string |
40+
41+
Для демонстрации этих меток, рассмотрим следующий объект `StatefulSet`:
42+
43+
```yaml
44+
apiVersion: apps/v1
45+
kind: StatefulSet
46+
metadata:
47+
labels:
48+
app.kubernetes.io/name: mysql
49+
app.kubernetes.io/instance: wordpress-abcxzy
50+
app.kubernetes.io/version: "5.7.21"
51+
app.kubernetes.io/component: database
52+
app.kubernetes.io/part-of: wordpress
53+
app.kubernetes.io/managed-by: helm
54+
```
55+
56+
## Приложения и экземпляры приложений
57+
58+
Одно и то же приложение может быть установлено несколько раз в кластер Kubernetes, в ряде случаев — в одинаковое пространство имен. Например, WordPress может быть установлен более одного раза, тогда каждый из сайтов будет иметь собственный установленный экземпляр WordPress.
59+
60+
Имя приложения и имя экземпляра хранятся по отдельности. Например, WordPress имеет ключ `app.kubernetes.io/name` со значением `wordpress`, при этом у него есть имя экземпляра, представленное ключом `app.kubernetes.io/instance` со значением `wordpress-abcxzy`. Такой механизм позволяет идентифицировать как приложение, так и экземпляры приложения. У каждого экземпляра приложения должно быть уникальное имя.
61+
62+
## Примеры
63+
64+
Следующие примеры показывают разные способы использования общих меток, поэтому они различаются по степени сложности.
65+
66+
### Простой сервис без состояния
67+
68+
Допустим, у нас есть простой сервис без состояния, развернутый с помощью объектов `Deployment` и `Service`. Следующие два фрагмента конфигурации показывают, как можно использовать метки в самом простом варианте.
69+
70+
Объект `Deployment` используется для наблюдения за подами, на которых запущено приложение.
71+
72+
```yaml
73+
apiVersion: apps/v1
74+
kind: Deployment
75+
metadata:
76+
labels:
77+
app.kubernetes.io/name: myservice
78+
app.kubernetes.io/instance: myservice-abcxzy
79+
...
80+
```
81+
82+
Объект `Service` используется для открытия доступа к приложению.
83+
84+
```yaml
85+
apiVersion: v1
86+
kind: Service
87+
metadata:
88+
labels:
89+
app.kubernetes.io/name: myservice
90+
app.kubernetes.io/instance: myservice-abcxzy
91+
...
92+
```
93+
94+
### Веб-приложение с базой данных
95+
96+
Рассмотрим случай немного посложнее: веб-приложение (WordPress), которое использует базу данных (MySQL), установленное с помощью Helm. В следующих фрагментов конфигурации объектов отображена отправная точка развертывания такого приложения.
97+
98+
Следующий объект `Deployment` используется для WordPress:
99+
100+
```yaml
101+
apiVersion: apps/v1
102+
kind: Deployment
103+
metadata:
104+
labels:
105+
app.kubernetes.io/name: wordpress
106+
app.kubernetes.io/instance: wordpress-abcxzy
107+
app.kubernetes.io/version: "4.9.4"
108+
app.kubernetes.io/managed-by: helm
109+
app.kubernetes.io/component: server
110+
app.kubernetes.io/part-of: wordpress
111+
...
112+
```
113+
114+
Объект `Service` используется для открытия доступа к WordPress:
115+
116+
117+
```yaml
118+
apiVersion: v1
119+
kind: Service
120+
metadata:
121+
labels:
122+
app.kubernetes.io/name: wordpress
123+
app.kubernetes.io/instance: wordpress-abcxzy
124+
app.kubernetes.io/version: "4.9.4"
125+
app.kubernetes.io/managed-by: helm
126+
app.kubernetes.io/component: server
127+
app.kubernetes.io/part-of: wordpress
128+
...
129+
```
130+
131+
MySQL открывается в виде `StatefulSet` с метаданными как для самого приложения, так и основного (родительского) приложения, к которому принадлежит СУБД:
132+
133+
```yaml
134+
apiVersion: apps/v1
135+
kind: StatefulSet
136+
metadata:
137+
labels:
138+
app.kubernetes.io/name: mysql
139+
app.kubernetes.io/instance: mysql-abcxzy
140+
app.kubernetes.io/version: "5.7.21"
141+
app.kubernetes.io/managed-by: helm
142+
app.kubernetes.io/component: database
143+
app.kubernetes.io/part-of: wordpress
144+
...
145+
```
146+
147+
Объект `Service` предоставляет MySQL в составе WordPress:
148+
149+
```yaml
150+
apiVersion: v1
151+
kind: Service
152+
metadata:
153+
labels:
154+
app.kubernetes.io/name: mysql
155+
app.kubernetes.io/instance: mysql-abcxzy
156+
app.kubernetes.io/version: "5.7.21"
157+
app.kubernetes.io/managed-by: helm
158+
app.kubernetes.io/component: database
159+
app.kubernetes.io/part-of: wordpress
160+
...
161+
```
162+
163+
Вы заметите, что `StatefulSet` и `Service` MySQL содержат больше информации о MySQL и WordPress.
164+
165+
{{% /capture %}}
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
---
2+
title: Селекторы полей
3+
weight: 60
4+
---
5+
6+
_Селекторы полей_ позволяют [выбирать ресурсы Kubernetes](/ru/docs/concepts/overview/working-with-objects/kubernetes-objects), исходя из значения одного или нескольких полей ресурсов. Ниже приведены несколько примеров запросов селекторов полей:
7+
8+
* `metadata.name=my-service`
9+
* `metadata.namespace!=default`
10+
* `status.phase=Pending`
11+
12+
Следующая команда `kubectl` выбирает все Pod-объекты, в которых значение поля [`status.phase`](/docs/concepts/workloads/pods/pod-lifecycle/#pod-phase) равно `Running`:
13+
14+
```shell
15+
kubectl get pods --field-selector status.phase=Running
16+
```
17+
18+
{{< note >}}
19+
По сути, селекторы полей являются *фильтрами* ресурсов. По умолчанию нет установленных селекторов/фильтров, поэтому выбираются ресурсы всех типов. Это означает, что два запроса `kubectl` ниже одинаковы:
20+
21+
```shell
22+
kubectl get pods
23+
kubectl get pods --field-selector ""
24+
```
25+
{{< /note >}}
26+
27+
## Поддерживаемые поля
28+
29+
Доступные селекторы полей зависят от типа ресурса Kubernetes. У всех типов ресурсов есть поля `metadata.name` и `metadata.namespace`. При использовании несуществующего селекторов полей приведёт к возникновению ошибки. Например:
30+
31+
```shell
32+
kubectl get ingress --field-selector foo.bar=baz
33+
```
34+
35+
```
36+
Error from server (BadRequest): Unable to find "ingresses" that match label selector "", field selector "foo.bar=baz": "foo.bar" is not a known field selector: only "metadata.name", "metadata.namespace"
37+
```
38+
39+
## Поддерживаемые операторы
40+
41+
Можно использовать операторы `=`, `==` и `!=` в селекторах полей (`=` и `==` — синонимы). Например, следующая команда `kubectl` выбирает все сервисы Kubernetes, не принадлежавшие пространству имен `default`:
42+
43+
```shell
44+
kubectl get services --all-namespaces --field-selector metadata.namespace!=default
45+
```
46+
47+
## Составные селекторы
48+
49+
Аналогично [метки](/ru/docs/concepts/overview/working-with-objects/labels) и другим селекторам, несколько селекторы полей могут быть объединены через запятую. Приведенная ниже команда `kubectl` выбирает все Pod-объекты, у которых значение поле `status.phase`, отличное от `Running`, а поле `spec.restartPolicy` имеет значение `Always`:
50+
51+
```shell
52+
kubectl get pods --field-selector=status.phase!=Running,spec.restartPolicy=Always
53+
```
54+
55+
## Множественные типы ресурсов
56+
57+
Можно использовать селекторы полей с несколькими типами ресурсов одновременно. Команда `kubectl` выбирает все объекты StatefulSet и Services, не включенные в пространство имен `default`:
58+
59+
```shell
60+
kubectl get statefulsets,services --all-namespaces --field-selector metadata.namespace!=default
61+
```

0 commit comments

Comments
 (0)