顯示具有 windows 標籤的文章。 顯示所有文章
顯示具有 windows 標籤的文章。 顯示所有文章

2026年5月13日 星期三

[Windows] 設置 OpenSSH 預設使用 PowerShell 7 環境 @ Windows 11

最近在處理 AI 自動化工作,開發了一些 claude skills ,發現最後需要在 Windows 11 運行 Claude Code CLI ,發現不同筆電的環境容易有問題,研究一陣子後,就決定統一都用 PowerShell 7 吧,也可以把 Windows 11 內建的 OpenSSH server 的 shell 也更換過去。

需要先理解 Windows 11 內建有 Powershell 5 ,但他不能拿來當 ssh 登入使用。這是預設採用 cmd 環境,改壞無法 ssh 登入 Windows 11 可以用這段還原,這是在 Powershell 運行:

New-ItemProperty `
  -Path "HKLM:\SOFTWARE\OpenSSH" `
  -Name DefaultShell `
  -Value "C:\Windows\System32\cmd.exe" `
  -PropertyType String `
  -Force

Restart-Service sshd

運行完,可用 Get-ItemProperty HKLM:\SOFTWARE\OpenSSH | Select-Object DefaultShell 查看預設的情況。

連續動作:

```
Windows PowerShell
著作權(C) Microsoft Corporation。保留擁有權利。

安裝最新的 PowerShell 以取得新功能和改進功能!https://aka.ms/PSWindows

PS C:\WINDOWS\system32> New-ItemProperty `
>>   -Path "HKLM:\SOFTWARE\OpenSSH" `
>>   -Name DefaultShell `
>>   -Value "C:\Windows\System32\cmd.exe" `
>>   -PropertyType String `
>>   -Force

DefaultShell : C:\Windows\System32\cmd.exe
PSPath       : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE\OpenSSH
PSParentPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE
PSChildName  : OpenSSH
PSDrive      : HKLM
PSProvider   : Microsoft.PowerShell.Core\Registry

PS C:\WINDOWS\system32>
PS C:\WINDOWS\system32> Restart-Service sshd
PS C:\WINDOWS\system32> Get-ItemProperty HKLM:\SOFTWARE\OpenSSH | Select-Object DefaultShell

DefaultShell
------------
C:\Windows\System32\cmd.exe
```

後續安裝完 Powershell 7 且更正確是要安裝 PowerShell 7 MSI 套件,直接在 MS Store 安裝會是另一個:

winget install --id Microsoft.PowerShell --installer-type wix

這時安裝完路徑會顯示在 `C:\Program Files\PowerShell\7\pwsh.exe` ,這版就可以當 ssh shell 來用了:

```
PS C:\WINDOWS\system32> Get-Command pwsh

CommandType     Name                                               Version    Source
-----------     ----                                               -------    ------
Application     pwsh.exe                                           7.6.1.0    C:\Program Files\PowerShell\7\pwsh.exe


PS C:\WINDOWS\system32> New-ItemProperty `
>>   -Path "HKLM:\SOFTWARE\OpenSSH" `
>>   -Name DefaultShell `
>>   -Value "C:\Program Files\PowerShell\7\pwsh.exe" `
>>   -PropertyType String `
>>   -Force

DefaultShell : C:\Program Files\PowerShell\7\pwsh.exe
PSPath       : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE\OpenSSH
PSParentPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE
PSChildName  : OpenSSH
PSDrive      : HKLM
PSProvider   : Microsoft.PowerShell.Core\Registry

