終端機快速複製檔案內容到剪貼簿

資料來源:How to copy and paste within a terminal in macOS or Linux?

在 MacOS 下,可以用 pbcopy/pbpaste

cat file.txt | pbcopy
pbpaste | tee foo.txt

在 Linux 下,要用 xsel,主要是參數 –input 跟 –output

# 複製到剪貼簿
cat file.txt | xsel --clipboard --input
xsel --clipboard --output | tee foo.txt

若要讓指令一致,可以用 alias

alias pbcopy='xsel --clipboard --input'
alias pbpaste='xsel --clipboard --output'

網站是用wordpress做的嗎?

最近在幫朋友找 wordpress 佈景主題,所以在找是不是有工具可以分析網站,取得資訊。

結果就找到這篇:How to Discover Which WordPress Theme a Site is Using – GreenGeeks

這篇文章介紹了四個方法,其中一個方法是借助 IsItWP 這個網站。這個網站除了可以偵測網站是否用 wordpress 做的之外,也可以分析裡面用到的 plugin 或是 theme,真的是很方便。

其他兩個網站分別是

使用方法都很簡單,貼上要分析的網址就可以了。

最後一個萬不得已的方法就是看網頁原始碼了。

用trivy掃描KBOM

KBOM = Kubernetes Bills Of Material,就是 Kubernetes 的物料清單。

trivy 是由 Aqua Security 所開發的一個掃描工具,現在支援了 KBOM,可以依據 Kubernetes 務料清單裡的軟體來進行掃描,並產出報告。

安裝可以從 https://github.com/aquasecurity/trivy 來下載安裝,有提供以下方式

  • Container image
  • Debian package
  • RPM package
  • Homebrew

安裝好以後,就可以使用了。

那要掃描 KBOM ,要先產出 kbom.json,用以下指令就可以產出。這邊要注意,執行 trivy 的電腦上必須已經放置 ~/.kube/config ,這樣 trivy 才能存取到 k8s cluster。

trivy k8s cluster --format cyclonedx --output kbom.json

有了 kbom.json 以後,就可以用以下指令產出報告

trivy sbom kbom.json

我的 k8s 報告如下

2024-02-18T15:29:26.693+0800	INFO	Vulnerability scanning is enabled
2024-02-18T15:29:26.694+0800	INFO	Detected SBOM format: cyclonedx-json
2024-02-18T15:29:26.720+0800	WARN	No OS package is detected. Make sure you haven't deleted any files that contain information about the installed packages.
2024-02-18T15:29:26.721+0800	WARN	e.g. files under "/lib/apk/db/", "/var/lib/dpkg/" and "/var/lib/rpm"
2024-02-18T15:29:26.721+0800	INFO	Detected OS: ubuntu
2024-02-18T15:29:26.721+0800	WARN	This OS version is not on the EOL list: ubuntu 22.04.3
2024-02-18T15:29:26.721+0800	INFO	Detecting Ubuntu vulnerabilities...
2024-02-18T15:29:26.721+0800	INFO	Number of language-specific files: 3
2024-02-18T15:29:26.722+0800	INFO	Detecting kubernetes vulnerabilities...
2024-02-18T15:29:26.728+0800	INFO	Detecting gobinary vulnerabilities...

kbom.json (ubuntu 22.04.3)

Total: 0 (UNKNOWN: 0, LOW: 0, MEDIUM: 0, HIGH: 0, CRITICAL: 0)


 (gobinary)

Total: 3 (UNKNOWN: 0, LOW: 0, MEDIUM: 3, HIGH: 0, CRITICAL: 0)

┌──────────────────────────────────┬─────────────────────┬──────────┬────────┬───────────────────┬────────────────┬──────────────────────────────────────────────────────────┐
│             Library              │    Vulnerability    │ Severity │ Status │ Installed Version │ Fixed Version  │                          Title                           │
├──────────────────────────────────┼─────────────────────┼──────────┼────────┼───────────────────┼────────────────┼──────────────────────────────────────────────────────────┤
│ github.com/containerd/containerd │ CVE-2023-25153      │ MEDIUM   │ fixed  │ 1.6.15            │ 1.5.18, 1.6.18 │ containerd: OCI image importer memory exhaustion         │
│                                  │                     │          │        │                   │                │ https://avd.aquasec.com/nvd/cve-2023-25153               │
│                                  ├─────────────────────┤          │        │                   │                ├──────────────────────────────────────────────────────────┤
│                                  │ CVE-2023-25173      │          │        │                   │                │ containerd: Supplementary groups are not set up properly │
│                                  │                     │          │        │                   │                │ https://avd.aquasec.com/nvd/cve-2023-25173               │
│                                  ├─────────────────────┤          │        │                   ├────────────────┼──────────────────────────────────────────────────────────┤
│                                  │ GHSA-7ww5-4wqc-m92c │          │        │                   │ 1.6.26, 1.7.11 │ containerd allows RAPL to be accessible to a container   │
│                                  │                     │          │        │                   │                │ https://github.com/advisories/GHSA-7ww5-4wqc-m92c        │
└──────────────────────────────────┴─────────────────────┴──────────┴────────┴───────────────────┴────────────────┴──────────────────────────────────────────────────────────┘

