公众号关注 「奇妙的 Linux 世界」
设为「星标」,每天带你玩转 Linux !
Kubernetes 是一个非常强大的软件部署平台。它提供的灵活性水平几乎可以适应任何用例,无论多么独特。这就是超过一半的财富 500 强企业采用 Kubernetes 的原因。根据 Dimensional Research 和 VMware 的一项研究《2020 年Kubernetes 现状报告》[1],K8s 的采用率从 2018 年的 27% 大幅飙升至 2020 年的 48% 。
但与所有工具一样,在功能和安全性之间存在自然的权衡。配置 Kubernetes 及其运行的工作负载的方法有数百万种,但其中 99% 都是危险的。很容易引入安全性、效率或可靠性问题——通常只是因为忘记在 YAML 配置中指定特定字段。
为了解决这个问题,社区提出了一套用于配置 Kubernetes 工作负载的 Kubernetes 最佳实践。这些是应该始终遵循的准则,除非你有充分的理由不这样做。 Fairwinds 的 Polaris 项目的[2] 诞生是为了帮助定义和实施这些最佳实践。
关于Polaris
Polaris是一款针对Kubernetes的开源安全策略引擎,可以帮助广大研究人员通过验证和修复Kubernetes的资源配置,来审查Kubernetes集群是否遵循了最佳安全实践。
当前版本的Polaris包含了30多种内置的配置策略,并且能够使用JSON Schema构建自定义策略。如果你通过命令行或Webhook运行Polaris的话,Polaris则可以根据策略标准自动修复问题。

工具特性
Polaris支持下列三种运行模式:
1、仪表盘模式[3]:根据“策略即代码”来验证Kubernetes资源安全态势;
2、准入控制器模式[4]:自动拒绝或修改不符合组织策略的工作负载;
3、命令行工具[5]:将策略作为代码纳入CI/CD流程,以测试本地YAML文件;

安装Polaris仪表板
Polaris仪表盘可以使用kubectl或Helm安装在集群上。它也可以在本地运行,并使用存储在KUBECONFIG中的凭据连接到集群。
需要注意的是,仪表盘是了解集群或“代码基础结构”中哪些工作负载不符合最佳实践的好方法。
Helm安装
helm repo add fairwinds-stable https://charts.fairwinds.com/stable
helm upgrade --install polaris fairwinds-stable/polaris --namespace polaris --create-namespace
kubectl port-forward --namespace polaris svc/polaris-dashboard 8080:80
本地代码安装
首先,你需要一个有效的KUBECONFIG来设置仪表盘并连接到你的集群。
广大研究人员可以直接访问该项目的【Releases页面[6]】来下载最新的代码发布版本,或使用【Homebrew[7]】安装:
brew tap reactiveops/tap
brew install reactiveops/tap/polaris
polaris dashboard --port 8080
我们还可以将仪表盘指向本地文件系统:
polaris dashboard --port 8080 --audit-path=./deploy/
本地Docker容器安装
docker run -d -p8080:8080 -v ~/.kube/config:/opt/app/config:ro quay.io/fairwinds/polaris:1.2 polaris dashboard --kubeconfig /opt/app/config
使用Polaris仪表板
Polaris仪表板可以简单直观地了解Kubernetes工作负载的当前状态,以及可以改进的路线图。仪表板提供了集群范围的概述,以及按类别、命名空间和工作负载划分结果:

