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 [2022/01/12 15:44] – [Установка сервера метрик kubernetes] adminlinux_faq:kubernetes_using_single_node_as_master_and_worker [2022/04/28 10:22] – [Single node Kubernetes setup - Ubuntu 18.04] admin
Line 8: Line 8:
      
   echo 'deb http://apt.kubernetes.io/ kubernetes-xenial main' | sudo tee /etc/apt/sources.list.d/kubernetes.list   echo 'deb http://apt.kubernetes.io/ kubernetes-xenial main' | sudo tee /etc/apt/sources.list.d/kubernetes.list
-  curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add +  ######### curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add 
-  +  gpg_key_url="https://packages.cloud.google.com/apt/doc/apt-key.gpg" 
 +  gpg_keyring_path="/etc/apt/trusted.gpg.d/kubernetes.gpg" 
 +  curl -fsSL "${gpg_key_url}" | gpg --dearmor | sudo tee -a ${gpg_keyring_path} 
 +   
   sudo apt-get update   sudo apt-get update
-  sudo apt-get install -y docker.io kubeadm kubelet+  #sudo apt-get install -y docker.io kubeadm kubelet 
 +  sudo apt-get install -y containerd kubeadm kubelet
      
-  # Setup Docker daemon. +  sudo mkdir -p /etc/containerd 
-  cat > /etc/docker/daemon.json <<EOF +  containerd config default | sudo tee /etc/containerd/config.toml 
-  { + 
-    "exec-opts": ["native.cgroupdriver=systemd"], +  ## Setup Docker daemon. 
-    "log-driver": "json-file", +  #cat > /etc/docker/daemon.json <<EOF 
-    "log-opts":+  #
-      "max-size": "100m" +  #  "exec-opts": ["native.cgroupdriver=systemd"], 
-    }, +  #  "log-driver": "json-file", 
-    "storage-driver": "overlay2" +  #  "log-opts":
-  } +  #    "max-size": "100m" 
-  EOF +  #  }, 
-   +  #  "storage-driver": "overlay2" 
-  sudo mkdir -p /etc/systemd/system/docker.service.d+  #
 +  #EOF
      
 +  #sudo mkdir -p /etc/systemd/system/docker.service.d
 +   
   # Enable services and restart docker.   # Enable services and restart docker.
-  sudo systemctl daemon-reload +  #sudo systemctl daemon-reload 
-  sudo systemctl enable docker +  #sudo systemctl enable docker 
-  sudo systemctl restart docker +  #sudo systemctl restart docker 
-  sudo systemctl enable kubelet.service+  #sudo systemctl enable kubelet.service
      
-  sudo usermod -a -G docker $USER+  #sudo usermod -a -G docker $USER
      
   # To ensure that kubelet starts only after docker:   # To ensure that kubelet starts only after docker:
 +  #cat << EOF | sudo tee /etc/systemd/system/kubelet.service.d/12-after-docker.conf
 +  #[Unit]
 +  #After=docker.service
 +  #EOF
 +   
   cat << EOF | sudo tee /etc/systemd/system/kubelet.service.d/12-after-docker.conf   cat << EOF | sudo tee /etc/systemd/system/kubelet.service.d/12-after-docker.conf
   [Unit]   [Unit]
-  After=docker.service+  After=containerd.service
   EOF   EOF
-    
   # Kubernetes Cluster Init    # Kubernetes Cluster Init 
   sudo kubeadm init --pod-network-cidr=10.244.0.0/16   sudo kubeadm init --pod-network-cidr=10.244.0.0/16
Line 56: Line 67:
   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 126: Line 159:
 Проверяем возможность апгрейда: Проверяем возможность апгрейда:
   sudo kubeadm upgrade plan   sudo kubeadm upgrade plan
-Если у нас хост с **containerd** (без **docker**), то нужно учесть, что **kubeadm** понадобится **docker** для получения **images**. Поэтому временно ставим его: +Если у нас хост с **containerd** (без **docker**), то нужно проверить, что параметр **kubeadm.alpha.kubernetes.io/cri-socket** указывает не на **docker-shim**, а на сокет **containerd**. У меня так: 
-  sudo apt-get install docker.io+  kubeadm.alpha.kubernetes.io/cri-socket: /run/containerd/containerd.sock 
 +если этого не сделать - будет ошибка, поскольку **kubeadm** возьмет эту запись и будет пытаться работать через docker, которого нет
 +  error execution phase preflight: docker is required for container runtime: exec: "docker": executable file not found in $PATH
 Обновляем: Обновляем:
   sudo kubeadm upgrade apply v1.20.9   sudo kubeadm upgrade apply v1.20.9
Line 187: Line 222:
 В результате - в неймспейсе **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/
Line 200: Line 299:
   --namespace cert-manager \   --namespace cert-manager \
   --create-namespace \   --create-namespace \
-  --version v1.5.4 +  --set installCRDs=true \ 
-  --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 \\
Line 291: Line 390:
     # 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: m.usik@sdventures.com+    email: mike@autosys.tk
     server: https://acme-staging-v02.api.letsencrypt.org/directory     server: https://acme-staging-v02.api.letsencrypt.org/directory
     privateKeySecretRef:     privateKeySecretRef:
  • linux_faq/kubernetes_using_single_node_as_master_and_worker.txt
  • Last modified: 2024/04/22 12:38
  • by admin