集群打包Sealer全系列之三 —— Clusterfile超详解

image.png

一、前言

上回说到sealer的整体系统架构,我们这边文章来单独讲讲Clusterfile的设计理念和使用姿势。

二、基于Clusterfile的集群配置

2.1设计原则

sealer中kubefile决定集群如何打包,Clusterfile决定集群实例如何创建。Cluster API只暴露五分之四的常用参数使得集群create/update足够简单,针对那些低频率参数可以使用其他的方式去处理,如:通过Kubefile overwrite kubeadm配置进行自定义。如:

FROM kubernetes:1.19.9

COPY my-kubeadm.yaml.tmp kubeadm.yaml.tmp

Clusterfile把大部分用户不关心的参数都隐藏掉,把不同实现关心的参数放到annotations里,还有一部分配置放到一些约定的文件中,最终结果就是绝大多数人用起来更简单,还支持很多的方式扩展配置,应用的配置都应用自身去关心。

2.2集群配置参数详解

apiVersion: sealer.aliyun.com/v1alpha1
#定义的Kind类型,目前支持的Kind类型有三种,
#   1.Cluster:该类型说明你这个clusterfile是用于集群镜像启动的
#   2.Config:该类型说明你这个clusterfile是用于集群信息配置的
#   3.Plugin:该类型说明你这个clusterfile是用于配置一些插件的
kind: Cluster
metadata:
  #~/sealer/my-cluster/Clusterfile里的my-cluster,代表你的集群名称
  name: my-cluster
  annotation:
   trident.aliyun-inc.com/etcd: "/data/etcd"
   trident.aliyun-inc.com/docker: "/var/lib/docker"
   sea.aliyun.com/cloudrootfs/dir: "/var/lib/seadent/data/my-cluster"
spec:
  #集群镜像
  image: registry.cn-qingdao.aliyuncs.com/sealer-io/kubernetes:v1.19.9
  ## 这个是集群全局的环境变量
  env:
    - DOMAIN="sealer.alibaba.com"
  #在已存在的集群安装类型BAREMETAL,在阿里云上安装类型是ALI_CLOUD
  provider: BAREMETAL
  ssh:
    # ssh的登录密码,如果使用的密钥登录则无需设置
    passwd:
    ## ssh的私钥文件绝对路径,例如/root/.ssh/id_rsa
    pk: xxx
    #  ssh的私钥文件密码,如果没有的话就设置为""
    pkPasswd: xxx
    # ssh login user
    user: root
  network:
    # in use NIC name
    interface: eth0
    # Network plug-in name
    cniName: calico
    podCIDR: 100.64.0.0/10
    svcCIDR: 10.96.0.0/22
    withoutCNI: false
  certSANS:
    # 把指定ip或域名放入apiserver证书使用
    - aliyun-inc.com
    - 10.0.0.2
  masters: # 如果你的 provider 类型是 ALI_CLOUD, 你可以使用数量配置, 如果是 BAREMETAL 使用 ipList.
    cpu: 6
    memory: 6
    count: 4
    systemDisk: 200
    dataDisks:
    - 200
  # ipList:
  #  - 10.10.10.1
  #  - 10.10.10.2
  #  - 10.10.10.3
  nodes:
    cpu: 3
    memory: 6
    count: 2
    systemDisk: 200
    dataDisks:
    - 200
  # ipList:
  #  - 10.10.10.1
  #  - 10.10.10.2
  #  - 10.10.10.3

三、基于Clusterfile增加集群配置信息

我们都知道在k8s上,使用了configmap用来放一些用户自定义的配置,在sealer中,如果用户想要改参数,该怎么办,总不能重新打个集群镜像吧,那不得裂开。而sealer巧妙利用overwrite的特性解决这一问题。之前说到Clusterfile决定集群实例如何创建,那它也可以决定集群是如何更新的。

如果你要增加集群的一些配置信息的话,需要编写类似如下的Clusterfile文件,一般在~/sealer/my-cluster/Clusterfile文件下追加配置信息就行,用---分隔

3.1集群Clusterfile注入配置参数详解

apiVersion: sealer.aliyun.com/v1alpha1
#定义的Kind类型,目前支持的Kind类型有三种,
#   1.Cluster:该类型说明你这个clusterfile是用于集群镜像启动的
#   2.Config:该类型说明你这个clusterfile是用于集群信息配置的
#   3.Plugin:该类型说明你这个clusterfile是用于配置一些插件的
kind: Cluster
metadata:
  #集群名称
  name: my-cluster
spec:
  #集群镜像
  image: registry.cn-qingdao.aliyuncs.com/sealer-app/my-SAAS-all-inone:latest
  #提供着是那种类型
  provider: BAREMETAL
#分割线上面是基础的集群信息,注意kind字段,分割线下面就是追加的配置信息
---
apiVersion: sealer.aliyun.com/v1alpha1
# Config类型说明是更改配置
kind: Config
metadata:
  name: mysql-config
spec:
  #对应你应用存放的文件地址,mysql为例
  path: etc/mysql-valus.yaml
  #你要修改数据的值,对应mysql-valus.yaml里的值
  data: |
       mysql-user: root
       mysql-passwd: xxx
---
apiVersion: sealer.aliyun.com/v1alpha1
kind: Config
metadata:
  name: redis-config
spec:
  #对应你应用存放的文件地址,redis为例
  path: etc/redis-valus.yaml
  data: |
       redis-user: root
       redis-passwd: xxx

当你追加好这些信息之后,使用sealer的apply命令,就能让你的配置生效。 当然你的kubfile要这样去编写,才能保证sealer起起来的集群可以注入应用的配置了:

FROM kuberentes:v1.19.9
...
CMD helm install mysql -f etc/mysql-config.yaml
CMD helm install mysql -f etc/redis-config.yaml

3.2集群环境变量注入配置参数

如果是少量配置可以通过“集群环境变量”的方式注入。

例如:我需要配置集群中某个监听的端口号,可以这样写你的编排文件:

...
kind: Service
apiVersion: v1
metadata:
  labels:
    k8s-app: kubernetes-app
  name: kubernetes-app
  namespace: kubernetes-app
spec:
  ports:
    - port: 8080
      #使用{{}}来规定你的变量参数
      targetPort: {{ AppPort }}
  selector:
    k8s-app: kubernetes-app
...

然后需要编写kubefile

FROM kubernetes:1.16.9
COPY app.yaml manifests/
CMD kubectl apply -f manifests/app.yaml

最后运行镜像的时候设置参数

sealer run -e AppPort=8089 myApp:latest

当然,最开始的配置文件中提到env字段,也可以通过env字段设置进去

四、基于Clusterfile的集群插件

在一些特殊的场景下,eg.希望通过sealer去修改主机名,或者升级内核,或者同步时间这些“本不该”由sealer去做的事情,那么我们可以启用插件的方式来完成。 我们看看目前支持哪些插件机制,添加插件配置也是使用---在Clusterfile中追加配置信息

4.1HOSTNAME插件

---
apiVersion: sealer.aliyun.com/v1alpha1
#类型是Plugin
kind: Plugin
metadata:
  #name表示插件的名称,HOSTNAME
  name: HOSTNAME
spec:
  #跟上你要修改的信息
  data: |
     10.10.0.2 master-0
     10.10.0.3 master-1
     10.10.0.4 master-2
     10.10.0.5 node-0
     10.10.0.6 node-1
     10.10.0.7 node-2

4.2 SHELL插件

apiVersion: sealer.aliyun.com/v1alpha1
kind: Plugin
metadata:
  name: SHELL
spec:
  action: PostInstall
  #格式-表示连续的机器ip,等价于10.10.0.1,10.10.0.2,10.10.0.3 可以写成逗号分隔
  on: 10.10.0.1-10.10.0.3
  data: |
     kubectl taint nodes node-role.kubernetes.io/master=:NoSchedule

4.3 LABEL插件

apiVersion: sealer.aliyun.com/v1alpha1
kind: Plugin
metadata:
  name: LABEL
spec:
  data: |
     10.10.0.2 ssd=true
     10.10.0.3 ssd=true
     10.10.0.4 ssd=true
     10.10.0.5 ssd=false,hdd=true
     10.10.0.6 ssd=false,hdd=true
     10.10.0.7 ssd=false,hdd=true

插件信息配置完成之后,使用sealer命令的apply即可生效

结语

好了,各位铁汁们,关于Clusterfile的详细内容,就介绍到这,更多信息请到sealer官方git地址上去了解。创作不易,请点个赞,点个关注,后续将分享更多有用信息。