Рубрики
Uncategorized

Устранение неисправностей OpenShift Clusters и рабочие нагрузки

Примечание: это было первоначально опубликовано на Martinheinz.dev, если вы являетесь администратором кластера, оператор кластера или … Tagged с OpenShift, Kubernetes, DevOps, Облако.

Примечание: это было первоначально опубликовано в martinheinz.dev

Если вы являетесь кластерным администратором, оператор кластера или единственный разработчик в команде, который на самом деле знает, что происходит в вашем кластере OpenShift, то вы узнаете, что некоторые ужасные вещи случаются время от времени. Это неизбежно, и лучше быть готовым к моменту, когда дерьмо попадает в вентилятор. Итак, это коллекция команд, которые должны быть частью вашего арсенала, когда речь идет о отладке развертываемых развертываний, потребления ресурсов, недостающих привилегий, недоступных рабочих нагрузок и более …

Не используйте веб-консоль

Да, это выглядит красиво, легко ориентироваться, это облегчает выполнение некоторых задач … и он также станет недоступным, если есть проблема с маршрутизатором, или развертывание теряет его Конечная точка Или если у оператора есть некоторые проблемы …

Если вы становитесь немного слишком, чтобы сделать все, используя веб-консоль, вы можете в конечном итоге не смог решить проблемы с CLI в тот момент, когда каждая минута имеет значение. Поэтому моя рекомендация — это комфортно с oc Инструмент и, по крайней мере, на время этой статьи забывают, что веб-консоль даже существует.

Мониторинг ресурсов узла

Хорошо проверять память и процессор, доступные на ваших рабочих узлах время от времени, и особенно если ваши стручки застряли в В ожидании состояние или быть Oomkild. . Вы можете сделать это с:

~ $ oc adm top nodes
NAME          CPU(cores)   CPU%   MEMORY(bytes)   MEMORY%   
        620m         15%    3791Mi          28%       
        418m         10%    2772Mi          21%

Который отображает процессор и статистика памяти узлов. Если вы хотите отфильтровать Мастер узлы и увидеть только рабочие Тогда вы можете использовать -L. node-role.kubenetes.io/worker , вот так:

~ $ oc adm top nodes -l node-role.kubernetes.io/worker

Устранение неисправностей узлов узлов

Если вы бежите голый металлический кластер, то есть хороший шанс, что вы в конечном итоге столкнусь с проблемами, связанными с вещами, работающими на узлах. Чтобы увидеть, что происходит с определенным Systemd Единицы (например Crio или Kubelet ) работает на рабочих узлах, вы можете использовать:

~ $ oc adm node-logs NODE_NAME -u unit

Эта команда извлекает журналы от конкретных единица Отказ Итак, работает с -У Крио Дает нам следующее:

~ $ oc adm node-logs NODE_NAME -u crio
May 21 16:45:25.218904 ... crio[1180294]: 2020-05-21T11:45:25-05:00 [verbose] Del: ::k8s-pod-network:eth0 {"cniVersion":"0.3.1","name":"k8s-pod-network","plugins":[{"datastore_type":"kubernetes","ipam":{"type":"calico-ipam"},"kubernetes":{"kubeconfig":"/var/run/multus/cni/net.d/calico-kubeconfig"},"mtu":1480,"nodename_file_optional":false,"policy":{"type":"k8s"},"type":"calico"},{"capabilities":{"portMappings":true},"snat":true,"type":"portmap"}]}
May 21 16:45:25.438991 ... crio[1180294]: 2020-05-21 11:45:25.438 [WARNING][3352471] workloadendpoint.go 77: Operation Delete is not supported on WorkloadEndpoint type

Когда журналы недостаточно хороши, и вам нужно фактически ткать внутри рабочего узла, вы можете запустить OC NODES/NODE-NODE Отказ Это даст вам оболочку внутри этого конкретного узла, создавая привилегированный POD на узле. Пример такого типа интерактивного сеанса:

~ $ oc debug nodes/node-name
...
sh # chroot /host
sh # crictl ps
...
sh # systemctl is-active ...
sh # systemctl restart ...

