kubectl scale

看完這篇 Using Kubectl Scale 所整理的。

基本使用方式

kubectl scale --replicas=3 deployment/nginx-hello

有條件的 scale,可以指定只有在已經有 n 個 pod 的情況下,才去 scale,例如

kubectl scale --current-replicas=3 --replicas=5 deployment/demo-deployment

這就是說,只有在目前已經有 3 個 pod 的情況下,才做 scale。這可以避免在資源已經不足的情況下還去做 scale,讓整個 k8s 叢集更加不穩定。

對多個資源做 scale

kubectl scale --replicas=5 deployment/app deployment/database

對 default 這個 namespace 裡所有可以 scale 的資源去做 scale

kubectl scale --all --replicas=5 --namespace=default deployment

也可以用 selector 去篩選,例如針對所有 app-name=demo-app 的 deployment 去做 scale

kubectl scale --replicas=5 --selector=app-name=demo-app deployment

要做 scale 還有其他方法:

  1. 更動 yaml 裡的 spec.replicas
  2. 使用 HPA (Horizontal Pod Autoscaling)

最佳實踐

  • 避免經常性的做 scale
  • scale 到 0 的時候,表示應用程式會停止服務
  • 確定選到正確的資源做 scale
  • 使用 --current-replicas 來避免意外。

yq

jq 這個工具可以用查詢語法去查詢 json 檔案裡的指定內容,很方便。基本上 yaml 可以直接轉換為 json ,因此若先把 yaml 轉換為 json,再用 jq 查詢也是可以的。

只是多了一道轉換,是稍嫌麻煩一點,那麼 yaml 檔案是不是也有類似的工具呢?

答案是有的,我找到兩個實作,一個是使用 python 實作,一個是使用 go 實作。

查詢語法跟 jq 很相似,這部份可以參考 jq https://stedolan.github.io/jq/

microk8s升級

使用過 OpenShift 跟 Kubernetes ,對於升級這件事情,就會比較小心。關於升級這件事情,可以參考 Kubernetes 升級 FAQ

microk8s 這部份蠻簡單的,官方的文件很清楚:Upgrading MicroK8s

單個節點

用 snap 更新就可以

sudo snap refresh microk8s --channel=1.21/stable

多個節點

Kubernetes 本身允許某些節點的版本較低 (service skew),這邊就一個節點、一個節點處理。

文件沒有提到順序,我的想法是先升級 master 節點,再升級 worker 節點,步驟都一樣。

先把 pod 都趕出來

microk8s kubectl drain <node> --ignore-daemonsets

用以下指令確認除了 daemonset 以外的 pod 都已經被終止。

microk8s kubectl get po -A -o wide

然後更新

sudo snap refresh microk8s --channel=1.21/stable

再用以下指令去確認 node 都升級完成

microk8s.kubectl get node

最後再將 node 設置為可以調度

microk8s kubectl uncordon <node>

這邊有篇實例可以參考:https://microk8s.io/docs/upgrade-cluster

RHEL8 系統憑證管理

RHEL8 管理系統 SSL 憑證,首先要安裝 ca-certificates 套件

yum install ca-certificates

這個套件主要是外部的憑證,會定期更新,若是在連線到外部有遇到憑證問題,通常更新這個套件就可以解決。

如果有需要安裝自簽憑證,可以複製到以下這兩個憑證路徑:

  • /etc/pki/ca-trust/source/anchors
  • /usr/share/pki/ca-trust-source/anchors

/etc/pki/ca-trust 的權限比較高。

複製完成,執行

update-ca-trust

要察看目前有放了哪些憑證,可以用 trust 指令

trust list

前面提到的複製、執行 update-ca-trust ,也可以用以下指令替代

trust anchor <path.to/certificate.crt>

參考資料

explainshell

前陣子看到有人介紹這網站,把指令貼上去以後,下方會出現指令跟引數的解說,覺得挺不錯。在懶得用 man 或用 google 查詢時,用這很方便。

使用方法很簡單,就在輸入欄貼上要查詢的指令,除了單個指令以外,也可以貼上有 pipe 這類的組合指令。貼上以後,下方就出現說明了,以後就不用一個一個查了。

電影流水帳(2022/09/16~2022/09/30)

Karen Gillan
Karen Gillan
  • The Gray Man (IMDB, Wikipedia),台譯:灰影人。
  • Thor: Love and Thunder (IMDB, Wikipedia),台譯:雷神索爾4-愛與雷霆

The Gray Man

CIA 找被定罪的殺人犯加入 sierra 計劃,遊走於灰色地帶,幫 CIA 處理一些不能在台面上公開說的事情,所以一開始主角 Court 就被遊說加入了這個計劃。

時間過很快,匆匆數年過去,主角 Court 已經是局裡一個頂尖的人物。這次他跟 Dani 一同出任務,這次任務 Court 並不完全是依照計劃殺掉目標,目標仍然死了,但 Court 從目標的口中取得了驚人的訊息。這驚人的訊息就是目標也加入了 CIA 的 sierra 計劃,為什麼會變成目標的原因是因為他知道了 CIA 的一些事情。Court 很驚訝,他從目標給他的隨身碟開始調查,從這隨身碟他得知了 CIA 內部有高層已經在做一些非法的勾當。Court 開始進行追查,但高層得知 Court 可能已經知道,也派出了遊走在灰色地帶的洛伊德追殺 Court。接下來的故事就是精彩刺激的動作橋段跟解謎,最後 Court 殺了洛伊德之後,跟 CIA 達成協議,救出了恩人的女兒。

Thor: Love and Thunder

後面幾部漫威的作品感覺有點力道不夠,又或者是我已經麻木,這集我覺得沒有第三集來的好看。

雷神索爾跟著星際特攻隊一起闖蕩,成功瘦身,然後他感覺到有某個世界有發出求救,就趕了過去。結果看到了碎裂的槌子跟另外一個雷神,那個雷神居然是珍,他驚訝了。打退敵人以後,了解了事情的原委,第一個是格爾因為喪女之痛跟得到死靈劍,所以開始殺神;第二個是珍取得碎裂的槌子後,得到了雷神的力量。索爾跟著珍回到地球,沒多久,格爾也趕到,但他打不贏眾人,就擄走阿斯嘉的孩子們。雷神索爾一行人去找眾神求救,豈料這些神見死不救,索爾他們只好改變計劃,改取得宙斯的閃電矛之後,自己去救人。

眾人找到格爾以後,才發現格爾要的是風暴毀滅者,他想打開通道去到永恆那邊,去消滅所有諸神。經過一番打鬥,索爾跟珍協力打斷了格爾的死靈劍,救出了阿斯嘉的孩子,但格爾仍打開了通往永恆之門,跟著去的雷神則是讓格爾明白,自己想要的是讓女兒復活。後來格爾讓女兒復活,請索爾好好照顧。珍則是因為癌症死去,到了英靈殿。

git-delta

git-delta 是帶有語法高亮的比對工具。

你知道的,git 預設是使用 diff,diff 沒有語法高亮,而且在比對的顯示需要一點時間習慣。

git-delta :delta

安裝

安裝蠻簡單的,提供各種作業系統的安裝方法:Installation – delta

以 Debian/Ubuntu 來說,從下載網頁下載 debian package以後,用 dpkg -i 安裝就可以。

wget https://github.com/dandavison/delta/releases/download/0.15.1/git-delta_0.15.1_amd64.deb
sudo dpkg -i git-delta_0.15.1_amd64.deb

設定

編輯 ~/.gitconfig ,加上以下設定

[core]
    pager = delta

[interactive]
    diffFilter = delta --color-only --features=interactive

[delta]
    features = decorations

[delta "interactive"]
    keep-plus-minus-markers = false

[delta "decorations"]
    commit-decoration-style = blue ol
    commit-style = raw
    file-style = omit
    hunk-header-decoration-style = blue box
    hunk-header-file-style = red
    hunk-header-line-number-style = "#067a00"
    hunk-header-style = file line-number syntax

使用

設定加好以後,在使用以下 git 指令時,就會看到比對了

  • git diff
  • git show
  • git log -p
  • git stash show -p
  • git reflog -p
  • git add -p

也可以直接拿來替代 diff 使用

delta a.txt b.txt

其他還有很多設定可以調整,可以依照自己的需求來調整:Usage – delta

結語

這種可以提升開發速度的工具,要列到建立開發環境的步驟裡,這樣在開發上可以提升效率。

定時自動重啟服務

定時自動重啟服務,第一個最先想到就是用 crontab ,執行 crontab -e 加入

