[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

[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。如果要手動恢復,需用上述指令進行強制遷移。

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