На сессии выше мы используем Криктр Чтобы проверить контейнеры, бегущие непосредственно на рабочем узле. Это место, где мы могли бы начать/перезагрузить/удалять некоторые контейнеры или системные услуги, если это необходимо. Излишне говорить, будьте очень осторожны, прикасаясь к вещам, работающим на узлах.

Как сбоку, если вы запускаете свой кластер на некоторых управляемых публичных облаках, то, скорее всего, у вас не будет разрешения на прямой доступ к узлам, так как это будет проблемы безопасности, поэтому последняя команда может потерпеть неудачу на вас.

Мониторинг обновлений кластера

Когда вы решите, что пришло время обновить вас кластер на новую версию, вы, вероятно, захотите отслеживать прогресс. В качестве альтернативы, если некоторые операторы разрываются без какой-либо понятной причины, вы также можете проверить свой Клостерверсия Оператор, чтобы увидеть, продвигается ли это к более новой версии, что может быть причиной временного деградации услуг:

~ $ oc describe clusterversion
Name:         version
Namespace:    
Labels:       
Annotations:  
API Version:  config.openshift.io/v1
Kind:         ClusterVersion
Metadata:
   ...
Spec:
  Cluster ID:  ...
Status:
  Available Updates:  
  Conditions:
    Last Transition Time:  2020-04-24T06:58:32Z
    Message:               Done applying 4.3.18
    Status:                True
    Type:                  Available
    Last Transition Time:  2020-05-04T21:59:03Z
    Status:                False
    Type:                  Failing
    ...

~ $ oc get clusterversion
NAME      VERSION   AVAILABLE   PROGRESSING   SINCE   STATUS
version   4.3.18    True        False         8d      Cluster version is 4.3.18

Обе команды приведены выше, извлекают версию и информацию о том, будет ли кластер в настоящее время обновления или какое состояние операторов кластеров в целом.

Все способы отладки стручков

То, что собирается сломать чаще всего, конечно, подходит и/или развертывание ( DeploymentConfig ). Есть несколько команд, которые могут дать вам представление о том, что не так с вами приложение, поэтому начиная с самого высокого уровня:

~ $ oc status
In project  on server https://

https://. (redirects) (svc/appname)
  dc/appname deploys de.icr.io/project/appname:latest 
    deployment #1 deployed 6 days ago - 1 pod

https://. (redirects) (svc/appname2)
  dc/appname2 deploys de.icr.io/project/appname2:latest 
    deployment #13 deployed 10 hours ago - 1 pod
    deployment #12 deployed 11 hours ago
    deployment #11 deployed 34 hours ago

4 infos identified, use 'oc status --suggest' to see details.

oc Состояние Это самый простой способ получить обзор ресурсов, развернутых в проекте, включая их отношения и состояние, как показано выше.

Следующий, вы уже знаете — OC Опишите Отказ Причина, по которой я упоминаю это События: Раздел на дне, который показал только события, связанные с этим конкретным ресурсом, что намного приятнее, чем пытаться найти что-то полезное в выходе OC События Отказ

~ $ oc describe pod/podname
Name:         appname-14-6vsq7
Namespace:    ...
Priority:     0
Node:         10.85.34.38/10.85.34.38
Start Time:   Thu, 21 May 2020 20:55:23 +0200
Labels:       app=appname
Annotations:  cni.projectcalico.org/podIP: 172.30.142.149/32
              cni.projectcalico.org/podIPs: 172.30.142.149/32
              openshift.io/scc: restricted
Status:       Running
IP:           172.30.142.149
IPs:
  IP:           172.30.142.149
Controlled By:  ReplicationController/appname-14
Containers:
  ...

Conditions:
  Type              Status
  Initialized       True 
  Ready             True 
  ContainersReady   True 
  PodScheduled      True 
Volumes:
  ...

Events:
  Type    Reason     Age        From                  Message
  ----    ------     ----       ----                  -------
  Normal  Scheduled    default-scheduler     Successfully assigned namespace/appname to ...
  Normal  Pulling    16s        kubelet, ...          Pulling image "de.icr.io/..."
  Normal  Pulled     16s        kubelet, ...          Successfully pulled image "de.icr.io/..."
  Normal  Created    16s        kubelet, ...          Created container appname
  Normal  Started    16s        kubelet, ...          Started container appname

