侧边栏壁纸
博主头像
背锅小王子博主等级

我从事运维工作有十年之久,主要从事云原生相关的工作,对k8s、devops、servicemesh、可观察性等较为熟悉!

  • 累计撰写 59 篇文章
  • 累计创建 64 个标签
  • 累计收到 1 条评论

目 录CONTENT

文章目录

使用OpenKruise固定Pod的IP

背锅小王子
2022-08-08 / 0 评论 / 0 点赞 / 260 阅读 / 1,207 字
温馨提示:
本文最后更新于 2022-11-14,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

介绍

OpenKruise 是一个基于 Kubernetes 的扩展套件,主要聚焦于云原生应用的自动化,比如 部署、发布、运维以及可用性防护。

OpenKruise 提供的绝大部分能力都是基于 CRD 扩展来定义,它们不存在于任何外部依赖,可以运行在任意纯净的 Kubernetes 集群中。

核心能力

通用工作负载

通用工作负载能帮助你管理 stateless(无状态)、stateful(有状态)、daemon 类型的应用。

它们不仅支持类似于 Kubernetes 原生 Workloads 的基础功能,还提供了如 原地升级、可配置的扩缩容/发布策略、并发操作 等。

  • CloneSet - 无状态应用
  • Advanced StatefulSet - 有状态应用
  • Advanced DaemonSet - daemon 类型应用

任务工作负载

  • BroadcastJob - 部署任务到一批特定节点上
  • AdvancedCronJob - 周期性地创建 Job 或 BroadcastJob

Sidecar 容器管理

Sidecar 容器可以很简单地通过 SidecarSet 来定义,然后 Kruise 会将它们注入到所有匹配的 Pod 中。

它是通过 Kubernetes webhook 机制来实现的,和 istio 的注入实现方式类似, 但是它允许你指定管理你自己的 sidecar 容器。

  • SidecarSet - 定义和升级你的 sidecar 容器

多区域管理

它可以帮助你在一个 Kubernetes 集群中的多个区域上部署应用,比如 不同的 node 资源池、可用区、机型架构(x86 & arm)、节点类型(kubelet & virtual kubelet)等。

这里我们提供两种不同的方式:

  • WorkloadSpread - 旁路地分发 workload 创建的 pods
  • UnitedDeployment - 一个新的 workload 来管理多个下属的 workloads

增强运维能力

  • 原地重启 pod 中的容器
  • 指定的一批节点上拉取镜像

应用安全防护

  • 保护 Kubernetes 资源及应用 pods 不被级联删除
  • PodUnavailableBudget - 覆盖更多的 Voluntary Disruption 场景,提供应用更加强大的防护能力

3、系统架构

图片-1659958969177

4、部署

说明:
从 v1.0.0 (alpha/beta) 开始,OpenKruise 要求在 Kubernetes >= 1.16 以上版本的集群中安装和使用。

通过 helm 安装

helm repo add openkruise https://openkruise.github.io/charts/

helm repo update

helm install kruise openkruise/kruise --version 1.2.0

查看部署结果

kubectl get pod -n kruise-system

NAME                                         READY   STATUS    RESTARTS   AGE
kruise-controller-manager-766b57c995-qlqj9   1/1     Running   0          2m17s
kruise-controller-manager-766b57c995-x8cgt   1/1     Running   0          2m17s
kruise-daemon-8tfxl                          1/1     Running   0          2m17s
kruise-daemon-x5626                          1/1     Running   0          2m17s

5、原地升级

原地升级是 OpenKruise 提供的核心功能之一。

目前支持原地升级的 Workload:

  • CloneSet
  • Advanced StatefulSet
  • Advanced DaemonSet
  • SidecarSet

什么是原地升级
当我们要升级一个存量 Pod 中的镜像时,这是 重建升级 和 原地升级 的区别:

图片-1659960049581

重建升级时我们要删除旧 Pod、创建新 Pod:

  • Pod 名字和 uid 发生变化,因为它们是完全不同的两个 Pod 对象(比如 Deployment 升级)
  • Pod 名字可能不变、但 uid 变化,因为它们是不同的 Pod 对象,只是复用了同一个名字(比如 StatefulSet 升级)
  • Pod 所在 Node 名字发生变化,因为新 Pod 很大可能性是不会调度到之前所在的 Node 节点的
  • Pod IP 发生变化,因为新 Pod 很大可能性是不会被分配到之前的 IP 地址的

但是对于原地升级,我们仍然复用同一个 Pod 对象,只是修改它里面的字段。因此:

  • 可以避免如 调度、分配 IP、分配、挂载盘 等额外的操作和代价
  • 更快的镜像拉取,因为开源复用已有旧镜像的大部分 layer 层,只需要拉取新镜像变化的一些 layer
  • 当一个容器在原地升级时,Pod 中的其他容器不会受到影响,仍然维持运行

6、CloneSet

CloneSet 控制器提供了高效管理无状态应用的能力,它可以对标原生的 Deployment,但 CloneSet 提供了很多增强功能。

部署一个测试用例:test-cloneset.yml

apiVersion: apps.kruise.io/v1alpha1
kind: CloneSet
metadata:
  labels:
    app: sample
  name: sample
spec:
  replicas: 5
  selector:
    matchLabels:
      app: sample
  template:
    metadata:
      labels:
        app: sample
    spec:
      containers:
      - name: nginx
        image: nginx:alpine

扩缩容功能

支持 PVC 模板

CloneSet 允许用户配置 PVC 模板 volumeClaimTemplates,用来给每个 Pod 生成独享的 PVC,这是 Deployment 所不支持的。 如果用户没有指定这个模板,CloneSet 会创建不带 PVC 的 Pod。

apiVersion: apps.kruise.io/v1alpha1
kind: CloneSet
metadata:
  labels:
    app: sample
  name: sample-data
spec:
  replicas: 1
  selector:
    matchLabels:
      app: sample
  template:
    metadata:
      labels:
        app: sample
    spec:
      containers:
      - name: nginx
        image: nginx:alpine
        volumeMounts:
        - name: data-vol
          mountPath: /usr/share/nginx/html
  volumeClaimTemplates:
    - metadata:
        name: data-vol
      spec:
        accessModes: [ "ReadWriteOnce" ]
        resources:
          requests:
            storage: 1Gi
0

评论区