Day 28 MANO开源专案使用之kube5gnfvo - 环境篇

那麽这几天所要介绍的kube5gnfvo因为此专案为free5gmano的子专案,所以就更像是将这些步骤一一拆开来做为API方式 让人使用,那麽这几天介绍此专案就可以让人更了解要如何去实践一个NS的步骤了。
那麽今天就来做一个kube5gnfvo的环境建置吧!
有些部分在前几天有介绍的安装方式,在今天我还会再重复一次,这样就不用再翻回之前的安装介绍了:D

前置作业

环境

kubernetes v1.18
ubuntu 20.04

取得kube5gnfvo

git clone https://github.com/free5gmano/kube5gnfvo.git

建置Multus

cd kube5gnfvo/example/
kubectl apply -f multus-daemonset.yml

建立OpenvSwitch(OVS)

安装套件

apt install openvswitch-switch -y
ovs-vsctl add-br br1

建立CNI

cd kube5gnfvo/example/
kubectl apply -f ovs-cni.yaml

建立CRD

  • 注意,若是你所用ovs的bridge不是br1,请改为自己的bridge变数
cat <<EOF >./ovs-net-crd.yaml
apiVersion: "k8s.cni.cncf.io/v1"
kind: NetworkAttachmentDefinition
metadata:
  name: ovs-net
  annotations:
    k8s.v1.cni.cncf.io/resourceName: ovs-cni.network.kubevirt.io/br1
spec:
  config: '{
      "cniVersion": "0.3.1",
      "type": "ovs",
      "bridge": "br1"
    }'
EOF
kubectl apply -f ovs-net-crd.yaml

建立Etcd Operator

这是由於kube5gnfvo会使用到etcd做存取,因此需要做安装的动作

cd etcd-cluster/rbac/
./create_role.sh
cd ..
kubectl apply -f deployment.yaml
(Please make sure that etcdclusters.etcd.database.coreos.com CRD in Kubernetes has been created)
kubectl apply -f ./

建立Metrics Server

cd ../metrics-server/
kubectl apply -f ./

建立Node Exporter

cd ..
kubectl apply -f prom-node-exporter.yaml

建立kubevirt

由於kube5gnfvo有支援使用kubevirt做安装虚拟机,因此需要安装。

cd kubevirt/
kubectl apply -f kubevirt-operator.yaml
# 这里注意要先等operator建立起来再跑底下的cr,因为cr是kubevirt的CRD
kubectl apply -f kubevirt-cr.yaml

建立kube5gnfvo

到这里就是安装完环境了,那麽我们开始建立kube5gnfvo吧

建立configmap

需要先将kubernetes的内容api config放置进来

cat ~/.kube/config

请注意,内容要放在config的下一层

cat <<EOF >./kube5gnfvo-configmap.yaml

apiVersion: v1
kind: ConfigMap
metadata:
  name: kube5gnfvo-config
data:
  config: |
    <cat ~/.kube/config 後取得的所有内容>

EOF

kubectl apply -f kube5gnfvo-configmap.yaml

建立ServiceAccount(SA)

cat <<EOF >./kube5gnfvo-sa.yaml
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
  name: kube5gnfvo
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- kind: ServiceAccount
  name: kube5gnfvo
  namespace: default
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: kube5gnfvo
EOF

kubectl apply -f kube5gnfvo-sa.yaml

建立DB

cat <<EOF >./kube5gnfvo-mysql.yaml
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: kube5gnfvo-mysql
spec:
  strategy:
    type: Recreate
  selector:
    matchLabels:
      app: kube5gnfvo-mysql
  template:
    metadata:
      labels:
        app: kube5gnfvo-mysql
    spec:
      containers:
      - image: mysql:5.6
        name: kube5gnfvo-mysql
        env:
        - name: MYSQL_ROOT_PASSWORD
          value: password
        ports:
        - containerPort: 3306
          name: mysql
        volumeMounts:
        - name: kube5gnfvo-mysql
          mountPath: /var/lib/mysql
        volumeMounts:
        - name: mysql-initdb
          mountPath: /docker-entrypoint-initdb.d
      volumes:
      - name: kube5gnfvo-mysql
        persistentVolumeClaim:
          claimName: kube5gnfvo-mysql
      volumes:
      - name: mysql-initdb
        configMap:
          name: mysql-initdb-config
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: kube5gnfvo-mysql
  labels:
    name: kube5gnfvo-mysql
