這次部屬Free5Gmano下的Kube5GNfvo專案。
首先clone Kube5GNfvo專案
git clone https://github.com/Free5Gmano/Kube5GNfvo.git
multus
multus用於解決k8s預設的POD不允許複數網卡的限制,multus可以為運行在kubernetes的POD提供多個網路介面,可以將多個CNI-Plugin組合並為POD配置不同類型的網路。
cd Kube5GNfvo/example/
kubectl apply -f multus-daemonset.yml
install OpenvSwitch並架設
OpenvSwitch是一種虛擬交換器,可用來作為L2的switch。
這裡因為VNF各元件內要互通,因此需要OpenvSwitch。
apt install openvswitch-switch -y
ovs-vsctl add-br br1
OVS-CNI
cd Kube5GNfvo/example/
kubectl apply -f ovs-cni.yaml
創建 NetworkAttachmentDefinition
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
cd Kube5GNfvo/example/etcd-cluster/rbac/
./create_role.sh
cd ..
kubectl apply -f deployment.yaml
(確認etcd的pod建立完畢後再進行下一步)
kubectl apply -f .
Metrics Server
新版K8S可以通過Metrics獲取資源使用情況(如container的CPU和memory使用情況等)。
cd Kube5GNfvo/example/metrics-server/
kubectl apply -f .
Node Exporter
node-exporter用於獲取UNIX類型的Kernal的硬體以及系統指標等。
cd Kube5GNfvo/example/
kubectl apply -f prom-node-exporter.yaml
KubeVirt
cd Kube5GNfvo/example/kubevirt/
kubectl apply -f kubevirt-operator.yaml
(確認kubevirt namespace建立成功後其內部所有pod都running之後再進行下一步驟)
kubectl apply -f kubevirt-cr.yaml
cat ~/.kube/config
將上面的輸出資料輸入下面的程式碼
cat <<EOF >./Kube5GNfvo-configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: Kube5GNfvo-config
data:
  config: |
      # 貼在這裡,注意排版
EOF
kubectl apply -f Kube5GNfvo-configmap.yaml
Kube5GNfvo ServiceAccount
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
部屬MySQL資料庫
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