Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
Next revisionBoth sides next revision
linux_faq:kubernetes_using_single_node_as_master_and_worker [2021/07/14 07:59] – [Ingress-controller] adminlinux_faq:kubernetes_using_single_node_as_master_and_worker [2022/04/06 12:29] – [Cert manager] admin
Line 56: Line 56:
   kubectl taint nodes --all node-role.kubernetes.io/master-   kubectl taint nodes --all node-role.kubernetes.io/master-
  
 +====== Настройка манифестов компонентво кубера на слабых маишинках ======
 +Я запускаю свой кластер в контейнере на сервере Proxmox,  на довольно слабой машинке, поэтому при старте компоненты кубера начинают отвечать очень нескоро. \\
 +Чтобы немного облегчить им жизнь и сделать поведение компонентов k8s более предсказуемым нужно увеличить таймауты **livenessProbe**, **readinessProbe** и **startupProbe** - в результате у сервисов будет больше времени чтобы прийти в норму при запуске/перезапуске и кластер будет вести себя стабильнее, особенно если в нем много полезной нагрузки. \\
 +Для этого - редактируем манифесты в директории **/etc/kubernetes/manifests/** и подкручиваем там значения до, например, таких: 
 +<code>
 +    livenessProbe:
 +      failureThreshold: 300
 +      initialDelaySeconds: 60
 +      periodSeconds: 15
 +      timeoutSeconds: 30
 +    readinessProbe:
 +      failureThreshold: 300
 +      periodSeconds: 15
 +      timeoutSeconds: 30
 +    startupProbe:
 +      failureThreshold: 300
 +      initialDelaySeconds: 60
 +      periodSeconds: 15
 +      timeoutSeconds: 30
 +</code>
 +И перезапускаем **kubelet**:
 +  sudo service kubelet restart
 ====== Изменение редактора kubectl edit ====== ====== Изменение редактора kubectl edit ======
   sudo awk -v line='export KUBE_EDITOR="/bin/nano"' 'FNR==NR && line==$0{f=1; exit} END{if (!f) print line >> FILENAME}' /etc/bash.bashrc   sudo awk -v line='export KUBE_EDITOR="/bin/nano"' 'FNR==NR && line==$0{f=1; exit} END{if (!f) print line >> FILENAME}' /etc/bash.bashrc
Line 106: Line 128:
 <code>  - --kubelet-insecure-tls</code> <code>  - --kubelet-insecure-tls</code>
 Без этого параметра metrics-server не запустится, а в логах будет примерно такое: Без этого параметра metrics-server не запустится, а в логах будет примерно такое:
-<<code>[unable to fully scrape metrics from node kub-worker01: unable to fetch metrics from node kub-sbl-apps-dev-worker01: Get "https://192.168.44.11:10250/stats/summary?only_cpu_and_memory=true": x509: cannot validate certificate for 192.168.44.11 because it doesn't contain any IP SANs </code>+<code>[unable to fully scrape metrics from node kub-worker01: unable to fetch metrics from node kub-sbl-apps-dev-worker01: Get "https://192.168.44.11:10250/stats/summary?only_cpu_and_memory=true": x509: cannot validate certificate for 192.168.44.11 because it doesn't contain any IP SANs </code>
 Все. Через некоторое время команды **kubectl top** начнут выдавать осмысленную информацию. \\ Все. Через некоторое время команды **kubectl top** начнут выдавать осмысленную информацию. \\
 Если этого не происходит, а в логах  Если этого не происходит, а в логах 
Line 116: Line 138:
 С третьей версией **Helm** ничего в кластер ставить не нужно. Для использования достаточно бинарника и сконфигурированного **context** для доступа к кластеру. С третьей версией **Helm** ничего в кластер ставить не нужно. Для использования достаточно бинарника и сконфигурированного **context** для доступа к кластеру.
  
 +====== Обновление kubernetes ======
 +смотрим какие версии **kubeadm** нам доступны
 +  sudo apt-get update
 +  apt-cache madison kubeadm
 +Разрешаем обновление **kubernetes-cni** и **kubeadm**:
 +  sudo apt-mark unhold kubernetes-cni kubeadm
 +Ставим нужную версию **kubeadm**: 
 +  sudo apt-get install kubeadm=1.20.9-00
 +Проверяем возможность апгрейда:
 +  sudo kubeadm upgrade plan
 +Если у нас хост с **containerd** (без **docker**), то нужно учесть, что **kubeadm** понадобится **docker** для получения **images**. Поэтому временно ставим его:
 +  sudo apt-get install docker.io
 +Обновляем:
 +  sudo kubeadm upgrade apply v1.20.9
 +Разрешаем обновление **kubelet** и **kubectl**
 +  sudo apt-mark unhold kubelet kubectl
 +И обновляем их до нужной версии:
 +  sudo apt-get install -y kubelet=1.20.9-00 kubectl=1.20.9-00
 +Морозим обратно версии пакетов:
 +  sudo apt-mark hold kube*
 +Апгрейдим всю систему:
 +  sudo apt-get update && sudo apt-get upgrade
 ====== Доступ к подам снаружи ====== ====== Доступ к подам снаружи ======
 Для доступа к сервисам, которые предоставляют поды, нужно установить и настроить: Для доступа к сервисам, которые предоставляют поды, нужно установить и настроить:
Line 124: Line 168:
 https://habr.com/ru/company/southbridge/blog/443110/ \\ https://habr.com/ru/company/southbridge/blog/443110/ \\
 https://metallb.universe.tf/installation/ \\ https://metallb.universe.tf/installation/ \\
-  kubectl create ns metallb-system +  helm repo add metallb https://metallb.github.io/metallb 
-  helm install --name metallb stable/metallb --namespace metallb-system +  helm repo update 
-При установке с помощью **helm** конфигурация хранится в **ConfigMap** с именем **metallb-config**, который лежит в том же неймспейсе куда установлен **metallb** (в данном случае - **metallb-system**). +  kubectl create ns metallb-system  
-<code>apiVersion: v1 +  helm upgrade --install -metallb-system metallb metallb/metallb 
-kind: ConfigMap +    --set configInline.address-pools[0].name="default" \ 
-metadata: +    --set configInline.address-pools[0].protocol="layer2" \ 
-  namespace: metallb-system +    --set configInline.address-pools[0].addresses[0]="192.168.77.160-192.168.77.189"
-  name: metallb-config +
-data: +
-  config: | +
-    address-pools: +
-    - name: default +
-      protocol: layer2 +
-      addresses+
-      - 192.168.77.160-192.168.77.189 +
-</code>+
 ==== Апгрейдим metallb ==== ==== Апгрейдим metallb ====
   helm repo update   helm repo update
-  helm upgrade metallb stable/metallb --namespace metallb-system +  helm upgrade -n metallb-system metallb metallb/metallb --reuse-values
 ===== Ingress-controller ===== ===== Ingress-controller =====
 https://docs.cert-manager.io/en/latest/tutorials/acme/quick-start/# \\ https://docs.cert-manager.io/en/latest/tutorials/acme/quick-start/# \\
Line 153: Line 187:
   #helm install stable/nginx-ingress --name http-https --namespace ingress   #helm install stable/nginx-ingress --name http-https --namespace ingress
   helm upgrade --install nginx -n ingress ingress-nginx/ingress-nginx \   helm upgrade --install nginx -n ingress ingress-nginx/ingress-nginx \
-  --set controller.service.type=LoadBalancer,controller.service.externalTrafficPolicy=Local,controller.service.loadBalancerIP=192.168.77.160 \+  --set controller.service.type=LoadBalancer,controller.service.externalTrafficPolicy=Cluster,controller.service.loadBalancerIP=192.168.77.160 \
   --set controller.addHeaders."X-XSS-Protection"="1\;mode=block" \   --set controller.addHeaders."X-XSS-Protection"="1\;mode=block" \
   --set controller.addHeaders."Content-Security-Policy"="default-src 'self'; \   --set controller.addHeaders."Content-Security-Policy"="default-src 'self'; \
Line 166: Line 200:
   helm upgrade --install nginx -n ingress ingress-nginx/ingress-nginx \   helm upgrade --install nginx -n ingress ingress-nginx/ingress-nginx \
   --set controller.service.type=LoadBalancer \   --set controller.service.type=LoadBalancer \
-  --set controller.service.externalTrafficPolicy=Local \+  --set controller.service.externalTrafficPolicy=Cluster \
   --set controller.service.loadBalancerIP=192.168.77.160 \   --set controller.service.loadBalancerIP=192.168.77.160 \
   --set controller.addHeaders."X-XSS-Protection"="1\;mode=block" \   --set controller.addHeaders."X-XSS-Protection"="1\;mode=block" \
Line 175: Line 209:
 В результате - в неймспейсе **ingress** появится сервис **nginx-ingress-nginx-controller**, у которого будет тип **LoadBalancer** и который получит указанный IP-адрес в локальной сети из диапазона, сконфигурированного для **metallb**. \\ В результате - в неймспейсе **ingress** появится сервис **nginx-ingress-nginx-controller**, у которого будет тип **LoadBalancer** и который получит указанный IP-адрес в локальной сети из диапазона, сконфигурированного для **metallb**. \\
 Теперь можно создавать **ingress**'ы, которые будут смотреть на сервисы внутри кластера и предоставлять к ним доступ. Пользователи будут посылать запросы на **ingress-controller**, а он, в свою очередь, - пересылать их на **ingress**'ы. Теперь можно создавать **ingress**'ы, которые будут смотреть на сервисы внутри кластера и предоставлять к ним доступ. Пользователи будут посылать запросы на **ingress-controller**, а он, в свою очередь, - пересылать их на **ingress**'ы.
 +==== Мониторинг nginx ingess ====
 +В кластере нужно развернуть **CRD** и оператор **prometheus**: https://wiki.autosys.tk/devops/prometheus_federation#%D1%83%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B0_%D0%BE%D0%BF%D0%B5%D1%80%D0%B0%D1%82%D0%BE%D1%80%D0%B0_prometheus \\
 +\\
 +**nginx-ingress-monitoring-values.yaml**
 +<code>
 +controller:
 +  metrics:
 +    port: 10254
 +    enabled: true
 +    service:
 +      annotations:
 +        prometheus.io/scrape: "true"
 +        prometheus.io/port: "10254"
 +      servicePort: 10254
 +      type: ClusterIP
 +
 +    serviceMonitor:
 +      enabled: true
 +      additionalLabels:
 +        jobLabel: nginx-ingress
 +      namespace: "ingress"
 +      namespaceSelector:
 +        matchNames:
 +          - ingress
 +      scrapeInterval: 30s
 +
 +    prometheusRule:
 +      enabled: true
 +      namespace: ingress
 +      rules:
 +        - alert: NGINXConfigFailed
 +          expr: count(nginx_ingress_controller_config_last_reload_successful == 0) > 0
 +          for: 1s
 +          labels:
 +            severity: critical
 +          annotations:
 +            description: bad ingress config - nginx config test failed
 +            summary: uninstall the latest ingress changes to allow config reloads to resume
 +        - alert: NGINXCertificateExpiry
 +          expr: (avg(nginx_ingress_controller_ssl_expire_time_seconds) by (host) - time()) < 604800
 +          for: 1s
 +          labels:
 +            severity: critical
 +          annotations:
 +            description: ssl certificate(s) will expire in less then a week
 +            summary: renew expiring certificates to avoid downtime
 +        - alert: NGINXTooMany500s
 +          expr: 100 * ( sum( nginx_ingress_controller_requests{status=~"5.+"} ) / sum(nginx_ingress_controller_requests) ) > 5
 +          for: 1m
 +          labels:
 +            severity: warning
 +          annotations:
 +            description: Too many 5XXs
 +            summary: More than 5% of all requests returned 5XX, this requires your attention
 +        - alert: NGINXTooMany400s
 +          expr: 100 * ( sum( nginx_ingress_controller_requests{status=~"4.+"} ) / sum(nginx_ingress_controller_requests) ) > 5
 +          for: 1m
 +          labels:
 +            severity: warning
 +          annotations:
 +            description: Too many 4XXs
 +            summary: More than 5% of all requests returned 4XX, this requires your attention
 +</code>
  
 +  helm upgrade --reuse-values -n ingress nginx ingress-nginx/ingress-nginx -f ./nginx-ingress-monitoring-values.yaml
 ===== Cert manager ===== ===== Cert manager =====
 https://docs.cert-manager.io/en/latest/tutorials/acme/quick-start/ https://docs.cert-manager.io/en/latest/tutorials/acme/quick-start/
 https://docs.cert-manager.io/en/latest/getting-started/install/kubernetes.html#installing-with-helm \\ https://docs.cert-manager.io/en/latest/getting-started/install/kubernetes.html#installing-with-helm \\
 Устанавливаем: Устанавливаем:
-<code># Install the CustomResourceDefinition resources separately +<code>kubectl create namespace cert-manager
-kubectl apply --validate=false -f https://raw.githubusercontent.com/jetstack/cert-manager/release-0.11/deploy/manifests/00-crds.yaml +
- +
-# Create the namespace for cert-manager +
-kubectl create namespace cert-manager +
- +
-# Add the Jetstack Helm repository+
 helm repo add jetstack https://charts.jetstack.io helm repo add jetstack https://charts.jetstack.io
- 
-# Update your local Helm chart repository cache 
 helm repo update helm repo update
  
-# Install the cert-manager Helm chart +helm upgrade --install \ 
-helm install \ +  cert-manager jetstack/cert-manager \
-  --name cert-manager \+
   --namespace cert-manager \   --namespace cert-manager \
-  --version v0.11.0 +  --create-namespace 
-  jetstack/cert-manager+  --set installCRDs=true \ 
 +  --version v1.5.4
 </code> </code>
 https://docs.cert-manager.io/en/latest/tasks/issuers/index.html \\ https://docs.cert-manager.io/en/latest/tasks/issuers/index.html \\
 Создаем издателя **Let's Encrypt** (ACME Issuer): Создаем издателя **Let's Encrypt** (ACME Issuer):
-<code>apiVersion: cert-manager.io/v1alpha2+<code>kubectl apply -f - << EOF 
 +apiVersion: cert-manager.io/v1
 kind: ClusterIssuer kind: ClusterIssuer
 metadata: metadata:
Line 211: Line 302:
     # certificates, and issues related to your account.     # certificates, and issues related to your account.
     email: mike@autosys.tk     email: mike@autosys.tk
-    server: https://acme-staging-v02.api.letsencrypt.org/directory+    server: https://acme-v02.api.letsencrypt.org/directory
     privateKeySecretRef:     privateKeySecretRef:
       # Secret resource used to store the account's private key.       # Secret resource used to store the account's private key.
Line 220: Line 311:
         ingress:         ingress:
           class: nginx           class: nginx
 +EOF
 </code> </code>
 Смотрим на его состояние: Смотрим на его состояние:
Line 234: Line 326:
 ==== Апгрейдим cert-manager ==== ==== Апгрейдим cert-manager ====
   helm repo update   helm repo update
-  helm upgrade --namespace cert-manager cert-manager jetstack/cert-manager+  helm upgrade --namespace cert-manager cert-manager jetstack/cert-manager --reuse-values
 ===== Ingress, Cert-Manager и сертификаты Let's Encrypt ===== ===== Ingress, Cert-Manager и сертификаты Let's Encrypt =====
 <del>https://docs.cert-manager.io/en/latest/getting-started/install/kubernetes.html</del>\\ <del>https://docs.cert-manager.io/en/latest/getting-started/install/kubernetes.html</del>\\
 <del>https://docs.bitnami.com/kubernetes/how-to/secure-kubernetes-services-with-ingress-tls-letsencrypt/#step-3-configure-tls-with-let-s-encrypt-certificates-and-cert-manager</del>\\ <del>https://docs.bitnami.com/kubernetes/how-to/secure-kubernetes-services-with-ingress-tls-letsencrypt/#step-3-configure-tls-with-let-s-encrypt-certificates-and-cert-manager</del>\\
 https://docs.cert-manager.io/en/latest/tutorials/acme/quick-start/#\\ https://docs.cert-manager.io/en/latest/tutorials/acme/quick-start/#\\
 +https://cert-manager.io/docs/installation/helm/ \\
 Итак, у нас установлен **MetalLB**, **Ingress Controller** и **CertManager**. \\ Итак, у нас установлен **MetalLB**, **Ingress Controller** и **CertManager**. \\
 В результате, сервис **Ingress Controller** должен получить адрес в локальной (или нелокальной сети) из диапазона, прописанного в конфигурации **MetalLB**: В результате, сервис **Ingress Controller** должен получить адрес в локальной (или нелокальной сети) из диапазона, прописанного в конфигурации **MetalLB**:
Line 271: Line 364:
 В результате, HTTP-запросы на **IP**-адрес **Ingress**-контроллера будут перенаправлены на сервис web-морды AWX. \\ В результате, HTTP-запросы на **IP**-адрес **Ingress**-контроллера будут перенаправлены на сервис web-морды AWX. \\
 \\ \\
-Теперь нужно сконфигурировать **ACME Issuer** - это сущность, которая будет запрашивать сертификаты по протоколу **ACME** у серверов **Let's Encrypt**: +Теперь нужно сконфигурировать **ACME Issuer** - это сущность, которая будет запрашивать сертификаты по протоколу **ACME** у серверов **Let's Encrypt**: \\ 
-<code>apiVersion: cert-manager.io/v1alpha2+https://cert-manager.io/docs/configuration/acme/ 
 +<code> 
 +kubectl apply -f - << EOF 
 +apiVersion: cert-manager.io/v1
 kind: ClusterIssuer kind: ClusterIssuer
 metadata: metadata:
   name: letsencrypt   name: letsencrypt
-  namespace: cert-manager 
 spec: spec:
   acme:   acme:
Line 282: Line 377:
     # Let's Encrypt will use this to contact you about expiring     # Let's Encrypt will use this to contact you about expiring
     # certificates, and issues related to your account.     # certificates, and issues related to your account.
-    email: mike@autosys.tk +    email: m.usik@sdventures.com 
-    server: https://acme-v02.api.letsencrypt.org/directory+    server: https://acme-staging-v02.api.letsencrypt.org/directory
     privateKeySecretRef:     privateKeySecretRef:
-      # Secret resource used to store the account's private key. +      # Secret resource that will be used to store the account's private key. 
-      name: letsencrypt-cert-issuer-account-key+      name: letsencrypt-issuer-account-key
     # Add a single challenge solver, HTTP01 using nginx     # Add a single challenge solver, HTTP01 using nginx
     solvers:     solvers:
Line 292: Line 387:
         ingress:         ingress:
           class: nginx           class: nginx
 +EOF
 </code> </code>
 После того, как создан **Issuer** (в данном случае - **ClusterIssuer** с именем **letsencrypt**) можно добавить в манифест ингресса информацию о нем. Редактируем ресурс **Ingress** и приводим секцию **annotations** к виду: После того, как создан **Issuer** (в данном случае - **ClusterIssuer** с именем **letsencrypt**) можно добавить в манифест ингресса информацию о нем. Редактируем ресурс **Ingress** и приводим секцию **annotations** к виду:
  • linux_faq/kubernetes_using_single_node_as_master_and_worker.txt
  • Last modified: 2024/04/22 12:38
  • by admin