在 kubeadm 集群上配置 PodSecurityPolicy
Configuring PodSecurityPolicy on a kubeadm cluster
我尝试在安装在 ubuntu 16.04 上的 1.10.1 集群上使用 kubeadm 设置 PodSecurityPolicy,已按照 https://kubernetes.io/docs/concepts/policy/pod-security-policy/
中的说明进行操作
所以我在 /etc/kubernetes/manifests/kube-apiserver.yaml
的主机上更改了 api 服务器清单
将 ",PodSecurityPolicy"
添加到 --admission-control
arg
当我这样做时 运行 kubectl get pods -n kube-system
api-server 没有列出,显然我已经设法命中 apiserver 的 运行ning 实例,因为我得到了所有其他 pods 的列表kube-system 命名空间
我可以看到一个新的 docker 容器已经用 PodSecurityPolicy 准入控制器启动了,它显然正在为 kubectl 请求提供服务
当我用 journalctl -u kubelet
检查 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,但不确定我是否必须为创建角色绑定api服务器、控制器管理器、调度程序和 kube-dns
没有说明如何处理这个问题的文档,我认为这是先有鸡还是先有蛋的情况,我必须 bootstrap 集群,添加一些 PSP、ClusterRoles 和 ClusterRolebindings,然后才能改变准入- api 服务器
的控制参数
有人遇到同样的问题或对此有任何指示吗?
谢谢
帕特
看起来不能只将 PodSecurityPolicy
添加到插件列表的末尾。例如,启动集群的 script 从选项列表 (SecurityContextDeny
、PodSecurityPolicy
、NodeRestriction
) 中仅选择一个 security_admission
,因此它们可能一起使用会引起冲突。
函数 create_psp_policy
在 start_apiserver
之后被调用,因此我们假设您可以在更改 api-服务器参数后创建策略、角色和绑定,但是一些 pods成为 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>
我写了一篇博客 post 关于我是如何想出这些东西的,简短的回答是
- 在 master 运行 kubeadm init 上启用了 PodSecurityPolicy 准入控制器
- 使用 RBAC 配置添加一些 pod 安全策略 - 足以允许 CNI 和 DNS 等启动
- 没有这个 CNI daemonsets 将无法启动
- 通过 kubeadm join 添加节点完成集群配置
- 当您向集群添加更多工作负载时,请检查您是否需要额外的 Pod 安全策略和相同的 RBAC 配置
见https://pmcgrath.net/using-pod-security-policies-with-kubeadm
我尝试在安装在 ubuntu 16.04 上的 1.10.1 集群上使用 kubeadm 设置 PodSecurityPolicy,已按照 https://kubernetes.io/docs/concepts/policy/pod-security-policy/
中的说明进行操作所以我在 /etc/kubernetes/manifests/kube-apiserver.yaml
的主机上更改了 api 服务器清单
将 ",PodSecurityPolicy"
添加到 --admission-control
arg
当我这样做时 运行 kubectl get pods -n kube-system
api-server 没有列出,显然我已经设法命中 apiserver 的 运行ning 实例,因为我得到了所有其他 pods 的列表kube-system 命名空间
我可以看到一个新的 docker 容器已经用 PodSecurityPolicy 准入控制器启动了,它显然正在为 kubectl 请求提供服务
当我用 journalctl -u kubelet
检查 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,但不确定我是否必须为创建角色绑定api服务器、控制器管理器、调度程序和 kube-dns
没有说明如何处理这个问题的文档,我认为这是先有鸡还是先有蛋的情况,我必须 bootstrap 集群,添加一些 PSP、ClusterRoles 和 ClusterRolebindings,然后才能改变准入- api 服务器
的控制参数有人遇到同样的问题或对此有任何指示吗?
谢谢 帕特
看起来不能只将 PodSecurityPolicy
添加到插件列表的末尾。例如,启动集群的 script 从选项列表 (SecurityContextDeny
、PodSecurityPolicy
、NodeRestriction
) 中仅选择一个 security_admission
,因此它们可能一起使用会引起冲突。
函数 create_psp_policy
在 start_apiserver
之后被调用,因此我们假设您可以在更改 api-服务器参数后创建策略、角色和绑定,但是一些 pods成为 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>
我写了一篇博客 post 关于我是如何想出这些东西的,简短的回答是
- 在 master 运行 kubeadm init 上启用了 PodSecurityPolicy 准入控制器
- 使用 RBAC 配置添加一些 pod 安全策略 - 足以允许 CNI 和 DNS 等启动
- 没有这个 CNI daemonsets 将无法启动
- 通过 kubeadm join 添加节点完成集群配置
- 当您向集群添加更多工作负载时,请检查您是否需要额外的 Pod 安全策略和相同的 RBAC 配置
见https://pmcgrath.net/using-pod-security-policies-with-kubeadm