2023年9月3日 星期日

Kubernetes/k8s 開發筆記 - 在 macOS 僅安裝 kubectl 、在 Windows 安裝 minikube v1.31.2 和 VirtualBox v7.0.10 @ macOS 13 , Windows 11

雖然 k8s 已夯很久,但工作事務上一直還沒用他,主因是現有的 Jenkins + Ansible 已經可以輕鬆管理數百台機器群,說穿了也滿像實體機房管理機制,有人(Linode/AWS/GCP/Azure)負責把實體機器上架插上電源網路線,接著設法自動化(Ansible)找到他們完成初始化,接著靠 Jenkions 完成 CI/CD。

年初就想要提升同事技能,刻意備好書推動,現在趁個颱風天自己也找點時間走一輪吧!我認為 k8s 的線上資源已經夠多了,已夯了五年,到處都有精美的簡中電子書和鐵人文,如:
整體上,我覺得可以 Kubernetes Handbook (Kubernetes指南)那為基準,先把基礎入門文都看一下,知道 k8s 源自於 Google Borg 的設計理念,往後只要看著 k8s 架構圖即可:


例如操作 k8s 可以透過 kubectl 指令,也可以透過 api 呼叫,更可以透過 Web UI 來操作。如果硬要對比的話,早年 AWS 2009 前後,一開始也是先提供 API 操控方式,接著進展到 Firefox plugin,後續提供 Web UI 並且越來越豐富,對應的還有 Azure / GCP 一推出就有 Web UI 可操作,接著為了自動化操控,我們會使用 API level 的方式,透過基本的權限掌控後,得知機器的 IP 跟默認的登入方式,也可以簡化成單純在 AWS/GCP Web UI 開好機器及設定好標籤後,後續 ansible-playbook 就能全盤接手處理。

至於要認識 k8s ,目前看到 minukube 是最佳的下手,他支援跨平台。實務上只需做一兩件事:
  1. 下載 minukube ,可以架設出本地 k8s cluster (預設是單一節點)
  2. 下載 kubectl 工具(雖然 minukube kubectl 也能呼喚出)
這邊做一點有趣的情境:在 macos 上僅安裝 kubectl 而已,在 windows 11 安裝 minukube v1.31.2 + VirtualBox v7.0.10,讓 Windows 資源拿來運作 k8s 環境,未來 macos 就縮減成 thin client 用來遠端操作。

實作方式 - macOS (也可靠 MacPorts 或 Homebrew 安裝):

% curl -L https://storage.googleapis.com/kubernetes-release/release/`curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt`/bin/darwin/amd64/kubectl > /tmp/kubectl
% chmod 700 /tmp/kubectl
% /tmp/kubectl version
Client Version: v1.28.1
Kustomize Version: v5.0.4-0.20230601165947-6ce0bf390ce3
The connection to the server localhost:8080 was refused - did you specify the right host or port?

這邊就可以看到 kubectl 他本身預設會去跟 localhost:8080 溝通,那代表其可以設定在遠方。

實作方式 - Windows 11: 

PS C:\Users\user\Downloads> .\minikube-windows-amd64.exe start
😄  minikube v1.31.2 on Microsoft Windows 11 Pro 10.0.22621.2215 Build 22621.2215
✨  Using the virtualbox driver based on existing profile
👍  Starting control plane node minikube in cluster minikube
🔄  Restarting existing virtualbox VM for "minikube" ...
❗  This VM is having trouble accessing https://registry.k8s.io
💡  To pull new external images, you may need to configure a proxy: https://minikube.sigs.k8s.io/docs/reference/networking/proxy/
🐳  Preparing Kubernetes v1.27.4 on Docker 24.0.4 ...
🔗  Configuring bridge CNI (Container Networking Interface) ...
    ▪ Using image gcr.io/k8s-minikube/storage-provisioner:v5
    ▪ Using image docker.io/kubernetesui/dashboard:v2.7.0
    ▪ Using image docker.io/kubernetesui/metrics-scraper:v1.0.8
🔎  Verifying Kubernetes components...
💡  Some dashboard features require the metrics-server addon. To enable all features please run:

        minikube addons enable metrics-server

🌟  Enabled addons: default-storageclass, storage-provisioner, dashboard
💡  kubectl not found. If you need it, try: 'minikube kubectl -- get pods -A'
🏄  Done! kubectl is now configured to use "minikube" cluster and "default" namespace by default

PS C:\Users\user\Downloads> .\minikube-windows-amd64.exe stop
✋  Stopping node "minikube"  ...
🛑  1 node stopped.

PS C:\Users\user\Downloads> .\minikube-windows-amd64.exe delete
🔥  Deleting "minikube" in virtualbox ...
💀  Removed all traces of the "minikube" cluster.

以上就是很粗淺的....我起來了,我停掉,我砍掉了。其中比較麻煩之處應該是 Virutalbox 7 的使用,剛安裝完後要重新啟動電腦,接著運行 minikube-windows-amd64.exe start 時,看能不能順利跑起來,常見卡住的地方是 Host-Only 網路卡等等。

此外,一直切換筆電很煩,就來把 Windows 11 Desktop 安裝 OpenSSH ,讓 macOS 遠端登入:[macOS] 從 Macbook 遠端登入 Windows 筆電並使用 PowerShell 工作環境

接著就回到 macOS 遠端登入 windows minikube 的用法:

% ssh user@windows-minikube-ip

Microsoft Windows [版本 10.0.22621.2215]
(c) Microsoft Corporation. 著作權所有,並保留一切權利。

user@WINDOWS-DESKTOP C:\Users\user>cd Downloads

user@WINDOWS-DESKTOP C:\Users\user\Downloads>minikube-windows-amd64.exe start
😄  minikube v1.31.2 on Microsoft Windows 11 Pro 10.0.22621.2215 Build 22621.2215
✨  Automatically selected the virtualbox driver
👍  Starting control plane node minikube in cluster minikube
🔥  Creating virtualbox VM (CPUs=2, Memory=4000MB, Disk=20000MB) ...
❗  This VM is having trouble accessing https://registry.k8s.io
💡  To pull new external images, you may need to configure a proxy: https://minikube.sigs.k8s.io/docs/reference/networking/proxy/
🐳  Preparing Kubernetes v1.27.4 on Docker 24.0.4 ...
    ▪ Generating certificates and keys ...
    ▪ Booting up control plane ...
    ▪ Configuring RBAC rules ...
🔗  Configuring bridge CNI (Container Networking Interface) ...
    ▪ Using image gcr.io/k8s-minikube/storage-provisioner:v5
🔎  Verifying Kubernetes components...
🌟  Enabled addons: default-storageclass, storage-provisioner
💡  kubectl not found. If you need it, try: 'minikube kubectl -- get pods -A'
🏄  Done! kubectl is now configured to use "minikube" cluster and "default" namespace by default

user@WINDOWS-DESKTOP C:\Users\user\Downloads>

user@WINDOWS-DESKTOP C:\Users\user\Downloads>minikube-windows-amd64.exe status
minikube
type: Control Plane
host: Running
kubelet: Running
apiserver: Running
kubeconfig: Configured

user@WINDOWS-DESKTOP C:\Users\user\Downloads>minikube-windows-amd64.exe kubectl -- config view
apiVersion: v1
clusters:
- cluster:
    certificate-authority: C:\Users\user\.minikube\ca.crt
    extensions:
    - extension:
        provider: minikube.sigs.k8s.io
        version: v1.31.2
      name: cluster_info
    server: https://192.168.59.101:8443
  name: minikube
contexts:
- context:
    cluster: minikube
    extensions:
    - extension:
        provider: minikube.sigs.k8s.io
        version: v1.31.2
      name: context_info
    namespace: default
    user: minikube
  name: minikube
current-context: minikube
kind: Config
preferences: {}
users:
- name: minikube
  user:
    client-certificate: C:\Users\user\.minikube\profiles\minikube\client.crt
    client-key: C:\Users\user\.minikube\profiles\minikube\client.key

user@WINDOWS-DESKTOP C:\Users\user\Downloads>minikube-windows-amd64.exe kubectl -- version --output=json     
{
  "clientVersion": {
    "major": "1",
    "minor": "27",
    "gitVersion": "v1.27.4",
    "gitCommit": "fa3d7990104d7c1f16943a67f11b154b71f6a132",
    "gitTreeState": "clean",
    "buildDate": "2023-07-19T12:20:54Z",
    "goVersion": "go1.20.6",
    "compiler": "gc",
    "platform": "windows/amd64"
  },
  "kustomizeVersion": "v5.0.1",
  "serverVersion": {
    "major": "1",
    "minor": "27",
    "gitVersion": "v1.27.4",
    "gitCommit": "fa3d7990104d7c1f16943a67f11b154b71f6a132",
    "gitTreeState": "clean",
    "buildDate": "2023-07-19T12:14:49Z",
    "goVersion": "go1.20.6",
    "compiler": "gc",
    "platform": "linux/amd64"
  }
}


user@WINDOWS-DESKTOP C:\Users\user\Downloads>ipconfig

Windows IP 設定


乙太網路卡 乙太網路:

   媒體狀態 . . . . . . . . . . . . .: 媒體已中斷連線
   連線特定 DNS 尾碼 . . . . . . . . :

乙太網路卡 乙太網路 2:

   連線特定 DNS 尾碼 . . . . . . . . :
   IPv4 位址 . . . . . . . . . . . . : 192.168.56.1
   子網路遮罩 . . . . . . . . . . . .: 255.255.255.0
   預設閘道 . . . . . . . . . . . . .:

乙太網路卡 乙太網路 3:

   連線特定 DNS 尾碼 . . . . . . . . :
   IPv4 位址 . . . . . . . . . . . . : 192.168.59.1
   子網路遮罩 . . . . . . . . . . . .: 255.255.255.0
   預設閘道 . . . . . . . . . . . . .:

...

如此,若要用 macOS kubectl 去控制 Windows 11 上的 minikube ,先挑個土法煉鋼模式:

1. 把 minikube-windows-amd64.exe kubectl -- config view 存起來(可以透 ssh remote command)

% ssh user@windows-minikube-ip '%HOME%\Downloads\minikube-windows-amd64.exe kubectl -- config view' > /tmp/kubectl.config.yaml

2. 將上面列到的 certificate-authority, client-certificate 和 client-key 也都靠 scp 下載回來

% scp user@windows-minikube-ip:"/C:/Users/user/.minikube/ca.crt" /tmp/kubectl.ca.crt
% scp user@windows-minikube-ip:"/C:/Users/user/.minikube/profiles/minikube/client.crt" /tmp/kubectl.client.crt
% scp user@windows-minikube-ip:"/C:/Users/user/.minikube/profiles/minikube/client.key" /tmp/kubectl.client.key

3. 修改 /tmp/kubectl.config.yaml 上 certificate-authority, client-certificate 和 client-key 對應位置

% /tmp/kubectl --kubeconfig ./kubectl.config.yaml config view
apiVersion: v1
clusters:
- cluster:
    certificate-authority: kubectl.ca.crt
    extensions:
    - extension:
        provider: minikube.sigs.k8s.io
        version: v1.31.2
      name: cluster_info
    server: https://127.0.0.1:8443
  name: minikube
contexts:
- context:
    cluster: minikube
    extensions:
    - extension:
        provider: minikube.sigs.k8s.io
        version: v1.31.2
      name: context_info
    namespace: default
    user: minikube
  name: minikube
current-context: minikube
kind: Config
preferences: {}
users:
- name: minikube
  user:
    client-certificate: kubectl.client.crt
    client-key: kubectl.client.key

其中上述的 clusters.cluster.server 數值我已換成 https://127.0.0.1:8443 ,這是為了彈性自行靠 ssh tunnel 

4. 最後,我再透過 SSH tunnel 自建一條連到 192.168.56.101:8443 (Windows 11 上的 minikube api 入口點)

% ssh -N -L 8443:192.168.59.101:8443 user@windows-minikube-ip

5. 如此,未來想從 macOS 的 kubectl 遠端連去控制 Windows 11 上的 minikube 時,就是先建立一條 SSH tunnel ,接著運行 kubectl 要指定 config 位置,就能黑皮遠端操控

% ./kubectl --kubeconfig ./kubectl.config.yaml version
Client Version: v1.28.1
Kustomize Version: v5.0.4-0.20230601165947-6ce0bf390ce3
Server Version: v1.27.4

最後一提,其實 Windows 11 Desktop 安裝完 OpenSSH server 後,已經可以自行遠端進去用 minikube-windows-amd64.exe kubectl 做事,只剩熟不熟悉 PowerShell 指令環境,所以,上述有點脫褲子放屁 XD 好處是練一輪後,未來有很多 k8s cluster 可以用 --kubeconfig 切換吧!

其他資訊:

Kubernetes/k8s 開發筆記 - 在 Macbook M1 Pro 安裝 minikube, qemu, socket_vmnet @ macOS 13.5.1


之前略知 Apple M1 架構,對於使用一些軟體服務會卡卡,終於來體驗一下。原先在考慮依照官網的簡介:


後來決定都靠 Homebrew 來管理,安裝流程:

% sw_vers
ProductName: macOS
ProductVersion: 13.5.1
BuildVersion: 22G90

% brew --version
Homebrew 4.1.7

% brew install qemu socket_vmnet minikube
Error: Cannot install in Homebrew on ARM processor in Intel default prefix (/usr/local)!
Please create a new installation in /opt/homebrew using one of the
"Alternative Installs" from:
  https://docs.brew.sh/Installation
You can migrate your previously installed formula list with:
  brew bundle dump

% eval "$(/opt/homebrew/bin/brew shellenv)"

% brew install qemu socket_vmnet  minikube

...
socket_vmnet requires root privileges so you will need to run
  `sudo /opt/homebrew/opt/socket_vmnet/socket_vmnet` or `sudo brew services start socket_vmnet`.
You should be certain that you trust any software you grant root privileges.

socket_vmnet is keg-only, which means it was not symlinked into /opt/homebrew,
because Homebrew's bin directory is often writable by a non-admin user.

If you need to have socket_vmnet first in your PATH, run:
  echo 'export PATH="/opt/homebrew/opt/socket_vmnet/bin:$PATH"' >> ~/.zshrc

To start socket_vmnet now and restart at startup:
  sudo brew services start socket_vmnet
Or, if you don't want/need a background service you can just run:
  /opt/homebrew/opt/socket_vmnet/bin/socket_vmnet --vmnet-gateway\=192.168.105.1 /opt/homebrew/var/run/socket_vmnet
...

% sudo brew services start socket_vmnet
Service `socket_vmnet` already started, use `brew services restart socket_vmnet` to restart.

% minikube start --driver=qemu --network socket_vmnet
😄  minikube v1.31.2 on Darwin 13.5.1 (arm64)
✨  Using the qemu2 driver based on user configuration
👍  Starting control plane node minikube in cluster minikube
🔥  Creating qemu2 VM (CPUs=2, Memory=6000MB, Disk=20000MB) ...
🐳  Preparing Kubernetes v1.27.4 on Docker 24.0.4 ...
    ▪ Generating certificates and keys ...
    ▪ Booting up control plane ...
    ▪ Configuring RBAC rules ...
🔗  Configuring bridge CNI (Container Networking Interface) ...
    ▪ Using image gcr.io/k8s-minikube/storage-provisioner:v5
🔎  Verifying Kubernetes components...
🌟  Enabled addons: default-storageclass, storage-provisioner
🏄  Done! kubectl is now configured to use "minikube" cluster and "default" namespace by default

% minikube status
minikube
type: Control Plane
host: Running
kubelet: Running
apiserver: Running
kubeconfig: Configured

% minikube stop  
✋  Stopping node "minikube"  ...
🛑  1 node stopped.

% minikube status
minikube
type: Control Plane
host: Stopped
kubelet: Stopped
apiserver: Stopped
kubeconfig: Stopped

然後重開機後,進入 zsh 環境時,需要重新做一點設定,就看個人的習慣要不要安置自動化了:

% minikube status
zsh: command not found: minikube
% eval "$(/opt/homebrew/bin/brew shellenv)"
% minikube status
🤷  Profile "minikube" not found. Run "minikube profile list" to view all profiles.
👉  To start a cluster, run: "minikube start"

% minikube start --driver=qemu --network socket_vmnet
😄  minikube v1.31.2 on Darwin 13.5.1 (arm64)
✨  Using the qemu2 driver based on user configuration
👍  Starting control plane node minikube in cluster minikube
🔥  Creating qemu2 VM (CPUs=2, Memory=6000MB, Disk=20000MB) ...\ OUTPUT: 
ERROR: Failed to connect to "/opt/homebrew/var/run/socket_vmnet": Connection refused


🔥  Deleting "minikube" in qemu2 ...
🤦  StartHost failed, but will try again: creating host: create: creating: Failed to connect to "/opt/homebrew/var/run/socket_vmnet": Connection refused: exit status 1
🔥  Creating qemu2 VM (CPUs=2, Memory=6000MB, Disk=20000MB) ...\ OUTPUT: 
ERROR: Failed to connect to "/opt/homebrew/var/run/socket_vmnet": Connection refused


😿  Failed to start qemu2 VM. Running "minikube delete" may fix it: creating host: create: creating: Failed to connect to "/opt/homebrew/var/run/socket_vmnet": Connection refused: exit status 1

❌  Exiting due to GUEST_PROVISION: error provisioning guest: Failed to start host: creating host: create: creating: Failed to connect to "/opt/homebrew/var/run/socket_vmnet": Connection refused: exit status 1

╭───────────────────────────────────────────────────────────────────────────────────────────╮
│                                                                                           │
│    😿  If the above advice does not help, please let us know:                             │
│    👉  https://github.com/kubernetes/minikube/issues/new/choose                           │
│                                                                                           │
│    Please run `minikube logs --file=logs.txt` and attach logs.txt to the GitHub issue.    │
│                                                                                           │
╰───────────────────────────────────────────────────────────────────────────────────────────╯

% sudo brew services restart socket_vmnet
Password:
Stopping `socket_vmnet`... (might take a while)
==> Successfully stopped `socket_vmnet` (label: homebrew.mxcl.socket_vmnet)
Warning: Taking root:admin ownership of some socket_vmnet paths:
  /opt/homebrew/Cellar/socket_vmnet/1.1.2/bin
  /opt/homebrew/Cellar/socket_vmnet/1.1.2/bin/socket_vmnet
  /opt/homebrew/opt/socket_vmnet
  /opt/homebrew/opt/socket_vmnet/bin
This will require manual removal of these paths using `sudo rm` on
brew upgrade/reinstall/uninstall.
==> Successfully started `socket_vmnet` (label: homebrew.mxcl.socket_vmnet)

% minikube delete

% minikube start --driver=qemu --network socket_vmnet
😄  minikube v1.31.2 on Darwin 13.5.1 (arm64)
✨  Using the qemu2 driver based on user configuration
👍  Starting control plane node minikube in cluster minikube
🔥  Creating qemu2 VM (CPUs=2, Memory=6000MB, Disk=20000MB) ...
🐳  Preparing Kubernetes v1.27.4 on Docker 24.0.4 ...
    ▪ Generating certificates and keys ...
    ▪ Booting up control plane ...
    ▪ Configuring RBAC rules ...
🔗  Configuring bridge CNI (Container Networking Interface) ...
    ▪ Using image gcr.io/k8s-minikube/storage-provisioner:v5
🔎  Verifying Kubernetes components...
🌟  Enabled addons: storage-provisioner, default-storageclass
🏄  Done! kubectl is now configured to use "minikube" cluster and "default" namespace by default

% minikube status
minikube
type: Control Plane
host: Running
kubelet: Running
apiserver: Running
kubeconfig: Configured

上述是因為筆電重啟後時,碰到 socket_vmnet 問題,最後就先試著把整套環境刪除 (minikube delete) 而重來,而後續常規的用法:

% eval "$(/opt/homebrew/bin/brew shellenv)"

% sudo brew services restart socket_vmnet  
Warning: Taking root:admin ownership of some socket_vmnet paths:
  /opt/homebrew/Cellar/socket_vmnet/1.1.2/bin
  /opt/homebrew/Cellar/socket_vmnet/1.1.2/bin/socket_vmnet
  /opt/homebrew/opt/socket_vmnet
  /opt/homebrew/opt/socket_vmnet/bin
This will require manual removal of these paths using `sudo rm` on
brew upgrade/reinstall/uninstall.
==> Successfully started `socket_vmnet` (label: homebrew.mxcl.socket_vmnet)