從報告可以看出軟體元件的版本跟漏洞報告。

如果不產出 kbom.json ,也可以用另外一個方式掃描

trivy k8s cluster --scanners vuln --report summary

不過這指令在我的 k8s cluster,會有問題,我猜想是我 k8s cluster 不夠力的關係,就先這樣吧。

trivy 也有 operator 可以安裝,有機會再來看看怎麼使用。

參考資料

sitespeed.io 取得網站效能

來源:https://www.sitespeed.io/

專案已經提供了用容器啟動的方式,所以蠻容易的

docker run --rm -v "$(pwd):/sitespeed.io" sitespeedio/sitespeed.io:32.2.0 https://www.sitespeed.io/

執行完成後,會在當前目錄產生 sitespeed-result 目錄,目錄裡就有你需要的效能報告。

有需要撰寫自訂腳本測試的,可以參考 https://www.sitespeed.io/documentation/sitespeed.io/scripting/

效能報告以網頁呈現,用瀏覽器就可以開啟。

如何檢查GitOps Manifests

Kubernetes 主要會用這幾種檔案格式:

  1. YAML
  2. Kustomize
  3. Helm Chart

在使用前,是否可以檢查呢?以下就分別來介紹

YAMLint

YAML 可以使用 yamllint 來檢查,在 RHEL9 裡可以直接安裝 yamllint 。

sudo yum install yamllint

用以下指令檢查

yamllint service.yml

可以使用 -f 來指定輸出格式。

Kustomize

kustomize 可以用 kustomize build 來檢查。

kustomize build path/to/folder

Red Hat 有寫一個輔助腳本:validate_manifest.sh

Helm

helm 本身有提供 subcommand 來檢查:helm lint

helm lint Chart.yaml

參考資料

git repository搬家

若有需要將整個 repository 從 A 搬到 B ,單純的 git clone 跟 git push 是不夠的,因為還有 branches, tags 等等的。

所以得這樣作。

首先在目的端,例如 github/gitlab ,建立一個空的 repository。

接著要處理來源端的 repository,在 clone 時加上 --mirror

git clone --mirror git@example.com:repo1.git

git clone 完成會有一個 repo1 的資料夾,進入 repo1 的資料夾,執行以下指令把所有 branches, tags 資訊都拉取回來,然後加入新的遠端,並進行推送

git fetch --all
git remote add target git@<新的repository>
git push target --mirror

這樣就大功告成了。

參考資料

Kubernetes刪除資源卡在Terminating

資料來源:

整理一下,若遇到刪除不了,一定是有原因。以 Namespace 來說,通常是有些資源刪除不掉,這時候要花點耐心去找。

若不想等,就是加上 --grace-period=0 --force ,強制來做。

Pod 也是類似的作法。

若還是不行,可以把 finalizer 清掉,以下是 pod 的例子,但 namespace 也可以用。

kubectl patch pod <pod>-p '{"metadata":{"finalizers":null}}'

最後一招,終極的作法,是直接存取 etcd ,這個會看是用哪個容器平台而有不同的作法。像 OpenShift ,etcd 是以 pod 形式存在,所以需要進到 etcd 的 pod 裡,用 etcdctl 去查詢跟刪除。

雖然通常都是建議不要,但難免會遇到這種情況,就參考看看。

serverspec

在「基礎架構即程式碼」這本書裡看到 serverspec 這個工具,是 rspec 的延伸,主要是檢查是否合乎規格,但對象換成了主機,而不是程式。

以下安裝都是在 Ubuntu 22.04 上進行,首先要安裝 ruby

sudo apt install ruby bundler

接著要透過 gem 來安裝 serverspec ,使用 gem install 預設是安裝到系統 /usr/local ,但我不想這樣,我希望是安裝到自己使用者目錄下,這時候可以用 –user-install

gem install serverspec --user-install

這樣就安裝完成了。

接下來建立一個目錄,作為工作區,然後初始化 serverspec 專案

mkdir -p work
serverspec-init

這時候會詢問主機的資訊

Select OS type:

  1) UN*X
  2) Windows

Select number: 1

Select a backend type:

  1) SSH
  2) Exec (local)

Select number: 1

Vagrant instance y/n: n
Input target host name: www.example.jp

主機規格描述,是放在 spec/www.example.jp/sample_spec.rb

所以就編輯這個檔案就可以。

連線到主機,是使用 SSH,這邊若是不想輸入密碼,就要把 public key 複製過去

ssh-copy-id user@www.example.jp

登入使用者不一樣,是要調整 spec/spec_helper.rb 裡的 user。

要進行測試,就執行

rake spec

這樣就可以對主機進行檢查了。

