title | weight | type | aliases | ||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Установка Knative |
6 |
docs |
|
Этот гайд поможет вам установить последнюю версию Knative. Обратите внимание, если вы обновляете существующую установку, следуйте инструкциям здесь.
Knative состоит из двух компонентов, которые могут быть установлены и использованы независимо или вместе. Чтобы помочь вам выбрать и выбрать те части, которые подходят для вас, вот краткое описание каждого:
Этот гайд предполагает, что вы хотите установить выпуск Knative с открытого источника на кластере Kubernetes. Увеличивающееся количество поставщиков имеют управляемые предложения Knative; см. страницу Предложения Knative для полного списка.
Knative {{< version >}} требует кластер Kubernetes версии 1.16 или выше, а также совместимого kubectl
. Этот гайд предполагает, что вы уже создали кластер Kubernetes, и что вы используете bash в окружении Mac или Linux; некоторые команды потребуют корректировки для использования в окружении Windows.
{{< feature-state version="v0.9" state="стабильный" >}}
Следующие команды устанавливают компонент Knative Serving.
Установите Custom Resource Definitions (сокращенно CRDs):
kubectl apply --filename {{< artifact repo="serving" file="serving-crds.yaml" >}}
Установите основные компоненты Serving (см. ниже для опциональных расширений):
kubectl apply --filename {{< artifact repo="serving" file="serving-core.yaml" >}}
Выберите уровень сетевого взаимодействия (в алфавитном порядке):
{{< tabs name="serving_networking" default="Istio" >}} {{% tab name="Ambassador" %}}{{% feature-state version="v0.8" state="альфа" %}}
Следующие команды устанавливают Ambassador и включают его интеграцию с Knative.
Создайте пространство имен для установки Ambassador:
kubectl create namespace ambassador
Установите Ambassador:
kubectl apply --namespace ambassador \
--filename https://getambassador.io/yaml/ambassador/ambassador-crds.yaml \
--filename https://getambassador.io/yaml/ambassador/ambassador-rbac.yaml \
--filename https://getambassador.io/yaml/ambassador/ambassador-service.yaml
Предоставьте Ambassador необходимые разрешения:
kubectl patch clusterrolebinding ambassador -p '{"subjects":[{"kind": "ServiceAccount", "name": "ambassador", "namespace": "ambassador"}]}'
Включите поддержку Knative в Ambassador:
kubectl set env --namespace ambassador deployments/ambassador AMBASSADOR_KNATIVE_SUPPORT=true
Чтобы настроить Knative Serving для использования Ambassador по умолчанию:
kubectl patch configmap/config-network \
--namespace knative-serving \
--type merge \
--patch '{"data":{"ingress.class":"ambassador.ingress.networking.knative.dev"}}'
Получите внешний IP-адрес или CNAME:
kubectl --namespace ambassador get service ambassador
Сохраните это для конфигурации DNS ниже.
{{< /tab >}}
{{% tab name="Contour" %}}
{{% feature-state version="v0.17" state="бета" %}}
Следующие команды устанавливают Contour и включают его интеграцию с Knative.
Установите правильно настроенный Contour:
kubectl apply --filename {{< artifact repo="net-contour" file="contour.yaml" >}}
Установите контроллер Knative Contour:
kubectl apply --filename {{< artifact repo="net-contour" file="net-contour.yaml" >}}
```1. Чтобы настроить Knative Serving для использования Contour по умолчанию:
```bash
kubectl patch configmap/config-network \
--namespace knative-serving \
--type merge \
--patch '{"data":{"ingress.class":"contour.ingress.networking.knative.dev"}}'
Получите внешний IP-адрес или CNAME:
kubectl --namespace contour-external get service envoy
Сохраните это для конфигурации DNS ниже.
{{< /tab >}}
{{% tab name="Gloo" %}}
{{% feature-state version="v0.8" state="alpha" %}}
Для подробного руководства по интеграции Gloo см. Установка Gloo для Knative в документации Gloo.
Следующие команды устанавливают Gloo и включают его интеграцию с Knative.
Убедитесь, что установлен glooctl
(рекомендуется версия 1.3.x и выше):
glooctl version
Если он не установлен, вы можете установить последнюю версию с помощью:
curl -sL https://run.solo.io/gloo/install | sh
export PATH=$HOME/.gloo/bin:$PATH
Или следуя руководству по установке CLI для Gloo.
Установите Gloo и интеграцию с Knative:
glooctl install knative --install-knative=false
Получите внешний IP-адрес или CNAME:
glooctl proxy url --name knative-external-proxy
Сохраните это для конфигурации DNS ниже.
{{< /tab >}}
{{% tab name="Istio" %}}
{{% feature-state version="v0.9" state="stable" %}}
Следующие команды устанавливают Istio и включают его интеграцию с Knative.
{{< /tab >}}1. Установите контроллер Knative Istio:
kubectl apply --filename {{< artifact repo="net-istio" file="release.yaml" >}}
Получите внешний IP-адрес или CNAME:
kubectl --namespace istio-system get service istio-ingressgateway
Сохраните это для настройки DNS ниже.
{{< /tab >}}
{{% tab name="Kong" %}}
{{% feature-state version="v0.13" state="" %}}
Следующие команды устанавливают Kong и включают его интеграцию с Knative.
Установите Kong Ingress Controller:
kubectl apply --filename https://raw.githubusercontent.com/Kong/kubernetes-ingress-controller/0.9.x/deploy/single/all-in-one-dbless.yaml
Чтобы настроить Knative Serving для использования Kong по умолчанию:
kubectl patch configmap/config-network \
--namespace knative-serving \
--type merge \
--patch '{"data":{"ingress.class":"kong"}}'
Получите внешний IP-адрес или CNAME:
kubectl --namespace kong get service kong-proxy
Сохраните это для настройки DNS ниже.
{{< /tab >}}
{{% tab name="Kourier" %}}
{{% feature-state version="v0.17" state="beta" %}}
Следующие команды устанавливают Kourier и включают его интеграцию с Knative.
Установите контроллер Knative Kourier:
kubectl apply --filename {{< artifact repo="net-kourier" file="kourier.yaml" >}}
Чтобы настроить Knative Serving для использования Kourier по умолчанию:
kubectl patch configmap/config-network \
--namespace knative-serving \
--type merge \
--patch '{"data":{"ingress.class":"kourier.ingress.networking.knative.dev"}}'
Получите внешний IP-адрес или CNAME:
kubectl --namespace kourier-system get service kourier
Сохраните это для настройки DNS ниже.
{{< /tab >}}
Настройка DNS
{{< tabs name="serving_dns" >}} {{% tab name="Magic DNS (xip.io)" %}} Мы предоставляем простую Kubernetes Job под названием "default domain", которая (см. примечания) настроит Knative Serving для использования xip.io как стандартного суффикса DNS.
kubectl apply --filename {{< artifact repo="serving" file="serving-default-domain.yaml" >}}
Внимание: Это будет работать только в том случае, если кластерный сервис LoadBalancer выдает IPv4-адрес или хостнейм, поэтому это не будет работать с кластерами IPv6 или локальными установками, такими как Minikube. Для этих случаев см. "Реальное DNS" или "Временное DNS". {{< /tab >}}
{{% tab name="Реальное DNS" %}} Для настройки DNS для Knative возьмите внешний IP-адрес или CNAME из настройки сетевого уровня и настройте его с помощью вашего провайдера DNS следующим образом:
Если сетевой уровень выдал внешний IP-адрес, то настройте универсальный A
-запись для домена:
# Здесь knative.example.com — это доменное суффиксное имя для вашего кластера
*.knative.example.com == A 35.233.41.212
Если сетевой уровень выдал CNAME, то настройте запись CNAME для домена:
# Здесь knative.example.com — это доменное суффиксное имя для вашего кластера
*.knative.example.com == CNAME a317a278525d111e89f272a164fd35fb-1510370581.eu-central-1.elb.amazonaws.com
После настройки вашего провайдера DNS направьте Knative использовать этот домен:```bash
kubectl patch configmap/config-domain
--namespace knative-serving
--type merge
--patch '{"data":{"knative.example.com":""}}'
{{< /tab >}}
{{% tab name="Временное DNS" %}} Если вы используете `curl` для доступа к образцовым приложениям или к вашему собственному приложению Knative и не можете использовать методы "Магического DNS (xip.io)" или "Реального DNS", есть временный подход. Это полезно для тех, кто хочет оценить Knative без изменения своей конфигурации DNS, как в методе "Реальное DNS", или не может использовать метод "Магического DNS" из-за использования, например, локальной установки Minikube или кластеров IPv6.
Чтобы получить доступ к вашему приложению с помощью `curl` с использованием этого метода:
1. После запуска вашего приложения получите URL вашего приложения:
```bash
kubectl get ksvc
Выходные данные должны быть похожи на:
NAME URL LATESTCREATED LATESTREADY READY REASON
helloworld-go http://helloworld-go.default.example.com helloworld-go-vqjlf helloworld-go-vqjlf True
Укажите curl
на подключение к внешнему IP-адресу или CNAME, определенным сетевым слоем в разделе 3 выше, и используйте параметр командной строки -H "Host:"
, чтобы указать имя хоста приложения Knative. Например, если сетевой слой определяет ваш внешний IP-адрес и порт как http://192.168.39.228:32198
и вы хотите получить доступ к вышеупомянутому приложению helloworld-go
, используйте:
curl -H "Host: helloworld-go.default.example.com" http://192.168.39.228:32198
``` В случае использования образца приложения `helloworld-go` вывод,
используя конфигурацию по умолчанию, должен быть следующим:
Hello Go Sample v1!
См. метод "Real DNS" для постоянного решения.
{{< /tab >}}
{{< /tabs >}}
Мониторьте компоненты Knative до тех пор, пока все компоненты не покажут статус STATUS
, равный Running
или Completed
:
kubectl get pods --namespace knative-serving
На этом этапе у вас есть базовая установка Knative Serving!
{{< tabs name="serving_extensions" >}} {{% tab name="HPA автоскалинг" %}}
{{% feature-state version="v0.8" state="beta" %}}
Knative также поддерживает использование Kubernetes Horizontal Pod Autoscaler (HPA) для принятия решений об автоскалинге. Следующая команда установит компоненты, необходимые для поддержки автоскалинга класса HPA:
kubectl apply --filename {{< artifact repo="serving" file="serving-hpa.yaml" >}}
{{< /tab >}}
{{% tab name="TLS с cert-manager" %}}
{{% feature-state version="v0.6" state="alpha" %}}
Knative поддерживает автоматическое выдачу сертификатов TLS через cert-manager. Следующие команды установят компоненты, необходимые для поддержки выдачи сертификатов TLS через cert-manager.
Сначала установите версию cert-manager 0.12.0
или выше
Затем установите компонент, который интегрирует Knative с cert-manager:
kubectl apply --filename {{< artifact repo="net-certmanager" file="release.yaml" >}}
```3. Теперь настройте Knative для [автоматической настройки сертификатов TLS](../serving/using-auto-tls.md).
{{< /tab >}}
{{% tab name="TLS через HTTP01" %}}
{{% feature-state version="v0.14" state="alpha" %}}
Knative поддерживает автоматическое получение сертификатов TLS с использованием Let's Encrypt HTTP01 challenge. Следующие команды установят компоненты, необходимые для поддержки этого.
Сначала установите контроллер net-http01
:
kubectl apply --filename {{< artifact repo="net-http01" file="release.yaml" >}}
Далее настройте certificate.class
для использования этого типа сертификата.
kubectl patch configmap/config-network \
--namespace knative-serving \
--type merge \
--patch '{"data":{"certificate.class":"net-http01.certificate.networking.knative.dev"}}'
Наконец, включите автоматическое TLS.
kubectl patch configmap/config-network \
--namespace knative-serving \
--type merge \
--patch '{"data":{"autoTLS":"Enabled"}}'
{{< /tab >}}
{{% tab name="Поддержка дикого картофеля TLS" %}}
{{% feature-state version="v0.12" state="alpha" %}}
Если вы используете реализацию сертификата, поддерживающую выдачу дикого картофеля сертификатов (например, cert-manager с DNS01 издателем), то наиболее эффективным способом выдачи сертификатов является использование контроллера сертификатов для пространства имен. Следующая команда установит компоненты, необходимые для выдачи дикого картофеля сертификатов в каждом пространстве имен:
kubectl apply --filename {{< artifact repo="serving" file="serving-nscert.yaml" >}}
```> Примечание: это не будет работать с HTTP01, как с cert-manager, так и с опциями net-http01.
{{< /tab >}} {{< /tabs >}}
### Начало работы с Serving
Разверните ваш первый приложение с помощью
[руководства по началу работы с развертыванием приложений Knative](../serving/getting-started-knative-app.md).
Вы также можете найти несколько примеров для Knative Serving
[здесь](../serving/samples/).
## Установка компонента Eventing
{{< feature-state version="v0.16" state="стабильный" >}}
Следующие команды устанавливают компонент Knative Eventing.
1. Установите
[Custom Resource Definitions](https://kubernetes.io/docs/concepts/extend-kubernetes/api-extension/custom-resources/)
(также известные как CRDs):
```bash
kubectl apply --filename {{< artifact repo="eventing" file="eventing-crds.yaml" >}}
Установите основные компоненты Eventing (см. ниже для опциональных расширений):
kubectl apply --filename {{< artifact repo="eventing" file="eventing-core.yaml" >}}
Примечание: Если ваш кластер Kubernetes поставляется с предустановленным Istio, убедитесь, что он имеет cluster-local-gateway
установлен.
В зависимости от версии Istio, вам потребуется применить istio-knative-extras.yaml
в соответствующей версии папки
[здесь](https://github.com/knative/serving/tree/{{< branch >}}/third_party).
Установите стандартный слой Channel (канал сообщений) (по алфавиту).
{{< tabs name="eventing_channels" default="In-Memory (standalone)" >}} {{% tab name="Apache Kafka Channel" %}}1. Сначала, Установите Apache Kafka для Kubernetes
Затем установите канал Apache Kafka:
curl -L "{{< artifact repo="eventing-contrib" file="kafka-channel.yaml" >}}" \
| sed 's/REPLACE_WITH_CLUSTER_URL/my-cluster-kafka-bootstrap.kafka:9092/' \
| kubectl apply --filename -
Для получения дополнительной информации о канале Apache Kafka попробуйте наш пример
{{< /tab >}}
{{% tab name="Google Cloud Pub/Sub Channel" %}}
Установите канал Google Cloud Pub/Sub:
# Это устанавливает как канал, так и источники GCP.
kubectl apply --filename {{< artifact org="google" repo="knative-gcp" file="cloud-run-events.yaml" >}}
Для получения дополнительной информации о канале Google Cloud Pub/Sub попробуйте наш пример
{{< /tab >}}
{{% tab name="In-Memory (standalone)" %}}
{{< feature-state version="v0.16" state="stable" >}}
Следующая команда устанавливает реализацию канала, которая работает в памяти. Эта реализация хороша тем, что она проста и автономна, но она не подходит для использования в производственных целях.
kubectl apply --filename {{< artifact repo="eventing" file="in-memory-channel.yaml" >}}
{{< /tab >}}
{{% tab name="NATS Channel" %}}
Сначала, [Установите NATS Streaming для Kubernetes](https://github.com/knative/eventing-contrib/blob/{{< version >}}/natss/config/broker/README.md)
Затем установите канал NATS Streaming:
kubectl apply --filename {{< artifact repo="eventing-contrib" file="natss-channel.yaml" >}}
{{< /tab >}}
{{< /tabs >}}Установите слой Broker (eventing):
{{< tabs name="eventing_brokers" default="MT-Channel-based" >}}
{{% tab name="Apache Kafka Broker" %}}
{{< feature-state version="v0.17" state="alpha" >}}
Следующая команда устанавливает Apache Kafka брокер и выполняет маршрутизацию событий в системном пространстве имен knative-eventing
, по умолчанию.
kubectl apply --filename {{< artifact org="knative-sandbox" repo="eventing-kafka-broker" file="eventing-kafka-broker.yaml" >}}
Для получения дополнительной информации см. документацию по Kafka Broker. {{< /tab >}}
{{% tab name="MT-Channel-based" %}} {{< feature-state version="v0.16" state="stable" >}} Следующая команда устанавливает реализацию Broker, которая использует Channels и запускает компоненты маршрутизации событий в пространстве имен System, обеспечивая более компактную и простую установку.
kubectl apply --filename {{< artifact repo="eventing" file="mt-channel-broker.yaml" >}}
Для настройки используемой реализации брокера канала обновите следующий ConfigMap, чтобы указать, какие конфигурации используются для каких пространств имен:yaml apiVersion: v1 kind: ConfigMap metadata: name: config-br-defaults namespace: knative-eventing data: default-br-config: | # Это кластерное по умолчанию значение для брокера канала. clusterDefault: brokerClass: MTChannelBasedBroker apiVersion: v1 kind: ConfigMap name: imc-channel namespace: knative-eventing # Это позволяет вам указать разные значения по умолчанию для каждого пространства имен, # в данном случае пространство имен "some-namespace" будет использовать конфигурацию канала Kafka по умолчанию (только для примера, вам потребуется установить Kafka для использования этого). namespaceDefaults: some-namespace: brokerClass: MTChannelBasedBroker apiVersion: v1 kind: ConfigMap name: kafka-channel namespace: knative-eventing
Примеры ConfigMap imc-channel
и kafka-channel
будут выглядеть следующим образом:
apiVersion: v1
kind: ConfigMap
metadata:
name: imc-channel
namespace: knative-eventing
data:
channelTemplateSpec: |
apiVersion: messaging.knative.dev/v1
kind: InMemoryChannel
---
apiVersion: v1
kind: ConfigMap
metadata:
name: kafka-channel
namespace: knative-eventing
data:
channelTemplateSpec: |
apiVersion: messaging.knative.dev/v1alpha1
kind: KafkaChannel
spec:
numPartitions: 3
replicationFactor: 1
Для использования KafkaChannel
убедитесь, что он установлен на кластере, как обсуждалось выше.
{{< /tab >}}{{< /tabs >}}
Ожидайте, пока все компоненты Knative покажут статус STATUS
равный Running
:
kubectl get pods --namespace knative-eventing
На этом этапе у вас есть базовая установка Knative Eventing!
{{< tabs name="eventing_extensions" >}} {{% tab name="Sugar Controller" %}}
{{< feature-state version="v0.16" state="alpha" >}}
Следующая команда устанавливает Eventing Sugar Controller:
kubectl apply --filename {{< artifact repo="eventing" file="eventing-sugar-controller.yaml" >}}
Knative Eventing Sugar Controller реагирует на специальные метки и аннотации и создает ресурсы Eventing. Например:
eventing.knative.dev/injection=enabled
, контроллер создает по умолчанию брокер в этом Namespace.eventing.knative.dev/injection=enabled
, контроллер создает брокер с именем, соответствующим этому Trigger, в Namespace триггера.Следующая команда включает по умолчанию брокер в Namespace (например, default
):```bash
kubectl label namespace default eventing.knative.dev/injection=enabled
{{< /tab >}}
{{% tab name="Github Source" %}}
{{< feature-state version="v0.2" state="alpha" >}}
Следующая команда устанавливает однопользовательский GitHub источник:
```bash
kubectl apply --filename {{< artifact repo="eventing-contrib" file="github.yaml" >}}
Однопользовательский GitHub источник создает один Knative сервис на каждый GitHub источник.
Следующая команда устанавливает многопользовательский GitHub источник:
kubectl apply --filename {{< artifact repo="eventing-contrib" file="mt-github.yaml" >}}
Многопользовательский GitHub источник создает только один Knative сервис, обрабатывающий все GitHub источники в кластере. Этот источник еще не поддерживает конфигурацию логирования или трассировки.
Для получения дополнительной информации о GitHub источнике попробуйте наш пример
{{< /tab >}}
{{% tab name="Apache Camel-K Source" %}} {{< feature-state version="v0.5" state="alpha" >}}
Следующая команда устанавливает Apache Camel-K Source:
kubectl apply --filename {{< artifact repo="eventing-contrib" file="camel.yaml" >}}
Для получения дополнительной информации о исходном коде Apache Camel-K, попробуйте наш пример
{{< /tab >}}
{{% tab name="Apache Kafka Source" %}}
{{< feature-state version="v0.5" state="alpha" >}}
Следующая команда устанавливает Apache Kafka Source:
kubectl apply --filename {{< artifact repo="eventing-contrib" file="kafka-source.yaml" >}}
Для получения дополнительной информации о исходном коде Apache Kafka, попробуйте наш пример{{< /tab >}}
{{% tab name="GCP Sources" %}}
{{< feature-state version="v0.2" state="alpha" >}}
Следующая команда устанавливает GCP Sources:
# Эта команда устанавливает как Sources, так и Channel.
kubectl apply --filename {{< artifact org="google" repo="knative-gcp" file="cloud-run-events.yaml" >}}
Для получения дополнительной информации о исходном коде Cloud Pub/Sub, попробуйте наш пример.
Для получения дополнительной информации о исходном коде Cloud Storage, попробуйте наш пример.
Для получения дополнительной информации о исходном коде Cloud Scheduler, попробуйте наш пример.
Для получения дополнительной информации о исходном коде Cloud Audit Logs, попробуйте наш пример.
{{< /tab >}}
{{% tab name="Apache CouchDB Source" %}}
{{< feature-state version="v0.10" state="alpha" >}}
Следующая команда устанавливает Apache CouchDB Source:
kubectl apply --filename {{< artifact repo="eventing-contrib" file="couchdb.yaml" >}}
Для получения дополнительной информации о исходном коде Apache CouchDB, прочитайте [нашу документацию]((https://github.com/knative/eventing-contrib/blob/{{< version >}}/couchdb/README.md))
{{< /tab >}}
{{% tab name="VMware Sources and Bindings" %}}
{{< feature-state version="v0.14" state="alpha" >}}
Следующая команда устанавливает VMware Sources and Bindings:
kubectl apply --filename {{< artifact org="vmware-tanzu" repo="sources-for-knative" file="release.yaml" >}}
Для получения дополнительной информации о исходных кодах и связях VMware, попробуйте наши примеры. {{< /tab >}}
{{< /tabs >}}
Вы можете найти множество примеров для Knative Eventing здесь. Быстрый старт доступен здесь.
{{< feature-state version="v0.14" state="deprecated" >}}
Установите следующие функции Observability для включения логирования, метрик и отслеживания запросов в ваших компонентах Serving и Eventing.
Все плагины Observability требуют установки ядра:
kubectl apply --filename {{< artifact repo="serving" file="monitoring-core.yaml" >}}
После установки ядра, вы можете выбрать установку одного или всех следующих плагинов Observability:
Установите Prometheus и Grafana для метрик:
kubectl apply --filename {{< artifact repo="serving" file="monitoring-metrics-prometheus.yaml" >}}
Установите ELK стек (Elasticsearch, Logstash и Kibana) для логирования:
kubectl apply --filename {{< artifact repo="serving" file="monitoring-logs-elasticsearch.yaml" >}}
Установите Jaeger для распределённого трассирования
{{< tabs name="jaeger" default="In-Memory (standalone)" >}} {{% tab name="In-Memory (standalone)" %}} Чтобы установить версию in-memory (standalone) Jaeger, выполните следующую команду:
kubectl apply --filename {{< artifact repo="serving" file="monitoring-tracing-jaeger-in-mem.yaml" >}}
```{{< /tab >}}
{{% tab name="ELK стек" %}} Чтобы установить версию ELK Jaeger (требуется установка ELK выше), выполните следующую команду:
```bash
kubectl apply --filename {{< artifact repo="serving" file="monitoring-tracing-jaeger.yaml" >}}
{{< /tab >}} {{< /tabs >}}
Установите Zipkin для распределённого трассирования
{{< tabs name="zipkin" default="In-Memory (standalone)" >}} {{% tab name="In-Memory (standalone)" %}} Чтобы установить версию in-memory (standalone) Zipkin, выполните следующую команду:```bash kubectl apply --filename {{< artifact repo="serving" file="monitoring-tracing-zipkin-in-mem.yaml" >}}
{{< /tab >}}
{{% tab name="ELK стек" %}} Для установки версии ELK Zipkin (необходима установка ELK выше), выполните следующую команду:
```bash
kubectl apply --filename {{< artifact repo="serving" file="monitoring-tracing-zipkin.yaml" >}}
{{< /tab >}} {{< /tabs >}}
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )