避免 ephemeral storage 空間用完

來源:Avoid running out of ephemeral storage space on your Kubernetes worker Nodes

Kubernetes 裡用 emptyDir 的 volume 的話,就是用 ephemeral storage,這塊空間就是 node 上的磁碟空間。所以用完的話,表示 node 上也沒空間了,其他 pod 在使用上可能就會有狀況。

node 上的位置可能會因發行版而有差異,文章裡提供的位置是:/var/lib/kubelet/pods//volumes/kubernetes.io~empty-dir//…

避免的方法有兩種。

第1種是在掛載 volume 時,設定 sizeLimit ,例如

volumes:
- name: www-content
  emptyDir:
    sizeLimit: 2Mi

缺點是當超過這限制時,kubernetes 會把這個 pod evict 掉。

第二種是設定 ResourceQuotas/LimitRange,先新增以下 YAML,然後 apply

apiVersion: v1
kind: ResourceQuota
metadata:
  name: default-resource-quotas
  namespace: my-application-namespace
spec:
  hard:
    limits.cpu: "2"
    limits.memory: 8Gi
    limits.ephemeral-storage: 2Gi
    requests.cpu: "1"
    requests.memory: 4Gi
    requests.ephemeral-storage: 1Gi
---
apiVersion: v1
kind: LimitRange
metadata:
  name: default-limit-ranges
  namespace: my-application-namespace
spec:
  limits:
  - default:
      cpu: 100m
      memory: 128Mi
      ephemeral-storage: "2Mi"
    defaultRequest:
      cpu: 25m
      memory: 64Mi
      ephemeral-storage: "1Mi" 
   type: Container

再來在 deployment/statefulset 裡增加 resource 指定,例如

apiVersion: apps/v1
kind: Deployment
metadata:
  name: helloworld-deployment-3
spec:
  selector:
    matchLabels:
      app.kubernetes.io/name: helloworld-deployment-3
  replicas: 2
  template:
    metadata:
      labels:
        app.kubernetes.io/name: helloworld-deployment-3
    spec:
      volumes:
      - name: www-content
        emptyDir: {}
      containers:
        - name: hello-world
          image: helloworld:1.0
          volumeMounts:
          - mountPath: /www
            name: www-content
          resources:
            requests:
              ephemeral-storage: "1Mi"
            limits:
              ephemeral-storage: "2Mi"


在 Kubernetes 裡雖然可以很容易擴充,但不表示資源無限,反而更應該去管控好,避免浪費。

如何檢查RHEL有受到特定CVE影響?

因為好奇怎麼去查,就找到這篇:How to check if an RHEL system is vulnerable to a CVE ,文章裡面提到兩個方法。

第一個方法是用 rpm -q --changelog <套件> | grep <CVE_number>

舉個例子

rpm -q --changelog openssl | grep CVE-2021-3450

第二個方法是用 yum updateinfo info --cve <CVE_number>

舉個例子

yum updateinfo info --cve CVE-2021-3445

最後,想調查這台 RHEL 有受到哪些 Errata 影響,可以用

yum updateinfo info --summary
yum updateinfo info --list

若要帶入 CVE 資訊,可以用這兩個指令

yum updateinfo info --summary --with-cve
yum updateinfo info --list --with-cve

Red Hat 也有一篇 KB ,方法相似:https://access.redhat.com/solutions/3628301

不太一樣的地方是,指令是查看 rpm 的,所以是用

rpm -qp kernel-3.10.0-862.11.6.el7.x86_64.rpm --changelog | grep CVE-2017-12190

或者是用 yum list –cve <CVE_number>

yum list --cve CVE-2017-12190 | grep kernel.x86_64

瀏覽器的Unsafe port

之前很方便,自己寫個應用程式,去 listen 指定 port ,用瀏覽器存取,都沒什麼問題。

但現在瀏覽器守備範圍變寬了,怕你危險,所以當使用奇怪的 port 時,就會出現 unsafe port 的訊息。

每種瀏覽器有不同的解除限制方式。

Chrome

啟動 google chrome 時,加入參數

--explicitly-allowed-ports=xxx

例如

C:\Program Files (x86)\Google\Chrome\Application\chrome.exe --explicitly-allowed-ports=6666

我想使用 Chrome 引擎的幾個瀏覽器應該也都適用,例如 Brave、Edge …

Firefox

firefox 處理方式比較簡單,開個新分頁,網址列輸入

about:config