Еще одна общая команда — OC Logs Отказ Одна вещь, которую вы можете не знать об этом, правда, это то, что он может нацелить определенный контейнер POD, используя -C аргумент Например:

~ $ oc logs podname -c cont_name1
~ $ oc logs podname -c cont_name2

# Example
~ $ oc logs test-pod
Error from server (BadRequest): a container name must be specified for pod test-pod, choose one of: [1st 2nd]

# We need to choose pod to get logs from

~ $ oc logs test-pod -c 1st
...  # Some logs
~ $ oc logs test-pod -c 2nd
...  # Some more logs

Это может пригодиться, если вы отладки одиночного контейнера в мульти-контейнере POD и хотите фильтровать только соответствующие журналы.

Теперь для небольших менее известных команд (ы). OC Debug Уже был показан в разделе о отладке узлах, но его можно использовать для отладки развертывания или стручков:

~ $ oc debug pods/podname
Starting pod/podname-debug ...
Pod IP: 172.30.142.144
If you don't see a command prompt, try pressing enter.

$  # And we're in the debug pod!
$ ...

# CTRL+D
Removing debug pod ...

В отличие от примера с узлами, это не даст вам оболочку на бегущий POD, а скорее создавать точную копию существующего POD в режиме отладки. Смысл, что этикетки будут разделить, и команда изменена на /bin/sh .

Одна из причин, по которой вам может потребоваться отладка POD в OpenShift, это проблема с политиками безопасности. В этом случае вы можете добавить - root К команде, чтобы остановить его от разрушения во время запуска.

Приятно в этой команде это то, что его можно использовать с любым ресурсом OpenShift, который создает POD, например, Развертывание С Работа , ImageStramtag , так далее.

Запуск Ad-HOC команды внутри стручков и контейнеров

Несмотря на то, что создание отладочных стручков может быть очень удобным, иногда вам просто нужно ткать в реальных стручках. Вы можете использовать OC Exec для этого. Это варианты, которые вы могли бы воспользоваться:

~ $ oc exec podname -- command --options
~ $ oc exec -it podname -c cont_name -- bash

# Example
~ $ oc exec podname -- ls -la
total 96
drwxr-xr-x.   1 root    root 4096 May 21 12:25 .
drwxr-xr-x.   1 root    root 4096 May 21 12:25 ..
drwxr-xr-x.   2 root    root 4096 Oct 29  2019 bin
...

Сначала команды выше прогоны с одним из них команда внутри под давлением При необходимости дополнительные варианты. Второй приведет вас к контейнеру в специфическом контейнере в POD, хотя вы, вероятно, должны использовать сокращение для этого — oc rsh. .

Одна команда, которую вы используете, могут использовать для устранения неполадок, но никогда не следует использовать в производственных условиях OC CP , который копирует файлы в или из стручка. Эта команда может быть полезна, если вам нужно получить файл из контейнера, чтобы вы могли проанализировать его дальше. Другое дело в использовании было бы скопировать файлы в POD (контейнер), чтобы быстро исправить некоторую проблему во время тестирования, прежде чем исправлять его должным образом в Docker Image ( DockerFile ) или исходный код.

~ $ oc cp local/file podname:/file/in/pod  # copy "local/file" to "/file/in/pod" in "podname"

# Examples:
# Copy config into pod:
~ $ oc cp config.yaml podname:/somedir/config.yaml

