Skip to content

Latest commit

 

History

History
483 lines (388 loc) · 17.5 KB

INSTALL.md

File metadata and controls

483 lines (388 loc) · 17.5 KB

安装:

1.kubernetes安装

kubernetes安装可以参考:kuberntes安装

2.glusterfs安装

下面说明整个集群的部署信息(请根据自身实际情况做修改):

ip role hostname
10.61.0.91 glusterfs server vmnode1
10.61.0.92 glusterfs server vmnode2
10.61.0.93 glusterfs server vmnode3
10.61.0.160 glusterfs client, kubernetes master,kubernetes node kuber-master
10.61.0.161 glusterfs client,kubernetes node kuber-node1
10.61.0.162 glusterfs client,kubernetes node kuber-node2
10.61.0.163 glusterfs client,kubernetes node kuber-node3

(1) 在 vmnode1,vmnode2,vmnode3上执行如下步骤(我这只在vmnode1上执行,vmnode2,vmnode3执行命令一样):

[root@vmnode1 ~]# yum install -y glusterfs glusterfs-server glusterfs-fuse glusterfs-rdma

(2) 在vmnode1,vmnode2,vmnode3上启动glusterFS(我这只在vmnode1上执行,vmnode2,vmnode3执行命令一样):

[root@vmnode1 ~]# systemctl start glusterd
[root@vmnode1 ~]# systemctl enable glusterd

(3) 在vmnode1上执行如下步骤,把vmnode2,vmnode3加入到集群当中:

[root@vmnode1 ~]# gluster peer probe vmnode1
[root@vmnode1 ~]# gluster peer probe vmnode2

(4) 在gluster1(vmnode1)上查看集群状态:

[root@vmnode1 ~]# gluster peer status
Number of Peers: 2

Hostname: vmnode2
Uuid: 3a6c9d1a-eb85-49e6-8a71-faf86b78d653
State: Peer in Cluster (Connected)

Hostname: vmnode3
Uuid: 730ab35b-e2a3-4f7f-a718-5d9e1d7f49d9
State: Peer in Cluster (Connected)

(5) 在vmnode1,vmnode2,vmnode3执行如下命令,创建数据存储目录(我这只在vmnode1上执行,vmnode2,vmnode3执行命令一样):

[root@vmnode1 ~]# mkdir  /mnt/gluster-data
[root@vmnode1 ~]# mkdir  /mnt/gluster-refer
[root@vmnode1 ~]# mkdir  /mnt/gluster-redis

(6) 创建volume,这里创建三个volume,一个是data-volume,一个是refer-volume,还有一个是redis-volume。data-volume是用来存放分析数据的,refer-volume是存放参考数据的,比如参考基因组文件,redis-volume是用来存放redis运行的数据,保证其持久化功能。下面命令只需在vmnode1上执行就行:

[root@vmnode1 ~]# gluster volume create data-volume replica 3 vmnode1:/mnt/gluster-data  vmnode2:/mnt/gluster-data vmnode3:/mnt/gluster-data

[root@vmnode1 ~]# gluster volume create refer-volume replica 3 vmnode1:/mnt/gluster-refer  vmnode2:/mnt/gluster-refer vmnode3:/mnt/gluster-refer

[root@vmnode1 ~]# gluster volume create redis-volume replica 3 vmnode1:/mnt/gluster-redis  vmnode2:/mnt/gluster-redis vmnode3:/mnt/gluster-redis

(7) 在vmnode1上启动data-volume,refer-volume:

[root@vmnode1 ~]# gluster volume start data-volume
[root@vmnode1 ~]# gluster volume start refer-volume
[root@vmnode1 ~]# gluster voluem start redis-volume

(8)在kuber-master,kuber-node1,kuber-node2,kuber-node3安装glusterfs客户端软件(整个kubernetes集群都需要安装glusterfs客户端软件),便于容器挂载(我这只是在kuber-master上执行如下命令,其他几点执行同样的命令):

[root@kuber-master ~]# yum install -y glusterfs-fuse glusterfs

3.下载angelina源码

(1)在kuber-master上使用git命令下载angelina源码:

[root@kuber-master ~]# git clone https://github.com/happy2048/angelina2
[root@kuber-master ~]# cd angelina2

(2)关于kubernetes中用到的yaml配置文件存放在config目录下

4.创建namespace

(1)为了不影响kubernetes中的其他应用,我们另外创建一个namespace,创建文件在下载的angelina2源码目录下的config目录下:

[root@kuber-master config]# cat bio-system.yml
apiVersion: v1
kind: Namespace
metadata:
   name: bio-system
   labels:
      name: bio-system

(2)这个文件不需要做任何修改

(3)在kuber-master上执行如下命令创建:

[root@kuber-master config]# kubectl apply -f bio-system.yml

5.在kubernetes创建gluster service和gluster endpoint

(1)创建glusterfs service和glusterfs endpoint的yaml文件存放在angelina源码目录下的config目录,如下:

[root@kuber-master config]# ll
total 40
-rw-r--r-- 1 root root  350 May  7 15:24 angelina-client-service-debug.yml
-rw-r--r-- 1 root root  252 May  7 20:02 angelina-client-service.yml
-rw-r--r-- 1 root root 1556 May  7 20:03 angelina-controller-deployment-debug.yml
-rw-r--r-- 1 root root 1140 May  7 20:01 angelina-controller-deployment.yml
-rw-r--r-- 1 root root  287 May  7 17:41 angelina-controller-service.yml
-rw-r--r-- 1 root root   95 May  3 12:53 bio-system.yml
-rw-r--r-- 1 root root  337 May  3 12:53 glusterfs-endpoints.json
-rw-r--r-- 1 root root  183 May  3 12:53 glusterfs-service.json
-rw-r--r-- 1 root root  712 May  7 19:54 redis-deployment.yml
-rw-r--r-- 1 root root  210 May  7 19:59 redis-service.yml

(2)在kuber-master上创建gluster endpoints,这个文件不能直接运行,需要做修改,修改的部分是文件中“ip”域,这里根据自己实际情况填写自己的gluster server的地址,有多少个server就写多少ip(另外,需要记住我们这里创建endpoints名称为glusterfs-cluster,后面angelina初始化时需要用到):

[root@kuber-master config]# cat glusterfs-endpoints.json
{
  "kind": "Endpoints",
  "apiVersion": "v1",
  "metadata": {
	"name": "glusterfs-cluster",
	"namespace": "bio-system"
  },
  "subsets": [
	{
	  "addresses": [
		{
		  "ip": "10.61.0.91"   // 这里的ip都需要修改
		},
		{
		  "ip": "10.61.0.92"
		},
		{
		  "ip": "10.61.0.93"
		},
	  ],
	  "ports": [
		{
		  "port": 1
		}
	  ]
	}
  ]
}

(3)使用如下命令创建:

[root@kuber-master config]# kubectl apply -f glusterfs-endpoints.json

(4)在kuber-master上创建gluster service(这个文件不需要做修改):

[root@kuber-master config]# cat glusterfs-service.json 
{
  "kind": "Service",
  "apiVersion": "v1",
  "metadata": {
	"name": "glusterfs-cluster",
	"namespace": "bio-system"
  },
  "spec": {
	"ports": [
	  {"port": 1}
	]
  }
}

(5)使用如下命令创建:

[root@kuber-master config]# kubectl apply -f glusterfs-service.json

6.在kubernetes上创建redis service和redis deployment

(1)在kubernetes上创建redis deployment,如果glusterfs是按照前面的默认配置,那么这个文件不需要修改,直接运行即可,否则需要做如下修改(建议按默认配置):

a.glusterfs的域中的endpoins需要与前面创建的glusterfs endpoints名称一致

b.namespace需要与前面创建的namespace一致

c.redis挂载的卷需要同前面创建的redis存储的卷一致

[root@kuber-master config]# cat redis-deployment.yml
apiVersion: apps/v1beta1
kind: Deployment
metadata:
  name: angelina-redis
  namespace: bio-system
  labels:
    app: angelina-redis
spec:
  replicas: 1
  selector:
    matchLabels:
       app: angelina-redis
  template:
    metadata:
      labels:
        app: angelina-redis
    spec:
      containers:
      - name: angelina-redis
        image: redis:3.0
        command:
          - redis-server
          - "--appendonly"
          - "yes"
        ports:
        - containerPort: 6379
        volumeMounts:
        - name: data
          mountPath: /data 
      volumes:
      - name: data
        glusterfs:
          endpoints: glusterfs-cluster
          path: redis-volume
          readOnly: false  

(2)使用如下命令创建:

[root@kuber-master config]# kubectl apply -f redis-deployment.yml

(3) 在kubernetes上创建redis service(这里采用的service是kubernetes的nodePort的方式,另一种是LoadBalancer,这种方式会在每一个kubernetes节点上创建一个监听端口,访问任意一个节点的相应端口都可以访问redis,这里我们选择31000端口):

[root@kuber-master config]# cat redis-service.yml 
apiVersion: v1
kind: Service
metadata:
  name: angelina-redis
  namespace: bio-system
spec:
  type: NodePort
  ports:
  - port: 6380
    targetPort: 6379
    nodePort: 31000
  selector:
    app: angelina-redis

(4)使用如下命令创建:

[root@kuber-master config]# kubectl apply -f redis-service.yml

7.编译angelina client

(1)在启动angelina controller之前,需要将angelina初始化信息存放到redis数据库中,当angelina controller启动时会读取相关的初始化信息,否则会报错,而初始化需要用到angelina client,所以需要先编译,也可以使用已经编译好的angelina client,放在源代码中的bin目录下。

(2)在编译之前,请确认golang是否安装。

(3)执行如下命令编译:

[root@kuber-master angelina2]#  old=$(echo $GOPATH) && export GOPATH=$(pwd) && make && export GOPATH=$old 

(3)编译完成之后,会在当前目录下生成一个bin目录,如下:

[root@kuber-master bin]# ll
total 67240
-rwxr-xr-x 1 root root 31925505 May  3 20:38 angelina
-rwxr-xr-x 1 root root 31618999 May  3 20:38 angelina-controller
-rwxr-xr-x 1 root root  5301877 May  3 20:38 angelina-runner

这三个文件就是angelina的组件,其中的angelina就是angelina client。

8.部署angelina controller

(1)部署angelina controller所需的配置文件主要有config下的angelina-controller-deployment.yml,angelina-controller-service.yml,angelina-client-service.yml

(2)angelina-controller-deployment.yml的内容如下,如果采用默认配置,这个文件不能直接运行,需要修改的地方如下:

a.KUBER_APISERVER需要根据实际情况修改为kubernetes apiserver的监听地址。
b.如果你不需要每次启动时都重新拉取镜像,请删除“imagePullPolicy: Always”这一行,建议删除。
c.如果复制粘贴该文件,请把注释去掉

[root@kuber-master config]# cat angelina-controller-deployment.yml 
apiVersion: apps/v1beta1
kind: Deployment
metadata:
  name: angelina-controller
  namespace: bio-system
  labels:
    app: angelina-controller
spec:
  replicas: 1
  selector:
    matchLabels:
       app: angelina-controller
  template:
    metadata:
      labels:
        app: angelina-controller
    spec:
      containers:
      - name: angelina-controller
        image: happy365/angelina-controller:latest  // 拉取镜像
        imagePullPolicy: Always
        resources:   // 资源不限制
          limits:
            cpu: "0m"
            memory: "0Mi"
          requests:
            cpu: "0m"
            memory: "0Mi"
        env:
        - name: ANGELINA_REDIS_ADDR  // angelina-controller使用该redis作为后端存储
          value: angelina-redis
        - name: ANGELINA_REDIS_PORT  // redis在kubernetes service中的端口
          value: "6380"
        - name: ANGELINA_SERVER  // angelina-controller在kubernetes service中的端口
          value: ":6300"
        - name: ANGELINA_CONTROLLER_ENTRY // angelina-controller在kubernetes service中的访问端点,供angelina-runner使用
          value: "angelina-controller:6300"
        - name: NAMESPACE  // 使用的命名空间
          value: "bio-system"
        - name: START_CMD
          value: "rundoc.sh"  // angelina-runner容器启动命令
        - name: GLUSTERFS_ENDPOINT // glusterfs endpoints
          value: "glusterfs-cluster"
        - name: GLUSTERFS_DATA_VOLUME  // 数据输出目录挂载卷
          value: "data-volume"
        - name: GLUSTERFS_REFER_VOLUME  // 参考数据挂载卷
          value: "refer-volume"
        - name: ANGELINA_QUOTA
          value: "compute-resources" // 命名空间使用的资源限制名称
        - name: KUBER_APISERVER
          value: "https://10.61.0.160:6443"  // kubernetes apiserver地址,一定要修改。
        - name: SMTP_ENABLED  // 对于运行完成的任务,是否启用邮件通知功能。
          value: "false"
        - name: SMTP_SERVER  // smtp server 
          value: ""
        - name: SMTP_SERVER_PORT // smtp port
          value: ""
        - name: EMAIL_TO  // 消息发送给谁
          value: ""
        - name: EMAIL_SMTP_USER // 邮件服务器邮箱认证用户
          value: ""
        - name: EMAIL_SMTP_PASS  //密码
          value: ""
        - name: EMAIL_SEND_INTERVAL // 发送邮件的间隔时间,单位为分钟,30表示每30分钟发送一次邮件,该邮件会把30分钟所有运行完成的job状态发送过去。
          value: "30"
        ports:
        - containerPort: 6300
          protocol: UDP
        - containerPort: 6300
          protocol: TCP
        volumeMounts:
        - name: data
          mountPath: /mnt/data
        - name: refer
          mountPath: /mnt/refer 
      volumes:
      - name: data
        glusterfs:
          endpoints: glusterfs-cluster
          path: data-volume
          readOnly: false   
      - name: refer
        glusterfs:
          endpoints: glusterfs-cluster
          path: refer-volume
          readOnly: true