30 3 * * sun /bin/systemctl restart myService

就可以在每周日的 3:30 去重新啟動 myService 這個服務。

那可不可以用 systemd 來解決呢?

How can I configure a systemd service to restart periodically? 這篇有提到 systemd 在 229 這個版本以後有一個設定:RuntimeMaxSec ,這個可以表明服務存活的時間,所以如果是寫 1d ,表示存活一天,然後依照 Restart 設定來決定服務是否重新啟動

[Service]
Restart=always
RuntimeMaxSec=1d

以上設定就表示,服務存活一天,一天後重新啟動。

但這樣的設定,無法指定時間。

若需要指定時間,就需要使用 systemd timer 來進行

首先建立一個 oneshot 的 service ,新增 /etc/systemd/system/my_program.service

[Unit]
Description=Restart service

[Service]
Type=oneshot
ExecStart=/usr/bin/systemctl try-restart myService.service

這個 service 就只重新啟動 myService.service。接著加入 timer 設定,新增 /etc/systemd/system/my_program.timer

[Unit]
Description=Do something daily

[Timer]
# OnCalendar=daily
OnCalendar=*-*-* 3:30:00
Persistent=true

[Install]
WantedBy=timers.target

新增好以後,設定啟用這個 timer

systemctl daemon-reload
systemctl enable --now my_program.timer

這樣就可以在每天的 3:30 重新啟動 myService 這個服務了。

這方法跟 crontab 相比,需要管理兩個檔案,好處是可以統一使用 systemctl 來管理,各有好處。

以上介紹了三種方法,多知道一些,未來就可以因應各種情況來做搭配使用。

參考資料

cockpit 改 port

cockpit 是 RHEL 現在主打的 web console,透過網站介面,就可以管理主機。Debian/Ubuntu/RHEL 都有把這個套件包進去。

預設在安裝以後,是不啟用的,需要使用以下指令來啟用

sudo systemctl enable cockpit.socket

port 的預設值是 9090,若需要改 Port 的話,可以透過以下指令來覆寫之前的設定

sudo systemctl edit cockpit.socket

編輯以後,輸入以下內容

[Socket]
ListenStream=
ListenStream=PORT_NUMBER

把 PORT_NUMBER 改為想要的 port 就可以。

修改完畢以後,用以下指令重新載入跟啟動

sudo systemctl daemon-reload
sudo systemctl restart cockpit.socket

RHEL8修復磁碟

Red Hat Enterprise Linux (RHEL) 7, 8, 9 的方法都一樣。

  1. 拿 RHEL 安裝光碟開機
  2. 開機選單進入 Troubleshooting
  3. 進入 Rescue a Red Hat Enterprise Linux System
  4. 進入終端機

有終端機就好辦事了。

Software RAID 就用 mdadm --assemble --scan ,這主要是用 RAID 工具去掃描磁碟並重組 RAID 。執行完,要用 cat /proc/mdstat 檢查看看。

LVM 就用 lvm vgchange -ay 去尋找並啟用 LVM。啟用成功以後,可以再檢查 LVM 相關設定看看 (/etc/lvm) 以及 Kernel 的開機參數 cat /proc/cmdline

先用 lsblk 或是 df -h 看看目前的磁碟跟掛載的分割區,通常無法掛載或是掛載成唯讀時,都表示可能有問題,這時候要用適當的修復指令去修復。

各種檔案系統的修復指令

  • ext2/ext3/ext4: e2fsck -fvy /dev/sdX
  • xfs: xfs_repair /dev/sdX
  • ReiserFS: reiserfsck /dev/sdX
  • Btrfs: btrfsck /dev/sdX
  • vfat: fsck.vfat /dev/sdX

修復好,可以掛載以後,要再把分割區掛載起來,檢查一下裡面的設定,例如 /etc/fstab ,/etc/lvm 等等的。

大致上是這樣,關於修復這部份,我覺得蠻吃經驗的,也需要對 Linux 開機過程有足夠的認識,這樣會比較好解決。

最後附帶一提,Ubuntu 也是用類似的方法來處理,Ubuntu 比較好的地方是用 LiveCD 開機完以後,有桌面環境可以用,這時就可以開終端機或是磁碟分割工具來使用,甚至也可以配置網路,用瀏覽器去查找資料來處理。