PS C:\WINDOWS\system32>
PS C:\WINDOWS\system32> Restart-Service sshd
```

如此遠端到 Windows 11 時,登入後會看到版本資訊:

```
PowerShell 7.6.1
PS C:\Users\user> 
```

2024年11月7日 星期四

Windows 開發筆記 - 將 Windows 11 筆電作業系統重置/還原至乾淨的環境與建立本地帳號密碼登入方式

由於 Windows 筆電常拿來實驗軟體,環境裝得有點亂,把它重置一下,筆記一下流程,哪天應該會用到:

系統 -> 復原 -> 重設此電腦 -> 本機重新安裝 -> 變更設定 -> 是否清除資料 (是) -> 按下重設就開始進行






接著會花一點時間,例如 20-30 分鐘後,筆電重開機,此台筆電就進入顯示 "正在重設這部電腦 10%" ,依筆電規格運算時間不同,在這台大概還要運行 40 分鐘:



手上的筆電,還會問你要不要保留筆電相關 keys ,通常是推薦選 ESC 略過清除:

A configuration change was requested to clear this computer's TPM (Trusted Platform Module).

WARNING: Clearing erases information stored on the TPM.
You will lose all created keys and access to data encrypted by these keys.
Press [F9] to confirm, ESC to reject

The system will restart.

詢問 Claude.ai 提供的資訊:

這個訊息是關於 TPM (Trusted Platform Module,信賴平台模組) 的重要警告。讓我解釋一下:

TPM 是電腦主機板上的一個安全晶片,主要用來:
1. 存儲加密金鑰
2. 保護 Windows Hello 的生物識別資料(如指紋)
3. 保護 BitLocker 硬碟加密的金鑰
4. 確保開機過程的安全性

這個警告在告訴你:
- 系統正在請求清除 TPM 中的資料
- 如果你按下 F9 確認清除,你將會失去:
  - TPM 中儲存的所有加密金鑰
  - 使用這些金鑰加密的資料的存取權限
- 按 ESC 可以取消這個動作

建議:
1. 如果你正在重置電腦並打算重新開始使用,按 F9 沒有問題
2. 如果你的電腦有使用 BitLocker 加密,請確保你已經備份了重要資料
3. 如果你不確定要不要清除,建議先按 ESC,等確認沒有重要資料需要保留後再進行

清除後,系統會重新啟動,而 TPM 會重新初始化以供新的 Windows 安裝使用。

接著,就像筆電剛買回來初次啟動一樣,開始被問要怎樣登入系統。印象中只要一開始設定好連外網路後,由於 Windows 也都在推廣自家帳號跟雲端服務,選個人使用會一直卡在被要求註冊一個帳號或登入一個微軟帳號,這時可以使用 "為公司或學校設定",在這種組織流程中可以像以前 Windows 7 等等,直接創建本機帳號:

為公司或學校設定 -> 登入選項 -> 改為加入網域 -> 輸入






接著進入系統後,大概會繼續做:
  • 系統安全更新 -> 升級到最新
  • 系統 -> 遠端桌面 -> 啟用
  • 系統 -> 電源和電池 
    • -> 電源
      • -> 螢幕與睡眠 -> 插電時,在下列時間後讓裝置進入睡眠狀態:永不
      • -> 電源模式:最佳效能
  • 關閉 筆電關閉就進入休眠
    • Ctrl + R -> 輸入 control panel
      • -> 控制台 -> 硬體與音效 -> 電源選項 -> 選擇蓋上螢幕時的行為
        • 當我關閉筆記電腦螢幕時:一般電源 -> 不進行動做
  • 開始 選單 -> Microsoft Store
    • -> Python 3.12
    • -> Visual Studio Code
    • -> Brave Browser
    • -> Mozilla Firefox
  • 啟用系統內建 OpenSSH Server
    • Ctrl+R -> 輸入 services.msc -> 找尋 OpenSSH 伺服器 
             -> 按 右鍵 選 啟用
             -> 按 右鍵 選 內容 -> 啟動類型 -> 自動
    • 防火牆設定 -> Ctrl+R -> wf.msc -> 輸入規則 -> OpenSSH SSH Server (sshd) 
             -> 進階 -> 設定檔 -> 勾選 網域/私人/公用
  • 啟用 telnet 工具
    • 控制台 -> 程式集 -> 程式和功能 -> 開啟或關閉 Windows 功能 -> Telnet Client
  • 下載 CygWin 安裝更多工具
    • https://www.cygwin.com/install.html
      • 或是用 Windows 11 系統內建的 curl 來下載
        • C:\Users\User\Downloads>curl https://www.cygwin.com/setup-x86_64.exe > setup-x86_64.exe
    • 安裝 curl, wget, vim, git, cmake, clang, autossh 工具
    • 之後透過 command 遠端登入 Windows 筆電時,可以在靠指令切換到 CygWin 的環境:
      • C:\Users\User>C:\cygwin64\Cygwin.bat 

        User@PC ~
        $

        User@PC ~
        $ pwd
        /cygdrive/c/Users/User
  • 使用 winget 指令:learn.microsoft.com/zh-tw/windows/package-manager/winget/
    • 太久沒用 Windows ,沒想到 Microsoft 有推出自家牌 winget 套件管理工具,直接用他安裝工具
    • 安裝完記得要重新登入才會更新工具搜尋環境,但是,有些工具裝完的確找不到,需自行更新 PATH 資訊
    • 範例一:安裝 wget 指令
      • C:\Users\User>wget
      • 'wget' 不是內部或外部命令、可執行的程式或批次檔。
      • C:\Users\User>winget install wget
      • 找到 Wget [JernejSimoncic.Wget] 版本 1.21.4
      • 此應用程式已由其擁有者授權給您。
      • Microsoft 不負任何責任,也不會授與協力廠商封裝的任何授權。
      • 正在下載 https://eternallybored.org/misc/wget/1.21.4/64/wget.exe
      •   ██████████████████████████████  6.71 MB / 6.71 MB
      • 已成功驗證安裝程式雜湊
      • 正在啟動套件安裝...
      • 新增的命令列別名: "wget"
      • 已修改路徑環境變數;重新啟動命令介面以使用新值。
      • 已成功安裝
    • 範例二:安裝 git vim
      • C:\Users\User>winget install git vim
      • 找到多個符合輸入條件的套件。請精煉輸入。
      • 名稱   識別碼        來源
      • ----------------------------
      • My Git 9NLVK2SL2SSP  msstore
      • Git    Git.Git       winget
      • Git    Microsoft.Git winget
      • 找到多個套件: git
      • 找到多個符合輸入條件的套件。請精煉輸入。
      • 名稱            識別碼          來源
      • ---------------------------------------
      • Vim Cheat Sheet 9WZDNCRDMCWR    msstore
      • Vim             vim.vim         winget
      • Vim             vim.vim.nightly winget
      • 找到多個套件: vim
    • 大概就安裝這些工具:
      • C:\Users\User>winget install wget vim.vim Microsoft.Git GnuWin32.Grep CoreyButler.NVMforWindows Docker.DockerDesktop
        • 其中 vim 預設還沒更新到 PATH 環境,需要去找他出來用 "C:\Program Files\Vim\vim91\vim.exe" ,對應的還有 "C:\Program Files (x86)\GnuWin32\bin\grep.exe" 等等
如此,又變成可以遠端進去處理、測試的 Windows 節點了! 像是 Python Windows 的實驗環境就可以用:

C:\Users\User\Downloads>python -m venv venv  
C:\Users\User\Downloads>.\venv\Scripts\activate
C:\Users\User\Downloads>pip install grip 

2024年6月29日 星期六

ThinkPad E15 開機無法偵測到 SSD 排除 - 2101: Detection error on Storage Device0 (M.2 Main Slot)

這台是 ThinkPad E15 2020年版,是疫情期間買給長輩用的平價筆電,在 2024.06 開機讀不到硬碟,由於已經沒有保固,再加上想要送回廠修理的方式,全台只有四個點且週末、假日不營業,實在不太方便,就乾脆自己修吧!


給原廠修的主因是想保有正版 Windows,省去煩惱一些資安問題,而自己處理則是可以加強隱私保護,確保沒人可以存取硬碟內的資訊,像是自己物理破壞掉也行。

研究了一下,據說 Windows 8 以後的筆電,會把 Windows 序號已經綁定在韌體上(BIOS?),因此筆電外殼也不會再貼序號貼紙,就這樣,只需看看能不能取得正版 Windows ISO 即可重新安裝:

首先,先研究一下如何拆筆電後蓋殼子,隨意找一下,發現有個 Youtube 影片教學快速看一下,剛好家裡也有個塑膠墊片就拿來開了!第一次沒經驗也把塑膠墊片弄得變形 XD 整體上需要一點點技巧的,可直接看官網 Support 教學影片:Lenovo Support 拆解與更換影片 > 底蓋拆卸

先買了一個 SSD 外接盒(非必要)想試試看救資料,結果失敗 Orz 看來 SSD 真的一壞了就難靠個人救了,要也得交給專業的來。回過頭來,也買一個特價中 MSI M371 1TB NVMe M.2 SSD 來使用,接著使用微軟官網下載的 ISO 檔,實際測試安裝都是失敗告收 XD 使用 Windows 10 或 11 的 x64 ISO 製成的 USB 安裝碟,永遠卡在要指定驅動程式的步驟:


原先還誤以為 SSD 沒抓到,跑去研究更新 BIOS 等事情,最終回想起 Lenovo USB Recovery Creator 工具,透過 Lenovo USB Recovery Creator 工具可以找到符合自己筆電的還原檔案(總共約11GB)並製作成還原隨身碟,必須找另一台 Windows 環境來運行該程式。整體上花 10分鐘下載資料,製作 USB 開機碟還要花個 20 分鐘。



終於,可以用 USB 還原隨身碟安裝 Windows 10 了:


以上步驟筆記:
經過了上述流程,終於筆電開起來是一個 Windows 10 Home 環境,接著就是一連串的 Windows 更新(數小時),預計最後要升級到 Windows 11 才收工,努力了 Orz 這時記得要先調整電源方案,調整成使用電源供電中不休眠。

當 Windows 10 安全更新至最新後,一直沒法收到 Windows 11 通知,只有一些 Windows 11 的簡介,像是跳轉到微軟官網看。後來透過以下方式可以更主動升級到 Windows 11:

2023年9月20日 星期三

Windows 開發筆記 - 使用 Command Line / CMD / ssh 與 PHP 8.2 / Composer / Git / VIM 開發環境 @ Windows 11

幫同事看了一下 Windows 開發環境,要在此環境使用 PHP8.2 與 PHP Laravel v10 framework,由於之前採用 xampp 管理套件被環境變數卡住。這些問題描述,瞬間拉回到學生時代在那邊設置 Windows %PATH% 環境變數 XD 我也忘了那時在幹嘛?推論是配置 Java 環境吧

目前就把手邊的 Windows 11 筆電拿來遠端,但懶得打開它。並且實際在 command line 測試會碰到幾個問題。

1. 從 https://windows.php.net/download/ 下載 VS16 x64 Non Thread Safe ,並解壓在 C:\php 目錄中,必須在設置 php.ini 。想要知道自己的 php.ini 位置,可以用 php.exe --ini

C:\php>php.exe --ini 
Configuration File (php.ini) Path: 
Loaded Configuration File:         (none)
Scan for additional .ini files in: (none)
Additional .ini files parsed:      (none)

接著把 C:\php\php.ini-development 複製到 C:\php\php.ini 使用:

C:\php>copy php.ini-development php.ini     
複製了         1 個檔案。

後續就編輯 php.ini 開啟一些項目,在此就靠 C:\cygwin64\bin\vim.exe 當編輯器(若碰到滑鼠圈選文字難複製,記得關掉滑鼠模式 :set mouse-=a),主要打開一些 php.ini 註解:

; Directory in which the loadable extensions (modules) reside.
; https://php.net/extension-dir
;extension_dir = "./"
; On windows:
extension_dir = "ext"
; ...
extension=curl
extension=fileinfo
extension=gd
extension=intl
extension=mbstring
extension=exif
extension=mysqli
extension=openssl
extension=sqlite3

C:\php>php.exe --ini 
Configuration File (php.ini) Path: 
Loaded Configuration File:         C:\php\php.ini
Scan for additional .ini files in: (none)
Additional .ini files parsed:      (none)

2. 下載 composer 後,預設會失敗:

C:\php>php.exe composer.phar self-update

In Factory.php line 648:
                                                                                                                          The openssl extension is required for SSL/TLS protection but is not available. If you can not enable the openssl extension, you can   
   disable this error, at your own risk, by setting the 'disable-tls' option to true.                          

self-update [-r|--rollback] [--clean-backups] [--no-progress] [--update-keys] [--stable] [--preview] [--snapshot] [--1] [--2] [--2.2] [--set-channel-only] [--] [<version>]

設置後:

C:\php>php.exe composer.phar self-update 
You are already using the latest available Composer version 2.6.3 (stable channel).

3. 在管理專案時,透過 C:\php\php.exe composer.phar install 時,會需要 GIT 指令,解法就是去官方安裝一下,安裝完的目錄位置在 C:\Program Files\Git 位置

C:\>"C:\Program Files\Git\bin\git.exe" --version
git version 2.42.0.windows.2

4. 回過頭來,更新環境變數 %PATH% 

C:\>git
'git' 不是內部或外部命令、可執行的程式或批次檔。
C:\>echo %PATH%
C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;C:\WINDOWS\System32\OpenSSH\;C:\Program Files\Docker\Docker\resources\bin;C:\WINDOWS\system32\config\systemprofile\AppData\Local\Microsoft\WindowsApps;C:\Users\user\AppData\Local\Microsoft\WindowsApps;
C:\>set PATH=%PATH%;C:\Program Files\Git\bin\
C:\>git --version
git version 2.42.0.windows.2

如此在 Windows 的 command line (PowerShell) 環境下,也可以靠純指令做一點事了

2023年9月7日 星期四

Windows 開發筆記 - 開機自動啟動 SSH Reverse Tunnel / autossh @ Windows 11, cygwin

視窗鍵 + R 輸入 shell:startup

想說要善加利用 Windows 筆電,就想到把它規劃成算力單位後,以及思考如何自動化叫他做事。在資安角度上就可採用 SSH Reverse Tunnel 方案,讓筆電開機啟動後,建立一個連線到指定的機器候命。如此,在 Windows 筆上安裝了一些服務後,就可以用遠端 Port Forwarding 的方式存取到。

首先,要先找到 autossh 這種用法,不然單建立一個 ssh 掛了很麻煩的。雖然有一些 github 的可挑,但整體上要找一個夠信任的來源,最後選擇知名的 cygwin ,就順便安裝 autossh, tmux, vim, wget, lftp, git, zip, unzip 等,如此 autossh.exe 就搞定,位置在 C:\cygwin64\bin\autossh.exe

之前的文章已提到,我在 Windows 11 下已啟用 OpenSSH server 了,那我可以測試把 openssh server 服務建立反向的連線(須留意 cygwin 認定的使用者家目錄跟 Windows PowerShell 的不一樣,需要先建立好 keypair 等資料)

C:\cygwin64\bin\autossh.exe -M 0 -N -R 10022:localhost:22 ServerUser@RemotServer

如此,在指定的機器(RemoteServer)上,就可以測試連線:

$ telnet localhost 10022
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
SSH-2.0-OpenSSH_for_Windows_8.6
^C^C
Connection closed by foreign host.

對於 cygwin 方面,目前採用 Windows 內建的 OpenSSH server 方案,連入後是 Windows Powershell 環境,若想切換到 cygwin ,可以多打一下:

Microsoft Windows [版本 10.0.22621.2215]

(c) Microsoft Corporation. 著作權所有,並保留一切權利。


user@WINDOWS-DESKTOP C:\Users\user>c:\cygwin64\Cygwin.bat


user@windows-desktop ~

$ 


對於 cygwin 用法,正規的安裝軟體還是透過原本的 setup.exe 去擴充,然而,可以去下載 github.com/transcode-open/apt-cyg 來使用,他可以提供一些便利的 command line 安裝套件的方式(但實務上不幸踩過失敗),當作一個備用方式:

user@windows-desktop ~

$ curl -s https://raw.githubusercontent.com/transcode-open/apt-cyg/master/apt-cyg > apt-cyg


user@windows-desktop ~

$ chmod 700 ./apt-cyg 


user@windows-desktop ~

$ ./apt-cyg 

NAME

  apt-cyg - package manager utility


SYNOPSIS

  apt-cyg [operation] [options] [targets]


DESCRIPTION

  apt-cyg is a package management utility that tracks installed packages on a   

  Cygwin system. Invoking apt-cyg involves specifying an operation with any     

  potential options and targets to operate on. A target is usually a package    

  name, file name, URL, or a search string. Targets can be provided as command  

  line arguments.


OPERATIONS

  install

    Install package(s).


  remove

    Remove package(s) from the system.


  update

    Download a fresh copy of the master package list (setup.ini) from the       

    server defined in setup.rc.


  download

    Retrieve package(s) from the server, but do not install/upgrade anything.   


  show

    Display information on given package(s).


  depends

    Produce a dependency tree for a package.


  rdepends

    Produce a tree of packages that depend on the named package.


  list

    Search each locally-installed package for names that match regexp. If no    

    package names are provided in the command line, all installed packages will 

    be queried.


  listall

    This will search each package in the master package list (setup.ini) for    

    names that match regexp.


  category

    Display all packages that are members of a named category.


  listfiles

    List all files owned by a given package. Multiple packages can be specified 

    on the command line.


  search

    Search for downloaded packages that own the specified file(s). The path can 

    be relative or absolute, and one or more files can be specified.


  searchall

    Search cygwin.com to retrieve file information about packages. The provided 

    target is considered to be a filename and searchall will return the

    package(s) which contain this file.


  mirror

    Set the mirror; a full URL to a location where the database, packages, and  

    signatures for this repository can be found. If no URL is provided, display 

    current mirror.


  cache

    Set the package cache directory. If a file is not found in cache directory, 

    it will be downloaded. Unix and Windows forms are accepted, as well as      

    absolute or regular paths. If no directory is provided, display current     

    cache.


OPTIONS

  --nodeps

    Specify this option to skip all dependency checks.


  --version

    Display version and exit.


下一步回歸到正題 - 開機自動執行,則是可以參考微軟官方文件 - 新增的應用程式以在 Windows 10 啟動時自動執行。此例在 Windows 11 上,透過 視窗鍵+R 執行 shell:startup 可快速開啟對應的目錄位置 ( %HOME%\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup ),只需在此目錄添加幾個 bat 檔案,開啟就會幫我運行這指令了,如:

00_ssh-reverse-tunnel_openssh-server.bat

內容:

C:\cygwin64\bin\autossh.exe -M 0 -N -R 10022:localhost:22 ServerUser@RemotServer

開啟後,他會佔一個小視窗。由於那台筆電本身就是閒置的,所以佔著小視窗反而更好觀測 autossh 運作是否正常

收工!

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 切換吧!

其他資訊: