假设你有一个空白的Kubernetes集群,这个集群至少有3个node。

此文章描述的是旧版OaaS的部署流程,可能与新版部署流程有所不同。如果您需要部署持续更新的OaaS,请参阅https://github.com/pawissanutt/OaaS/tree/main

前置部署

Knative Serving

执行以下命令,分别安装custom resource和Knative core。

1
kubectl apply -f https://github.com/knative/serving/releases/download/knative-v1.13.1/serving-crds.yaml
1
kubectl apply -f https://github.com/knative/serving/releases/download/knative-v1.13.1/serving-core.yaml

Rook

首先,安装Rook并部署一个Rook集群。

1
2
3
4
git clone --single-branch --branch v1.13.5 https://github.com/rook/rook.git
cd rook/deploy/examples
kubectl create -f crds.yaml -f common.yaml -f operator.yaml
kubectl create -f cluster.yaml

接着,部署Rook Object Storage。将以下内容保存在object.yaml文件中。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
apiVersion: ceph.rook.io/v1
kind: CephObjectStore
metadata:
name: my-store
namespace: rook-ceph
spec:
metadataPool:
failureDomain: host
replicated:
size: 3
dataPool:
failureDomain: host
erasureCoded:
dataChunks: 2
codingChunks: 1
preservePoolsOnDelete: true
gateway:
sslCertificateRef:
port: 80
# securePort: 443
instances: 1

执行以下命令创建对象存储。

1
kubectl create -f object.yaml

执行以下命令创建Rook Object存储类。

1
2
# 假设你的工作目录在rook
kubectl create -f deploy/examples/storageclass-bucket-delete.yaml

如果你的Kubernetes集群没有可供pvc的持久化存储(比如你在主机上部署了新的Kubernetes而非使用云计算平台提供的Kubernetes服务),还可以部署Rook的Block存储类,这样集群中的pod就可以申请Rook Block作为持久化存储了。执行以下命令创建Block的存储类。

1
kubectl create -f deploy/examples/csi/rbd/storageclass.yaml

Block存储类创建完成后,你可能需要修改Kubernetes的默认存储类,或者在部署配置文件中手动声明pvc的存储类。

Strimzi

建议使用helm来安装Strimzi。执行以下命令。

1
helm install strimzi-cluster-operator oci://quay.io/strimzi-helm/strimzi-kafka-operator

ArangoDB Operator

执行以下命令,将<version>改成你在ArangoDB的GitHub release页面看到的版本号。

1
2
export URLPREFIX=https://github.com/arangodb/kube-arangodb/releases/download/<version>
helm install --generate-name $URLPREFIX/kube-arangodb-<version>.tgz

安装OaaS

从GitHub上克隆项目。

1
2
git clone https://github.com/hpcclab/OaaS.git
cd OaaS

部署Kafka集群。

1
kubectl apply -f deploy/kafka/kafka-cluster.yml

等待Kafka集群部署完成。在这步中,当屏幕上显示的输出不再变化时,按Ctrl+C退出watch模式。

1
kubectl get -w pod

编辑deploy/oaas/object-bucket.yml,在spec中加入storageClassName: rook-ceph-bucket。保存后执行以下命令部署Object Bucket。

1
kubectl apply -f deploy/oaas/object-bucket.yml

部署ArangoDB数据库。

1
kubectl apply -f deploy/arango/arango-cluster.yml

安装Nginx ingress控制器。

1
2
3
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo update
helm install my-nginx-ingress ingress-nginx/ingress-nginx --namespace ingress-nginx --create-namespace

创建名为nginx-ingressclass.yaml的文件并粘贴以下内容。

1
2
3
4
5
6
apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
name: nginx
spec:
controller: k8s.io/ingress-nginx

执行以下命令创建ingress class。

1
kubectl apply -f nginx-ingressclass.yaml

创建名为oaas-ingress.yml的文件,保存以下内容。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: oaas-ingress
spec:
ingressClassName: nginx
rules:
- http:
paths:
- pathType: Prefix
path: /
backend:
service:
name: content-delivery-service
port:
number: 80

创建ingress。

1
kubectl apply -f oaas-ingress.yml

如果你使用的不是云服务平台提供的Kubernetes服务,还需要将ingress控制器类型改为NodePort。

1
kubectl edit svc my-nginx-ingress-ingress-nginx-controller -n ingress-nginx

将其中spec.type改为NodePort,并保存。之后可通过服务器的公网IP加上service列表中显示的映射端口访问OaaS。