「K8S 生态周报」内容主要包含我所接触到的 K8S 生态相关的每周值得推荐的一些信息。欢迎订阅知乎专栏「k8s 生态」 ( https://zhuanlan.zhihu.com/container )。
1 Conftest 正式加入 Open Policy Agent 项目
conftest ( https://www.conftest.dev/ ) 是一个非常实用的 CLI 工具,可以用于测试/验证配置文件是否符合预期。例如,可以通过如下内容来定义规则:
package main
deny[msg] {
input.kind = "Deployment"
not input.spec.template.spec.securityContext.runAsNonRoot = true
msg = "Containers must not run as root"
}
deny[msg] {
input.kind = "Deployment"
not input.spec.selector.matchLabels.app
msg = "Containers must provide app label for pod selectors"
}
使用此规则去检查一个未符合预期规则的 Deployment 的配置文件:
(MoeLove) ➜ conftest test deployment.yaml
FAIL - deployment.yaml - Containers must not run as root
FAIL - deployment.yaml - Deployments are not allowed
2 tests, 0 passed, 0 warnings, 2 failures
就会看到有相应的检查结果了。
至于 OPA ( https://www.openpolicyagent.org/ ) 它是一个策略引擎,提供了一种非常灵活的方式来声明策略。
conftest 正式加入 OPA 项目,可以更好的让彼此进行集成和组合使用。并且,在 conftest 加入 OPA 项目后,会有部分功能从 conftest 移至 OPA,让 conftest 更间简便。期待后续的发展。
2 Traefik v2.2.7 发布
Traefik v2.2.6 中,修复了一个安全问题。在校验使用域前置的 TLS 连接时,如果 Host 头与 SNI 不同的话,则 Traefik 将会返回 421 状态码。
此次 Traefik 发布的 v2.2.7 版本,主要是为了解决上述在 v2.2.6 中由于修复此安全问题而引入的 bug 。
现象是在 v2.2.6 版本中,如果为 Host 指定了非标准端口(443)的话,则 Traefik 会返回 421 状态码,从而导致连接异常。
v2.2.7 中解决办法也很简单,直接忽略掉 Host 中的端口,与 SNI 进行比较即可。
建议如果打算升级的话,直接升至 v2.2.7 ,避开 v2.2.6 版本。可通过 Release 页面 ( https://github.com/containous/traefik/releases/tag/v2.2.7 ) 下载使用。
3 NGINX Ingress Controller v1.8.0 发布
这里介绍的是 NGINX 官方的 Ingress Controller 项目(避免和社区的 Kubernetes NGINX Ingress Controller 搞混) 。
此次版本中有几个非常值得关注的特性。
Policy 资源允许你为 VirtualServer 资源添加访问控制,可作用于 认证,限流和 WAF 之类的特性。由于此版本中是首次添加,目前只实现了基于 IP 的访问控制。例如,你可以通过下方的配置文件,来允许 10.0.0.0/8 的访问:
apiVersion: k8s.nginx.org/v1alpha1
kind: Policy
metadata:
name: allow-localhost
spec:
accessControl:
allow:
- 10.0.0.0/8
使用 Snippets 允许你为 VirtualServer 配置注入一段原生的 NGINX 配置片段,用于覆盖默认配置。示例如下:
apiVersion: k8s.nginx.org/v1
kind: VirtualServer
metadata:
name: cafe
namespace: cafe
spec:
http-snippets: |
limit_req_zone $binary_remote_addr zone=mylimit:10m rate=1r/s;
proxy_cache_path /tmp keys_zone=one:10m;
host: cafe.example.com
tls:
secret: cafe-secret
server-snippets: |
limit_req zone=mylimit burst=20;
upstreams:
- name: tea
service: tea-svc
port: 80
- name: coffee
service: coffee-svc
port: 80
routes:
- path: /tea
location-snippets: |
proxy_cache one;
proxy_cache_valid 200 10m;
action:
pass: tea
- path: /coffee
action:
pass: coffee
但要注意的是,如果你使用此特性,我建议你在使用之前,清楚的理解自己配置的含义。因为用这种方式配置,会绕过 Ingress Controller 的校验过程。会比较危险。并且使用此特性,不够直观。但,却可以让你对 NGINX 有更强的控制能力。
更多关于此版本的信息,请参考其 RelaseNote ( https://github.com/nginxinc/kubernetes-ingress/releases/tag/v1.8.0 )
4上游进展