然後輸入

network.security.ports.banned.override

然後填入

87,88,89,1050

或是範圍

10000-19999

完成以後,會立刻生效。

參考資料

結語

開發上,還是會需要使用到這些不安全的 port 來開發,所以知道怎麼繞過去會蠻有用的。

Hash Buster

Hackin9 看到這篇:Hash Buster – Why crack hashes when you can bust them?

這篇主要是在說 md5/sha1 是不安全的,透過目前電腦的強大能力,已經是可逆的了。用 Hash-Buster 這工具可以很快逆向取得雜湊前的結果。

安裝 Hash-Buster

方法1

git clone https://github.com/s0md3v/Hash-Buster.git
cd Hash-Buster
make install

方法2

wget https://raw.githubusercontent.com/s0md3v/Hash-Buster/master/hash.py -O /usr/local/bin/buster && chmod +x /usr/local/bin/buster

使用

把雜湊值當參數

buster -s "5e8ff9bf55ba3508199d22e984129be6"

把內有雜湊值的檔案當參數

buster -f with_hashed.txt

找目錄下所有內含有雜湊值的檔案

buster -d /somedir

Python 3 產生 md5 雜湊

import hashlib

print(hashlib.md5('sample'.encode('utf-8')).hexdigest())

結語

這工具蠻方便的,而且很小,但使用時必須要注意的一件事情,裡面的程式主要是使用外部的服務,所以是把雜湊值上傳到外部網站,然後取得結果。若是因為不小心遺忘密碼,那麼在取得結果後,要趕緊進行變更,以防萬一。

Powershell 找早於15天的檔案

這個需求在 linux 用 find 寫,很方便

find /tmp/location -type f -mtime +15 -delete

在 Windows Powershell 的話,可以參考這篇 Delete files older than 15 days using PowerShell

$limit = (Get-Date).AddDays(-15)
$path = "C:\Some\Path"

# Delete files older than the $limit.
Get-ChildItem -Path $path -Force | Where-Object { !$_.PSIsContainer -and $_.CreationTime -lt $limit } | Remove-Item -Force

# Delete any empty directories left behind after deleting the old files.
Get-ChildItem -Path $path -Force | Where-Object { $_.PSIsContainer -and (Get-ChildItem -Path $_.FullName -Recurse -Force | Where-Object { !$_.PSIsContainer }) -eq $null } | Remove-Item -Force -Recurse

這是使用 Get-ChildItem -Path $path ,搭配 Where-Object ,Where-Object 裏面是做判斷, $_ 是每個項目,用每個項目的 CreationTime 去判斷,然後用 Remove-Item 去刪除。

找指定位置下的目錄

想找到指定位置下的目錄,但不要再深入。指定位置下的目錄是這樣的

/tmp/location
  +-- dir1
    + dir11
  +-- dir2
    + dir21
  foo.txt

我預期是只看到 dir1 跟 dir2,所以我用 find

find /tmp/location -type d -print

結果我找到的是

/tmp/location
/tmp/location/dir2
/tmp/location/dir2/dir21
/tmp/location/dir1
/tmp/location/dir1/dir11

find 的輸出跟我預期的不相符啊,我又不想用 ls 處理,後來找到 -maxdepth -mindepth 這兩個參數,搭配起來使用就可以了。

find /tmp/location -maxdepth 1 -mindepth 1 -type d -print

這樣就會是我需要的 dir1 跟 dir2

/tmp/location/dir2
/tmp/location/dir1

又學到一課,謝謝你 find

paps

之前使用 enscript 來將文字檔轉為 pdf,但實測發現,若文字檔裡面是中文,那麼轉出來是亂碼。

只好找其他的方案,找到的是 paps: https://github.com/dov/paps

paps 比較麻煩的是需要自己安裝,安裝說明可以參考:https://github.com/dov/paps/blob/master/INSTALL.md

我的環境是 Ubuntu 20.04

第一個是需要 meson,這個直接用 apt-get 安裝就可以

sudo apt install meson

第二個是 fmtlib ,Ubuntu 20.04 內的 fmtlib 版本過舊,這邊需要借助 backports

sudo add-apt-repository ppa:savoury1/backports
sudo apt install libfmt-dev

最後就是編譯

https://github.com/dov/paps.git
cd paps
meson build
cd build && ninja
sudo ninja install

這樣就可以得到 paps 了。

電影流水帳(2023/02/01~2023/02/28)

