# 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)