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
linux_faq:kubernetes_using_single_node_as_master_and_worker [2021/12/19 18:29] – [Ingress-controller] adminlinux_faq:kubernetes_using_single_node_as_master_and_worker [2024/04/22 12:38] (current) – [Cert manager] 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} 
 + 
 +  cat <<EOF | sudo tee /etc/modules-load.d/containerd.conf 
 +  overlay 
 +  br_netfilter 
 +  EOF 
 + 
 +  sudo modprobe overlay 
 +  sudo modprobe br_netfilter 
 + 
 +  # Setup required sysctl params, these persist across reboots. 
 +  cat <<EOF | sudo tee /etc/sysctl.d/99-kubernetes-cri.conf 
 +  net.bridge.bridge-nf-call-iptables  = 1 
 +  net.ipv4.ip_forward                 = 1 
 +  net.bridge.bridge-nf-call-ip6tables = 1 
 +  EOF 
 + 
 +  # Apply sysctl params without reboot 
 +  sudo sysctl --system 
   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"]+  cat << EOF | sudo tee /etc/systemd/system/kubelet.service.d/12-after-docker.conf 
-    "log-driver": "json-file", +  [Unit
-    "log-opts":+  After=containerd.service
-      "max-size": "100m" +
-    }, +
-    "storage-driver": "overlay2" +
-  }+
   EOF   EOF
      
-  sudo mkdir -/etc/systemd/system/docker.service.d+  sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true//etc/containerd/config.toml 
 +  sudo service containerd restart
      
-  # Enable services and restart docker. 
-  sudo systemctl daemon-reload 
-  sudo systemctl enable docker 
-  sudo systemctl restart docker 
-  sudo systemctl enable kubelet.service 
      
-  sudo usermod -a -G docker $USER 
-   
-  # 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 
-    
   # Kubernetes Cluster Init    # Kubernetes Cluster Init 
-  sudo kubeadm init --pod-network-cidr=10.244.0.0/16+  sudo kubeadm init --cri-socket /run/containerd/containerd.sock --pod-network-cidr=10.244.0.0/16
      
   mkdir -p $HOME/.kube   mkdir -p $HOME/.kube
Line 56: Line 62:
   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 99: Line 127:
 ===== Установка сервера метрик kubernetes ===== ===== Установка сервера метрик kubernetes =====
 https://github.com/kubernetes-sigs/metrics-server https://github.com/kubernetes-sigs/metrics-server
-  kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/download/v0.3.6/components.yaml+  kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
 В результате в неймспейсе **kube-system** появится **deployment** **metrics-server** и развернется **pod** **metrics-server-...**.\\ В результате в неймспейсе **kube-system** появится **deployment** **metrics-server** и развернется **pod** **metrics-server-...**.\\
 В нашем кластере отключен **ssl**, но он включен по-дефолту в **metrics-server**. Поэтому выполняем: В нашем кластере отключен **ssl**, но он включен по-дефолту в **metrics-server**. Поэтому выполняем:
Line 106: Line 134:
 <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 126: Line 154:
 Проверяем возможность апгрейда: Проверяем возможность апгрейда:
   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 217:
 В результате - в неймспейсе **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://cert-manager.io/docs/installation/helm/ \\
-https://docs.cert-manager.io/en/latest/getting-started/install/kubernetes.html#installing-with-helm \\+
 Устанавливаем: Устанавливаем:
 <code>kubectl create namespace cert-manager <code>kubectl create namespace cert-manager
Line 200: Line 293:
   --namespace cert-manager \   --namespace cert-manager \
   --create-namespace \   --create-namespace \
-  --version v1.5.4 \ +  --set installCRDs=true \ 
-  --set installCRDs=true+  --version v1.14.4 \ 
 +  --set prometheus.enabled=false
 </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 385:
     # 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