github.com/alibaba/sealer@v0.8.6-0.20220430115802-37a2bdaa8173/docs/design/plugin_zh.md (about)

     1  # 集群镜像插件
     2  
     3  插件可以帮助用户做一些之外的事情,比如更改主机名,升级内核,或者添加节点标签等……
     4  
     5  ## 主机名插件
     6  
     7  如果你在Clusterfile后添加插件配置并应用它,sealer将帮助你更改所有的主机名:
     8  
     9  ```yaml
    10  ---
    11  apiVersion: sealer.aliyun.com/v1alpha1
    12  kind: Plugin
    13  metadata:
    14    name: hostname
    15  spec:
    16    type: HOSTNAME
    17    data: |
    18      192.168.0.2 master-0
    19      192.168.0.3 master-1
    20      192.168.0.4 master-2
    21      192.168.0.5 node-0
    22      192.168.0.6 node-1
    23      192.168.0.7 node-2
    24  ```
    25  
    26  > Hostname Plugin 将各个节点在安装集群前修改为对应的主机名。
    27  
    28  ## 脚本插件
    29  
    30  如果你在Clusterfile后添加Shell插件配置并应用它,sealer将帮助你执行shell命令(执行路径为镜像Rootfs目录):
    31  
    32  ```yaml
    33  ---
    34  apiVersion: sealer.aliyun.com/v1alpha1
    35  kind: Plugin
    36  metadata:
    37    name: shell
    38  spec:
    39    type: SHELL
    40    action: PostInstall
    41    'on': node-role.kubernetes.io/master=
    42    data: |
    43      kubectl taint nodes node-role.kubernetes.io/master=:NoSchedule
    44  ```
    45  
    46  ```shell
    47  action : [PreInit| PostInstall] # 指定执行shell的时机
    48    在初始化之前执行命令      |  action: PreInit
    49    在添加节点之前执行命令    |  action: PreJoin
    50    在添加节点之后执行命令    |  action: PostJoin
    51    在执行Kubefile CMD之前  |  action: PreGuest
    52    在安装集群之后执行命令    |  action: PostInstall
    53    在清理集群前执行命令      |  action: PreClean
    54    在清理集群后执行命令      |  action: PostClean
    55    组合使用                |  action: PreInit|PreJoin
    56  on     : #指定执行命令的机器
    57    为空时默认在所有节点执行
    58    在所有master节点上执行   | 'on': master
    59    在所有node节点上执行     | 'on': node
    60    在指定IP上执行          | 'on': 192.168.56.113,192.168.56.114,192.168.56.115,192.168.56.116
    61    在有连续IP的机器上执行    | 'on': 192.168.56.113-192.168.56.116
    62    在指定label节点上执行(action需为PostInstall或PreClean)  | 'on': node-role.kubernetes.io/master=
    63  data   : #指定执行的shell命令
    64  ```
    65  
    66  ## 标签插件
    67  
    68  如果你在Clusterfile后添加label插件配置并应用它,sealer将帮助你添加label:
    69  
    70  ```yaml
    71  apiVersion: sealer.aliyun.com/v1alpha1
    72  kind: Plugin
    73  metadata:
    74    name: label
    75  spec:
    76    type: LABEL
    77    action: PreGuest
    78    data: |
    79      192.168.0.2 ssd=true
    80      192.168.0.3 ssd=true
    81      192.168.0.4 ssd=true
    82      192.168.0.5 ssd=false,hdd=true
    83      192.168.0.6 ssd=false,hdd=true
    84      192.168.0.7 ssd=false,hdd=true
    85  ```
    86  
    87  > 节点ip与标签之前使用空格隔开,多个标签之间使用逗号隔开。
    88  
    89  ## 集群检测插件
    90  
    91  由于服务器以及环境因素(服务器磁盘性能差)可能会导致sealer安装完kubernetes集群后,立即部署应用服务,出现部署失败的情况。cluster check插件会等待kubernetes集群稳定后再部署应用服务。
    92  
    93  ```yaml
    94  apiVersion: sealer.aliyun.com/v1alpha1
    95  kind: Plugin
    96  metadata:
    97    name: checkCluster
    98  spec:
    99    type: CLUSTERCHECK
   100    action: PreGuest
   101  ```
   102  
   103  ## 污点插件
   104  
   105  如果你在Clusterfile后添加taint插件配置并应用它,sealer将帮助你添加污点和去污点:
   106  
   107  ```yaml
   108  apiVersion: sealer.aliyun.com/v1alpha1
   109  kind: Plugin
   110  metadata:
   111    name: taint
   112  spec:
   113    type: TAINT
   114    action: PreGuest
   115    data: |
   116      192.168.56.3 key1=value1:NoSchedule
   117      192.168.56.4 key2=value2:NoSchedule-
   118      192.168.56.3-192.168.56.7 key3:NoSchedule
   119      192.168.56.3,192.168.56.4,192.168.56.5,192.168.56.6,192.168.56.7 key4:NoSchedule
   120      192.168.56.3 key5=:NoSchedule
   121      192.168.56.3 key6:NoSchedule-
   122      192.168.56.4 key7:NoSchedule-
   123  ```
   124  
   125  > data写法为`ips taint_argument`
   126  > ips           : 多个ip通过`,`连接,连续ip写法为 首ip-末尾ip
   127  > taint_argument: 同kubernetes 添加或去污点写法(key=value:effect #effect必须为:NoSchedule, PreferNoSchedule 或 NoExecute)。
   128  
   129  ## 插件使用步骤
   130  
   131  Clusterfile内容:
   132  
   133  ```
   134  apiVersion: sealer.aliyun.com/v1alpha1
   135  kind: Cluster
   136  metadata:
   137    name: my-cluster
   138  spec:
   139    image: registry.cn-qingdao.aliyuncs.com/sealer-io/kubernetes:v1.19.8
   140    provider: BAREMETAL
   141    ssh:
   142      # ssh的私钥文件绝对路径,例如/root/.ssh/id_rsa
   143      pk: xxx
   144      # ssh的私钥文件密码,如果没有的话就设置为""
   145      pkPasswd: xxx
   146      # ssh登录用户
   147      user: root
   148      # ssh的登录密码,如果使用的密钥登录则无需设置
   149      passwd: xxx
   150    network:
   151      podCIDR: 100.64.0.0/10
   152      svcCIDR: 10.96.0.0/22
   153    certSANS:
   154      - aliyun-inc.com
   155      - 10.0.0.2
   156    masters:
   157      ipList:
   158       - 192.168.0.2
   159       - 192.168.0.3
   160       - 192.168.0.4
   161    nodes:
   162      ipList:
   163       - 192.168.0.5
   164       - 192.168.0.6
   165       - 192.168.0.7
   166  ---
   167  apiVersion: sealer.aliyun.com/v1alpha1
   168  kind: Plugin
   169  metadata:
   170    name: hostname
   171  spec:
   172    type: HOSTNAME
   173    data: |
   174       192.168.0.2 master-0
   175       192.168.0.3 master-1
   176       192.168.0.4 master-2
   177       192.168.0.5 node-0
   178       192.168.0.6 node-1
   179       192.168.0.7 node-2
   180  ---
   181  apiVersion: sealer.aliyun.com/v1alpha1
   182  kind: Plugin
   183  metadata:
   184    name: taint
   185  spec:
   186    type: SHELL
   187    action: PostInstall
   188    on: node-role.kubernetes.io/master=
   189    data: |
   190       kubectl taint nodes node-role.kubernetes.io/master=:NoSchedule
   191  ```
   192  
   193  ```
   194  sealer apply -f Clusterfile #plugin仅在安装时执行,后续apply不生效。
   195  ```
   196  
   197  > 执行上述命令后hostname,shell plugin将修改主机名并在成功安装集群后执行shell命令。
   198  
   199  ## 在Kubefile中定义默认插件
   200  
   201  很多情况下在不使用Clusterfile的情况下也能使用插件,本质上sealer会先把Clusterfile中的插件配置先存储到 rootfs/plugins目录,再去使用,所以我们可以在制作镜像时就定义好默认插件。
   202  
   203  插件配置文件 shell.yaml:
   204  
   205  ```yaml
   206  apiVersion: sealer.aliyun.com/v1alpha1
   207  kind: Plugin
   208  metadata:
   209  name: taint
   210  spec:
   211  type: SHELL
   212  action: PostInstall
   213  on: node-role.kubernetes.io/master=
   214  data: |
   215    kubectl get nodes
   216  ---
   217  apiVersion: sealer.aliyun.com/v1alpha1
   218  kind: Plugin
   219  metadata:
   220    name: SHELL
   221  spec:
   222    action: PostInstall
   223    data: |
   224      if type yum >/dev/null 2>&1;then
   225      yum -y install iscsi-initiator-utils
   226      systemctl enable iscsid
   227      systemctl start iscsid
   228      elif type apt-get >/dev/null 2>&1;then
   229      apt-get update
   230      apt-get -y install open-iscsi
   231      systemctl enable iscsid
   232      systemctl start iscsid
   233      fi
   234  ```
   235  
   236  Kubefile:
   237  
   238  ```shell script
   239  FROM kubernetes:v1.19.8
   240  COPY shell.yaml plugin
   241  ```
   242  
   243  构建一个包含安装iscsi的插件(或更多插件)的集群镜像:
   244  
   245  ```shell script
   246  sealer build -m lite -t kubernetes-iscsi:v1.19.8 .
   247  ```
   248  
   249  通过镜像启动集群后插件也将被执行,而无需在Clusterfile中定义插件:
   250  `sealer run kubernetes-iscsi:v1.19.8 -m x.x.x.x -p xxx`