spec:
  capacity:
    storage: 20Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    type: DirectoryOrCreate
    path: /mnt/kube5gnfvo-mysql
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: kube5gnfvo-mysql
  namespace: default
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 20Gi
  selector:
    matchExpressions:
    - key: name
      operator: In
      values: ["kube5gnfvo-mysql"]
---
apiVersion: v1
kind: Service
metadata:
  name: kube5gnfvo-mysql
spec:
  ports:
  - port: 3306
  selector:
    app: kube5gnfvo-mysql
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: mysql-initdb-config
data:
  initdb.sql: |
    CREATE DATABASE kube5gnfvo;
EOF

kubectl apply -f kube5gnfvo-mysql.yaml

建立kube5gnfvo

cat <<EOF >./kube5gnfvo.yaml
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: kube5gnfvo
spec:
  replicas: 1
  selector:
    matchLabels:
      app: kube5gnfvo
  template:
    metadata:
      labels:
        app: kube5gnfvo
    spec:
      serviceAccountName: kube5gnfvo
      containers:
      - image: free5gmano/kube5gnfvo-stage2
        name: kube5gnfvo
        env:
        - name: DATABASE_PASSWORD
          value: "password"
        - name: DATABASE_HOST
          value: "kube5gnfvo-mysql"
        - name: DATABASE_PORT
          value: "3306"
        command: ["/bin/sh","-c"]
        args: ['python3 manage.py migrate && python3 manage.py runserver 0:8000']
        ports:
        - containerPort: 8000
          name: kube5gnfvo
        volumeMounts:
        - name: kube5gnfvo-vnf-package
          mountPath: /root/NSD
          subPath: NSD
        - name: kube5gnfvo-vnf-package
          mountPath: /root/VnfPackage
          subPath: VnfPackage
        - name: kube-config
          mountPath: /root/config
          subPath: config
      volumes:
      - name: kube5gnfvo-vnf-package
        persistentVolumeClaim:
          claimName: kube5gnfvo-pvc
      - name: kube-config
        configMap:
          name: kube5gnfvo-config
          items:
          - key: config
            path: config
---
apiVersion: v1
kind: Service
metadata:
  name: kube5gnfvo
spec:
  type: NodePort
  ports:
  - port: 8000
    nodePort: 30888
  selector:
    app: kube5gnfvo
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: kube5gnfvo-pvc
  namespace: default
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 20Gi
  selector:
    matchExpressions:
    - key: name
      operator: In
      values: ["kube5gnfvo"]
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: kube5gnfvo-pv
  labels:
    name: kube5gnfvo
spec:
  capacity:
    storage: 20Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    type: DirectoryOrCreate
    path: /mnt/kube5gnfvo
EOF

kubectl apply -f kube5gnfvo.yaml

结果

那麽到这里就完成了,明天将会进行解析其使用的TOSCA Temple的部分,明天见:D


<<:  Day 29. Zabbix 实际报警案例分享 - 网路流量异常飙高

>>:  大共享时代系列_027_第三方 Cookie (Third-Party cookie)

Day 15 关键字二三事

广告中,很多人一昧追求着浮夸的字眼来置入关键字,希望广告可以这样就脱颖而出,但事实上,你真的知道消费...

MyDlink 网路摄影机云端录影档案下载

Dlink 网路摄影机 提供三种方案(只提供APP购买订阅) 详细图片介绍连结 免费方案: 使用一年...

mybatis 使用

上一章节讲述了 PostgreSQL 的键置和 mybatis 连线到 DB 的配置,那今天就来实际...

[DAY 08]新成员进来时靠bot进行说明事项

最近进了一个公会群,发现当有新成员进来时管理员还需要问他们ID才能把他们邀进游戏里的工会 新成员进来...

【Day5】来了解一下Component的建立和使用方法吧!! ٩(●˙▿˙●)۶…⋆ฺ

React Component是什麽概念呢!? 就是很像把东西组成起来的元件 => 比如汽车的...