[Docker] 使用多階段構建(multi-stage builds)時的垃圾清理

進行多階段構建時,builder image通常很佔空間,
尤其當系統架構是微服務,又做了自動化建構時,可能三兩天Runner硬碟就會滿載,
透過image filter的設定,可以用來刪除編譯時產生的builder image,
例如:

FROM builder-image:latest as builder
LABEL stage=builder
LABEL build=my-service
COPY . .
RUN go build -o app *.go
FROM alpine:latest
COPY --from=builder app .
CMD ["./app"]

build完之後,清理builder images

docker image prune -f --filter label=stage=builder --filter label=build=my-service

套用在Gitlab CI的話,可以利用CI_JOB_ID來實現,
先讓CI_JOB_ID,在編譯時帶入builder image:

FROM builder-image:latest as builder
ARG job_id
LABEL stage=builder
LABEL build=$job_id
COPY . .
RUN go build -o app *.go
FROM alpine:latest
COPY --from=builder app .
CMD ["./app"]
docker build --pull \
 --build-arg job_id=${CI_JOB_ID} \
 -t my-service:latest .

並在build job設定中新增after script:

.remove-intermediate-containers:
  after_script:
    - docker image prune -f --filter label=stage=builder --filter label=build=$CI_JOB_ID

參考資料:

https://docs.docker.com/engine/reference/commandline/images/#filtering

https://docs.gitlab.com/ee/ci/variables/#predefined-environment-variables

[Freenas] 外掛服務(Jail)中的檔案分享

裝了Freenas後,免不了會裝一些Emby 、 Transmission等等的播放與下載外掛服務。這些外掛程式是以FreeBSD Jail型式安裝,可以理解為這些服務是各自運作在獨立的沙盒上中,彼此隔離。

問題來了,如果今天我們想要將外掛中的資料夾,讓其他Jail服務使用,或是分享給Windows系統(SMB),會發現直接把Freenas的SMB路徑指到Jail中是無法直接使用的,會遇到各種權限問題。

這時掛接點(掛載點,Mount Points)就派上用場了。掛接點的概念,就是將一個 Freenas 中的一個磁碟路徑, 指派給 Jail 服務,作為其中一個指定路徑使用,類似Windows的磁碟分享概念。底下說明設定流程。

1. 掛載掛接點前準備

  1. 停止要掛載掛接點的 Jail服務
  2. 清空目的地端資料夾(Jail服務內的資料夾)

2. 掛載掛接點

進入掛接點。

設定掛接點,來源為Freenas路徑,目的地為 Jail 服務中的路徑。

3. 重新啟動Jail服務

完成設定後,新增在目的地路徑的檔案,就能同步在來源端路徑獲取到了,我們可以以相同方式,讓不同服務共用資料,也可以透過SMB或WebDEV等方式來分享資料夾。

[Grafana] provisioning配置

在過往, Grafana 想要自動化的配置Dashboard 與 Alert等設定,都必須以API達成,實在很不方便。 這不管在設定資訊的版本控管,以及容器環境的使用,都很不方便。

好在 v5.0開始 ,提供配置yaml格式的設定檔,讓Grafana於初始化時,能預先載入設定,目前支持的設定有:

  • 數據源 Datasources
  • 儀錶板 Dashboards
  • 警報通知頻道 Alert Notification Channels

上述三種設定檔都需要放置於provisioning資料夾中才有作用。

1. 確認grafana.ini中的provisioning路徑

指定,譬如/etc/grafana/provisioning

2. 設定檔放置於對應資料夾中

  • Datasources:/provisioning/datasources/
  • Dashboards :/provisioning/dashboards/
  • Alert Notification Channels:/provisioning/notifiers/

2.1 配置datasources

這邊以Prometheus為例,datasources可以是複數個。

2.2 配置dashboards

以istio儀表板為例,providers可以是複數個。

每個provider都會指定一個放置json格式dashboard設定檔的路徑。

2.3 配置notifiers

以slack為例,notifiers可以是複數個。

5.x版的notifiers配置似乎有問題,沒有成功過。一直到Grafana 6才能正常使用。

參考資料:

[Gitlab]Runner磁碟空間不足問題