(3)使用如下命令创建:

[root@kuber-master config]# kubectl apply -f angelina-controller-deployment.yml

(4)执行angelina-controller-service.yml,如果采用默认配置,改文件不需要做任何修改:

[root@kuber-master config]# cat angelina-controller-service.yml 
apiVersion: v1
kind: Service
metadata:
  name: angelina-controller
  namespace: bio-system
spec:
  ports:
  - name: socket
    port: 6300
    protocol: UDP
    targetPort: 6300
  - name: http
    port: 6300
    protocol: TCP
    targetPort: 6300
  selector:
    app: angelina-controller

(5)执行如下命令创建:

[root@kuber-master config]# kubectl apply -f angelina-controller-service.yml

(6)执行angelina-client-service.yml,如果采用默认配置,不需要做任何修改(需要说明的是,这里仍然service仍然采用nodePort,后面的ANGELINA系统环境变量的设置只需要设置为任意一个节点的32000端口即可,例如: export ANGELINA=kuber-node1:32000):

[root@kuber-master config]# cat angelina-client-service.yml 
apiVersion: v1
kind: Service
metadata:
  name: angelina-client
  namespace: bio-system
spec:
  type: NodePort
  ports:
  - name: restful
    port: 6300
    protocol: TCP
    targetPort: 6300
    nodePort: 32000
  selector:
    app: angelina-controller

(7)执行如下命令创建:

[root@kuber-master config]# kubectl apply -f angelina-client-service.yml

(8)在angelina client所在物理机上设置ANGELINA系统环境变量,变量的值设置为任意的kuberntes node的32000端口即可:

[root@kuber-master config]# echo "export ANGELINA=kuber-node1:32000" >> /root/.bashrc
[root@kuber-master config]# source /root/.bashrc

9.为bio-system命名空间设置资源配额

(1)计算资源配额对于高效利用集群资源具有重要的意义,但是如果配额设置得不好,集群资源无法充分利用。资源配置文件为angelina源码目录config目录下的compute-resources.yaml

[root@kuber-master config]# cat compute-resources.yaml 
apiVersion: v1
kind: ResourceQuota
metadata:
  name: compute-resources
  namespace: bio-system
spec:
  hard:
    pods: "20"
    requests.cpu: "4"
    requests.memory: 3000Mi

说明:

(1)pods: 表示该命名空间总共可以启动多少个容器,如果启动的容器数量超过这个数字,容器启动会失败
(2)requests.cpu:表示该命名空间总共可以用多少的requests cpu,在kubernetes集群中,每一个pod可以设置requests cpu,表要运行我这个容器,至少需要多少个cpu单位,由于一个cpu对于容器来说是很大的单位,所以kubernetes把每一个cpu分成1000份,写成1000m,假设我的容器需要0.5个cpu,可以写成500m。
(3)requests memory: 表示该命名空间总共可以使用多少 requests memory,单位Mi表示MB,Gi表示GB...。
(4)上面的requests.cpu: "4"表示可以使用4个cpu线程。

(2)使用如下命令创建:

[root@kuber-master config]# kubectl apply -f compute-resources.yaml

10.制作angelina runner容器

(1) angelina runner是运行具体任务的容器,每个容器做的任务都不相同,在制作容器的的时候,需要在容器内容加入一个rundoc.sh的脚本文件,文件在angelina源码目录下的utils下,内容如下:

[root@kuber-master angelina2]# cat utils/rundoc.sh 
#!/bin/bash
wget -c $SCRIPTURL -O /usr/bin/angelina-runner
chmod +x /usr/bin/angelina-runner
angelina-runner

(2)制作容器时,不要指定ENTRYPOINT,切记。

(3)以下是一个简单的bwa容器的例子,前面的内容不重要重要的是需要加入rundoc.sh这个脚本到容器中并赋予执行权限:

[root@kuber-master bwa]# cat Dockerfile 
FROM centos:7.3.1611
RUN yum install epel-release -y
RUN yum install wget \
	git \
	make \
	gcc \
	gcc-c++ \
	zlib \
	zlib-devel -y
RUN cd /root && \
	git clone https://github.com/lh3/bwa.git && \
	cd bwa && \
	make && \
	cp bwa /usr/local/bin && \
	cd /root && \
	git clone https://github.com/lh3/minimap2 && \
	cd minimap2 && \
	make && \
	cp minimap2 /usr/local/bin 
ADD rundoc.sh  /usr/bin/rundoc.sh
RUN chmod +x /usr/bin/rundoc.sh

(2)从上面的Dockerfile中可以看到,每一个任务容器都需要加入rundoc.sh这个工具。

(3)将制作好的容器上传到本地私有仓库。