Настройка PodSecurityPolicy в кластере kubeadm

Я попытался настроить PodSecurityPolicy в кластере 1.10.1, установленном на ubuntu 16.04 с помощью kubeadm, выполнил инструкции на https://kubernetes.io/docs/concepts/policy/pod-security-policy/

Поэтому я изменил манифест apiserver на мастере на /etc/kubernetes/manifests/kube-apiserver.yaml, добавив ",PodSecurityPolicy" к --admission-control arg

Когда я делаю это и запускаю kubectl get pods -n kube-system, api-server не отображается в списке, очевидно, мне удалось задействовать работающий экземпляр apiserver, поскольку я получаю список всех других модулей в пространстве имен kube-system.

Я вижу, что новый контейнер докеров был запущен с контроллером допуска PodSecurityPolicy, и он, очевидно, обслуживает запросы kubectl.

Когда я проверяю логи kubelet с помощью journalctl -u kubelet, я вижу

Apr 15 18:14:23 pmcgrath-k8s-3-master kubelet[993]: E0415 18:14:23.087361 993 kubelet.go:1617] Failed creating a mirror pod for "kube-apiserver-pmcgrath-k8s-3-master_kube-system(46dbb13cd345f9fbb9e18e2229e2e dd1)": pods "kube-apiserver-pmcgrath-k8s-3-master" is forbidden: unable to validate against any pod security policy: []

Я уже добавил привилегированный PSP, создал роль кластера и привязку и подтвердил, что PSP работает.

Просто не уверен, почему apiserver kubelet выдает эту ошибку и, следовательно, не отображается в списке модулей, можно было бы подумать, что kubelet создает этот модуль, и не уверен, что мне нужно создать привязку ролей для apiserver, диспетчера контроллеров, планировщика и куба. DNS

Нет документов, указывающих, как с этим справиться, я предполагаю, что это ситуация с курицей и яйцом, когда мне нужно загрузить кластер, добавить некоторые PSP, ClusterRoles и ClusterRolebindings, прежде чем я смогу изменить аргумент управления доступом для сервера api

У кого-нибудь есть такая же проблема или есть какие-либо указатели на это?

Спасибо, Пэт


person pmcgrath    schedule 15.04.2018    source источник


Ответы (2)


Я написал сообщение в блоге о том, как я понял это, короткий ответ был

  • На главном запустите kubeadm init с включенным контроллером допуска PodSecurityPolicy.
  • Add some pod security policies with RBAC config - enough to allow CNI and DNS etc. to start
    • CNI daemonsets will not start without this
  • Завершите настройку кластера, добавляя узлы через kubeadm join
  • По мере добавления дополнительных рабочих нагрузок в кластер проверяйте, нужны ли вам дополнительные политики безопасности подов и конфигурация RBAC для тех же

См. https://pmcgrath.net/using-pod-security-policies-with-kubeadm

person pmcgrath    schedule 21.09.2018

Похоже, нельзя просто добавить PodSecurityPolicy в конец списка плагинов. Например, скрипт, который добавляет кластер вверх, выбирает только один security_admission из списка параметров (_3 _, _ 4 _, _ 5_), поэтому при совместном использовании они могут вызвать конфликты.

Функция create_psp_policy вызывается после start_apiserver, поэтому мы предполагаем, что вы можете создавать политики, роли и привязки после изменения параметров api-server, но некоторые поды становятся Running после того, как все необходимые объекты размещены.

См. Файл https://github.com/kubernetes/kubernetes/blob/master/hack/local-up-cluster.sh.

начиная со строки 412:

function start_apiserver {
    security_admission=""
    if [[ -n "${DENY_SECURITY_CONTEXT_ADMISSION}" ]]; then
      security_admission=",SecurityContextDeny"
    fi
    if [[ -n "${PSP_ADMISSION}" ]]; then
      security_admission=",PodSecurityPolicy"
    fi
    if [[ -n "${NODE_ADMISSION}" ]]; then
      security_admission=",NodeRestriction"
    fi
    if [ "${ENABLE_POD_PRIORITY_PREEMPTION}" == true ]; then
      security_admission=",Priority"
      if [[ -n "${RUNTIME_CONFIG}" ]]; then
          RUNTIME_CONFIG+=","
      fi
      RUNTIME_CONFIG+="scheduling.k8s.io/v1alpha1=true"
    fi
    # Admission Controllers to invoke prior to persisting objects in cluster
    #
    # The order defined here dose not matter.

    ENABLE_ADMISSION_PLUGINS=Initializers,LimitRanger,ServiceAccount${security_admission},DefaultStorageClass,DefaultTolerationSeconds,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota,PodPreset,StorageObjectInUseProtection

    <skipped>
}
<skipped>

начиная со строки 864:

function create_psp_policy {
    echo "Create podsecuritypolicy policies for RBAC."
    ${KUBECTL} --kubeconfig="${CERT_DIR}/admin.kubeconfig" create -f ${KUBE_ROOT}/examples/podsecuritypolicy/rbac/policies.yaml
    ${KUBECTL} --kubeconfig="${CERT_DIR}/admin.kubeconfig" create -f ${KUBE_ROOT}/examples/podsecuritypolicy/rbac/roles.yaml
    ${KUBECTL} --kubeconfig="${CERT_DIR}/admin.kubeconfig" create -f ${KUBE_ROOT}/examples/podsecuritypolicy/rbac/bindings.yaml
}

<skipped>

начиная со строки 986

echo "Starting services now!"
if [[ "${START_MODE}" != "kubeletonly" ]]; then
  start_etcd
  set_service_accounts
  start_apiserver
  start_controller_manager
  if [[ "${EXTERNAL_CLOUD_PROVIDER:-}" == "true" ]]; then
    start_cloud_controller_manager
  fi
  start_kubeproxy
  start_kubedns
  start_kubedashboard
fi

if [[ "${START_MODE}" != "nokubelet" ]]; then
  ## TODO remove this check if/when kubelet is supported on darwin
  # Detect the OS name/arch and display appropriate error.
    case "$(uname -s)" in
      Darwin)
        warning "kubelet is not currently supported in darwin, kubelet aborted."
        KUBELET_LOG=""
        ;;
      Linux)
        start_kubelet
        ;;
      *)
        warning "Unsupported host OS.  Must be Linux or Mac OS X, kubelet aborted."
        ;;
    esac
fi

if [[ -n "${PSP_ADMISSION}" && "${AUTHORIZATION_MODE}" = *RBAC* ]]; then
  create_psp_policy
fi

if [[ "$DEFAULT_STORAGE_CLASS" = "true" ]]; then
  create_storage_class
fi

print_success

<skipped>
person VASャ    schedule 18.04.2018
comment
Немного поздно, но спасибо за информацию, в последнее время у нас было немного времени и я понял это - person pmcgrath; 21.09.2018