неизвестные поля «возможности» в io.k8s.api.core.v1.PodSecurityContext (запуск tshark в контейнере / модуле k8s) - PullRequest
2 голосов
/ 22 апреля 2020

Я создал docker образ, содержащий tshark (его образ, который я собираюсь использовать для выполнения различных ручных отладок из модуля kubernetes).

Я развернул контейнер в kubernetes, на котором образ. Но когда я получаю доступ к контейнеру и пытаюсь запустить tshark, я получаю:

$ kubectl exec myapp-cbd49f587-w2swx -it bash
root@myapp-cbd49f587-w2swx:/# tshark -ni any -f "test.host" -w sample.pcap -F libpcap
Running as user "root" and group "root". This could be dangerous.
Capturing on 'any'
tshark: cap_set_proc() fail return: Operation not permitted

Погуглить эту ошибку:

https://www.weave.works/blog/container-capabilities-kubernetes/ https://unofficial-kubernetes.readthedocs.io/en/latest/concepts/policy/container-capabilities/

кажется, мне нужно настроить securityContext для моего контейнера / контейнера. В моем deploy.yaml я добавил:

  containers:
     ...
  securityContext:
    capabilities:
      add:
        - NET_ADMIN

Но когда я применяю это развертывание, я получаю:

error: error validating "deployment.yaml": error validating data: ValidationError(Deployment.spec.template.spec.securityContext): unknown field "capabilities" in io.k8s.api.core.v1.PodSecurityContext; if you choose to ignore these errors, turn validation off with --validate=false

Добавление --validate=false удаляет ошибку, но также означает, что securityContext игнорируется .

Что мешает мне установить:

  securityContext:
    capabilities:
      add:
        - NET_ADMIN

На основании руководств, которые я нашел, это должно быть хорошо.

Я также посмотрел (выглядит так, чтобы быть не бесплатно):

https://sysdig.com/blog/tracing-in-kubernetes-kubectl-capture-plugin/

, поэтому, вероятно, правильный способ - использовать какой-то инструмент ( ksniff ) или настроить контейнер с коляской . Но мне все еще интересно, почему я получаю вышеуказанную ошибку.

1 Ответ

1 голос
/ 23 апреля 2020

Обращаясь конкретно к ошибке, вы опубликовали только часть своего манифеста и, глядя на это, мы видим, что вы поставили securityContext: на том же уровне, что и containers::

  containers:
     ...
  securityContext:
    capabilities:
      add:
        - NET_ADMIN

Это должно быть под контейнерами, как написано в документации :

Чтобы добавить или удалить возможности Linux для контейнера, включите поле capabilities в разделе securityContext контейнерный манифест.

Пример:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: security-context-demo
spec:
  replicas: 2
  selector:
    matchLabels:
      app: security-context-demo
  template:
    metadata:
      labels:
        app: security-context-demo
    spec:
      containers:
      - name: sec-ctx-4
        image: gcr.io/google-samples/node-hello:1.0
        securityContext:
          capabilities:
            add:
            - NET_ADMIN
...