6

我尝试使用 kubeadm 在安装在 ubuntu 16.04 上的 1.10.1 集群上设置 PodSecurityPolicy,并按照https://kubernetes.io/docs/concepts/policy/pod-security-policy/上的说明进行操作

/etc/kubernetes/manifests/kube-apiserver.yaml 所以我在添加",PodSecurityPolicy"--admission-controlarg时更改了主服务器上的 apiserver 清单

当我这样做并运行kubectl get pods -n kube-system api-server 时,没有列出,显然我已经设法命中了一个正在运行的 apiserver 实例,因为我得到了 kube-system 命名空间中所有其他 pod 的列表

我可以看到已经使用 PodSecurityPolicy 准入控制器启动了一个新的 docker 容器,它显然正在为 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 会出现此错误,因此不会出现在 pod 列表中,会认为 kubelet 创建了这个 pod,但不确定我是否必须为 apiserver、控制器管理器、调度程序和 kube-创建角色绑定- dns

没有说明如何处理这个问题的文档,我认为这是先有鸡还是先有蛋的情况,我必须引导集群,添加一些 PSP、ClusterRoles 和 ClusterRolebindings,然后才能改变 api 服务器的准入控制参数

有人有同样的问题或对此有任何指示吗?

谢谢帕特

4

2 回答 2

3

我写了一篇关于我如何弄清楚这些东西的博客文章,简短的回答是

  • 在启用 PodSecurityPolicy 准入控制器的主运行 kubeadm init 上
  • 使用 RBAC 配置添加一些 pod 安全策略 - 足以允许 CNI 和 DNS 等启动
    • 没有这个 CNI daemonsets 将无法启动
  • 通过 kubeadm join 完成配置集群添加节点
  • 当您向集群添加更多工作负载时,请检查您是否需要额外的 pod 安全策略和 RBAC 配置

请参阅https://pmcgrath.net/using-pod-security-policies-with-kubeadm

于 2018-09-21T10:12:59.403 回答
1

看起来不能只添加PodSecurityPolicy到插件列表的末尾。例如,启动集群的scriptsecurity_admission仅从选项列表中选择一个(SecurityContextDeny, PodSecurityPolicy, NodeRestriction),因此它们一起使用时可能会导致冲突。

函数create_psp_policy在 after 调用start_apiserver,因此我们假设您可以在更改 api-server 参数后创建策略、角色和绑定,但是Running在所有必要的对象都到位之后,一些 pod 会变成。

请查看文件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>
于 2018-04-18T15:35:14.573 回答