Как запустить 'connect_get_namespaced_pod_exe c' как root в python k8s клиенте - PullRequest
0 голосов
/ 01 августа 2020
from os import getenv, listdir, path
from kubernetes import client, config
from kubernetes.stream import stream
import constants, logging
from pprint import pprint

def listdir_fullpath(directory):
    return [path.join(directory, file) for file in listdir(directory)]

def active_context(kubeConfig, cluster):
    config.load_kube_config(config_file=kubeConfig, context=cluster)

def kube_exec(command, apiInstance, podName, namespace, container):
    response = None
    execCommand = [
        '/bin/bash',
        '-c',
        command]
    try:
        response = apiInstance.read_namespaced_pod(name=podName,
                                                namespace=namespace)
    except ApiException as e:
        if e.status != 404:
            print(f"Unknown error: {e}")
            exit(1)
    if not response:
        print("Pod does not exist")
        exit(1)
    try:
        response = stream(apiInstance.connect_get_namespaced_pod_exec,
                          podName,
                          namespace,
                          container=container,
                          command=execCommand,
                          stderr=True,
                          stdin=False,
                          stdout=True,
                          tty=False,
                          _preload_content=True)
    except Exception as e:
        print("error in executing cmd")
        exit(1)
    pprint(response)


if __name__ == '__main__':
    configPath     = constants.CONFIGFILE
    kubeConfigList = listdir_fullpath(configPath)
    kubeConfig = ':'.join(kubeConfigList)
    active_context(kubeConfig, "ort.us-west-2.k8s.company-foo.net")
    apiInstance = client.CoreV1Api()
    kube_exec("whoami", apiInstance, "podname-foo", "namespace-foo", "container-foo")

Я запускаю этот код и получаю ответ от запуска whoami: 'java\n' как я могу работать как root? кроме того, я нигде не могу найти хорошего do c для этого клиента (документы в репозитории git довольно ужасны), если вы можете связать меня с любым, это было бы потрясающе

EDIT: I просто попробовал несколько разных модулей и контейнеров, похоже, что некоторые из них по умолчанию root, все равно хотел бы иметь возможность выбирать моего пользователя при запуске команды, поэтому вопрос все еще актуален

1 Ответ

1 голос
/ 01 августа 2020

некоторые из них по умолчанию root, все равно хотели бы иметь возможность выбирать моего пользователя, когда я запускаю команду, поэтому вопрос все еще актуален

У вас есть влияние на UID (Насколько я знаю, не напрямую пользователем), когда вы запускаете Pod, но с этого момента в кубернетах нет эквивалента docker exec -u - вы можете подключиться к Pod, запустив независимо от того, под каким UID он был запущен, но вы не можете изменить UID

Я бы предположил, что это проблема безопасности в заблокированных кластерах, так как никто не хочет, чтобы кто-то с доступом kubectl мог повышать привилегии

Если вам нужно работать как root в вашем контейнере, вы должны изменить значение securityContext: runAsUser: 0, а затем отказаться от привилегий для запуска вашего основного процесса. Таким образом, новые команды (созданные вашей командой exec) будут запускаться как root, так же, как ваш исходный command: делает

...