# Copy logs from pod:
~ $ oc cp podname:/logs/messages.log messages.log
tar: Removing leading `/' from member names

Осмотрите сломанные изображения

Я думаю, что этого было достаточно для отладки стручков и контейнеров, но как насчет отладки изображений приложений? Для этого вам следует обратиться к скорее :

~ $ skopeo inspect someimage
~ $ skopeo list-tags someimage

# Example
# Inspect repository
~ $ skopeo inspect docker://quay.io/buildah/stable
{
    "Name": "quay.io/buildah/stable",
    "Digest": "sha256:4006c153bc76f2a98436d2de604d5bab0393618d7e2ab81ccb1272d3fe56e683",
    "RepoTags": [
        "v1.9.0",
        "v1.9.1",
        ...
        "master",
        "latest"
    ],
    "Created": "2020-05-18T21:13:55.180304657Z",
    "DockerVersion": "18.02.0-ce",
    "Labels": {
        "license": "MIT",
        "name": "fedora",
        "vendor": "Fedora Project",
        "version": "32"
    },
    "Architecture": "amd64",
    "Os": "linux",
    "Layers": [
        "sha256:03c837e31708e15035b6c6f9a7a4b78b64f6bc10e6daec01684c077655becf95",
        ...
        "sha256:2d8f327dcfdd9f50e6ee5f31b06676c027b9e3b1ae7592ac06808bfc59527530"
    ],
    "Env": [
        "DISTTAG=f32container",
        "FGC=f32",
        "container=oci",
        "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
        "BUILDAH_ISOLATION=chroot"
    ]
}

# List image tags
~ $ skopeo list-tags docker://docker.io/library/fedora
{
    "Repository": "docker.io/library/fedora",
    "Tags": [
        "20",
        "21",
        "22",
        "23",
        "24",
        "25",
        "26-modular",
        ...
        "32",
        "33",
        "branched",
        "heisenbug",
        "latest",
        "modular",
        "rawhide"
    ]
}

Первая команда может осмотреть репозиторий изображения, который может быть полезен, например, в случае, если изображение не может быть вытащено, что может произойти, если тег не существует, или имя изображения было неправильно. Второй просто дает вам список доступных тегов без необходимости открывать веб-сайт реестра, который довольно удобно.

Сбор всей доступной информации

Когда все остальное не удается, вы можете попробовать работать OC ADM должен собрать Чтобы получить всю информацию, доступную из кластера, это может быть полезно для отладки. Файл, создаваемый этой командой, может использоваться для собственной отладки или может быть отправлено в поддержку Red Hat, если вам нужна помощь.

Отладка недоступных приложений

Это не редкость (по крайней мере для меня), что приложения/развертывание, кажется, работают нормально Но они не могут связаться друг с другом. Есть пара причин, по которым это может быть. Давайте пройдемся после сценария — у вас есть приложение и база данных. Оба работают просто хорошо, но по какой-то причине ваша приложение не может общаться с базой данных. Вот один из способов устранения неполадок это:

~ $ oc get svc/db-pod -o jsonpath="{.spec.clusterIP}{'\n'}"
172.21.180.177  # IP of database pod
~ $ oc debug -t dc/app-pod
Starting pod/app-pod-debug ...
Pod IP: 172.30.142.160
If you don't see a command prompt, try pressing enter.

$ curl -v http://172.21.180.177:5432
...
* Connected to 72.21.180.177... (72.21.180.177) port 5432 (#0)
...
$ exit
Removing debug pod ...

# Now same thing other way around
~ $ oc get svc/app-pod -o jsonpath="{.spec.clusterIP}{'\n'}"
172.21.80.251
~ $ oc debug -t dc/db-pod
Starting pod/db-pod-debug ...
Pod IP: 172.30.142.143
If you don't see a command prompt, try pressing enter.

$ curl -v http://172.21.80.251:9080
...
curl: (28) Connection timed out after ... milliseconds
...
$ exit
Removing debug pod ...

~ $ oc get svc
NAME        TYPE       CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
db-pod      NodePort   172.21.180.177           80:31544/TCP   8d
app-pod     NodePort   172.21.80.251            80:30146/TCP   12d

~ $ oc get endpoints
NAME       ENDPOINTS             AGE
db-pod     172.30.142.191:9080   8d
app-pod                    12d       # <- Missing Endpoint

~ $ oc describe svc/app-pod
Name:                     app-pod
Namespace:                some-namespace
Labels:                   app=app-pod
...
Selector:                 app=not-app-pod  # <- Fix this
...
Endpoints:                           # <- Missing Endpoint
...

Снаппин выше предполагает, что у нас уже есть приложение и база данных, а также их соответствующие Услуги . Мы можем начать отладку, пытаясь получить доступ к базе данных из приложения. Первое, что нам нужно для этого, это IP базы данных, которую мы смотрим, используя первую команду. Далее мы создаем углеродную копию приложения, используя OC Debug И попробуйте достичь базы данных POD с Curl , который успешно.

После этого мы повторяем проверку другого пути, и мы можем видеть Curl Times Out, означает, что база данных не может достичь приложений IP. Затем мы проверяем ранее созданные Услуги Ничего странно там. Наконец, мы проверяем Конечные точки И мы видим, что POD приложения не имеет одного. Это, скорее всего, вызвано неправильным содержанием соответствующей Сервис , как показано последней командой, где мы явно неверны селектор Отказ После исправления этой ошибки (с oc Редактировать SVC/... ), Конечная точка автоматически создается и приложение доступно.

Исправить Отсутствующие ограничения контекста безопасности

Если ваш POD не сможет какую-либо проблему, связанную с файлами копирования/доступа, выполнения двоичных файлов, модифицирующих ресурсы на узле и т. Д., Тогда это наиболее вероятная проблема с Ограничения контекста безопасности Отказ На основании конкретной ошибки, которую вы получаете, вы сможете определить правильный SCC для вашего POD. Если неясно, хотя, то есть несколько указателей, которые могут помочь вам решить:

Если ваш POD не может работать из-за использования UID/GID, вы можете проверить диапазон UID и GID для каждого SCC:

~ $ oc describe scc some-scc
  Run As User Strategy: MustRunAsNonRoot    
    UID:                        ...
    UID Range Min:              ...
    UID Range Max:              ...

Если эти поля установлены на <Нет> Хотя вы должны посмотреть на аннотации проекта:

~ $ oc get project my-project -o yaml
piVersion: project.openshift.io/v1
kind: Project
metadata:
  annotations:
    openshift.io/sa.scc.supplemental-groups: 1001490000/10000
    openshift.io/sa.scc.uid-range: 1001490000/10000
...

Эти аннотации говорят вам, что эффективные UID вашего POD будут в пределах 1001490000 +/- 10000. Если это не удовлетворяет вашим потребностям, вам придется установить spec.securityContext.runasuser: quote_uid заставить специфическую UID. Если ваш POD не удается после этих изменений, вы должны переключать SCC или изменять его, чтобы иметь разные диапазон UID.

Один аккуратный трюк, чтобы определить, какой SCC нужен по Сервисная учетная запись Чтобы иметь возможность запустить POD, это использовать OC Policy Policy SCC-тему-обзор команда:

~ $ oc get pod podname -o yaml | oc adm policy scc-subject-review -f -
RESOURCE           ALLOWED BY   
Pod/podname        anyuid

Что эта команда делает, проверьте, хотите ли пользователю или Сервисная учетная запись Может создать POD, передаваемый в использовании yaml представления. При выходе этой команды показывают <Нет> Тогда это означает, что ресурс не допускается. Если какое-либо имя SCC отображается вместо этого, например, например Anyuid Выше, значит, это означает, что этот ресурс может быть создан благодаря этому SCC.

Чтобы использовать эту команду с некоторыми Сервисная учетная запись Вместо пользователя добавьте -z Параметр, например — OC ADM Policy Policy SCC-Тема-Обзор -Z Builder Отказ

Когда вывод этих команд показывает что-нибудь, кроме <Нет> Тогда вы знаете, что вы хотите идти.

Заключение

Самая большая вынос из этой статьи должен быть для вас, что, если что-то не работает в вашем кластере OpenShift, то это, вероятно, RBAC, если нет, то это SCC. Если это тоже не так, то это сеть (DNS). Во всяком случае, я надеюсь, что хотя бы некоторые из этих команд сэкономит вам некоторое время в следующий раз, когда вам нужно будет устранить неисправность в OpenShift. Также приятно знать более распространенные из сердца, потому что вы никогда не знаете, когда вы Действительно Понадобится это. 😉

Оригинал: «https://dev.to/martinheinz/troubleshooting-openshift-clusters-and-workloads-4h2f»