Ana de Armas - 042
Ana Celia de Armas Caso
  • Knives out (IMDB, Wikipedia),台譯:峰迴路轉。
  • Glass Onion: A Knives Out Mystery (IMDB, Wikipedia),台譯:峰迴路轉2-抽絲剝繭。

這兩部電影拍的都很有味道,邊看電影的同時,邊讓人享受推理的樂趣。

Knives out

這部電影的故事,印象中有看過,記得是跟陪死者的看護有關係,但我始終找不到之前在哪裡看過。

死者是富裕的小說家,家裡的女兒、兒子都有些狀況,父親不想留財產給他們。小說家在某天早上就被發現死了,這下就糟了,沒多久,所有家人都到齊,知名的偵探也來了。於是展開了調查,在偵探檢視了所有人的動機以及現場留下的線索以後,案情陷入撲朔迷離的狀態,但在偵探慢慢調查跟排除不可能的動機之後,終於找到凶手。

其實在整個過程下來,可以猜出來誰是凶手的,就是這種抽絲剝繭的魔力,讓人對推理小說愛不釋手。

Glass Onion: A Knives Out Mystery

這部電影的故事同樣跟富翁有關係。

這富翁當初在創業初期時,有把其中一個人以法律方式,趕出了團隊。在創業初期若沒有處理好股權的部份,很容易發生這種事情。之後這人一直想爭取回自己應有的權益,只是始終未果。

這富翁的個性有點偏差,愛炫燿,把謎題寄給之前一起的人,算是創業伙伴或投資伙伴吧,你得解開謎題,才會知道在什麼時間地點集合,才能到富翁的島上渡假。偵探受到某人的委託,幫忙解開了謎題,也一同跟著過去。

到了島上以後,跟前集一樣,看似融洽的關係,其實暗潮洶湧。果不其然,就有人死了,大家都很害怕,但臨時有暴風雨,無法離開島上,很多事情就開始爆出來。同樣,偵探這時取得大家同意以後,開始進行調查跟推理。

跟上集有點不同的地方是,這集偵探其實早在要到島上前,就已經知道有古怪,所以跟委託人講好怎麼調查,開始設局了。最終,當然有找到凶手,富翁的公司也受到事件的影響而下市。

簡化路徑

路徑太長,想要縮短到 80 個字元以內,又要可以辨識,唯一找到的工具是 https://github.com/chrissound/SodiumSierraStrawberry

但這工具執行起來有問題,想要重新編譯,對 haskell 又不熟,只好放棄。

好在找到這篇:Path shortener for GUI application ,裏面提到可以用 Python3 的 pathlib 來做,於是就順手改了一下,做出自己要的工具

#!/usr/bin/env python3

import argparse
import sys
import pathlib

def cut_path(path, limit):
    if len(path)>limit:
      parts = list(pathlib.PurePath(path).parts)
      # print(parts)
      #if len(parts) >= 4:
      #    parts [2:-1] = ['...']
      new_parts = []
      for part in parts[:-1]:
        if len(part)>4:
          new_parts.append(part[:4] + "..")
        else:
          new_parts.append(part)
      new_parts.append(parts[-1])
      #print(new_parts)
      new_path = str(pathlib.PurePath(*new_parts))
      #print(len(new_path))
      if len(new_path) > limit:
        parts[2:-1] = ['...']
        return pathlib.PurePath(*parts)
      return new_path
    else:
      return path


def main():
    parser = argparse.ArgumentParser(
      prog=sys.argv[0],
    )
    parser.add_argument('-l', '--limit', type=int, default=76)
    parser.add_argument('filename')

    args = parser.parse_args()

    print(cut_path(args.filename, args.limit))


if __name__ == "__main__":
    main() 

基本運作是這樣

  1. 超過指定字元數目就做縮減,沒超過就直接回傳。
  2. 縮減的作法:使用 Pathlib 的 PurePath.parts() 把路徑拆成一段一段的,然後用名稱去做判斷,超過 4 個字元就把後面的改為 “…” ,然後產出新的字串。
  3. 若 2 的字串還是超過指定字元數目,就直接把其中一部份都刪除掉,改為 “…”

結果大約會是這樣

/home/user1/aaa.txt
coll../ansi../gov/twgc../role../veri../task../main.yml
collection/ansible_collections/.../main.yml

能夠這樣用 Python3 快速的弄出個小工具,真的是蠻開心的,Python3 真的自帶很多好東西可用。