Polaris的默认标准是非常高的,所以如果你的分数低于你的预期,请不要感到惊讶。
Polaris的一个关键目标是设定一个高标准,并在默认情况下实现出色的配置。如果我们包含的默认值过于严格,那么很容易将配置作为部署配置的一部分进行调整,以更好地适应你的工作负载。
Polaris示例
下面是一个 Kubernetes 部署示例:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
你能说出它出了什么问题吗?可能不会,除非你非常熟悉 Kubernetes 配置。但有几个字段未指定,可能会导致严重问题。
CPU 和内存设置
首先,重要的是告诉 Kubernetes 你的应用程序预计使用多少内存和 CPU。这使得 Kubernetes 能够有效地将你的工作负载打包到运行它们的节点上,并在应用程序出现异常(例如,由于内存泄漏)时提供指导。
更好的容器规范如下所示:
containers:
- name: nginx
image: nginx:1.14.2
resources:
requests:
memory: 512MB
cpu: 500m
limits:
memory: 1GB
cpu: 1000m
健康探针
上面的示例还缺少 Liveness 和 Readiness Probes。这些设置告诉 Kubernetes 如何检查你的应用程序是否正常并准备好提供流量。如果没有 Liveness Probe
,如果你的应用程序冻结,Kubernetes 将无法自我修复;如果没有Readiness Probe
,它可能会将流量定向到尚未完全准备就绪的 Pod。
Liveness 和 Readiness Probes 需要一些特定于应用程序的知识,但通常会轮询特定的 HTTP 端点或运行 Unix 命令来测试应用程序是否正确响应。例如:
containers:
livenessProbe:
exec:
command:
- cat
- /tmp/healthy
readinessProbe:
httpGet:
path: /healthz
port: 8080
安全强化
许多 Kubernetes 工作负载设置默认情况下是不安全的——它们倾向于授予应用程序权限来执行它可能需要或不需要的操作。
例如,默认情况下每个容器都会安装一个可写的根文件系统,这可以使攻击者能够替换系统二进制文件或修改配置。
更安全的容器配置如下所示:
containers:
- name: nginx
image: nginx:1.14.2
securityContext:
allowPrivilegeEscalation: false
privileged: false
readOnlyRootFilesystem: true
runAsNonRoot: true
capabilities:
drop:
- ALL
Polaris 如何提供帮助
Polaris 检查上述所有问题以及更多问题。它带有几十项内置检查。随着用户提交反馈并且社区学习新的更好的配置工作负载的方法,检查会不断添加到我们的库中。
我们的每项检查都是在 JSON Schema 中定义的。
最简单的检查只需要几行配置:
successMessage: Host network is not configured
failureMessage: Host network should not be configured
category: Security
target: Pod
schema:
'$schema': http://json-schema.org/draft-07/schema
type: object
properties:
hostNetwork:
not:
const: true
但我们也可以利用 JSON Schema 和 Go Templates 的全部功能来创建一些相当复杂的检查。你可以查看 Polaris 文档,[8] 了解有关如何编写自己的自定义 Polaris 检查的更多信息,如果你的组织有自己的内部策略和想要执行的最佳实践,这将非常有用。
其他资料
• Goldilocks[9] - 通过将内存和 CPU 设置与实际使用情况进行比较来调整 Kubernetes Deploy资源的大小
• Polaris[10] - 审核、执行和构建 Kubernetes 资源策略,包括 20 多项内置最佳实践检查
• Pluto[11] - 检测未来版本中已弃用或删除的 Kubernetes 资源
• Nova[12] - 检查你的 Helm 图表是否有可用更新
• rbac-manager[13] - 简化 Kubernetes 集群中 RBAC 的管理
引用链接
[1]
Kubernetes 现状报告: https://k8s.vmware.com/state-of-kubernetes-2020/[2]
Fairwinds 的 Polaris 项目的: https://github.com/FairwindsOps/polaris[3]
Polaris仪表盘模式: https://polaris.docs.fairwinds.com/dashboard[4]
Polaris准入控制器模式: https://polaris.docs.fairwinds.com/admission-controller[5]
Polaris命令行工具: https://polaris.docs.fairwinds.com/infrastructure-as-code[6]
Polaris Releases页面: https://github.com/fairwindsops/polaris/releases[7]
Polaris Homebrew: https://brew.sh/[8]
Polaris 文档,: https://polaris.docs.fairwinds.com/customization/custom-checks/[9]
Goldilocks: https://github.com/FairwindsOps/Goldilocks[10]
Polaris: https://github.com/FairwindsOps/Polaris[11]
Pluto: https://github.com/FairwindsOps/Pluto[12]
Nova: https://github.com/FairwindsOps/Nova[13]
rbac-manager: https://github.com/FairwindsOps/rbac-manager
本文转载自:「云原生百宝箱」,原文:https://url.hi-linux.com/eOF9J,版权归原作者所有。欢迎投稿,投稿邮箱: editor@hi-linux.com。
最近,我们建立了一个技术交流微信群。目前群里已加入了不少行业内的大神,有兴趣的同学可以加入和我们一起交流技术,在 「奇妙的 Linux 世界」 公众号直接回复 「加群」 邀请你入群。
你可能还喜欢
点击下方图片即可阅读
100 个常用 Kubernetes 诊断命令,助你轻松搞定各种 Kubernetes 集群故障
点击上方图片,『美团|饿了么』外卖红包天天免费领
更多有趣的互联网新鲜事,关注「奇妙的互联网」视频号全了解!