﻿# Установка Linkerd с помощью Cert-manager

> [HTML Version](linkerd-with-cert-manager.html)

Linkerd — это выделенный уровень инфраструктуры, который помогает обрабатывать связь между сервисами, автоматически шифровать соединения, обрабатывать повторные запросы и тайм-ауты. Установка компонента дополнений Linkerd позволяет обеспечить балансировку gRPC-трафика при масштабировании сервисов ELMA365. Также он предоставляет использование телеметрии (коэффициент успешности, задержки) и многое другое.

Linkerd является необходимым компонентом для включения поддержки масштабирования сервисов на стороне приложения ELMA365. Без установленного Linkerd масштабирование микросервисов ELMA365 работать не будет.

О подготовке сертификатов с помощью openssl для Linkerd и его установке читайте в статье [«Установка Linkerd»](install-linkerd.md).

В этой статье рассмотрим, как:

- автоматизировать подготовку сертификатов с помощью инструмента Cert-manager и установить Linkerd;

- [удалить чарт Linkerd с помощью Helm в Kubernetes-кластере](#delete-chart).

Установка Linkerd состоит из четырёх этапов:

1. [Подготовить сертификаты для Linkerd](#prepare-certificate).

2. [Загрузить Helm-чарт и конфигурационный файл](#helm-chart).

3. [Заполнить конфигурационный файл](#configuration-file).

4. [Установить чарт Linkerd с помощью Helm в Kubernetes-кластер](#install-chart).

## Шаг 1. Подготовить сертификаты для Linkerd

1. Установите [Cert-manager](install-cert-manager.md) и создайте пространства имён. Cert-manager будет использовать их для хранения ресурсов, связанных с веб-перехватчиком:

````
kubectl create namespace linkerd  
kubectl label namespace linkerd linkerd.io/is-control-plane=true config.linkerd.io/admission-webhooks=disabled linkerd.io/control-plane-ns=linkerd  
kubectl annotate namespace linkerd linkerd.io/inject=disabled

2. ````
Установите инструмент [step](https://smallstep.com/cli/), чтобы создать пару ключей для подписи каждого сертификата:

````
wget https://dl.smallstep.com/cli/docs-cli-install/latest/step-cli\_amd64.deb  
sudo dpkg -i step-cli\_amd64.deb

3. ````
Сгенерируйте сертификаты с помощью [step](https://smallstep.com/cli/), чтобы использовать их для подписи:

- сертификатов веб-перехватчика;

Выполните команду

````
  
\#  Создать ключи CA  
step certificate create webhook.linkerd.cluster.local caWebhook.crt caWebhook.key --profile root-ca --no-password --insecure --san webhook.linkerd.cluster.local --not-after=87600h  
kubectl create secret tls webhook-issuer-tls --cert=caWebhook.crt --key=caWebhook.key --namespace=linkerd  
\# Создать Issuer  
kubectl apply -f - <<EOF  
apiVersion: cert-manager.io/v1  
kind: Issuer  
metadata:  
  name: webhook-issuer  
  namespace: linkerd  
spec:  
  ca:  
    secretName: webhook-issuer-tls  
EOF  
\# Создать Certificate  
kubectl apply -f - <<EOF  
apiVersion: cert-manager.io/v1  
kind: Certificate  
metadata:  
  name: linkerd-policy-validator  
  namespace: linkerd  
spec:  
  secretName: linkerd-policy-validator-k8s-tls  
  duration: 24h  
  renewBefore: 1h  
  issuerRef:  
    name: webhook-issuer  
    kind: Issuer  
  commonName: linkerd-policy-validator.linkerd.svc  
  dnsNames:  
  - linkerd-policy-validator.linkerd.svc  
  isCA: false  
  privateKey:  
    algorithm: ECDSA  
    encoding: PKCS8  
  usages:  
  - server auth  
\---  
apiVersion: cert-manager.io/v1  
kind: Certificate  
metadata:  
  name: linkerd-proxy-injector  
  namespace: linkerd  
spec:  
  secretName: linkerd-proxy-injector-k8s-tls  
  duration: 24h  
  renewBefore: 1h  
  issuerRef:  
    name: webhook-issuer  
    kind: Issuer  
  commonName: linkerd-proxy-injector.linkerd.svc  
  dnsNames:  
  - linkerd-proxy-injector.linkerd.svc  
  isCA: false  
  privateKey:  
    algorithm: ECDSA  
  usages:  
  - server auth  
\---  
apiVersion: cert-manager.io/v1  
kind: Certificate  
metadata:  
  name: linkerd-sp-validator  
  namespace: linkerd  
spec:  
  secretName: linkerd-sp-validator-k8s-tls  
  duration: 24h  
  renewBefore: 1h  
  issuerRef:  
    name: webhook-issuer  
    kind: Issuer  
  commonName: linkerd-sp-validator.linkerd.svc  
  dnsNames:  
  - linkerd-sp-validator.linkerd.svc  
  isCA: false  
  privateKey:  
    algorithm: ECDSA  
  usages:  
  - server auth  
EOF  

````

- ````
сертификата Control Plane.

Выполните команду

````
  
\# Создать ключи CA  
step certificate create root.linkerd.cluster.local caRoot.crt caRoot.key --profile root-ca --no-password --insecure --not-after=87600h  
kubectl create secret tls linkerd-trust-anchor --cert=caRoot.crt --key=caRoot.key --namespace=linkerd  
\# Создать Issuer  
kubectl apply -f - <<EOF  
apiVersion: cert-manager.io/v1  
kind: Issuer  
metadata:  
  name: linkerd-trust-anchor  
  namespace: linkerd  
spec:  
  ca:  
    secretName: linkerd-trust-anchor  
EOF  
\# Создать Certificate  
kubectl apply -f - <<EOF  
apiVersion: cert-manager.io/v1  
kind: Certificate  
metadata:  
  name: linkerd-identity-issuer  
  namespace: linkerd  
spec:  
  secretName: linkerd-identity-issuer  
  duration: 48h  
  renewBefore: 25h  
  issuerRef:  
    name: linkerd-trust-anchor  
    kind: Issuer  
  commonName: identity.linkerd.cluster.local  
  dnsNames:  
  - identity.linkerd.cluster.local  
  isCA: true  
  privateKey:  
    algorithm: ECDSA  
  usages:  
  - cert sign  
  - crl sign  
  - server auth  
  - client auth  
EOF  

````

## ````
Шаг 2. Загрузить Helm-чарт и конфигурационный файл

Для установки через интернет получите конфигурационный файл \[OBJECT\], выполнив команду:

````
helm repo add elma365 https://charts.elma365.tech  
helm repo update  
helm show values elma365/linkerd > values-linkerd.yaml

````


Получение конфигурационного файла для установки в закрытом контуре без доступа в интернет



1. На компьютере с доступом в интернет загрузите архив актуальной версии (latest) чарта **Linkerd** из репозитория ELMA365, выполнив команду:

````
helm repo add elma365 https://charts.elma365.tech  
helm repo update  
helm pull elma365/linkerd

2. ````
Полученный архив чарта \[OBJECT\] скопируйте на сервер его установки.

3. Распакуйте чарт на сервере и скопируйте конфигурационный файл по умолчанию \[OBJECT\] в \[OBJECT\], выполнив команду:

````
tar -xf linkerd-X.Y.Z.tgz  
cp linkerd/values.yaml values-linkerd.yaml

````


## Шаг 3. Заполнить конфигурационный файл

В конфигурационном файле \[OBJECT\] заполните параметры для установки Linkerd:

1. Укажите DNS-имя домена Kubernetes-кластера в параметре \[OBJECT\]. В этом примере указано имя \[OBJECT\]:

````
\# Настройки linkerd  
linkerd:  
  # DNS-имя домена Kubernetes  
  clusterDomain: cluster.local  
  # добавляет ресурс PodSecurityPolicy (устарело начиная с версии k8s v1.21)  
  enablePSP: false  
  # отключить heartbeat  
  disableHeartBeat: false    
...

2. ````
Для обеспечения высокой доступности вы можете раскомментировать параметры секции **Параметры для обеспечения высокой доступности**.

Пример включения высокой доступности

````
  
\# Настройки linkerd  
linkerd:  
...  
\#  
\# параметры для обеспечения высокой доступности  
  controllerReplicas: 3  
  enablePodDisruptionBudget: true  
  deploymentStrategy:  
    rollingUpdate:  
      maxUnavailable: 1  
      maxSurge: 25%  
  enablePodAntiAffinity: true  
  proxy:  
    resources:  
      cpu:  
        request: 100m  
      memory:  
        limit: 250Mi  
        request: 20Mi  
  controllerResources: \&controller\_resources  
    cpu: \&controller\_resources\_cpu  
      limit: ""  
      request: 100m  
    memory:  
      limit: 250Mi  
      request: 50Mi  
  destinationResources: \*controller\_resources  
  identityResources:  
    cpu: \*controller\_resources\_cpu  
    memory:  
      limit: 250Mi  
      request: 10Mi  
  heartbeatResources: \*controller\_resources  
  proxyInjectorResources: \*controller\_resources  
  webhookFailurePolicy: Ignore  
  spValidatorResources: \*controller\_resources  
\#   
...

````


3. Если вы установили [средства мониторинга](install-monitoring-tools.md), укажите параметр для сбора метрик Linkerd:

````
\# Параметр подключения сбора метрик  
podMonitor:  
  enabled: true

4. ````
Если вы устанавливаете Linkerd в закрытом контуре без доступа в интернет, заполните параметры подключения к приватному **registry**.

Пример заполнения параметров для подключения к приватному registry

  
Для подключения к приватному \[OBJECT\]:

1. Скачайте образы ELMA365 и загрузите их в локальный реестр образов. Подробнее об этом читайте в статье [«Загрузка образов ELMA365»](downloadin-images-elma365.md).

2. Задайте адрес и путь в параметрах \[OBJECT\], \[OBJECT\], \[OBJECT\], \[OBJECT\].

3. Укажите наименование секрета с правами доступа к приватному \[OBJECT\] в параметре \[OBJECT\]. Секрет должен быть создан вручную и зашифрован в Base64.

````
\# Настройки linkerd  
linkerd:  
...  
  # параметры подключения к приватному registry  
  # адрес и путь для приватного registry  
  controllerImage: registry.example.com/linkerd/controller  
  policyController:  
    image:  
      # адрес и путь для приватного registry  
      name: registry.example.com/linkerd/policy-controller  
  proxy:  
    image:  
      # адрес и путь для приватного registry  
      name: registry.example.com/linkerd/proxy  
  proxyInit:  
    image:  
      # адрес и путь для приватного registry  
      name: registry.example.com/linkerd/proxy-init  
  # секрет с правами доступа к приватному registry должен быть создан вручную и зашифрован в Base64  
  imagePullSecrets:  
    - name: myRegistryKeySecretName

````
Где формат:

- ````
\[OBJECT\]````
:

- адрес — ````
\[OBJECT\]````
;

- путь — ````
\[OBJECT\]````
;

- ````
\[OBJECT\]````
:

- адрес — ````
\[OBJECT\]````
;

- путь — ````
\[OBJECT\]````
;

- ````
\[OBJECT\]````
:

- адрес — ````
\[OBJECT\]````
;

- путь — ````
\[OBJECT\]````
;

- ````
\[OBJECT\]````
:

- адрес — ````
\[OBJECT\]````
;

- путь — ````
\[OBJECT\]````
.

````


````


## Шаг 4. Установить чарт Linkerd с помощью Helm в Kubernetes-кластер

Установите чарт **Linkerd** в \[OBJECT\]. Namespace будет создан во время установки, если не был создан ранее.

В примере ниже команда установки выполняется из директории, где на [шаге 1](#prepare-certificate) были созданы сертификаты. Если выполнение команды происходит из другой директории, укажите пути до сертификатов, созданных на [шаге 1](#prepare-certificate) (\[OBJECT\], \[OBJECT\]).

Для установки через интернет:

````
helm upgrade --install linkerd elma365/linkerd -f values-linkerd.yaml -n linkerd --create-namespace \\  
\--set-file linkerd.identityTrustAnchorsPEM=caRoot.crt \\  
\--set linkerd.identity.issuer.scheme=kubernetes.io/tls \\  
\--set linkerd.policyValidator.externalSecret=true \\  
\--set-file linkerd.policyValidator.caBundle=caWebhook.crt \\  
\--set linkerd.proxyInjector.externalSecret=true \\  
\--set-file linkerd.proxyInjector.caBundle=caWebhook.crt \\  
\--set linkerd.profileValidator.externalSecret=true \\  
\--set-file linkerd.profileValidator.caBundle=caWebhook.crt

````
Для установки без доступа в интернет:

````
helm upgrade --install linkerd ./linkerd -f values-linkerd.yaml -n linkerd --create-namespace \\  
\--set-file linkerd.identityTrustAnchorsPEM=caRoot.crt \\  
\--set linkerd.identity.issuer.scheme=kubernetes.io/tls \\  
\--set linkerd.policyValidator.externalSecret=true \\  
\--set-file linkerd.policyValidator.caBundle=caWebhook.crt \\  
\--set linkerd.proxyInjector.externalSecret=true \\  
\--set-file linkerd.proxyInjector.caBundle=caWebhook.crt \\  
\--set linkerd.profileValidator.externalSecret=true \\  
\--set-file linkerd.profileValidator.caBundle=caWebhook.crt

Начало внимание

````
После установки Linkerd измените параметры приложения ELMA365 и настройте автомасштабирование сервисов. Подробнее читайте в статье [«Включение автомасштабирования сервисов в ELMA365 Enterprise»](autoscaling-service-enterprise.md).

````
Конец внимание

## ````
Удалить чарт Linkerd с помощью Helm в Kubernetes-кластере

````
Начало внимание

````
Перед удалением компонента дополнений Linkerd отключите автомасштабирование на стороне приложения ELMA365.

````
Конец внимание

````
Чтобы удалить чарт **Linkerd** в \[OBJECT\], выполните команду:

````
helm uninstall linkerd -n linkerd

````