想法

  1. 個人不太喜歡 Ruby ,但 spec 的寫法的確很簡潔。日後若要使用,勢必要再對 ruby熟悉一些。
  2. Ansible 應該可以使用 check mode ,也就是 playbook 單純描述預期的狀態,執行 ansible-playbook 時,可以帶入 --check--diff 來做到類似的功能。

參考資料

Rancher安裝

Rancher 是 RKE 的 Web Console。

參考資料

事前準備

安裝 helm

Rancher 是用 helm 安裝的,所以要先安裝 helm (文件)

到這邊挑選版本下載:https://github.com/helm/helm/releases

wget https://get.helm.sh/helm-v3.13.0-linux-amd64.tar.gz tar xf helm-v3.13.0-linux-amd64.tar.gz sudo mv linux-amd64/helm /usr/local/bin/helm

安裝

增加 helm repo

helm repo add jetstack https://charts.jetstack.io helm repo add rancher-stable https://releases.rancher.com/server-charts/stable

jetstack 是 cert-manager 的 repo

安裝 cert-manager

helm install cert-manager jetstack/cert-manager --namespace cert-manager --version v1.11.0 --set installCRDs=true

安裝 rancher

helm install rancher rancher-stable/rancher \ --namespace cattle-system \ --set hostname=rancher.experteam.com.tw \ --set replicas=1 \ --set useBundledSystemChart=true \ --set bootstrapPassword="Redhat12345678"

這邊要加 useBundledSystemChart=true ,若不加,佈署時會失敗。

若安裝失敗,可以用 uninstall

helm uninstall rancher -n cattle-system

配置 Load Balancer

由於會自動安裝 nginx-ingress ,所以可以使用以下幾種方式

  1. 在 F5 配置,將 master, worker 都配置進去即可。
  2. 新增一台 haproxy ,將 master, worker 配置到 backend
  3. 新增一台 nginx ,將 master, worker 配置進去

或者是偷懶的在 DNS 新增一筆 A record,填入 master 的 node IP 即可。

接下來應該就可以登入了。

RKE安裝

因公司某產品說在 RKE 平台上有問題,所以就找了資料,裝一套起來試試看,想不到意外的簡單。

參考資料

準備 VM 與配置 VM 環境

建立兩台 VM,可以使用 RHEL8

接下來動作,兩台都要作

移除 podman

sudo yum remove podman runc docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine

安裝 docker-ce

sudo ls /etc/yum.repos.d wget https://download.docker.com/linux/centos/docker-ce.repo -O - | sudo tee /etc/yum.repos.d/docker.repo sudo yum install -y docker-ce-cli-20.10.24-3.el8 docker-ce-20.10.24-3.el8 sudo systemctl enable --now docker

關閉 swap

sudo swapoff -a

編輯 /etc/fstab ,註解掉 swap 該行

關閉 selinux

sudo setenforce 0 sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config

關閉防火牆

sudo systemctl stop firewalld sudo systemctl disable firewalld

新增 sysctl 設定

新增 /etc/sysctl.d/99-k8s.conf

net.ipv4.ip_forward = 1 net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1

增加使用者 apadmin

sudo useradd apadmin sudo passwd apadmin sudo usermod -aG docker apadmin

安裝

在 bastion 上作業

下載 rke

因這邊有需求要裝 kubernetes 1.24,所以要下載對應的 rke 版本 1.43-rc3

這是在 bastion 主機上作

wget https://github.com/rancher/rke/releases/download/v1.4.3-rc3/rke_linux-amd64 -O /tmp/rke sudo mv /tmp/rke /usr/local/bin/rke sudo chmod +x /usr/local/bin/rke

配置 ssh 免密碼登入

ssh-keygen ssh-copy-id apadmin@<master> ssh-copy-id apadmin@<worker>

rke設定檔

先列出此版 rke 可安裝的 kubernetes 版本

rke config --list-version -all

輸出結果是

v1.24.8-rancher1-1 v1.25.5-rancher1-1 v1.23.14-rancher1-1

新增 cluster.yml ,裡面的 kubernetes_version 指定的 kubernetes 版本

cluster_name: ithome-rancher kubernetes_version: "v1.24.8-rancher1-1" nodes: - address: 10.11.23.81 user: apadmin role: [controlplane,worker,etcd] - address: 10.11.23.82 user: apadmin role: [worker,etcd] services: etcd: backup_config: enabled: true interval_hours: 6 retention: 60 network: plugin: flannel

開始安裝

執行以下指令就可以安裝

rke up

安裝後配置

安裝完成後,目錄裡會有 kube_config_cluster.yml 的檔案

這是給 kubectl 使用的檔案,先下載 kubectl

curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl" sudo mv kubectl /usr/local/bin sudo chmod +x /usr/local/bin/kubectl

把 kube_config_cluster.yml 複製為 ~/.kube/config

mkdir -p ~/.kube cp kube_config_cluster.yml ~/.kube/config

接下來就可以用 kubectl 指令查看

kubectl get nodes kubectl get pods -A