% minikube start --driver=qemu --network socket_vmnet
😄  minikube v1.31.2 on Darwin 13.5.1 (arm64)
✨  Using the qemu2 driver based on existing profile
👍  Starting control plane node minikube in cluster minikube
🔄  Restarting existing qemu2 VM for "minikube" ...
🐳  Preparing Kubernetes v1.27.4 on Docker 24.0.4 ...
🔗  Configuring bridge CNI (Container Networking Interface) ...
🔎  Verifying Kubernetes components...
    ▪ Using image gcr.io/k8s-minikube/storage-provisioner:v5
🌟  Enabled addons: storage-provisioner, default-storageclass
🏄  Done! kubectl is now configured to use "minikube" cluster and "default" namespace by default

% minikube status
minikube
type: Control Plane
host: Running
kubelet: Running
apiserver: Running
kubeconfig: Configured

2023年8月31日 星期四

Node.js 筆記 - 使用 Puppeteer 抓取網頁上的圖片內容並靠 Tesseract 分析圖片上的文字 (OCR) @ macOS 13.5.1, node v20.5.1, tesseract v5.3.2

剛好有同好在詢問如何處理認證碼的事,就順手複習一下 node.js 與 Puppeteer 動態爬網頁,並且把認證碼圖片存起來,在靠 Tesseract 分析上述的文字。

以前略知 光學字元辨識(OCR) 的方式,但一直沒實戰,這次就順手摸一下:github.com/changyy/node-puppeteer-with-tesseract-tool

目前只單純練一下功,還不到實際使用的地步,因為 Tesseract 分析上仍有精準度問題,純做個小工具方便把玩。此程式碼只提供快速定位到 <img> (getElementById)  的方式,接著動態存成圖片,再呼叫工具分析它。

此外,已經存在本機了,後續也能靠 tesseract 指令反覆測試參數。

安裝:

% sudo port install tesseract tesseract-eng tesseract-chi-tra tesseract-chi-sim 
% sw_vers
ProductName: macOS
ProductVersion: 13.5.1
BuildVersion: 22G90
% tesseract --version
tesseract 5.3.2
leptonica-1.82.0
libgif 5.2.1 : libjpeg 8d (libjpeg-turbo 2.1.5.1) : libpng 1.6.40 : libtiff 4.5.1 : zlib 1.2.11 : libwebp 1.3.1 : libopenjp2 2.5.0
Found SSE4.1
Found libarchive 3.6.2 zlib/1.2.11 liblzma/5.4.1 bz2lib/1.0.8 liblz4/1.9.4 libzstd/1.5.4
Found libcurl/8.1.2 SecureTransport (LibreSSL/3.3.6) zlib/1.2.11 nghttp2/1.51.0

使用:

% nvm use v20
Now using node v20.5.1 (npm v9.8.0)
% npm install
% npm run main
> main
> node main.js
Usage> node /private/tmp/node-puppeteer-with-tesseract-tool/main.js "WebURL" "ImageObjectID"
% node main.js
Usage> node /private/tmp/node-puppeteer-with-tesseract-tool/main.js "WebURL" "ImageObjectID"

測試:

% node main.js 'https://xxx/login' 'verifyImgCode'
[INFO] WebURL: "https://xxx/login", The id of the DOM <img>: "verifyImgCode"

  Puppeteer old Headless deprecation warning:
    In the near future `headless: true` will default to the new Headless mode
    for Chrome instead of the old Headless implementation. For more
    information, please see https://developer.chrome.com/articles/new-headless/.
    Consider opting in early by passing `headless: "new"` to `puppeteer.launch()`
    If you encounter any bugs, please report them to https://github.com/puppeteer/puppeteer/issues/new/choose.

on.domcontentloaded
on.framenavigated: about:blank
on.load
...
page.screenshot
browser.close
tesseract.recognize result:  058B47

練精準度:

% tesseract /tmp/verify-code.png stdout -c tessedit_char_whitelist=0123456789

[macOS] 從 Macbook 遠端登入 Windows 筆電並使用 PowerShell 工作環境 @ macOS 13.2.1

