﻿# Установка Cilium eBPF

> [HTML Version](cilium-ebpf.html)

Cilium — это CNI‑плагин, который обеспечивает эффективную маршрутизацию трафика для сервисов приложения ELMA365 благодаря интеграции с технологией eBPF. В отличие от классических прокси, eBPF позволяет применять фильтры, балансировку и L7‑политики непосредственно в ядре Linux, не тратя ресурсы на копирование данных между ядром и приложением.

Это позволяет:

- исключить потери производительности, связанные с переключением контекстов;

- обеспечить линейное масштабирование при росте нагрузки;

- реализовать обработку пиковых нагрузок ELMA365 с минимальными задержками. 

Установка плагина состоит из трёх этапов:

1. [Скачивание helm-чарта и конфигурационного файла](#download-chart).

2. [Заполнение конфигурационного файла](#config-file).

3. [Установка с помощью helm в Kubernetes-кластер](#install).

````
начало внимание

````
Если вы ранее использовали другой CNI‑плагин, перед установкой Cilium полностью удалите его, а также компонент **kube-proxy**, чтобы избежать конфликтов.

````
конец внимание

## ````
Шаг 1. Скачать helm-чарт и конфигурационный файл

Для установки через интернет получите конфигурационный файл `values-cilium.yaml`, выполнив команду:

````
helm repo add elma365 https://charts.elma365.tech  
helm repo update  
helm show values elma365/cilium > values-cilium.yaml

````
**Получение конфигурационного файла для установки в закрытом контуре без доступа в интернет**

1. На компьютере с доступом в интернет скачайте архив актуальной версии (latest) чарта **cilium**, выполнив следующую команду:

````
helm repo add elma365 https://charts.elma365.tech  
helm repo update  
helm pull elma365/cilium

2. ````
Скопируйте полученный архив чарта `cilium-X.Y.Z.tgz` на сервер, где будет выполняться установка.

3. Распакуйте чарт `cilium-X.Y.Z.tgz` и создайте копию конфигурационного файла `values.yaml` с названием `values-cilium.yaml`:

````
tar -xf cilium-X.Y.Z.tgz  
cp cilium/values.yaml values-cilium.yaml
````

## ````
Шаг 2. Заполнить конфигурационный файл

Задайте настройки для установки Cilium в конфигурационном файле `values-cilium.yaml`. 

**Пример содержания файла values-cilium.yaml**

````
\## Настройки cilium  
cilium:  
\# Отключить L2-объявления (Advertisement) сервисов  
  l2announcements:  
    enabled: false  
  
\## Хост Kubernetes API (пусто = автоопределение)  
  k8sServiceHost: ""  
  k8sServicePort: "6443"  
  
\## Включить поддержку Kubernetes Gateway API  
  gatewayAPI:  
    enabled: false  
\## Использовать hostNetwork для Gateway (иначе CNI) необходимо расскомментировать envoy.securityContext.capabilities  
    hostNetwork:  
      enabled: false  
  
\## Автоматически генерировать TLS-сертификаты для внутреннего взаимодействия  
  certgen:  
    generateCA: true  
  
\## Hubble — наблюдаемость сети (eBPF)  
  hubble:  
    metrics:  
\## Какие метрики собирать  
      enabled: \[dns,drop,tcp,flow,icmp,http\]  
    relay:  
      enabled: false  
\## Включение Hubble UI  
    ui:  
      enabled: false  
      backend:  
        image:  
  
\## IP Address Management — управление IP-адресами  
  ipam:  
\## Режим: пул IP для всего кластера  
    mode: "cluster-pool"  
    operator:  
      clusterPoolIPv4PodCIDRList: \["10.0.0.0/8"\]  
      clusterPoolIPv4MaskSize: 24  
      clusterPoolIPv6PodCIDRList: \["fd00::/104"\]  
      clusterPoolIPv6MaskSize: 120  
  
\## Поддержка диапазонов  
  ipv4:  
    enabled: true  
  ipv6:  
    enabled: false  
  
\## Полная замена kube-proxy на eBPF (включая kube-proxy)  
  kubeProxyReplacement: "true"  
\## Включить L7 прокси (HTTP/gRPC через Envoy)  
  l7Proxy: true  
\## Режим работы L7 прокси  
  loadBalancer:  
    l7:  
      backend: envoy  
\## Включить Envoy внутри Cilium  
  envoy:  
    enabled: false  
\##  При включенном hostNetwork.enabled=true, раскомметировать securityContext  
\#    securityContext:  
\#      capabilities:  
\#        keepCapNetBindService: true  
\#        envoy: \[NET\_BIND\_SERVICE,BPF,SYS\_ADMIN,NET\_ADMIN,NET\_RAW\]  
  
  
\## Cilium Operator — управление кластером  
  operator:  
    enabled: true
````

````
**Заполнение параметров подключения к приватному registry для установки в закрытом контуре без доступа в интернет**

  
Для подключения к приватному registry:

1. Скачайте образы ELMA365 и загрузите их в локальный реестр образов. Подробнее читайте в статье [«Загрузка образов ELMA365»](downloadin-images-elma365.md).

2. В файле `values-cilium.yaml`:

	- в параметре `image.repository` — задайте путь к приватному registry в формате `registry.example.com`;

	- в параметре `imagePullSecrets` — укажите наименование секрета с правами доступа к приватному registry. Он должен быть создан вручную и зашифрован в Base64.

````
cilium:  
\## параметры подключения к приватному registry  
  image:  
    repository: "registry.example.com/docker/addons/cilium/cilium"  
    tag: "v1.19.3"  
    useDigest: false  
\## секрет с правами доступа к приватному registry должен быть создан вручную, зашифрованный в Base64  
  imagePullSecrets: \[\]  
\## На каких узлах запускать Cilium  
  nodeSelector:  
    kubernetes.io/os: linux  
  tolerations:  
    - operator: Exists  
  
  
  certgen:  
    image:  
\## параметры подключения к приватному registry  
      repository: "registry.example.com/docker/addons/cilium/certgen"  
      tag: "v0.4.1"  
      useDigest: false  
\## На каких узлах запускать Cilium  
    nodeSelector: \{\}  
    tolerations: \[\]  
  
  hubble:  
    ui:  
      backend:  
        image:  
\## параметры подключения к приватному registry  
          repository: "registry.example.com/docker/addons/cilium/hubble-ui-backend"  
          tag: "v0.13.3"  
          useDigest: false  
      frontend:  
        image:  
\## параметры подключения к приватному registry  
          repository: "registry.example.com/docker/addons/cilium/hubble-ui"  
          tag: "v0.13.3"  
          useDigest: false  
\## На каких узлах запускать Cilium  
      nodeSelector:  
        kubernetes.io/os: linux  
      tolerations: \[\]  
  
  operator:  
    image:  
\## параметры подключения к приватному registry  
      repository: "registry.example.com/docker/addons/cilium/operator"  
      tag: "v1.19.3"  
\## На каких узлах запускать Cilium  
    nodeSelector:  
      kubernetes.io/os: linux  
    tolerations:  
      - key: "node-role.kubernetes.io/control-plane"  
        operator: Exists  
      - key: "node-role.kubernetes.io/master  
        operator: Exists  
      - key: "node.kubernetes.io/not-ready"  
        operator: Exists  
      - key: "node.cloudprovider.kubernetes.io/uninitialized"  
        operator: Exists
````

## ````
Шаг 3. Установить чарт cilium в Kubernetes-кластер

C помощью helm установите чарт **cilium** в namespace `kube-system`:

- для установки через интернет выполните команду:

````
helm upgrade --install -n kube-system cilium elma365/cilium -f values-cilium.yaml

- ````
для установки в закрытом контуре без доступа в интернет перейдите в каталог с загруженным чартом и выполните команду:

````
helm upgrade --install cilium ./cilium -f values-cilium.yaml -n kube-system

## ````
Удалить чарт Cilium в Kubernetes-кластере

Чтобы удалить чарт **cilium** в namespace** **`kube-system`, выполните команду:

````
helm uninstall -n kube-system cilium 

## ````
Использовать Hubble для визуализации кластеров

Hubble — это инструмент для наблюдения за сетями, встроенный в Cilium, который предоставляет карту сервисов Kubernetes-кластера. Hubble использует возможности eBPF‑программ Cilium, поэтому собирает данные о сетевых потоках без существенной затраты ресурсов.

Для визуализации и фильтрации потоков данных используется веб-интерфейс Hubble UI. При развёртывании приложений в нём автоматически строится диаграмма связей и зависимостей между сервисами на уровнях L3, L4 и L7.

Hubble можно использовать для:

- отладки сетевых проблем;

- проверки сетевых политик;

- анализа поведения сервисов;

- диагностики ошибок, например, при обработке запросов.

Чтобы открыть Hubble UI в браузере:

1. Настройте переадресацию портов на сервис `hubble-ui` с помощью команды:

````
kubectl port-forward -n kube-system svc/hubble-ui 8080:80 --address 0.0.0.0

2. ````
Перейдите в веб-интерфейс по адресу **http://<node\_ip>:8080/**.