---
# System prepended metadata

title: UP Board 嵌入式板子上安裝Wazuh之方法 (三塊板子 ver.)
tags: [實體機(板子)流程]

---

# UP Board 嵌入式板子上安裝Wazuh之方法 (三塊板子 ver.)

###### tags: `實體機(板子)流程`

本方法採用的配置為使用三塊板子，也就是三個node
第一個node為Control Plane、其餘兩個node為Worker
一個板子即為一台主機

若在執行過程中有遇到錯誤，可參考[FAQ](https://hackmd.io/nl5N3NtRSs287Q2rpEEw_w)

## 需求配置 

* 3塊 UP Board板子
* 三條DC電源線(5V3A)
* 三條網路線
* 一條HDMI線
* 一個具有HDMI輸入孔之螢幕
* 鍵盤、滑鼠各一

## 第一步 - 安裝Ubuntu Linux 20.04 Server 

使用的印象檔：**ubuntu-20.04.4-live-server-amd64**
準備好一張記憶卡，使用**rufus-3.20**燒錄印象檔到記憶卡內

三塊板子的安裝流程相同

插入記憶卡轉接到USB上，接上電源線
進入系統安裝

安裝完成後，系統提示要拔除記憶卡並按下Enter重啟
此時會出現錯誤訊息：**CPU Soft Lock**
此後若出現此訊息只要將電源線拔掉重新連上即可

重啟後應可順利到登入頁面
至此，系統安裝完成

## 第二步 - 網路配置

三塊板子都採用相同的配置方法，使用固定IP

登入後
先開啟管理者權限
```=bash
sudo su
```
輸入帳密

確認切換到root後
先回到最上層資料夾
使用下列指令
```=bash
cd ..
```
重複上述指令到最上層後，檢視該層內的所有檔案
使用下列指令進行檢視
```=bash
ls
```
發現 etc資料夾
使用cd指令切換到該資料夾下
```=bash
cd etc
```
確認已到該資料夾
再進行一次檢視所有檔案
```=bash
ls
```
發現 netplan資料夾，切換到該資料夾
```=bash
cd netplan
```
檢視檔案
```=bash
ls
```
發現有一檔案為 00-installer-config.yaml
使用使令nano進行修改(注意，這裡要以系統管理員權限進行)
```=bash
nano 00-installer-config.yaml
```
進入後，將內容修改成如下格式
![](https://i.imgur.com/flvmQL7.jpg)

其中
* enp1s0為網路卡名稱，有可能因為不同裝置而有不同名稱
* dhcp4、dhcp6的部分設置為no，目的是要關掉動態IP，採用靜態IP的方式
* addresses為靜態IP位址
* gateway4為預設閘道
* nameservers部分照打即可

完成後存檔
輸入指令如下
```=bash
netplan apply
```
該命令將新設定的網路應用
若缺少此指令則網路無法正確運行

完成後，確認是否有網路
輸入指令
```=bash
ip a
```
出現下圖
![](https://i.imgur.com/DIbzYdo.png)
找到inet部分，發現有我們輸入的固定IP
至此，固定IP設定完成

## 第三步 - 安裝kubernetes 集群

下述步驟所有節點都需要執行

安裝 net-tools
```=bash
sudo apt install net-tools
```
關閉swap，K8S會需要使用到Swap memory
```=bash
sudo vim /etc/fstab (# 註解此行：/Swap.img …… # comment out it -> #/Swap.img …)

sudo vim /etc/sysctl.conf

vm.swappiness=0  (於最後面加入此行)

sudo shutdown -r now (更改後重啟)

free -m (測試是否成功)
```
若swap的部分皆顯示為0即為成功，如下圖
![](https://i.imgur.com/HgfQxDN.png)


Set hostname (每個Node都要，用於Node之間的通信)
```=bash
sudo vim /etc/hosts
```
三個板子都做如下設定，設定固定IP，三塊板子都位於同一個網段之下
140.122.184.192 k8s-up-m1 # XXX填入該板子的固定IP，在本例為192
140.122.184.XXX k8s-up-w1 # XXX填入該板子的固定IP
140.122.184.XXX k8s-up-w2 # XXX填入該板子的固定IP

Enable IPv4 Forwarding
```=bash
sudo modprobe overlay

sudo modprobe br_netfilter

echo "net.bridge.bridge-nf-call-iptables = 1" | sudo tee -a /etc/sysctl.d/99-kubernetes-cri.conf

echo "net.ipv4.ip_forward = 1" | sudo tee -a /etc/sysctl.d/99-kubernetes-cri.conf

echo "net.bridge.bridge-nf-call-ip6tables = 1" | sudo tee -a /etc/sysctl.d/99-kubernetes-cri.conf

sudo sysctl --system
```

Set cri-o versions to use

```=bash
export OS=xUbuntu_20.04

export VERSION=1.23

echo "deb http://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable:/cri-o:/$VERSION/$OS/ /" | sudo tee -a /etc/apt/sources.list.d/cri-0.list

curl -L http://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable:/cri-o:/$VERSION/$OS/Release.key | sudo apt-key add -

echo "deb https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/$OS/ /" | sudo tee -a /etc/apt/sources.list.d/libcontainers.list

sudo apt-get update
```

Install cri-o
```=bash
sudo apt-get install -y cri-o cri-o-runc podman buildah

sudo systemctl daemon-reload

sudo systemctl enable crio

sudo systemctl start crio

systemctl status crio (查看是否正在running) #若有顯示running，按ctrl+z退出
```
Add Kubernetes repo and software

```=bash
sudo sh -c "echo 'deb http://apt.kubernetes.io/ kubernetes-xenial main' >> /etc/apt/sources.list.d/kubernetes.list"

curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -

sudo apt-get update

sudo apt-get install -y kubeadm=1.23.4-00 kubelet=1.23.4-00 kubectl=1.23.4-00

sudo apt-mark hold kubeadm kubelet kubectl

sudo apt-get update
```

上述步驟所有節點都須完成

### **注意!!! 下述安裝步驟須分別安裝到不同的節點上**

#### 以下為僅安裝在 Control Plane 1 (Master 1)

生成 kube-vip Pod (非高可用情況下可跳過)
```=bash
sudo su

export VIP=140.122.184.100 #注意，140.122.184為網段，若要更改只需要更改這段就好，後面的100不用動

export INTERFACE=enp1s0 #需要對應到網卡名稱

podman image pull docker.io/plndr/kube-vip:v0.3.8
```

```
podman run --rm --network=host --entrypoint=/kube-vip ghcr.io/kube-vip/kube-vip:v0.3.8 \
  manifest pod \
  --interface $INTERFACE \
  --vip $VIP \
  --controlplane \
  --services \
  --arp \
  --leaderElection | tee  /etc/kubernetes/manifests/kube-vip.yaml
```

配置kubeadm-config 用於初始化集群


```=bash
sudo nano kubeadm-config.yaml
```

```=bash
apiVersion: kubeadm.k8s.io/v1beta3
kind: InitConfiguration
nodeRegistration:
  criSocket: "/var/run/crio/crio.sock"
  imagePullPolicy: IfNotPresent
---
kind: ClusterConfiguration
apiVersion: kubeadm.k8s.io/v1beta3
kubernetesVersion: v1.23.4
clusterName: kubernetes
certificatesDir: /etc/kubernetes/pki
imageRepository: k8s.gcr.io
controlPlaneEndpoint: "140.122.184.192:6443"  # 填 apiserver 的 vip 地址 (也就是Control Plane 1之IP)
networking:
  serviceSubnet: "140.122.184.0/16" # 填寫與Control Plane 1 相同之網段，這部分是用來讓之後的Service生成後，配置給Service的IP段，若與上面的apiserver網段不同，則無法正常運作 
  podSubnet: "140.122.184.0/16" # 填寫與Control Plane 1 相同之網段，這部分是用來讓之後的Pod生成後，配置給Service的IP段，若與上面的apiserver網段不同，則無法正常運作 
etcd:
  local:
    dataDir: /var/lib/etcd
```

Init Cluster(集群初始化)

```=bash
sudo kubeadm init --config=kubeadm-config.yaml --upload-certs
```
會跳出以下提示加入Master及Worker之Key (需記住key，每次都不相同；這裡的IP應該會顯示和Control Plane 1相同之IP)
```=bash
Your Kubernetes control-plane has initialized successfully!

To start using your cluster, you need to run the following as a regular user:

  mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config

Alternatively, if you are the root user, you can run:

  export KUBECONFIG=/etc/kubernetes/admin.conf

You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  https://kubernetes.io/docs/concepts/cluster-administration/addons/

You can now join any number of the control-plane node running the following command on each as root:

  kubeadm join 140.122.184.192:6443 --token awlsky.8am4x56dzhj7ck8c \
        --discovery-token-ca-cert-hash sha256:2f63344f462737e6eaf6db85303e90efee192e356aa9c7ad71c81eb097a27c08 \
        --control-plane --certificate-key 044eeea2cd00a932668464e36f5decfbaa4389b061ffd107f32b347e2646950c

Please note that the certificate-key gives access to cluster sensitive data, keep it secret!
As a safeguard, uploaded-certs will be deleted in two hours; If necessary, you can use
"kubeadm init phase upload-certs --upload-certs" to reload certs afterward.

Then you can join any number of worker nodes by running the following on each as root:

kubeadm join 140.122.184.192:6443 --token awlsky.8am4x56dzhj7ck8c \
        --discovery-token-ca-cert-hash sha256:2f63344f462737e6eaf6db85303e90efee192e356aa9c7ad71c81eb097a27c08
```

記下後，執行下列三個指令，讓之後Control Plane可做集群的檢視

```=bash
mkdir -p $HOME/.kube

sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

sudo chown $(id -u):$(id -g) $HOME/.kube/config
```

檢視集群是否正常
```=bash
kubectl get cs

kubectl get node
```

#### 以上為僅安裝在Control Plane 1之部分

#### 以下為僅安裝在Control Plane 2~n之部分

若有其他Control Plane要加入集群，執行下列步驟
也就是說，下列步驟僅須執行在Control Plane 2~n

記得先切換到系統管理員模式，才可進行集群的修改
```=bash
sudo su
```

加入集群，使用之前所記錄的key
要記住的是，加入其他Control Plane僅能在Control Plane 1建立後的兩個小時內加入，因此動作要快

```=bash
sudo  kubeadm join 140.122.184.192:6443 --token awlsky.8am4x56dzhj7ck8c \
        --discovery-token-ca-cert-hash sha256:2f63344f462737e6eaf6db85303e90efee192e356aa9c7ad71c81eb097a27c08 \
        --control-plane --certificate-key 044eeea2cd00a932668464e36f5decfbaa4389b061ffd107f32b347e2646950c
```

加入後，也執行下列三行指令，讓該Control Plane可進行集群的檢視

```=bash
mkdir -p $HOME/.kube

sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

sudo chown $(id -u):$(id -g) $HOME/.kube/config
```

檢視集群是否正常
```=bash
kubectl get cs

kubectl get node
```

接著，將剛加入的Control Plane進行生成Kube-vip
```=bash
sudo su

export VIP=140.122.184.100

export INTERFACE=enp1s0

podman image pull docker.io/plndr/kube-vip:v0.3.8
```

```=bash
podman run --rm --network=host --entrypoint=/kube-vip ghcr.io/kube-vip/kube-vip:v0.3.8 \
  manifest pod \
  --interface $INTERFACE \
  --vip $VIP \
  --controlplane \
  --services \
  --arp \
  --leaderElection | tee  /etc/kubernetes/manifests/kube-vip.yaml

```

執行下列指令
```=bash
kubectl get pods -A | grep vip
```
應會出現類似圖
![](https://i.imgur.com/ShyxsNg.png)
由於本例中只有一個Control Plane，故只有一個Kube-vip(Kube-vip是在Control Plane上的元件)


#### 以上為僅安裝在Control Plane 2~n之部分

#### 以下為僅安裝在Worker 1~n之部分

要把Worker加入集群，僅需執行下列指令，來自Control Plane 1 生成後之key

```=bash
kubeadm join 140.122.184.192:6443 --token awlsky.8am4x56dzhj7ck8c \
        --discovery-token-ca-cert-hash sha256:2f63344f462737e6eaf6db85303e90efee192e356aa9c7ad71c81eb097a27c08
```

加入完成後，來到Control Plane上執行下列指令，確認Worker是否已加入集群
```=bash
kubectl get node 
```
應會出現下圖
![](https://i.imgur.com/oHwdfRX.png)


#### 以上為僅安裝在Worker 1~n之部分

#### 所有的Control Plane和Worker 都加入集群後，執行下列步驟一次即可

在任意的Control Plane上執行，建議使用Control Plane 1 安裝

配置calico yaml

```=bash
curl https://docs.projectcalico.org/manifests/calico.yaml -O 

kubectl apply -f calico.yaml
```

確認calico pod 及kube-vip成功running
```=bash
kubectl get pod -n=kube-system
```
![](https://i.imgur.com/taqUeGP.png)

## 第四步 - Wazuh的安裝(1) - NFS的安裝

先到Contol Plane 1上把Wazuh需要的檔案clone下來

然後到[NFS的安裝這邊](https://hackmd.io/@rTR3BUDZS3C8y2_qJDE4EQ/NFS)，執行完後回來進行第五步 - Wazuh的安裝(2)

## 第五步 - Wazuh的安裝(2) - Wazuh的部署

切換到上一步驟內抓下來的Wazuh內的wazuh-kubernetes(此步驟也在Control Plane 1 上執行)
```=bash
cd wazuh

cd wazuh-kubernetes
```
生產證書
```=bash
bash wazuh/certs/kibana_http/generate_certs.sh
(bash wazuh/certs/dashboard_http/generate_certs.sh)

bash wazuh/certs/odfe_cluster/generate_certs.sh
(bash wazuh/certs/indexer_cluster/generate_certs.sh)
```
創建3個persistent volume儲存空間 配置yaml
內容皆一樣，僅需更改name的部分

```=bash
sudo nano wazuh-pv1.yaml

sudo nano wazuh-pv2.yaml

sudo nano wazuh-pv3.yaml
```

```=bash
#PV.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: wazuh-pv1 #2#3
spec:
  capacity:
    storage: 10Gi
  accessModes:
  - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  storageClassName: wazuh-storage
  hostPath:
    path: /tmp
```

佈署PV
```=bash
kubectl apply -f wazuh-pv1.yaml

kubectl apply -f wazuh-pv2.yaml

kubectl apply -f wazuh-pv3.yaml
```

佈署Wazuh腳本並確定pv有與storageclass 連接
```=bash
kubectl get pv 

kubectl apply -k envs/local-env/

kubectl get pv 
```

確認剛部屬的pv有與storge class連接
```=bash
kubectl get pv -n=wazuh 
```
![](https://i.imgur.com/WKbrLdA.png)

確認服務與使用之Port
```=bash
kubectl get svc -n=wazuh 
```
![](https://i.imgur.com/7Y3HiaA.png)

確認pod皆Running
```=bash
kubectl get pod -n=wazuh 
```
![](https://i.imgur.com/Bx0jTQn.png)

接下來，到瀏覽器上輸入Control Plane 1的IP地址加上kibana的Port
```
https://140.122.184.192:30098
```
即可見到Wazuh之頁面
![](https://i.imgur.com/Ds8a1KK.png)
