「K8S 生态周报」内容主要包含我所接触到的 K8S 生态相关的每周值得推荐的一些信息。欢迎订阅知乎专栏「k8s生态」。
Kubernetes v1.22 已经在今天正式发布了,这是 2021 年的第二个正式发布的版本。此版本中共包含 53 项增强更新,其中 13 项达到 stable,24 项达到 beta 还有 16 项为 alpha。当然,也有 3 项特性被标记为废弃。
从今年的 4 月份,Kubernetes 的发布节奏由原来的每 3 个月一个版本修改成了每 4 个月一个版本,这也是第一个应用了此节奏的长周期版本。我们一起来看看有哪些值得注意的变更吧!
Server-side Apply 特性达到 GA
Server-side Apply 这个特性主要目标是把逻辑从 kubectl apply
移动到 kube-apiserver 中,这可以修复当前遇到的很多有关所有权冲突的问题。
还记得在之前的『K8S生态周报』中我曾为你介绍过 Kubernetes 新增的 .meta.managedFields
吗?Server-side Apply 当前就是通过此特性来跟踪对象字段的更改的。
同时此特性的好处在与你可以直接通过 API 完成声明式配置的操作,而无需依赖于特定的 kubectl apply
命令,比如直接通过 curl
即可完成。
此功能的用法如下:
kubectl apply --server-side [--dry-run=server]
Pod Security Policy 的替代品
PodSecurity admission controller 是在 Kubernets v1.21 中被废弃的 Pod Security Policies 的替代品。
这个 admission controller 可以按 namespace 级别启用 Pod Security Standards ,可以有以下三种模式:
- enforce: 违反策略的 Pod 将被拒绝;
- audit:违反策略的 Pod 将会添加审计注释,但其他情况下都允许;
- warn:违反策略的 Pod 将会触发面向用户的警告;
可通过如下配置文件进行控制:
apiVersion: apiserver.config.k8s.io/v1
kind: AdmissionConfiguration
plugins:
- name: PodSecurity
configuration:
defaults: # Defaults applied when a mode label is not set.
enforce: <default enforce policy level>
enforce-version: <default enforce policy version>
audit: <default audit policy level>
audit-version: <default audit policy version>
warn: <default warn policy level>
warn-version: <default warn policy version>
exemptions:
usernames: [ <array of authenticated usernames to exempt> ]
runtimeClassNames: [ <array of runtime class names to exempt> ]
namespaces: [ <array of namespaces to exempt> ]
Node swap 支持
此特性现在是 Alpha 阶段。
虽然 swap 并不够快,但是现在有很多场景都是需要用到它的,尤其是一些 Java 和 Node 应用。
在 Kubernetes 的 issue 列表中有一个存在了 5 年左右的讨论,就是针对于能否开启 swap 支持的。当前这个特性一旦开启就是针对于整个 Node 的,并不能精确到某个 Pod 中。
你可以通过如下步骤启用此特性:
- 在 Node 中启用 swap;
- 开启 kubelet 的
NodeMemorySwap
特性; - 设置
--fail-on-swap=false
- 可选在 Kubelet 的配置中增加
MemorySwap.SwapBehavior=UnlimitedSwap
更多内容可参考:https://github.com/kubernetes...
外部客户端凭证提供工具
这个功能允许 client-go 使用外部工具进行身份验证,比如 LDAP、Kerberos、OAuth2、SAML 等。这个特性是从 v1.10 开始引入的。
使用此特性的话,需要你在 kubeconfig 配置文件中作为 user 字段下的字段进行配置。比如:
apiVersion: v1
kind: Config
users:
- name: my-user
user:
exec:
command: "example-client-go-exec-plugin"
apiVersion: "client.authentication.k8s.io/v1beta1"
env:
- name: "FOO"
value: "bar"
args:
- "arg1"
- "arg2"
provideClusterInfo: true
clusters:
...
在 user.exec
字段下配置可用的 client-go-exec plugin 即可。现在也有一个示例项目可供参考 https://github.com/ankeesler/...
可索引的 Job API
在 Kubernetes v1.21 中新增的可索引 Job API 可以更加方便的调度并行化的 Job。你可以使用如下的方式通过环境变量让 Job 中的 Pod 知道自己的索引:
[...]
spec:
subdomain: my-job-svc
containers:
- name: task
image: registry.example.com/processing-image
command: ["./process", "--index", "$JOB_COMPLETION_INDEX", "--hosts-pattern", "my-job-{{.id}}.my-job-svc"]
为 Job API 增加 suspend 字段
自 v1.21 起,Job 可以通过设置 .spec.suspend=true
字段来临时的挂起。可以比较方便的去进行控制,类似 Argo workflow 中,也可以对某个 workflow 进行挂起操作。
CSR 的有效期
通过在 CertificateSigningRequestSpec
中增加的 ExpirationSeconds
可以接受的最小值是 600(10分钟),这样就可以很好的控制其有效期了。现在默认的是 1 年。
内存资源的 QoS
之前 Kubernetes 在使用 cgroups v1 ,对于 Pod 的 QoS 其实只适用于 CPU 资源。Kubernetes v1.22 中通过引入 cgroups v2 来提供了一个 alpha 特性,允许对内存资源也提供 QoS。(如果没记错,貌似是腾讯云团队提交的 KEP 吧)
其他值得注意的变更,请参考之前发布的每期『K8S生态周报』及 《K8S 生态周报| Kubernetes v1.22.0-beta.0 发布》
当然,你也可以通过KIND 使用如下命令来快速的体验 Kubernetes v1.22 :
kind create cluster --image=kindest/node:v1.22.0@sha256:b8bda84bb3a190e6e028b1760d277454a72267a5454b57db34437c34a588d047
欢迎订阅我的文章公众号【MoeLove】
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。