由於想善用 Windows 筆電的資源(算力),先來試試看能不能打通 macOS command line 遠端登入進 Windows 11 筆電。查了一下資料,看來真的也有人有這種需求 XD

原理:
  1. Windows 11 安裝 OpenSSH Server
  2. macOS 安裝 PowerShell Core 資源 (非必要)
其中一還滿常見,二就有點怕怕,所幸資源算是微軟提供(?),有興趣可以裝 pkg 檔案,裝完在 macos command line 用 pwsh 指令就切換到 PowerShell 工作環境,目前只需做 (1) 就能完成需求,以下是在 Windows 11 筆電下運行指令,建議在上述微軟官方文件上複製使用,在此純做筆記:

PS C:\Users\user> Get-WindowsCapability -Online | Where-Object Name -like 'OpenSSH*'

Name  : OpenSSH.Client~~~~0.0.1.0
State : Installed

Name  : OpenSSH.Server~~~~0.0.1.0
State : NotPresent

PS C:\Users\user> ssh -V
OpenSSH_for_Windows_8.6p1, LibreSSL 3.4.3

PS C:\Users\user> Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0

Path          :
Online        : True
RestartNeeded : False

PS C:\Users\user> Start-Service sshd
PS C:\Users\user> Set-Service -Name sshd -StartupType 'Automatic'
PS C:\Users\user> if (!(Get-NetFirewallRule -Name "OpenSSH-Server-In-TCP" -ErrorAction SilentlyContinue | Select-Object Name, Enabled)) {
>>     Write-Output "Firewall Rule 'OpenSSH-Server-In-TCP' does not exist, creating it..."
>>     New-NetFirewallRule -Name 'OpenSSH-Server-In-TCP' -DisplayName 'OpenSSH Server (sshd)' -Enabled True -Direction Inbound -Protocol TCP -Action Allow -LocalPort 22
>> } else {
>>     Write-Output "Firewall rule 'OpenSSH-Server-In-TCP' has been created and exists."
>> }
Firewall rule 'OpenSSH-Server-In-TCP' has been created and exists.

PS C:\Users\user> ssh localhost
user@localhost's password:

如此筆電重啟後,也會自動啟動 OpenSSH Server 。而 macOS 要遠端進去一樣把它當成 linux server 即可,靠 ssh 加上帳密遠端登入。

另外,常會使用 ping 來查看機器健康情況,而 Windows 11 默認關閉(也是滿好的資安規劃),在此要人工開啟:

系統 -> 隱私權與安全性 -> Windows 安全性 -> 防火牆與網路保護 -> 進階設定 -> 輸入規則 ->  核心網路診斷 - ICMP 回應要求 -> 啟動


可以自行依照需求開啟全部 ICMP 回應或部分情境。 

最後,莫忘筆電的電源節源設計,預設應該是 5分鐘就會進入休眠,可以把它調整成插電就永不進入休眠,以及要衝刺算力也可以調整電源策略。

2023年8月27日 星期日

我有酒,你有故事嗎?

最近不少事務變動,在公司待的年數也增加不少,在這多頭的年裡,經歷過同事加入與主動離職,這次開始經手組員離職的流程,回顧著被離職同事的工作項目,也得重新安排給其他同事接手。在管理團隊上也體驗完全套:招募成員、成員主動離去與成員被動離去 Orz

想著想著,就像木曜四超玩的畢業典禮:

對於被離職的同事,這樣的歲數上有著許多可選之路,恰恰好被推動去選擇其他擺盪許久的機會,雖然被離開肯定不是好事,但這樣的故事發展卻也不是壞事的。

想想好友們換房換車的繼續行動、出國的出國、皮拉提斯的皮拉提斯,大家還是持續過得很精彩的。

這陣子跟幾位朋友分享彼此近況,同輩的有那種越來越收斂在自身的狀態,實在是有太多不可控的項目,包括工作的變異、親人的分離、退化的健康,漸漸地「關我屁事」可能也真的成了主流?讓自己的心情專注在自身了。

時間依舊是稀缺,當年用第24個夏天來做個足跡紀錄,現在可能要變成“人生還有多少個暑假可用?”了,看在學生時期認識的教授開始退休,還有把刷 leetcode 當作娛樂的,努力譜曲著自己的故事。