專案若更新頻繁,
Runner所在VM(或主機)可能會三不五時遇到個問題,
磁碟空間不足,
此時可以用以下指令確診病情:
docker system df
若顯示有很大量可回收資源(由reclaimable欄位查看),
此時就可以考慮定時清理docker不用的資源,
一個簡單好用的方案是crontab搭配docker system prune。

選定執行時間建立crontab

依照想要的頻率建立crontab,
我希望每天清理,
因此直接建立在/etc/cron.daily/資料夾中。
cd /etc/cron.daily
vim clean-docker-system.sh

撰寫corntab腳本

使用docker system prune指令清理不使用的資源,
這邊因VM只供runner使用,做了徹底清理。

#!/bin/sh
docker system prune --volumes --all --force

說明有用到的幾個選項:

  • –all , -a:清理所有unused鏡像,而不單單是dangling狀態的鏡像
  • –volumes :清理不使用的資料卷
  • –force , -f :不做確認詢問

若是環境有其他服務使用docker,
須謹慎使用–volumes選項,避免誤刪資料。

設定corntab腳本權限

新建的檔案權限是664,
若要將該檔案變成可執行檔,且不讓其他人修改檔案,
要將檔案權限調整為755

chmod 755 clean-docker-system.sh

到此就設定完成囉,
可以隔段時間再檢查是否有正常運作。

[K8s]節點調度與隔離

這個主題目的是安全的維護節點,或移除節點 。

封鎖(隔離)Node

標記節點為不可調度, 新的pod不會調度到該節點,但不會影響該節點上任何現有pod 。
DaemonSet 創建的Pod會繞過調度程序,不遵守節點上的不可調度屬性。

kubectl cordon {NODENAME}


驅逐Node

安全驅逐節點上所有的Pod,被驅逐的Pod會優雅的終止。

kubectl drain {NODENAME}  --delete-local-data --ignore-daemonsets

–delete-local-data:非共用磁碟,刪除local資料
–ignore-daemonsets:強制移轉daemonsets


取消封鎖Node

節點恢復可以調度。


kubectl uncordon {NODENAME}


刪除Node

若Cluster在雲上,不一定會同步刪除VM,此時須到雲上手動刪除。


kubectl delete node {NODENAME}

備註:節點故障或斷線情境

根據 controller-manager的–pod-eviction-timeout備至,默認5分鐘之後 K8s会把Pod狀態設置為Unknown , 之後在其他節點啟動Pod。當故障節點恢復後,K8s會刪除故障節點上面的Unknown pod。如果要手動恢復,需用上述指令進行強制遷移。

[FreeNAS]為NextCloud設定SSL連線

環境

FreeNAS版本:11.2
安裝方式:Jails

步驟1: 進入 NextCloud Shell

步驟2:放入憑證檔

將憑證檔放到下列路徑,
pem檔產生方式可參考這篇
(自簽憑證會有很多使用上的麻煩,建議到SSL For Free申請,每3個月要重新申請一次)


步驟3:開始設定Nginx config

建議在編輯前,先備份檔案,以免改不回來…

vi /usr/local/etc/nginx/conf.d/nextcloud.conf

將原先的service區塊,改為聆聽443 port,並加入相關ssl設定。

若想禁用http,可以在設定檔最後,新增一個service跳轉設定。

設定完之後就可儲存離開。

步驟4:重新啟動Nginx

service nginx restart

成功重啟後,就能用瀏覽器測試看是否功能正常囉!
若重新啟動發生錯誤,請回頭檢查nextcloud.conf是否設定正確。

[SSL]憑證轉PEM與合併

範例使用sslforfree申請的免費憑證,
需要合併中繼憑證掛載,才不會被瀏覽器認定為不安全憑證。

中繼憑證轉pem

openssl x509 -in ca_bundle.crt -out ca_bundle.pem -outform PEM

憑證轉pem

openssl x509 -in certificate.crt -out certificate.pem -outform PEM

合併憑證與中繼憑證

cat certificate.pem ca_bundle.pem > mix.pem

private key 轉PEM

cat private.key > private.pem

[GitLab]使用Docker佈署Runner

Step 1:確認GitLab 設定

URL與Token待會會使用到。

Step 2: 取得最新版本Runner image

 docker pull gitlab/gitlab-runner:latest null

Step 3:建立Runner

