# 插件

# API

k8s 为一些底层组件定义了 API 规范,如果一个插件实现了这些 API ,则可以替换默认组件。比如:

  • 容器运行时接口(Container Runtime Interface ,CRI):供 k8s 调用容器运行时,从而管理容器、镜像。
    • 大部分容器运行时并不兼容 CRI ,因此 k8s 还开发了一些 shim 模块,用于将各种容器运行时对接到 CRI 。
      • 后来改为通过 containerd 或 CRI-O 来调用底层的容器运行时。
    • CRI 使得 k8s 与容器运行时解耦,允许 k8s 同时使用多种容器运行时。
  • 容器网络接口(Container Network Interface ,CNI):供 k8s 管理容器的网络。
  • 容器存储接口(Container Storage Interface ,CSI):供 k8s 管理容器的存储层。
    • k8s 本身提供了 hostPath、ConfigMap 等类型的 volume 。而一些第三方的存储程序可通过 CSI 接口接入 k8s 集群,提供一些其它类型的 volume 。

常见插件:

  • kube-dns :为 k8s 集群提供 DNS 服务。
  • Kube-router
  • Flannel :一个 CNI 插件,比较简单。
  • Calico :一个 CNI 插件,比较复杂,功能更多。
  • Dashboard :提供 Web UI 。
  • Federation :提供跨可用区的集群。
    • k8s 原本是部署在同一局域网内的主机上,如果部署在跨地域(Region)的不同主机上,则网络延迟会比较大。
  • Fluentd-elasticsearch :采集、管理 k8s 集群的日志。

# Helm

:一个命令行工具,用于管理 k8s 中的应用,相当于高层的包管理工具。

  • 将 k8s 中一个应用的相关配置文件打包成一个 .tgz 文件,称为 Chart 。
    • charts 可以存储在本机,或者存储到远端仓库。
  • Helm 2.0 采用 C/S 架构。
    • 客户端名为 Helm ,负责管理 charts 。
    • 服务器名为 Tiller ,会将客户端发来的 chart 渲染成 release 文件,然后传给 k8s 的 apiserver 。
  • Helm 3.0 于 2019 年 11 月发布,与 Helm2 不兼容,移除了 Tiller ,成为了一个纯客户端工具。

命令:

helm
    init            # 初始化 Helm(这会创建 Helm 的配置文件、安装 Tiller)
    reset           # 卸载 Tiller

    create <dir>    # 创建一个 Chart 目录(会包含一些模板文件)
    inspect <dir>   # 查看一个 Chart 的详细信息
    lint <dir>      # 检查 Chart 的语法
    package <dir>   # 将一个 Chart 目录打包,这会生成一个 .tgz 文件
    template <dir>                       # 渲染 Chart 目录中的所有模板
            > release.yml                # 将渲染结果保存到一个文件中
            -x templates/configmap.yaml  # 只渲染指定模板文件

    install <name>  # 将一个 Chart 部署到 k8s
    delete <name>   # 删除 k8s 中的一个 release
    status <name>   # 显示 k8s 中的一个 release 的状态
    list            # 显示 k8s 中的所有 release

    search <name>   # 在 Helm Hub 中查找 Chart

# 制作 Chart

Chart 的目录结构:

app/
├── Chart.yaml          # 描述该 Chart 的信息
├── templates/          # 存放该应用的配置文件
│   ├── deployment.yaml
│   └── service.yaml
├── values.yaml         # 用于给 templates 中的变量赋值
├── requirements.yaml   # 描述当前 Chart 依赖的其它 Chart
├── charts/             # 存放当前 Chart 依赖的其它 Chart
├── .helmignore         # 描述打包 Chart 时要忽略的文件
├── LICENSE
└── README.md

Chart.yaml 的示例:

apiVersion: v1
appVersion: "1.0"
description: A Helm chart for Kubernetes
name: redis
version: 0.1.0

values.yaml 的示例:

image:
  repository: myharbor.com/test/redis
  tag: 5.0.6

在 deployment.yaml 中使用 values 的示例:

template:
  spec:
      containers:
      - image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
      ...