随着 Kubernetes 的广泛使用,如何保证集群稳定运行,成为了开发和运维团队关注的焦点。在集群中部署应用时,像忘记配置资源请求或忘记配置限制这样简单的事情可能就会破坏自动伸缩,甚至导致工作负载耗尽资源。这样种种的配置问题常常导致生产中断,为了避免它们我们用 Polaris 来预防。Polaris是fairwinds开发的一款开源的kubernetes集群健康检查组件。通过分析集群中的部署配置,从而发现并避免影响集群稳定性、可靠性、可伸缩性和安全性的配置问题。
Choerodon 作为开源多云应用敏捷全链路技术平台,同样也是使用Kubernetes来部署和升级应用,如何保证集群稳定运行是十分关键的。为了满足 Choerodon 特性,Choerodon 团队借鉴了 Polaris 健康检查的实现原理,结合Choerodon的实际业务需求,在 Agent 组件中实现了一套自己的健康检查规则,用于更细粒度的检查集群,监控集群健康状态,从而保证集群稳定运行。通过对 Polaris 的实践,总结了一些对Polaris的认识和安装使用,希望对大家有所帮助。
关于agent组件的功能,请参考Choerodon猪齿鱼 Agent——基于GitOps的云原生持续交付模型
Polaris的功能
Polaris是一款通过分析部署配置,从而发现集群中存在的问题的健康检查组件。当然,Polaris的目标可不仅仅只是发现问题,同时也提供避免问题的解决方案,确保集群处于健康状态。下面将会介绍Polaris的主要功能:
Polaris 包含3个组件,分别实现了不同的功能:
- Dashboard - 以图表的形式查看当前Kubernetes workloads的工作状态和优化点。
- Webhook - 阻止在集群中安装不符合标准的应用
- CLI - 检查本地的yaml文件,可结合CI/CD使用
Dashboard
Dashboard是polaris提供的可视化工具,可以查看Kubernetes workloads状态的概览以及优化点。也可以按类别、名称空间和工作负载查看。
概览集群状态
- 查看集群健康评分
- 查看集群检查结果
- 查看集群版本、节点、pod、名称空间数量
按类别查看检查结果
- Health Checks
- Images
- Networking
- Resources
- Security
按名称空间查看检查结果
Webhook
Polaris可以作为一个admission controller运行,作为一个validating webhook。它接受与仪表板相同的配置,并可以运行相同的验证。这个webhook将拒绝任何触发验证错误的workloads 。这表明了Polaris更大的目标,不仅仅是通过仪表板的可见性来鼓励更好的配置,而是通过这个webhook来实际执行它。Polaris不会修复workloads,只会阻止他们。
- 使用和dashboard相同的配置
- 阻止所有部署配置不通过的应用安装到集群
- 不仅仅能够查看集群当前存在的缺陷,还能预防缺陷
CLI
在命令行上也可以使用Polaris来审计本地文件或正在运行的集群。这对于在CI/CD管道的基础设施代码上运行Polaris特别有帮助。如果Polaris给出的审计分数低于某个阈值,或者出现任何错误,可使用命令行标志来导致CI/CD失败。
- 检查本地文件或正在运行的集群
- 可以结合CI/CD,部署配置校验不通过时直接让CI/CD失败
安装与使用
如何安装polaris
polaris支持kubectl
, helm
and local binary
三种安装方式,本文选择最简单的安装方式,分别介绍三个组件的安装,详细的安装教程参考polaris安装
1.Dashboard安装
Helm
添加helm charts仓库
helm repo add reactiveops-stable https://charts.reactiveops.com/stable
更新charts仓库并安装Dashboard组件
helm upgrade --install polaris reactiveops-stable/polaris --namespace polaris
如果需要在本地查看Dashboard仪表盘,可以使用以下命令,进行本地端口转发
kubectl port-forward --namespace polaris svc/polaris-dashboard 8080:80
2.Webhook安装
在集群中安装Webhook组件后,将会阻止不符合标准的应用部署在集群中。
Helm
添加helm charts仓库
helm repo add reactiveops-stable https://charts.reactiveops.com/stable
更新charts仓库并安装Webhook组件
helm upgrade --install polaris reactiveops-stable/polaris --namespace polaris \
--set webhook.enable=true --set dashboard.enable=false
3.CLI安装
如果需要在本地测试polaris,可以下载二进制文件安装 releases page,也可以使用 Homebrew安装:
brew tap reactiveops/tap
brew install reactiveops/tap/polaris
polaris --version
使用CLI检查本地配置文件
polaris --audit --audit-path ./deploy/
可以将扫描结果保存到yaml文件中
polaris --audit --output-format yaml > report.yaml
如何使用Polaris
上面简单的介绍了,polaris的安装与基本使用。但是,如果要根据我们项目的实际情况来结合polaris,使用默认配置就不能满足需求了。所以我们还需要知道如何定义polaris检查规则的配置文件,实现自定义配置。
在自定义配置polaris之前,我们需要先了解一下polaris检查的等级以及支持的检查类型。
polaris检查的严重等级分为error
、warning
和ignore
,polaris不会检查ignore
等级的配置项。
polaris支持的检查类型有:Health Checks
、Images
、Networking
、Resources
、Security
,下面我们将一一介绍:
健康检查(Health Checks)
Polaris 支持校验pods中是否存在readiness和liveiness探针。
key | default | description |
---|---|---|
healthChecks.readinessProbeMissing |
warning |
没有为pod配置readiness探针时失败。 |
healthChecks.livenessProbeMissing |
warning |
没有为pod配置liveness探针时失败。 |
镜像(Images)
key | default | description |
---|---|---|
images.tagNotSpecified |
error |
没有为镜像指定tag或者指定 latest 时失败. |
images.pullPolicyNotAlways |
ignore |
当镜像拉取策略不是 always 时失败. |
网络(Networking)
key | default | description |
---|---|---|
networking.hostNetworkSet |
warning |
配置了 hostNetwork 时失败. |
networking.hostPortSet |
warning |
配置了 hostPort 时失败. |
资源(Resources)
polaris支持校验内存、cpu使用限制是否配置
确保相关配置存在:
key | default | description |
---|---|---|
resources.cpuRequestsMissing |
error |
没有配置 resources.requests.cpu 时失败. |
resources.memoryRequestsMissing |
error |
没有配置 resources.requests.memory 时失败. |
resources.cpuLimitsMissing |
error |
没有配置 resources.limits.cpu 时失败. |
resources.memoryLimitsMissing |
error |
没有配置 resources.limits.memory 时失败. |
对于内存、cpu等资源配置,还可以配置范围检查。只有当配置在指定区间内才可以通过检查。
limits:
type: object
required:
- memory
- cpu
properties:
memory:
type: string
resourceMinimum: 100M
resourceMaximum: 6G
cpu:
type: string
resourceMinimum: 100m
resourceMaximum: "2"
安全(Security)
key | default | description |
---|---|---|
security.hostIPCSet |
error |
配置了 hostIPC 属性时失败. |
security.hostPIDSet |
error |
配置了 hostPID 属性时失败. |
security.notReadOnlyRootFileSystem |
warning |
当 securityContext.readOnlyRootFilesystem 不是 true时失败. |
security.privilegeEscalationAllowed |
error |
当 securityContext.allowPrivilegeEscalation 属性是 true是失败. |
security.runAsRootAllowed |
error |
当 securityContext.runAsNonRoot 属性不是 true时失败. |
security.runAsPrivileged |
error |
当 securityContext.privileged 属性是true时失败. |
根据上文的介绍,我们已经可以根据项目的实际情况,定义自己的扫描配置。如果觉得polaris提供的检查规则不满足需求的话,我们还可以自定义检查规则。
比如:我们可以自定义规则检查镜像来源,当镜像来自quay.io抛出警告
checks:
imageRegistry: warning
customChecks:
imageRegistry:
successMessage: Image comes from allowed registries
failureMessage: Image should not be from disallowed registry
category: Images
target: Container # target can be "Container" or "Pod"
schema:
'$schema': http://json-schema.org/draft-07/schema
type: object
properties:
image:
type: string
not:
pattern: ^quay.io
还可以配置集群中的检查白名单,比如跳过检查dns-controller是否设置hostNetwork
exemptions:
- controllerNames:
- dns-controller
rules:
- hostNetworkSet
关于猪齿鱼
Choerodon 猪齿鱼作为开源多云应用敏捷全链路技术平台,是基于开源技术Kubernetes,Istio,knative,Gitlab,Spring Cloud来实现本地和云端环境的集成,实现企业多云/混合云应用环境的一致性。平台通过提供精益敏捷、持续交付、容器环境、微服务、DevOps等能力来帮助组织团队来完成软件的生命周期管理,从而更快、更频繁地交付更稳定的软件。
大家也可以通过以下社区途径了解猪齿鱼的最新动态、产品特性,以及参与社区贡献:
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。