docker run -d --name gitlab-runner-1  \
--restart always \
-v /var/run/docker.sock:/var/run/docker.sock \
gitlab/gitlab-runner:latest

Step 4:配置&註冊Runner

docker exec -it gitlab-runner-1 gitlab-runner register -n \
--url https://gitlab.com/ \
--registration-token abcdefg1234567 \
--description "Test Runner 1" \
--tag-list "docker-build, docker-deploy” \
--machine-max-builds 4 \
--executor docker \
--docker-image "docker:stable" \
--docker-volumes /var/run/docker.sock:/var/run/docker.sock

參考資料

[FreeNAS]設定Gmail SMTP

少了Email服務,無法即時收到系統通知,就用最簡單方便的Gmail吧!

在只能透過使用者名稱和密碼 (而不能透過使用者名稱、密碼和驗證碼) 設定的裝置或應用程式中,您都可以使用這組應用程式密碼來存取 Google 帳戶歐!

步驟1:新增應用程式密碼

登入Google,進入Google帳戶->安全性設定頁面,
點選應用程式密碼。

新增一組新的應用程式密碼,選擇其他可以自己命名。

記好這16碼密碼,待會設定SMTP會用到。

步驟2:設定SMTP

登入FreeNAS,進入System->Email選單,
參照下圖填寫設定,
Email&Username:統一填寫步驟一所使用的gmail,
密碼:剛才申請的16碼應用程式密碼

儲存後就可以發送成功囉!

官方參考資料

[FreeNAS]安裝FreeNAS-11.2

家裡缺一台NAS,剛好舊電腦跑Windows很喘 ,那就來個老將新生吧!

基本硬體要求 :

首先要有一台不用的舊電腦 ,如果沒有可以買一台最低規格的個人電腦,安裝前準備如下:

  • CPU :64位元CPU (32位元CPU請安裝FreeNAS 9.2.1.9)
  • RAM:8G以上記憶體
  • Disk:至少1顆硬碟與2個隨身碟
    • 隨身碟A:安裝碟 , 至少1G,燒錄FreeNas安裝程序 ,裝好後就不需使用了
    • 隨身碟B:FreeNAS 系統碟 ,至少8G , 建議32G。未來的開機碟
    • 硬碟:資料碟,最少1顆,但2顆以上資料比較安全(譬如走Mirror模式)

FreeNAS系統會占用一個Disk(硬碟 or 隨身碟),該Disk寫入後無法作為NAS儲存空間,建議裝在家裡不用的隨身碟即可

不要浪費一顆定硬碟

步驟1 : 下載ISO檔 , 燒錄到隨身碟A

首先到官網下載ISO檔案 , 下載路徑:Download

點選左邊的11.2下載

ISO檔直接解壓縮到隨身碟是無法使用的 ,可以下載Win32Diskimager 進行燒錄

點選 “寫入資料到裝置中"

如果是燒錄到CD , 從CD啟動。某些主板可能需將光碟機連接到SATA0才能從CD啟動

燒錄在隨身碟比較方便

步驟2 : 系統安裝

將兩個隨收碟都裝於電腦上 , 將開機碟選為安裝碟(隨身碟A)


啟動後會看到安裝畫面 ,安裝程序官方文檔寫得很清楚 ,可以直接參閱 :

https://www.ixsystems.com/documentation/freenas/11.2/install.html#performing-the-installation

步驟3 : 重新啟動

安裝完成後要重新啟動電腦,此時需要做兩件事情:

  1. 拔除安裝碟(隨身碟A)
  2. 將FreeNAS 系統碟 (隨身碟B)設為開機碟
edf

重新啟動後會進入啟動選單 ,不用理會它 , 預設過幾秒就會自行啟動FreeNAS

成功啟動後的畫面如下 :

sdr

再來就可以用上面顯示的IP ,在其他台電腦開啟美美的Web管理介面了!

登入畫面

美美的Dashboard

備註

安裝碟(隨身碟A)在裝好FreeNAS後就沒有作用了,
因格式問題,Windows無法直接將它格式化,
需要另外抓格式化工具進行格式化,譬如USB Disk Storage Format Tool。

參考資料 :

  1. 官方文件 : FreeNAS® 11.2-U2 User Guide
  2. 硬體要求 : Hardware Requirements

使用 WordPress.com 設計專業網站
立即開始使用