<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Antony 筆記：技術原理與實務經驗 – 學習筆記</title><link>https://blog.kubeantony.com/archive/learning-notes/</link><description>Recent content in 學習筆記 on Antony 筆記：技術原理與實務經驗</description><generator>Hugo -- gohugo.io</generator><language>zh-TW</language><lastBuildDate>Fri, 07 Feb 2025 03:52:38 +0800</lastBuildDate><atom:link href="https://blog.kubeantony.com/archive/learning-notes/index.xml" rel="self" type="application/rss+xml"/><item><title>生成式 AI 課程</title><link>https://blog.kubeantony.com/archive/learning-notes/%E7%94%9F%E6%88%90%E5%BC%8F-ai-%E8%AA%B2%E7%A8%8B/</link><pubDate>Fri, 07 Feb 2025 03:52:38 +0800</pubDate><guid>https://blog.kubeantony.com/archive/learning-notes/%E7%94%9F%E6%88%90%E5%BC%8F-ai-%E8%AA%B2%E7%A8%8B/</guid><description>
&lt;h2&gt;環境準備&lt;span class="hx:absolute hx:-mt-20" id="環境準備"&gt;&lt;/span&gt;
&lt;a href="#%e7%92%b0%e5%a2%83%e6%ba%96%e5%82%99" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;h3&gt;Hardware&lt;span class="hx:absolute hx:-mt-20" id="hardware"&gt;&lt;/span&gt;
&lt;a href="#hardware" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;os: windows server 2025&lt;/li&gt;
&lt;li&gt;cpu: 8 cores&lt;/li&gt;
&lt;li&gt;MEM: 32 G&lt;/li&gt;
&lt;li&gt;disk: 70 G&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;安裝軟體&lt;span class="hx:absolute hx:-mt-20" id="安裝軟體"&gt;&lt;/span&gt;
&lt;a href="#%e5%ae%89%e8%a3%9d%e8%bb%9f%e9%ab%94" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;Python 3.8 以上的版本 (安裝前記得勾加入 PATH)
自行挑選：https://www.python.org/downloads/
特定版本：https://www.python.org/downloads/release/python-3119/&lt;/li&gt;
&lt;li&gt;Cursor 或 Visual Studio Code
Cursor：https://www.cursor.com/ （同時註冊帳號）
&lt;a
href="https://cursor.directory/"target="_blank" rel="noopener"&gt;https://cursor.directory/&lt;/a&gt;
VSCode：https://code.visualstudio.com/download&lt;/li&gt;
&lt;li&gt;Ollama
&lt;a
href="https://ollama.com/download"target="_blank" rel="noopener"&gt;https://ollama.com/download&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Docker
&lt;a
href="https://www.docker.com/"target="_blank" rel="noopener"&gt;https://www.docker.com/&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;以上軟體都安裝好後，&lt;/p&gt;
&lt;p&gt;先打開 powershell 執行以下命令安裝 deepseek-r1:1.5b&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;ollama run deepseek-r1:1.5b&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;執行結果 :&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;pulling manifest
pulling aabd4debf0c8... 100% ▕███████████████████████████████████████████████████████▏ 1.1 GB
pulling 369ca498f347... 100% ▕███████████████████████████████████████████████████████▏ 387 B
pulling 6e4c38e1172f... 100% ▕███████████████████████████████████████████████████████▏ 1.1 KB
pulling f4d24e9138dd... 100% ▕███████████████████████████████████████████████████████▏ 148 B
pulling a85fe2a2e58e... 100% ▕███████████████████████████████████████████████████████▏ 487 B
verifying sha256 digest
writing manifest
success
&amp;gt;&amp;gt;&amp;gt; Send a message (/? for help)&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;在 docker desktop 執行以下指令&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;docker run -d -p 3000:8080 \
--add-host=host.docker.internal:host-gateway \
-v openwebui:/app/backend/data \
--name open-webui \
--restart always \
ghcr.io/open-webui/open-webui:main&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;確認 open-web-ui 運作正常&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;docker ps&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;執行結果 :&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8350f31409b2 ghcr.io/open-webui/open-webui:main &amp;#34;bash start.sh&amp;#34; About a minute ago Up About a minute (health: starting) 0.0.0.0:3000-&amp;gt;8080/tcp open-webui&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;打開瀏覽器，輸入 : &lt;code&gt;http://localhost:3000&lt;/code&gt; 連到 UI&lt;/p&gt;
&lt;p&gt;&lt;img src="https://hackmd.io/_uploads/ByTJYymt1l.png" alt="image" loading="lazy" /&gt;&lt;/p&gt;
&lt;h3&gt;實作 : 利用 PyTorch 建立一個 Word2Vec 詞嵌入模型&lt;span class="hx:absolute hx:-mt-20" id="實作--利用-pytorch-建立一個-word2vec-詞嵌入模型"&gt;&lt;/span&gt;
&lt;a href="#%e5%af%a6%e4%bd%9c--%e5%88%a9%e7%94%a8-pytorch-%e5%bb%ba%e7%ab%8b%e4%b8%80%e5%80%8b-word2vec-%e8%a9%9e%e5%b5%8c%e5%85%a5%e6%a8%a1%e5%9e%8b" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;$ mkdir llm0207&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;打開 cursor 並進入 &lt;code&gt;llm0207&lt;/code&gt; 專案，產生 requirements.txt 檔案 (檔名要一模一樣)&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;pandas
numpy
matplotlib
seaborn
scikit-learn
transformers
torch
torchvision&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;按 Ctrl + s 存檔，再按 Ctrl + shift + p&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;&amp;gt; Python: Create Environment
&amp;gt; 選擇 Venv type
&amp;gt; Use Existing
&amp;gt; 選 requirements.txt 按 ok 就會安裝&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;或是可以直接執行以下指令安裝
&lt;code&gt;pip install -r requirements.txt&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;用指令檢查有沒有安裝成功&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;pip list&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;執行結果 :&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;Package Version
------------------ ------------
backports.tarfile 1.2.0
build 1.2.2.post1
CacheControl 0.14.2
certifi 2025.1.31
charset-normalizer 3.4.1
cleo 2.1.0
colorama 0.4.6
contourpy 1.3.1
crashtest 0.4.1
cycler 0.12.1
distlib 0.3.9
dulwich 0.22.7
fastjsonschema 2.21.1
filelock 3.17.0
fonttools 4.55.8
fsspec 2025.2.0
huggingface-hub 0.28.1
idna 3.10
importlib_metadata 8.6.1
installer 0.7.0
jaraco.classes 3.4.0
jaraco.context 6.0.1
jaraco.functools 4.1.0
Jinja2 3.1.5
joblib 1.4.2
keyring 25.6.0
kiwisolver 1.4.8
MarkupSafe 3.0.2
matplotlib 3.10.0
more-itertools 10.6.0
mpmath 1.3.0
msgpack 1.1.0
networkx 3.4.2
numpy 2.2.2
packaging 24.2
pandas 2.2.3
pillow 11.1.0
pip 25.0
pkginfo 1.12.0
platformdirs 4.3.6
poetry 2.0.1
poetry-core 2.0.1
pyparsing 3.2.1
pyproject_hooks 1.2.0
python-dateutil 2.9.0.post0
pytz 2025.1
pywin32-ctypes 0.2.3
PyYAML 6.0.2
RapidFuzz 3.12.1
regex 2024.11.6
requests 2.32.3
requests-toolbelt 1.0.0
safetensors 0.5.2
scikit-learn 1.6.1
scipy 1.15.1
seaborn 0.13.2
setuptools 65.5.0
shellingham 1.5.4
six 1.17.0
sympy 1.13.1
threadpoolctl 3.5.0
tokenizers 0.21.0
tomlkit 0.13.2
torch 2.6.0
torchvision 0.21.0
tqdm 4.67.1
transformers 4.48.2
trove-classifiers 2025.1.15.22
typing_extensions 4.12.2
tzdata 2025.1
urllib3 2.3.0
virtualenv 20.29.1
zipp 3.21.0&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;產生檔案 : &lt;code&gt;01_word2vec.py&lt;/code&gt;&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;01_word2vec.py
&amp;#34;&amp;#34;&amp;#34;
Word2Vec 實作模組
使用 Skip-gram 模型實作詞向量訓練。
此模組提供基本的詞嵌入訓練功能，並包含相似詞查詢和視覺化功能。
主要功能：
1. 文本預處理
2. Skip-gram 模型訓練
3. 詞向量相似度計算
4. 詞向量視覺化
&amp;#34;&amp;#34;&amp;#34;
# 匯入需要的套件
import torch # PyTorch 深度學習框架
import torch.nn as nn # 神經網路模組
import torch.optim as optim # 優化器模組
import numpy as np # 數值計算套件
from collections import Counter # 用於計算詞頻
import matplotlib.pyplot as plt # 繪圖套件
from sklearn.metrics.pairwise import cosine_similarity # 餘弦相似度計算
from sklearn.decomposition import PCA # 主成分分析
from typing import List, Tuple, Dict # 型別提示
# 設定 matplotlib 中文字型
plt.rcParams[&amp;#39;font.sans-serif&amp;#39;] = [&amp;#39;Microsoft JhengHei&amp;#39;] # 設定Windows預設中文字型
plt.rcParams[&amp;#39;axes.unicode_minus&amp;#39;] = False # 修正負號顯示問題
# 檢查系統可用的中文字型
def check_chinese_fonts():
fonts = [f.name for f in fm.fontManager.ttflist] # 取得所有可用字型
print(&amp;#34;系統可用的中文字型：&amp;#34;)
chinese_fonts = [f for f in fonts if (&amp;#39;Microsoft&amp;#39; in f) or (&amp;#39;微軟&amp;#39; in f) or (&amp;#39;Arial&amp;#39; in f)]
for f in chinese_fonts:
print(f)
# 定義模型訓練的超參數
WINDOW_SIZE: int = 2 # 上下文窗口大小
EMBEDDING_DIM: int = 10 # 詞向量維度
EPOCHS: int = 200 # 訓練回合數
LEARNING_RATE: float = 0.005 # 學習率
class SkipGram(nn.Module):
&amp;#34;&amp;#34;&amp;#34;
Skip-gram 模型類別
用於學習詞向量的神經網路模型，包含一個嵌入層和一個輸出層。
&amp;#34;&amp;#34;&amp;#34;
def __init__(self, vocab_size: int, embedding_dim: int) -&amp;gt; None:
&amp;#34;&amp;#34;&amp;#34;
初始化模型架構
參數:
vocab_size: 詞彙表大小（有多少不同的詞）
embedding_dim: 詞向量的維度
&amp;#34;&amp;#34;&amp;#34;
super(SkipGram, self).__init__()
self.embeddings = nn.Embedding(vocab_size, embedding_dim) # 詞嵌入層
self.output_layer = nn.Linear(embedding_dim, vocab_size) # 全連接輸出層
self.log_softmax = nn.LogSoftmax(dim=-1) # 對數 Softmax 激活函數
def forward(self, target: torch.Tensor) -&amp;gt; torch.Tensor:
&amp;#34;&amp;#34;&amp;#34;
前向傳播函式
參數:
target: 目標詞的索引張量
回傳:
模型預測的機率分布（取對數後）
&amp;#34;&amp;#34;&amp;#34;
embed = self.embeddings(target) # 將輸入轉換為詞向量
output = self.output_layer(embed) # 通過輸出層
return self.log_softmax(output) # 計算對數機率
def preprocess_text(corpus: str) -&amp;gt; Tuple[List[str], Dict[str, int], Dict[int, str]]:
&amp;#34;&amp;#34;&amp;#34;
預處理文本資料
參數:
corpus (str): 原始文本
回傳:
Tuple[List[str], Dict[str, int], Dict[int, str]]:
- 處理後的單詞列表
- 單詞到索引的映射
- 索引到單詞的映射
&amp;#34;&amp;#34;&amp;#34;
words = corpus.lower().replace(&amp;#39;.&amp;#39;, &amp;#39;&amp;#39;).split()
word_counts = Counter(words)
vocab = list(word_counts.keys())
word_to_ix = {word: i for i, word in enumerate(vocab)}
ix_to_word = {i: word for word, i in word_to_ix.items()}
return words, word_to_ix, ix_to_word
def generate_training_pairs(words: List[str], window_size: int) -&amp;gt; List[Tuple[str, str]]:
&amp;#34;&amp;#34;&amp;#34;
生成訓練用的詞對
參數:
words (List[str]): 單詞列表
window_size (int): 上下文窗口大小
回傳:
List[Tuple[str, str]]: 目標詞和上下文詞的配對列表
&amp;#34;&amp;#34;&amp;#34;
pairs = []
for idx, word in enumerate(words):
for neighbor in range(-window_size, window_size &amp;#43; 1):
if neighbor == 0:
continue
neighbor_idx = idx &amp;#43; neighbor
if 0 &amp;lt;= neighbor_idx &amp;lt; len(words):
pairs.append((word, words[neighbor_idx]))
return pairs
def find_similar_words(word: str,
word_embeddings: np.ndarray,
word_to_ix: Dict[str, int],
ix_to_word: Dict[int, str],
top_n: int = 3) -&amp;gt; List[str]:
&amp;#34;&amp;#34;&amp;#34;
尋找與目標詞最相似的詞
參數:
word (str): 目標詞
word_embeddings (np.ndarray): 詞向量矩陣
word_to_ix (Dict[str, int]): 單詞到索引的映射
ix_to_word (Dict[int, str]): 索引到單詞的映射
top_n (int): 要返回的相似詞數量
回傳:
List[str]: 最相似詞的列表
&amp;#34;&amp;#34;&amp;#34;
target_vector = word_embeddings[word_to_ix[word]].reshape(1, -1)
similarities = cosine_similarity(target_vector, word_embeddings)
similar_indices = np.argsort(similarities[0])[::-1][1:top_n&amp;#43;1]
return [ix_to_word[i] for i in similar_indices]
def main():
&amp;#34;&amp;#34;&amp;#34;
主程式執行流程
&amp;#34;&amp;#34;&amp;#34;
# 建立語料文本
corpus = &amp;#34;I am happy because I am learning. I am excited to learn. Happy students are learning quickly.&amp;#34;
# 資料預處理
words, word_to_ix, ix_to_word = preprocess_text(corpus)
pairs = generate_training_pairs(words, WINDOW_SIZE)
training_data = [(word_to_ix[target], word_to_ix[context]) for target, context in pairs]
# 初始化模型
vocab_size = len(word_to_ix)
model = SkipGram(vocab_size, EMBEDDING_DIM)
criterion = nn.NLLLoss()
optimizer = optim.Adam(model.parameters(), lr=LEARNING_RATE)
# 訓練模型
for epoch in range(EPOCHS):
total_loss = 0
for target, context in training_data:
target_tensor = torch.tensor([target], dtype=torch.long)
context_tensor = torch.tensor([context], dtype=torch.long)
optimizer.zero_grad()
output = model(target_tensor)
loss = criterion(output, context_tensor)
loss.backward()
optimizer.step()
total_loss &amp;#43;= loss.item()
if (epoch &amp;#43; 1) % 10 == 0:
print(f&amp;#39;訓練週期 {epoch&amp;#43;1}, 損失值: {total_loss:.4f}&amp;#39;)
# 取得訓練後的詞向量
word_embeddings = model.embeddings.weight.data.numpy()
# 顯示相似詞結果
print(&amp;#34;與 &amp;#39;happy&amp;#39; 最相似的詞:&amp;#34;, find_similar_words(&amp;#34;happy&amp;#34;, word_embeddings, word_to_ix, ix_to_word))
print(&amp;#34;與 &amp;#39;learning&amp;#39; 最相似的詞:&amp;#34;, find_similar_words(&amp;#34;learning&amp;#34;, word_embeddings, word_to_ix, ix_to_word))
# 視覺化詞向量
pca = PCA(n_components=2)
reduced_embeddings = pca.fit_transform(word_embeddings)
plt.figure(figsize=(8, 6))
for i, word in enumerate(word_to_ix.keys()):
x, y = reduced_embeddings[i]
plt.scatter(x, y)
plt.text(x &amp;#43; 0.01, y &amp;#43; 0.01, word, fontsize=12)
plt.xlabel(&amp;#34;PCA 第一維度&amp;#34;)
plt.ylabel(&amp;#34;PCA 第二維度&amp;#34;)
plt.title(&amp;#34;Word2Vec Skip-gram 詞向量視覺化&amp;#34;)
plt.show()
if __name__ == &amp;#34;__main__&amp;#34;:
main()&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;按 Ctrl + s 儲存&lt;/p&gt;
&lt;p&gt;執行程式&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;&amp;amp; c:/Users/bigred/llm0207/.venv/Scripts/python.exe c:/Users/bigred/llm0207/01_word2vec.py&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;執行結果 :&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;訓練週期 10, 損失值: 113.0977
訓練週期 20, 損失值: 101.9441
訓練週期 30, 損失值: 98.7468
訓練週期 40, 損失值: 97.5221
訓練週期 50, 損失值: 96.9120
訓練週期 60, 損失值: 96.5535
訓練週期 70, 損失值: 96.3194
訓練週期 20, 損失值: 101.9441
訓練週期 30, 損失值: 98.7468
訓練週期 40, 損失值: 97.5221
訓練週期 50, 損失值: 96.9120
訓練週期 60, 損失值: 96.5535
訓練週期 70, 損失值: 96.3194
訓練週期 50, 損失值: 96.9120
訓練週期 60, 損失值: 96.5535
訓練週期 70, 損失值: 96.3194
訓練週期 80, 損失值: 96.1548
訓練週期 90, 損失值: 96.0326
訓練週期 100, 損失值: 95.9380
訓練週期 110, 損失值: 95.8620
訓練週期 120, 損失值: 95.7993
訓練週期 130, 損失值: 95.7463
訓練週期 140, 損失值: 95.7004
訓練週期 150, 損失值: 95.6601
訓練週期 160, 損失值: 95.6241
訓練週期 170, 損失值: 95.5915
訓練週期 110, 損失值: 95.8620
訓練週期 120, 損失值: 95.7993
訓練週期 130, 損失值: 95.7463
訓練週期 140, 損失值: 95.7004
訓練週期 150, 損失值: 95.6601
訓練週期 160, 損失值: 95.6241
訓練週期 170, 損失值: 95.5915
訓練週期 160, 損失值: 95.6241
訓練週期 170, 損失值: 95.5915
訓練週期 180, 損失值: 95.5618
訓練週期 190, 損失值: 95.5345
訓練週期 200, 損失值: 95.5090
與 &amp;#39;happy&amp;#39; 最相似的詞: [&amp;#39;learning&amp;#39;, &amp;#39;excited&amp;#39;, &amp;#39;to&amp;#39;]
與 &amp;#39;learning&amp;#39; 最相似的詞: [&amp;#39;happy&amp;#39;, &amp;#39;because&amp;#39;, &amp;#39;excited&amp;#39;]&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;然後會 show 出一張圖&lt;/p&gt;
&lt;p&gt;&lt;img src="https://hackmd.io/_uploads/rJURcxQYJe.png" alt="image" loading="lazy" /&gt;&lt;/p&gt;
&lt;h3&gt;範例 2&lt;span class="hx:absolute hx:-mt-20" id="範例-2"&gt;&lt;/span&gt;
&lt;a href="#%e7%af%84%e4%be%8b-2" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;&amp;amp; c:/Users/bigred/llm0207/.venv/Scripts/python.exe c:/Users/bigred/llm0207/02_stochastic_gradient_descent.py&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;執行結果&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;訓練週期 10/100, 損失值: 0.1400
訓練週期 20/100, 損失值: 0.0093
訓練週期 30/100, 損失值: 0.0078
訓練週期 40/100, 損失值: 0.0078
訓練週期 50/100, 損失值: 0.0078
訓練週期 60/100, 損失值: 0.0078
訓練週期 70/100, 損失值: 0.0078
訓練週期 80/100, 損失值: 0.0078
訓練週期 90/100, 損失值: 0.0078
訓練週期 100/100, 損失值: 0.0078
訓練完成！最終模型參數：
參數 linear.weight: 3.0012
參數 linear.bias: 2.0036&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3&gt;範例 3&lt;span class="hx:absolute hx:-mt-20" id="範例-3"&gt;&lt;/span&gt;
&lt;a href="#%e7%af%84%e4%be%8b-3" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;&amp;amp; c:/Users/bigred/llm0207/.venv/Scripts/python.exe c:/Users/bigred/llm0207/03_vanishing_gradient_problem.py&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;執行結果&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;練週期 10/100, 損失值: 0.6906, 第一層梯度: 0.000054
訓練週期 20/100, 損失值: 0.6904, 第一層梯度: 0.000054
訓練週期 30/100, 損失值: 0.6902, 第一層梯度: 0.000055
訓練週期 40/100, 損失值: 0.6899, 第一層梯度: 0.000056
訓練週期 50/100, 損失值: 0.6897, 第一層梯度: 0.000057
訓練週期 60/100, 損失值: 0.6894, 第一層梯度: 0.000058
訓練週期 70/100, 損失值: 0.6892, 第一層梯度: 0.000059
訓練週期 80/100, 損失值: 0.6889, 第一層梯度: 0.000061
訓練週期 90/100, 損失值: 0.6887, 第一層梯度: 0.000062
訓練週期 100/100, 損失值: 0.6884, 第一層梯度: 0.000064
訓練完成！
觀察結果：由於使用 Sigmoid 激活函數，
深層網路中的梯度在反向傳播過程中逐漸消失，
這會導致較早層的權重更新緩慢，影響模型的學習效果。&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3&gt;範例 4&lt;span class="hx:absolute hx:-mt-20" id="範例-4"&gt;&lt;/span&gt;
&lt;a href="#%e7%af%84%e4%be%8b-4" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;&amp;amp; c:/Users/bigred/llm0207/.venv/Scripts/python.exe c:/Users/bigred/llm0207/04_vanishing_gradient_problem_fixed.py&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;執行結果&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;訓練週期 10/100, 損失值: 0.0300, 第一層梯度: 0.002530
訓練週期 20/100, 損失值: 0.0108, 第一層梯度: 0.002441
訓練週期 30/100, 損失值: 0.0057, 第一層梯度: 0.002390
訓練週期 40/100, 損失值: 0.0026, 第一層梯度: 0.000645
訓練週期 50/100, 損失值: 0.0015, 第一層梯度: 0.000145
訓練週期 60/100, 損失值: 0.0010, 第一層梯度: 0.000119
訓練週期 70/100, 損失值: 0.0007, 第一層梯度: 0.000088
訓練週期 80/100, 損失值: 0.0005, 第一層梯度: 0.000051
訓練週期 90/100, 損失值: 0.0004, 第一層梯度: 0.000034
訓練週期 100/100, 損失值: 0.0003, 第一層梯度: 0.000029
測試結果：
輸入: [[ 0.5 0.5]
[-0.5 -0.5]]
預測: [[9.9999988e-01]
[1.6248593e-07]]
改進總結：
1. ReLU 激活函數避免了梯度消失
2. 批次正規化幫助穩定訓練過程
3. Xavier 初始化提供了更好的起始權重
4. Adam 優化器提供了自適應學習率&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3&gt;範例 5&lt;span class="hx:absolute hx:-mt-20" id="範例-5"&gt;&lt;/span&gt;
&lt;a href="#%e7%af%84%e4%be%8b-5" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;&amp;amp; c:/Users/bigred/llm0207/.venv/Scripts/python.exe c:/Users/bigred/llm0207/05_lstm.py&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;執行結果&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;開始序列處理，顯示各時間步的計算結果：
=== 時間步 1 ===
輸入 x: [[-1.266819 -0.23635459 -1.2682884 1.1461157 ]]
遺忘門 (Forget gate) f_t:
[[0.6572256 0.36749864 0.42991826]]
輸入門 (Input gate) i_t:
[[0.59915054 0.5485195 0.48892254]]
候選記憶單元 (Candidate cell) c_candidate:
[[-0.240163 -0.3913692 -0.25401673]]
更新後的記憶單元 (Memory cell) c:
[[-0.1438938 -0.21467364 -0.1241945 ]]
輸出門 (Output gate) o_t:
[[0.5153311 0.620698 0.5811946]]
更新後的隱藏狀態 (Hidden state) h:
[[-0.07364536 -0.13123764 -0.07181233]]
-------------------------------
=== 時間步 2 ===
輸入 x: [[-1.5957438 0.4445498 -0.543539 -1.4150689]]
遺忘門 (Forget gate) f_t:
[[0.41003838 0.46972215 0.5150182 ]]
輸入門 (Input gate) i_t:
[[0.64580995 0.36331752 0.47042245]]
候選記憶單元 (Candidate cell) c_candidate:
[[-0.5844555 0.17626989 -0.62574565]]
更新後的記憶單元 (Memory cell) c:
[[-0.43644914 -0.03679502 -0.35832724]]
輸出門 (Output gate) o_t:
[[0.47196326 0.3124301 0.48176473]]
更新後的隱藏狀態 (Hidden state) h:
[[-0.19383381 -0.01149069 -0.1656017 ]]
-------------------------------
=== 時間步 3 ===
輸入 x: [[ 0.05293205 -0.77091706 -0.7147509 0.17642277]]
遺忘門 (Forget gate) f_t:
[[0.57225716 0.4478708 0.4592267 ]]
輸入門 (Input gate) i_t:
[[0.5396667 0.5573089 0.4244663]]
候選記憶單元 (Candidate cell) c_candidate:
[[-0.43210194 -0.06478254 -0.06248397]]
更新後的記憶單元 (Memory cell) c:
[[-0.48295218 -0.0525833 -0.19107577]]
輸出門 (Output gate) o_t:
[[0.4559599 0.6255029 0.47814628]]
更新後的隱藏狀態 (Hidden state) h:
[[-0.2045458 -0.03286073 -0.0902663 ]]
-------------------------------
=== 時間步 4 ===
輸入 x: [[-0.1387624 -0.6167944 1.6499552 -1.0031953]]
遺忘門 (Forget gate) f_t:
[[0.50970256 0.6360289 0.41048098]]
輸入門 (Input gate) i_t:
[[0.62627995 0.5196672 0.30097124]]
候選記憶單元 (Candidate cell) c_candidate:
[[-0.13491811 -0.45510677 -0.3899505 ]]
更新後的記憶單元 (Memory cell) c:
[[-0.33065847 -0.26994857 -0.19579686]]
輸出門 (Output gate) o_t:
[[0.45622295 0.3666553 0.6378727 ]]
更新後的隱藏狀態 (Hidden state) h:
[[-0.14558636 -0.0966419 -0.12332159]]
-------------------------------
=== 時間步 5 ===
輸入 x: [[ 0.26633266 -0.82728124 -0.04644813 -0.32036436]]
遺忘門 (Forget gate) f_t:
[[0.54177433 0.52325344 0.4516588 ]]
輸入門 (Input gate) i_t:
[[0.5455653 0.55652875 0.38952616]]
候選記憶單元 (Candidate cell) c_candidate:
[[-0.36856094 -0.08281524 -0.14614902]]
更新後的記憶單元 (Memory cell) c:
[[-0.38021633 -0.18734059 -0.14536224]]
輸出門 (Output gate) o_t:
[[0.43234622 0.56785136 0.50058883]]
更新後的隱藏狀態 (Hidden state) h:
[[-0.15689641 -0.1051543 -0.07225849]]
-------------------------------
LSTM 運作機制說明：
1. 遺忘門決定要遺忘多少舊的記憶
2. 輸入門決定要記住多少新的資訊
3. 候選記憶單元產生新的資訊
4. 記憶單元結合舊記憶和新資訊
5. 輸出門控制要輸出的資訊量&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3&gt;範例 6&lt;span class="hx:absolute hx:-mt-20" id="範例-6"&gt;&lt;/span&gt;
&lt;a href="#%e7%af%84%e4%be%8b-6" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;&amp;amp; c:/Users/bigred/llm0207/.venv/Scripts/python.exe c:/Users/bigred/llm0207/06_tensor_explain.py&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;執行結果&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;PyTorch 張量維度展示：
純量張量 : 42
形狀 : torch.Size([])
維度數 : 0
資料型態 : torch.int64
--------------------------------------------------
向量張量 : [1 2 3 4 5]
形狀 : torch.Size([5])
維度數 : 1
資料型態 : torch.int64
--------------------------------------------------
矩陣張量 : [[1 2 3]
[4 5 6]
[7 8 9]]
形狀 : torch.Size([3, 3])
維度數 : 2
資料型態 : torch.int64
--------------------------------------------------
三維張量 : [[[ 1 2 3]
[ 4 5 6]
[ 7 8 9]]
[[10 11 12]
[13 14 15]
[16 17 18]]]
形狀 : torch.Size([2, 3, 3])
維度數 : 3
資料型態 : torch.int64
--------------------------------------------------
四維張量 : [[[[ 1 2]
[ 3 4]]
[[ 5 6]
[ 7 8]]]
[[[ 9 10]
[11 12]]
[[13 14]
[15 16]]]]
形狀 : torch.Size([2, 2, 2, 2])
維度數 : 4
資料型態 : torch.int64
--------------------------------------------------
張量維度的實際應用說明：
0D 張量（純量）：
- 單一數值，如損失函數的輸出值
- 準確率計算的結果
1D 張量（向量）：
- 一維特徵向量
- 單字的詞嵌入表示
2D 張量（矩陣）：
- 批次的特徵向量
- 灰階圖片
- 全連接層的權重矩陣
3D 張量：
- RGB 彩色圖片 (高度 × 寬度 × 色彩通道)
- 時間序列資料 (序列長度 × 批次大小 × 特徵維度)
4D 張量：
- 影像批次 (批次大小 × 高度 × 寬度 × 色彩通道)
- 影片資料 (幀數 × 高度 × 寬度 × 色彩通道)
注意事項：
1. 張量的維度數決定了它可以表示的資料複雜度
2. 在深度學習中，正確理解張量維度對於模型設計至關重要
3. PyTorch 支援自動微分，使得張量運算更加方便&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3&gt;範例 7 : 實作 LSTM 模型來處理給定的文本&lt;span class="hx:absolute hx:-mt-20" id="範例-7--實作-lstm-模型來處理給定的文本"&gt;&lt;/span&gt;
&lt;a href="#%e7%af%84%e4%be%8b-7--%e5%af%a6%e4%bd%9c-lstm-%e6%a8%a1%e5%9e%8b%e4%be%86%e8%99%95%e7%90%86%e7%b5%a6%e5%ae%9a%e7%9a%84%e6%96%87%e6%9c%ac" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;&amp;amp; c:/Users/bigred/llm0207/.venv/Scripts/python.exe c:/Users/bigred/llm0207/07_lstm_generate.py&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;執行結果&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;開始訓練模型...
訓練週期 10/100, 損失值: 2.8676
訓練週期 20/100, 損失值: 2.8103
訓練週期 30/100, 損失值: 2.7176
訓練週期 40/100, 損失值: 2.0817
訓練週期 50/100, 損失值: 1.1766
訓練週期 60/100, 損失值: 0.5819
訓練週期 70/100, 損失值: 0.2223
訓練週期 80/100, 損失值: 0.1094
訓練週期 90/100, 損失值: 0.0700
訓練週期 100/100, 損失值: 0.0548
使用種子文本 &amp;#39;Hello&amp;#39; 生成的文本：
Hello, this is a sample text for LSTM text for LSTM text for LSTM text for LSTM text for LSTM text for LS&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3&gt;範例 7&lt;span class="hx:absolute hx:-mt-20" id="範例-7"&gt;&lt;/span&gt;
&lt;a href="#%e7%af%84%e4%be%8b-7" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;&amp;amp; c:/Users/bigred/llm0207/.venv/Scripts/python.exe c:/Users/bigred/llm0207/04_vanishing_gradient_problem_fixed.py&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;執行結果&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;訓練週期 10/100, 損失值: 0.0300, 第一層梯度: 0.002530
訓練週期 20/100, 損失值: 0.0108, 第一層梯度: 0.002441
訓練週期 30/100, 損失值: 0.0057, 第一層梯度: 0.002390
訓練週期 40/100, 損失值: 0.0026, 第一層梯度: 0.000645
訓練週期 50/100, 損失值: 0.0015, 第一層梯度: 0.000145
訓練週期 60/100, 損失值: 0.0010, 第一層梯度: 0.000119
訓練週期 70/100, 損失值: 0.0007, 第一層梯度: 0.000088
訓練週期 80/100, 損失值: 0.0005, 第一層梯度: 0.000051
訓練週期 90/100, 損失值: 0.0004, 第一層梯度: 0.000034
訓練週期 100/100, 損失值: 0.0003, 第一層梯度: 0.000029
測試結果：
輸入: [[ 0.5 0.5]
[-0.5 -0.5]]
預測: [[9.9999988e-01]
[1.6248593e-07]]
改進總結：
1. ReLU 激活函數避免了梯度消失
2. 批次正規化幫助穩定訓練過程
3. Xavier 初始化提供了更好的起始權重
4. Adam 優化器提供了自適應學習率&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3&gt;範例 8&lt;span class="hx:absolute hx:-mt-20" id="範例-8"&gt;&lt;/span&gt;
&lt;a href="#%e7%af%84%e4%be%8b-8" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;&amp;amp; c:/Users/bigred/llm0207/.venv/Scripts/python.exe c:/Users/bigred/llm0207/04_vanishing_gradient_problem_fixed.py&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;執行結果&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;訓練週期 10/100, 損失值: 0.0300, 第一層梯度: 0.002530
訓練週期 20/100, 損失值: 0.0108, 第一層梯度: 0.002441
訓練週期 30/100, 損失值: 0.0057, 第一層梯度: 0.002390
訓練週期 40/100, 損失值: 0.0026, 第一層梯度: 0.000645
訓練週期 50/100, 損失值: 0.0015, 第一層梯度: 0.000145
訓練週期 60/100, 損失值: 0.0010, 第一層梯度: 0.000119
訓練週期 70/100, 損失值: 0.0007, 第一層梯度: 0.000088
訓練週期 80/100, 損失值: 0.0005, 第一層梯度: 0.000051
訓練週期 90/100, 損失值: 0.0004, 第一層梯度: 0.000034
訓練週期 100/100, 損失值: 0.0003, 第一層梯度: 0.000029
測試結果：
輸入: [[ 0.5 0.5]
[-0.5 -0.5]]
預測: [[9.9999988e-01]
[1.6248593e-07]]
改進總結：
1. ReLU 激活函數避免了梯度消失
2. 批次正規化幫助穩定訓練過程
3. Xavier 初始化提供了更好的起始權重
4. Adam 優化器提供了自適應學習率&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3&gt;範例 9&lt;span class="hx:absolute hx:-mt-20" id="範例-9"&gt;&lt;/span&gt;
&lt;a href="#%e7%af%84%e4%be%8b-9" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;&amp;amp; c:/Users/bigred/llm0207/.venv/Scripts/python.exe c:/Users/bigred/llm0207/04_vanishing_gradient_problem_fixed.py&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;執行結果&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;訓練週期 10/100, 損失值: 0.0300, 第一層梯度: 0.002530
訓練週期 20/100, 損失值: 0.0108, 第一層梯度: 0.002441
訓練週期 30/100, 損失值: 0.0057, 第一層梯度: 0.002390
訓練週期 40/100, 損失值: 0.0026, 第一層梯度: 0.000645
訓練週期 50/100, 損失值: 0.0015, 第一層梯度: 0.000145
訓練週期 60/100, 損失值: 0.0010, 第一層梯度: 0.000119
訓練週期 70/100, 損失值: 0.0007, 第一層梯度: 0.000088
訓練週期 80/100, 損失值: 0.0005, 第一層梯度: 0.000051
訓練週期 90/100, 損失值: 0.0004, 第一層梯度: 0.000034
訓練週期 100/100, 損失值: 0.0003, 第一層梯度: 0.000029
測試結果：
輸入: [[ 0.5 0.5]
[-0.5 -0.5]]
預測: [[9.9999988e-01]
[1.6248593e-07]]
改進總結：
1. ReLU 激活函數避免了梯度消失
2. 批次正規化幫助穩定訓練過程
3. Xavier 初始化提供了更好的起始權重
4. Adam 優化器提供了自適應學習率&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3&gt;範例 10&lt;span class="hx:absolute hx:-mt-20" id="範例-10"&gt;&lt;/span&gt;
&lt;a href="#%e7%af%84%e4%be%8b-10" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;&amp;amp; c:/Users/bigred/llm0207/.venv/Scripts/python.exe c:/Users/bigred/llm0207/04_vanishing_gradient_problem_fixed.py&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;執行結果&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;訓練週期 10/100, 損失值: 0.0300, 第一層梯度: 0.002530
訓練週期 20/100, 損失值: 0.0108, 第一層梯度: 0.002441
訓練週期 30/100, 損失值: 0.0057, 第一層梯度: 0.002390
訓練週期 40/100, 損失值: 0.0026, 第一層梯度: 0.000645
訓練週期 50/100, 損失值: 0.0015, 第一層梯度: 0.000145
訓練週期 60/100, 損失值: 0.0010, 第一層梯度: 0.000119
訓練週期 70/100, 損失值: 0.0007, 第一層梯度: 0.000088
訓練週期 80/100, 損失值: 0.0005, 第一層梯度: 0.000051
訓練週期 90/100, 損失值: 0.0004, 第一層梯度: 0.000034
訓練週期 100/100, 損失值: 0.0003, 第一層梯度: 0.000029
測試結果：
輸入: [[ 0.5 0.5]
[-0.5 -0.5]]
預測: [[9.9999988e-01]
[1.6248593e-07]]
改進總結：
1. ReLU 激活函數避免了梯度消失
2. 批次正規化幫助穩定訓練過程
3. Xavier 初始化提供了更好的起始權重
4. Adam 優化器提供了自適應學習率&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;</description></item><item><title>Build HA K8S - 3M</title><link>https://blog.kubeantony.com/archive/learning-notes/build-ha-k8s-3m/</link><pubDate>Mon, 06 Feb 2023 13:07:58 +0800</pubDate><guid>https://blog.kubeantony.com/archive/learning-notes/build-ha-k8s-3m/</guid><description>
&lt;h2&gt;1. 安裝 kubectl , kubeadm , kubelet&lt;span class="hx:absolute hx:-mt-20" id="1-安裝-kubectl--kubeadm--kubelet"&gt;&lt;/span&gt;
&lt;a href="#1-%e5%ae%89%e8%a3%9d-kubectl--kubeadm--kubelet" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;安裝 Kubernetes 要用的一些管理命令&lt;/strong&gt;&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;$ sudo apk update; sudo apk add kubeadm kubelet kubectl --update-cache --repository http://dl-3.alpinelinux.org/alpine/edge/testing/ --allow-untrusted
$ ssh m2 &amp;#39;sudo apk update; sudo apk add kubeadm kubelet kubectl --update-cache --repository http://dl-3.alpinelinux.org/alpine/edge/testing/ --allow-untrusted&amp;#39;
$ ssh m3 &amp;#39;sudo apk update; sudo apk add kubeadm kubelet kubectl --update-cache --repository http://dl-3.alpinelinux.org/alpine/edge/testing/ --allow-untrusted&amp;#39;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;將 m1, m2, m3 的 kubelet 設定為系統自動啟動&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;$ sudo rc-update add kubelet default; ssh m2 &amp;#39;sudo rc-update add kubelet default&amp;#39;; ssh m3 &amp;#39;sudo rc-update add kubelet default&amp;#39;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;檢查有沒有安裝
$ sudo rc-service kubelet status
*status: stopped (k8s還沒起來)&lt;/p&gt;
&lt;p&gt;&lt;code&gt;$ ssh m2 'sudo rc-service kubelet status';ssh m3 'sudo rc-service kubelet status'&lt;/code&gt;&lt;/p&gt;
&lt;h2&gt;2. kube-vip (set up m1 node)&lt;span class="hx:absolute hx:-mt-20" id="2-kube-vip-set-up-m1-node"&gt;&lt;/span&gt;
&lt;a href="#2-kube-vip-set-up-m1-node" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;開機一定會自動產生的 pod&lt;/li&gt;
&lt;li&gt;static pods 的 yaml 檔案一定會放在　/etc/kubenetes/manifests&lt;/li&gt;
&lt;li&gt;一定會在 node 上面 run&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;# Set configuration details
#IP 要改成叢集外的新 IP
$ export VIP=120.96.143.xxx (新的IP， 不是 cluster 的 IP)
($ export INTERFACE=eth0 這行可以不用做因為 環境變數 $env 有宣告 GWIF=eth0)
# Configure to use a container runtime
# 取得版本代號
$ export KVVERSION=$(curl -sL https://api.github.com/repos/kube-vip/kube-vip/releases | jq -r &amp;#34;.[0].name&amp;#34;)
#檢查
$ echo $KVVERSION
v0.5.7
# podman
$ alias kube-vip=&amp;#34;sudo podman run --network host --rm ghcr.io/kube-vip/kube-vip:$KVVERSION&amp;#34;
* image=ghcr.io/kube-vip/kube-vip:$KVVERSION
# ARP
# This configuration will create a manifest that starts kube-vip providing controlplane and services management, using leaderElection. When this instance is elected as the leader it will bind the vip to the specified interface, this is also the same for services of type:LoadBalancer.
# 手動建立 static pods 的目錄
$ sudo mkdir -p /etc/kubernetes/manifests/
$ kube-vip manifest pod \
--interface $GWIF \
--vip $VIP \
--controlplane \
--arp \
--leaderElection | sudo tee /etc/kubernetes/manifests/kube-vip.yaml&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;code&gt;--vip&lt;/code&gt; : vip 是 kube vip 使用的
這些指令都會在 container 裡面執行 ,也就是把 kube-vip 做出來 ,且放到 static pods 的目錄區 ,讓他自動啟動
使用內建的環境變數 GWIF 代表 eth0 -&amp;gt; 也代表 ip 位置 .
把 yaml 放到 m1 的 static 目錄區&lt;/p&gt;
&lt;h2&gt;3. 建立 k8s 系統&lt;span class="hx:absolute hx:-mt-20" id="3-建立-k8s-系統"&gt;&lt;/span&gt;
&lt;a href="#3-%e5%bb%ba%e7%ab%8b-k8s-%e7%b3%bb%e7%b5%b1" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;h3&gt;命令式&lt;span class="hx:absolute hx:-mt-20" id="命令式"&gt;&lt;/span&gt;
&lt;a href="#%e5%91%bd%e4%bb%a4%e5%bc%8f" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;將整個 Clusert 重開，後初始化 K8S&lt;/strong&gt;&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;$ sudo kubeadm init --service-cidr 10.98.0.0/24 --pod-network-cidr 10.244.0.0/16 --service-dns-domain=k8s.org --apiserver-advertise-address $IP --control-plane-endpoint &amp;#34;120.96.143.xxx:6443&amp;#34; --upload-certs&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;--control-plane-endpoint &amp;quot;LOAD_BALANCER_DNS:LOAD_BALANCER_PORT&amp;quot;&lt;/code&gt;：代入的DNS及PORT為 kube-apiserver的域名，port預設使用 6443。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--upload-certs&lt;/code&gt;：自動將 control plane 會用到的 certificates 儲存到名為 kubeadm-certs 的 secret 中。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;設定檔方式&lt;span class="hx:absolute hx:-mt-20" id="設定檔方式"&gt;&lt;/span&gt;
&lt;a href="#%e8%a8%ad%e5%ae%9a%e6%aa%94%e6%96%b9%e5%bc%8f" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;編輯 &lt;code&gt;init-config.yaml&lt;/code&gt;&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;$ nano &amp;#34;${HOME}&amp;#34;/init-config.yaml&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;檔案內容 :&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;apiVersion: kubeadm.k8s.io/v1beta3
kind: InitConfiguration
localAPIEndpoint:
advertiseAddress: 120.96.143.61 # change from Master node IP
bindPort: 6443
nodeRegistration:
criSocket: unix:///run/crio/crio.sock # change from CRI-O Unix Socket
imagePullPolicy: IfNotPresent
name: k2m1 # change from Master node hsotname
taints: []
---
apiServer:
timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta3
certificatesDir: /etc/kubernetes/pki
clusterName: topgun # set your clusterName
controllerManager: {}
dns: {}
etcd:
local:
dataDir: /var/lib/etcd
imageRepository: registry.k8s.io
kind: ClusterConfiguration
kubernetesVersion: 1.26.1
networking:
dnsDomain: k8s.org # DNS domain used by Kubernetes Services.
podSubnet: 10.244.0.0/16 # the subnet used by Pods.
serviceSubnet: 10.98.0.0/24 # subnet used by Kubernetes Services.
scheduler: {}
controlPlaneEndpoint: 120.96.143.60:6443&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;初始化 K8S 命令&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;sudo kubeadm init --upload-certs --config=&amp;#34;${HOME}&amp;#34;/init-config.yaml&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2&gt;4. 將 bigred 設成 K8S 管理者&lt;span class="hx:absolute hx:-mt-20" id="4-將-bigred-設成-k8s-管理者"&gt;&lt;/span&gt;
&lt;a href="#4-%e5%b0%87-bigred-%e8%a8%ad%e6%88%90-k8s-%e7%ae%a1%e7%90%86%e8%80%85" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;$ mkdir -p $HOME/.kube; sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config; sudo chown $(id -u):$(id -g) $HOME/.kube/config&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2&gt;5. 設定 K8S Master 可以執行 Pod&lt;span class="hx:absolute hx:-mt-20" id="5-設定-k8s-master-可以執行-pod"&gt;&lt;/span&gt;
&lt;a href="#5-%e8%a8%ad%e5%ae%9a-k8s-master-%e5%8f%af%e4%bb%a5%e5%9f%b7%e8%a1%8c-pod" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;$ kubectl taint node m1 node-role.kubernetes.io/control-plane:NoSchedule-
&lt;code&gt;node/m1 untainted&lt;/code&gt;&lt;/p&gt;
&lt;h2&gt;6. 安裝 Flannel 網路套件&lt;span class="hx:absolute hx:-mt-20" id="6-安裝-flannel-網路套件"&gt;&lt;/span&gt;
&lt;a href="#6-%e5%ae%89%e8%a3%9d-flannel-%e7%b6%b2%e8%b7%af%e5%a5%97%e4%bb%b6" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;$ kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2&gt;7. join m2 and m3 control-plane node&lt;span class="hx:absolute hx:-mt-20" id="7-join-m2-and-m3-control-plane-node"&gt;&lt;/span&gt;
&lt;a href="#7-join-m2-and-m3-control-plane-node" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;$ ssh m2 &amp;#39;sudo kubeadm join 120.96.143.xxx:6443 --token 9t3pt8.j1smywokfw7qg5ez \
--discovery-token-ca-cert-hash sha256:606851b5dca00e0a375da14ba35bb2c91dbef7ce013757d4422fc25620ee9791 \
--control-plane --certificate-key 4a8d586ecb8706b01ec05547835587d5c7ffca2d18ccde8a824559f22b8e8432&amp;#39;
# ssh 到 m2 將 bigred 設成 K8S 管理者
$ ssh m2 &amp;#39;mkdir -p $HOME/.kube; sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config; sudo chown $(id -u):$(id -g) $HOME/.kube/config&amp;#39;
$ ssh m3 &amp;#39;sudo kubeadm join 120.96.143.xxx:6443 --token 9t3pt8.j1smywokfw7qg5ez \
--discovery-token-ca-cert-hash sha256:606851b5dca00e0a375da14ba35bb2c91dbef7ce013757d4422fc25620ee9791 \
--control-plane --certificate-key 4a8d586ecb8706b01ec05547835587d5c7ffca2d18ccde8a824559f22b8e8432&amp;#39;
# ssh 到 m3 將 bigred 設成 K8S 管理者
$ ssh m3 &amp;#39;mkdir -p $HOME/.kube; sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config; sudo chown $(id -u):$(id -g) $HOME/.kube/config&amp;#39;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3&gt;create control-plane install command&lt;span class="hx:absolute hx:-mt-20" id="create-control-plane-install-command"&gt;&lt;/span&gt;
&lt;a href="#create-control-plane-install-command" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;$ certs=$(sudo kubeadm init phase upload-certs --upload-certs | tail -n 1)
$ echo -e &amp;#34;\nPlease run this command to join master node:\n\n\
sudo $(sudo kubeadm token create --print-join-command) --control-plane --certificate-key ${certs}&amp;#34;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;注意 ! 這行命令只能在有 kubeVIP 的那台 master node 執行 !&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;8. set up m2 node&lt;span class="hx:absolute hx:-mt-20" id="8-set-up-m2-node"&gt;&lt;/span&gt;
&lt;a href="#8-set-up-m2-node" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;# Set configuration details
$ export VIP=120.96.143.xxx (新的IP， 不是 cluster 的 IP)
# Configure to use a container runtime
$ export KVVERSION=$(curl -sL https://api.github.com/repos/kube-vip/kube-vip/releases | jq -r &amp;#34;.[0].name&amp;#34;)
$ echo $KVVERSION
v0.5.7
# podman
$ alias kube-vip=&amp;#34;sudo podman run --network host --rm ghcr.io/kube-vip/kube-vip:$KVVERSION&amp;#34;
# ARP
# This configuration will create a manifest that starts kube-vip providing controlplane and services management, using leaderElection. When this instance is elected as the leader it will bind the vip to the specified interface, this is also the same for services of type:LoadBalancer.
$ kube-vip manifest pod \
--interface $GWIF \
--vip $VIP \
--controlplane \
--arp \
--leaderElection | sudo tee /etc/kubernetes/manifests/kube-vip.yaml&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;設定 K8S Master 可以執行 Pod&lt;/strong&gt;
$ kubectl taint node m2 node-role.kubernetes.io/control-plane:NoSchedule-
&lt;code&gt;node/m1 untainted&lt;/code&gt;&lt;/p&gt;
&lt;h2&gt;9. set up m3 node&lt;span class="hx:absolute hx:-mt-20" id="9-set-up-m3-node"&gt;&lt;/span&gt;
&lt;a href="#9-set-up-m3-node" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;# Set configuration details
$ export VIP=120.96.143.xxx (新的IP， 不是 cluster 的 IP)
# Configure to use a container runtime
$ export KVVERSION=$(curl -sL https://api.github.com/repos/kube-vip/kube-vip/releases | jq -r &amp;#34;.[0].name&amp;#34;)
$ echo $KVVERSION
v0.5.7
# podman
$ alias kube-vip=&amp;#34;sudo podman run --network host --rm ghcr.io/kube-vip/kube-vip:$KVVERSION&amp;#34;
# ARP
# This configuration will create a manifest that starts kube-vip providing controlplane and services management, using leaderElection. When this instance is elected as the leader it will bind the vip to the specified interface, this is also the same for services of type:LoadBalancer.
$ kube-vip manifest pod \
--interface $GWIF \
--vip $VIP \
--controlplane \
--arp \
--leaderElection | sudo tee /etc/kubernetes/manifests/kube-vip.yaml&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;設定 K8S Master 可以執行 Pod&lt;/strong&gt;
$ kubectl taint node m3 node-role.kubernetes.io/control-plane:NoSchedule-
&lt;code&gt;node/m1 untainted&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;安裝好後，將 m1 主機重新開機&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;$ sudo reboot&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2&gt;10. 檢視 Kubernetes 系統狀態&lt;span class="hx:absolute hx:-mt-20" id="10-檢視-kubernetes-系統狀態"&gt;&lt;/span&gt;
&lt;a href="#10-%e6%aa%a2%e8%a6%96-kubernetes-%e7%b3%bb%e7%b5%b1%e7%8b%80%e6%85%8b" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;檢查 node 的狀態&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
m1 Ready control-plane 18m v1.25.3
m2 Ready control-plane 11m v1.25.3
m3 Ready control-plane 10m v1.25.3&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;檢查 kube-system 這個 Namespace 裡面 pod 的狀態&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;$ kubectl get pods -n kube-system
NAME READY STATUS RESTARTS AGE
coredns-565d847f94-mkj5s 1/1 Running 1 62m
coredns-565d847f94-wn6cp 1/1 Running 1 62m
etcd-d6m1 1/1 Running 2 62m
etcd-d6m2 1/1 Running 1 59m
etcd-d6m3 1/1 Running 1 58m
kube-apiserver-d6m1 1/1 Running 2 62m
kube-apiserver-d6m2 1/1 Running 2 59m
kube-apiserver-d6m3 1/1 Running 4 (16m ago) 57m
kube-controller-manager-d6m1 1/1 Running 2 62m
kube-controller-manager-d6m2 1/1 Running 1 58m
kube-controller-manager-d6m3 1/1 Running 1 56m
kube-proxy-2986z 1/1 Running 1 59m
kube-proxy-q7xt6 1/1 Running 2 46m
kube-proxy-v9kc2 1/1 Running 1 45m
kube-proxy-vfpwm 1/1 Running 2 62m
kube-proxy-vlswl 1/1 Running 1 58m
kube-scheduler-d6m1 1/1 Running 2 62m
kube-scheduler-d6m2 1/1 Running 1 59m
kube-scheduler-d6m3 1/1 Running 2 58m
kube-vip-d6m1 1/1 Running 3 62m
kube-vip-d6m2 1/1 Running 1 51m
kube-vip-d6m3 1/1 Running 1 52m&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h1&gt;開始建置 Kubernetes Worker&lt;/h1&gt;&lt;h2&gt;w1, w2 安裝 kubelet 及 kubeadm 命令&lt;span class="hx:absolute hx:-mt-20" id="w1-w2-安裝-kubelet-及-kubeadm-命令"&gt;&lt;/span&gt;
&lt;a href="#w1-w2-%e5%ae%89%e8%a3%9d-kubelet-%e5%8f%8a-kubeadm-%e5%91%bd%e4%bb%a4" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;# ssh 到 w1 主機安裝 kubelet 及 kubeadm 命令
$ ssh w1 &amp;#39;sudo apk add kubeadm kubelet --update-cache --repository http://dl-3.alpinelinux.org/alpine/edge/testing/ --allow-untrusted&amp;#39;
# ssh 到 w2 主機安裝 kubelet 及 kubeadm 命令
$ ssh w2 &amp;#39;sudo apk add kubeadm kubelet --update-cache --repository http://dl-3.alpinelinux.org/alpine/edge/testing/ --allow-untrusted&amp;#39;
# ssh 到 w1, w2 主機，將 kubelet 設成 Deamon
$ ssh w1 &amp;#39;sudo rc-update add kubelet default&amp;#39;; ssh w2 &amp;#39;sudo rc-update add kubelet default&amp;#39;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2&gt;w1, w2 加入 K8S Cluster&lt;span class="hx:absolute hx:-mt-20" id="w1-w2-加入-k8s-cluster"&gt;&lt;/span&gt;
&lt;a href="#w1-w2-%e5%8a%a0%e5%85%a5-k8s-cluster" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;在 m1 的終端機, 執行以下命令
$ export JOIN=$(echo &amp;#34; sudo `kubeadm token create --print-join-command 2&amp;gt;/dev/null`&amp;#34;)
$ ssh w1 &amp;#34;$JOIN&amp;#34;; ssh w2 &amp;#34;$JOIN&amp;#34;
$ ssh w1 sudo reboot; ssh w2 sudo reboot&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2&gt;設定 K8S Worker 標籤&lt;span class="hx:absolute hx:-mt-20" id="設定-k8s-worker-標籤"&gt;&lt;/span&gt;
&lt;a href="#%e8%a8%ad%e5%ae%9a-k8s-worker-%e6%a8%99%e7%b1%a4" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;$ kubectl label node w1 node-role.kubernetes.io/worker=; kubectl label node w2 node-role.kubernetes.io/worker=&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;檢查是否符合預期&lt;/p&gt;
&lt;p&gt;$ kubectl get nodes&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;NAME STATUS ROLES AGE VERSION
m1 Ready control-plane 61m v1.25.0
m2 Ready control-plane 58m v1.25.0
m3 Ready control-plane 57m v1.25.0
w1 Ready worker 45m v1.25.0
w2 Ready worker 44m v1.25.0&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h1&gt;測試&lt;/h1&gt;&lt;p&gt;$ ks&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;NAME READY STATUS RESTARTS AGE
coredns-565d847f94-mkj5s 1/1 Running 1 3h5m
coredns-565d847f94-wn6cp 1/1 Running 1 3h5m
etcd-d6m1 1/1 Running 2 3h5m
etcd-d6m2 1/1 Running 1 3h2m
etcd-d6m3 1/1 Running 1 3h
kube-apiserver-d6m1 1/1 Running 2 3h5m
kube-apiserver-d6m2 1/1 Running 2 3h2m
kube-apiserver-d6m3 1/1 Running 4 (139m ago) 3h
kube-controller-manager-d6m1 1/1 Running 2 3h5m
kube-controller-manager-d6m2 1/1 Running 1 3h1m
kube-controller-manager-d6m3 1/1 Running 1 179m
kube-proxy-2986z 1/1 Running 1 3h2m
kube-proxy-q7xt6 1/1 Running 2 169m
kube-proxy-v9kc2 1/1 Running 1 168m
kube-proxy-vfpwm 1/1 Running 2 3h5m
kube-proxy-vlswl 1/1 Running 1 3h1m
kube-scheduler-d6m1 1/1 Running 2 3h5m
kube-scheduler-d6m2 1/1 Running 1 3h2m
kube-scheduler-d6m3 1/1 Running 2 3h1m
kube-vip-d6m1 1/1 Running 3 3h5m
kube-vip-d6m2 1/1 Running 1 174m
kube-vip-d6m3 1/1 Running 1 175m&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;$ kubectl logs -n kube-system kube-vip-d6m1&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;time=&amp;#34;2022-12-20T08:16:19Z&amp;#34; level=info msg=&amp;#34;Starting kube-vip.io [v0.5.7]&amp;#34;
time=&amp;#34;2022-12-20T08:16:19Z&amp;#34; level=info msg=&amp;#34;namespace [kube-system], Mode: [ARP], Features(s): Control Plane:[true], Services:[false]&amp;#34;
time=&amp;#34;2022-12-20T08:16:19Z&amp;#34; level=info msg=&amp;#34;prometheus HTTP server started&amp;#34;
time=&amp;#34;2022-12-20T08:16:19Z&amp;#34; level=info msg=&amp;#34;Starting Kube-vip Manager with the ARP engine&amp;#34;
time=&amp;#34;2022-12-20T08:16:19Z&amp;#34; level=info msg=&amp;#34;Beginning cluster membership, namespace [kube-system], lock name [plndr-cp-lock], id [d6m1]&amp;#34;
I1220 08:16:19.293587 1 leaderelection.go:248] attempting to acquire leader lease kube-system/plndr-cp-lock...
time=&amp;#34;2022-12-20T08:16:20Z&amp;#34; level=info msg=&amp;#34;Node [d6m2] is assuming leadership of the cluster&amp;#34;
time=&amp;#34;2022-12-20T08:16:26Z&amp;#34; level=info msg=&amp;#34;Node [d6m3] is assuming leadership of the cluster&amp;#34;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;$ kubectl logs -n kube-system kube-vip-d6m2&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;time=&amp;#34;2022-12-20T08:19:20Z&amp;#34; level=info msg=&amp;#34;Starting kube-vip.io [v0.5.7]&amp;#34;
time=&amp;#34;2022-12-20T08:19:20Z&amp;#34; level=info msg=&amp;#34;namespace [kube-system], Mode: [ARP], Features(s): Control Plane:[true], Services:[false]&amp;#34;
time=&amp;#34;2022-12-20T08:19:20Z&amp;#34; level=info msg=&amp;#34;prometheus HTTP server started&amp;#34;
time=&amp;#34;2022-12-20T08:19:20Z&amp;#34; level=info msg=&amp;#34;Starting Kube-vip Manager with the ARP engine&amp;#34;
time=&amp;#34;2022-12-20T08:19:20Z&amp;#34; level=info msg=&amp;#34;Beginning cluster membership, namespace [kube-system], lock name [plndr-cp-lock], id [d6m2]&amp;#34;
I1220 08:19:20.510887 1 leaderelection.go:248] attempting to acquire leader lease kube-system/plndr-cp-lock...
time=&amp;#34;2022-12-20T08:19:20Z&amp;#34; level=info msg=&amp;#34;Node [d6m3] is assuming leadership of the cluster&amp;#34;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;$ kubectl logs -n kube-system kube-vip-d6m3&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;............
E1220 08:16:01.515714 1 leaderelection.go:330] error retrieving resource lock kube-system/plndr-cp-lock: Get &amp;#34;https://kubernetes:6443/apis/coordination.k8s.io/v1/namespaces/kube-system/leases/plndr-cp-lock&amp;#34;: dial tcp 127.0.0.1:6443: connect: connection refused
E1220 08:16:13.254844 1 leaderelection.go:330] error retrieving resource lock kube-system/plndr-cp-lock: Get &amp;#34;https://kubernetes:6443/apis/coordination.k8s.io/v1/namespaces/kube-system/leases/plndr-cp-lock&amp;#34;: net/http: TLS handshake timeout
time=&amp;#34;2022-12-20T08:16:20Z&amp;#34; level=info msg=&amp;#34;Node [d6m2] is assuming leadership of the cluster&amp;#34;
I1220 08:16:25.734487 1 leaderelection.go:258] successfully acquired lease kube-system/plndr-cp-lock
time=&amp;#34;2022-12-20T08:16:25Z&amp;#34; level=info msg=&amp;#34;Node [d6m3] is assuming leadership of the cluster&amp;#34;
time=&amp;#34;2022-12-20T08:16:25Z&amp;#34; level=info msg=&amp;#34;Gratuitous Arp broadcast will repeat every 3 seconds for [120.96.143.248]&amp;#34;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;bigred@d6m1:&lt;del&gt;$ sudo poweroff
bigred@d6m2:&lt;/del&gt;$ kg all&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;NAME READY STATUS RESTARTS AGE
pod/presenation-bd9bb89cd-ptszx 1/1 Running 0 13s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.98.0.1 &amp;lt;none&amp;gt; 443/TCP 3h9m
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/presenation 1/1 1 1 14s
NAME DESIRED CURRENT READY AGE
replicaset.apps/presenation-bd9bb89cd 1 1 1 14s&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;一開始 m1 當 leadership of the cluster ，當我們把 m1 關機&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;pod 還是正常 running&lt;/li&gt;
&lt;li&gt;leadership of the cluster 變成 m3&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;$ kubectl logs -n kube-system kube-vip-d6m2&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;time=&amp;#34;2022-12-20T08:19:20Z&amp;#34; level=info msg=&amp;#34;Starting kube-vip.io [v0.5.7]&amp;#34;
time=&amp;#34;2022-12-20T08:19:20Z&amp;#34; level=info msg=&amp;#34;namespace [kube-system], Mode: [ARP], Features(s): Control Plane:[true], Services:[false]&amp;#34;
time=&amp;#34;2022-12-20T08:19:20Z&amp;#34; level=info msg=&amp;#34;prometheus HTTP server started&amp;#34;
time=&amp;#34;2022-12-20T08:19:20Z&amp;#34; level=info msg=&amp;#34;Starting Kube-vip Manager with the ARP engine&amp;#34;
time=&amp;#34;2022-12-20T08:19:20Z&amp;#34; level=info msg=&amp;#34;Beginning cluster membership, namespace [kube-system], lock name [plndr-cp-lock], id [d6m2]&amp;#34;
I1220 08:19:20.510887 1 leaderelection.go:248] attempting to acquire leader lease kube-system/plndr-cp-lock...
time=&amp;#34;2022-12-20T08:19:20Z&amp;#34; level=info msg=&amp;#34;Node [d6m3] is assuming leadership of the cluster&amp;#34;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;$ kubectl logs -n kube-system kube-vip-d6m3&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;E1220 08:16:13.254844 1 leaderelection.go:330] error retrieving resource lock kube-system/plndr-cp-lock: Get &amp;#34;https://kubernetes:6443/apis/coordination.k8s.io/v1/namespaces/kube-system/leases/plndr-cp-lock&amp;#34;: net/http: TLS handshake timeout
time=&amp;#34;2022-12-20T08:16:20Z&amp;#34; level=info msg=&amp;#34;Node [d6m2] is assuming leadership of the cluster&amp;#34;
I1220 08:16:25.734487 1 leaderelection.go:258] successfully acquired lease kube-system/plndr-cp-lock
time=&amp;#34;2022-12-20T08:16:25Z&amp;#34; level=info msg=&amp;#34;Node [d6m3] is assuming leadership of the cluster&amp;#34;
time=&amp;#34;2022-12-20T08:16:25Z&amp;#34; level=info msg=&amp;#34;Gratuitous Arp broadcast will repeat every 3 seconds for [120.96.143.248]&amp;#34;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h1&gt;重新建立損壞 master&lt;/h1&gt;&lt;p&gt;&lt;strong&gt;參考文件&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a
href="https://stackoverflow.com/questions/67921552/re-installed-node-cannot-join-kubernetes-cluster"target="_blank" rel="noopener"&gt;https://stackoverflow.com/questions/67921552/re-installed-node-cannot-join-kubernetes-cluster&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
href="https://facsiaginsa.com/kubernetes/join-existing-kubernetes-cluster"target="_blank" rel="noopener"&gt;https://facsiaginsa.com/kubernetes/join-existing-kubernetes-cluster&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
href="https://stackoverflow.com/questions/35757620/how-to-gracefully-remove-a-node-from-kubernetes"target="_blank" rel="noopener"&gt;https://stackoverflow.com/questions/35757620/how-to-gracefully-remove-a-node-from-kubernetes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
href="https://facsiaginsa.com/kubernetes/join-existing-kubernetes-cluster"target="_blank" rel="noopener"&gt;https://facsiaginsa.com/kubernetes/join-existing-kubernetes-cluster&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
href="https://blog.scottlowe.org/2019/08/15/reconstructing-the-join-command-for-kubeadm/"target="_blank" rel="noopener"&gt;https://blog.scottlowe.org/2019/08/15/reconstructing-the-join-command-for-kubeadm/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
href="https://stackoverflow.com/questions/67921552/re-installed-node-cannot-join-kubernetes-cluster"target="_blank" rel="noopener"&gt;https://stackoverflow.com/questions/67921552/re-installed-node-cannot-join-kubernetes-cluster&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
href="https://www.kancloud.cn/pshizhsysu/kubernetes/2055662"target="_blank" rel="noopener"&gt;https://www.kancloud.cn/pshizhsysu/kubernetes/2055662&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;在 Alpine Linux 安裝 etcd-ctl 命令套件檔&lt;span class="hx:absolute hx:-mt-20" id="在-alpine-linux-安裝-etcd-ctl-命令套件檔"&gt;&lt;/span&gt;
&lt;a href="#%e5%9c%a8-alpine-linux-%e5%ae%89%e8%a3%9d-etcd-ctl-%e5%91%bd%e4%bb%a4%e5%a5%97%e4%bb%b6%e6%aa%94" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;$ sudo apk add etcd-ctl \
--no-cache \
--update-cache \
--allow-untrusted \
--repository http://dl-cdn.alpinelinux.org/alpine/edge/testing&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;$ kubectl get pods -n kube-system | grep etcd&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;etcd-d4m1 1/1 Running 8 8d
etcd-d4m2 1/1 Running 8 8d
etcd-d4m3 0/1 CrashLoopBackOff 1020 (3m ago) 19h&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2&gt;清除損壞的 master node&lt;span class="hx:absolute hx:-mt-20" id="清除損壞的-master-node"&gt;&lt;/span&gt;
&lt;a href="#%e6%b8%85%e9%99%a4%e6%90%8d%e5%a3%9e%e7%9a%84-master-node" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;$ ks&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;NAME READY STATUS RESTARTS AGE
coredns-565d847f94-h6kwm 1/1 Running 7 15d
coredns-565d847f94-rjmkc 1/1 Running 7 15d
etcd-d3m1 1/1 Running 8 15d
etcd-d3m2 0/1 CrashLoopBackOff 885 (2m1s ago) 9h
etcd-d3m3 1/1 Running 8 15d
kube-apiserver-d3m1 1/1 Running 22 15d
kube-apiserver-d3m2 0/1 CrashLoopBackOff 866 (4m15s ago) 6d21h
kube-apiserver-d3m3 1/1 Running 23 (9h ago) 15d
kube-controller-manager-d3m1 1/1 Running 10 15d
kube-controller-manager-d3m2 1/1 Running 12 6d21h
kube-controller-manager-d3m3 1/1 Running 12 (9h ago) 15d
kube-proxy-8m84p 1/1 Running 7 15d
kube-proxy-9hwvx 1/1 Running 9 15d
kube-proxy-hvmvl 1/1 Running 9 15d
kube-proxy-j4l4m 1/1 Running 0 6d21h
kube-proxy-zn9d2 1/1 Running 8 15d
kube-scheduler-d3m1 1/1 Running 10 15d
kube-scheduler-d3m2 1/1 Running 11 6d21h
kube-scheduler-d3m3 1/1 Running 13 (9h ago) 15d
kube-vip-d3m1 1/1 Running 24 15d
kube-vip-d3m2 1/1 Running 11 6d21h
kube-vip-d3m3 1/1 Running 28 (9h ago) 15d&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;$ kubectl get nodes
$ kubectl drain &amp;lt;node-name&amp;gt;
$ kubectl drain &amp;lt;node-name&amp;gt; --ignore-daemonsets --delete-local-data
$ kubectl delete node &amp;lt;node-name&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2&gt;找到那一台 壞掉 master node 的 ID&lt;span class="hx:absolute hx:-mt-20" id="找到那一台-壞掉-master-node-的-id"&gt;&lt;/span&gt;
&lt;a href="#%e6%89%be%e5%88%b0%e9%82%a3%e4%b8%80%e5%8f%b0-%e5%a3%9e%e6%8e%89-master-node-%e7%9a%84-id" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Find the id of the member to remove&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;sudo ETCDCTL_API=3 etcdctl --endpoints 127.0.0.1:2379 --cacert /etc/kubernetes/pki/etcd/ca.crt --cert /etc/kubernetes/pki/etcd/server.crt --key /etc/kubernetes/pki/etcd/server.key member list&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;出現以下的結果&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;78c846a8a9465434, started, d3m3, https://120.96.143.183:2380, https://120.96.143.183:2379, false
92df15cb2da41804, started, d3m1, https://120.96.143.181:2380, https://120.96.143.181:2379, false
d3aa799c592c5386, started, d3m2, https://120.96.143.182:2380, https://120.96.143.182:2379, false&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;把損壞刪除
==I want to remove d3aa799c592c5386==&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;sudo ETCDCTL_API=3 etcdctl --endpoints 127.0.0.1:2379 --cacert /etc/kubernetes/pki/etcd/ca.crt --cert /etc/kubernetes/pki/etcd/server.crt --key /etc/kubernetes/pki/etcd/server.key member remove d3aa799c592c5386&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Checking, 檢查&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;sudo ETCDCTL_API=3 etcdctl --endpoints 127.0.0.1:2379 --cacert /etc/kubernetes/pki/etcd/ca.crt --cert /etc/kubernetes/pki/etcd/server.crt --key /etc/kubernetes/pki/etcd/server.key member list&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Now I can join my new master.&lt;/p&gt;
&lt;h2&gt;Join a Node to a Kubernetes Cluster&lt;span class="hx:absolute hx:-mt-20" id="join-a-node-to-a-kubernetes-cluster"&gt;&lt;/span&gt;
&lt;a href="#join-a-node-to-a-kubernetes-cluster" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;$ kubectl get cm kubeadm-config -n kube-system -o yaml&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;apiVersion: v1
data:
ClusterConfiguration: |
apiServer:
extraArgs:
authorization-mode: Node,RBAC
timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta3
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controlPlaneEndpoint: 120.96.143.194:6443
controllerManager: {}
dns: {}
etcd:
local:
dataDir: /var/lib/etcd
imageRepository: registry.k8s.io
kind: ClusterConfiguration
kubernetesVersion: v1.25.5
networking:
dnsDomain: k8s.org
podSubnet: 10.244.0.0/16
serviceSubnet: 10.98.0.0/24
scheduler: {}
kind: ConfigMap
metadata:
creationTimestamp: &amp;#34;2022-12-20T07:12:01Z&amp;#34;
name: kubeadm-config
namespace: kube-system
resourceVersion: &amp;#34;199&amp;#34;
uid: 75169c8c-9389-4f20-bacd-56b3f182f64d&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;img src="https://i.imgur.com/qEWRbPM.png" alt="" loading="lazy" /&gt;&lt;/p&gt;
&lt;p&gt;複製以上那段貼到新的 nano 檔案&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Copy the marked text under ClusterConfiguration:, create a new file to store the configuration&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;$ nano kubeadm-config.yaml&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt; apiServer:
extraArgs:
authorization-mode: Node,RBAC
timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta3
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controlPlaneEndpoint: 120.96.143.194:6443
controllerManager: {}
dns: {}
etcd:
local:
dataDir: /var/lib/etcd
imageRepository: registry.k8s.io
kind: ClusterConfiguration
kubernetesVersion: v1.25.5
networking:
dnsDomain: k8s.org
podSubnet: 10.244.0.0/16
serviceSubnet: 10.98.0.0/24
scheduler: {}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2&gt;Get Kubeadm Join Command for Master Node&lt;span class="hx:absolute hx:-mt-20" id="get-kubeadm-join-command-for-master-node"&gt;&lt;/span&gt;
&lt;a href="#get-kubeadm-join-command-for-master-node" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;code&gt;$ sudo kubeadm init phase upload-certs --upload-certs --config kubeadm-config.yaml&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;[upload-certs] Storing the certificates in Secret &amp;ldquo;kubeadm-certs&amp;rdquo; in the &amp;ldquo;kube-system&amp;rdquo; Namespace
[upload-certs] Using certificate key:
==ec52acebb6630efa584b6ff784db4a50ac59f8c22bc81baab6b82c1e70244787==&lt;/p&gt;
&lt;p&gt;The marked part above is the ==certificate key== that we need to pass to the join command.
上面標記的部分是我們需要傳遞給加入命令的證書密鑰。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;$ kubeadm token create --print-join-command&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;==kubeadm join 120.96.143.194:6443 &amp;ndash;token nlzfjg.6e5x6p2hb36rcjd3 &amp;ndash;discovery-token-ca-cert-hash sha256:2a3bd2c4c5a6de8332503d95dcdef141f45790504f5a2c11ea96c06bd86ca87c==&lt;/p&gt;
&lt;h2&gt;Joining Master Node to Kubernetes CLuster&lt;span class="hx:absolute hx:-mt-20" id="joining-master-node-to-kubernetes-cluster"&gt;&lt;/span&gt;
&lt;a href="#joining-master-node-to-kubernetes-cluster" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Now, execute the join command with this format&lt;/p&gt;
&lt;p&gt;&lt;code&gt;&amp;lt;basic join command&amp;gt; --control-plane --certificate-key &amp;lt;ceritifcate-key&amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;In this case, I will execute this command to join my new master node:&lt;/p&gt;
&lt;p&gt;==$ ssh &amp;lt;壞掉的 node&amp;gt;==&lt;/p&gt;
&lt;p&gt;&lt;font color=red&gt;&lt;code&gt;$ sudo kubeadm join 120.96.143.194:6443 --token nlzfjg.6e5x6p2hb36rcjd3 --discovery-token-ca-cert-hash sha256:2a3bd2c4c5a6de8332503d95dcdef141f45790504f5a2c11ea96c06bd86ca87c --control-plane --certificate-key ec52acebb6630efa584b6ff784db4a50ac59f8c22bc81baab6b82c1e70244787&lt;/code&gt;&lt;/font&gt;&lt;/p&gt;
&lt;h2&gt;如果不是全新的機器要把舊的檔案，目錄刪除&lt;span class="hx:absolute hx:-mt-20" id="如果不是全新的機器要把舊的檔案目錄刪除"&gt;&lt;/span&gt;
&lt;a href="#%e5%a6%82%e6%9e%9c%e4%b8%8d%e6%98%af%e5%85%a8%e6%96%b0%e7%9a%84%e6%a9%9f%e5%99%a8%e8%a6%81%e6%8a%8a%e8%88%8a%e7%9a%84%e6%aa%94%e6%a1%88%e7%9b%ae%e9%8c%84%e5%88%aa%e9%99%a4" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;$ sudo rm -r /etc/kubernetes/kubelet.conf
$ sudo rm -r /etc/kubernetes/manifests/
$ sudo rm -r /var/lib/etcd
$ sudo reboot
$ sudo rc-service kubelet stop&lt;/p&gt;
&lt;p&gt;&lt;font color=red&gt;&lt;code&gt;$ sudo kubeadm join 120.96.143.194:6443 --token nlzfjg.6e5x6p2hb36rcjd3 --discovery-token-ca-cert-hash sha256:2a3bd2c4c5a6de8332503d95dcdef141f45790504f5a2c11ea96c06bd86ca87c --control-plane --certificate-key ec52acebb6630efa584b6ff784db4a50ac59f8c22bc81baab6b82c1e70244787&lt;/code&gt;&lt;/font&gt;&lt;/p&gt;
&lt;h2&gt;加到 kube-vip&lt;span class="hx:absolute hx:-mt-20" id="加到-kube-vip"&gt;&lt;/span&gt;
&lt;a href="#%e5%8a%a0%e5%88%b0-kube-vip" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;$ mkdir -p $HOME/.kube
$ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;cp: overwrite &amp;lsquo;/home/bigred/.kube/config&amp;rsquo;? ==y==&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;code&gt;$ sudo chown $(id -u):$(id -g) $HOME/.kube/config&lt;/code&gt;
$ kubectl get nodes&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;NAME STATUS ROLES AGE VERSION
d4m1 Ready control-plane 9d v1.25.0
d4m2 Ready control-plane 9d v1.25.0
d4m3 Ready control-plane 18m v1.25.0
d4w1 Ready worker 8d v1.25.0
d4w2 Ready worker 8d v1.25.0&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;#取得版本代號
&lt;code&gt;$ export KVVERSION=$(curl -sL https://api.github.com/repos/kube-vip/kube-vip/releases | jq -r &amp;quot;.[0].name&amp;quot;)&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;#檢查
$ echo $KVVERSION
&lt;code&gt;v0.5.7&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;#podman
&lt;code&gt;$ alias kube-vip=&amp;quot;sudo podman run --network host --rm ghcr.io/kube-vip/kube-vip:$KVVERSION&amp;quot;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;$ sudo mkdir -p /etc/kubernetes/manifests/&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;$ kube-vip manifest pod \
--interface eth0 \
--vip 120.96.143.194 \
--controlplane \
--arp \
--leaderElection | sudo tee /etc/kubernetes/manifests/kube-vip.yaml&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;==$ kubectl taint node &lt;node-name&gt; node-role.kubernetes.io/control-plane:NoSchedule-==
node/&lt;node-name&gt; untainted&lt;/p&gt;
&lt;p&gt;$ ks&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;NAME READY STATUS RESTARTS AGE
coredns-565d847f94-69lpx 1/1 Running 9 9d
coredns-565d847f94-r626m 1/1 Running 9 9d
etcd-d4m1 1/1 Running 9 9d
etcd-d4m2 1/1 Running 8 9d
etcd-d4m3 1/1 Running 0 12m
kube-apiserver-d4m1 1/1 Running 14 9d
kube-apiserver-d4m2 1/1 Running 13 9d
kube-apiserver-d4m3 1/1 Running 0 12m
kube-controller-manager-d4m1 1/1 Running 13 9d
kube-controller-manager-d4m2 1/1 Running 15 (16m ago) 9d
kube-controller-manager-d4m3 1/1 Running 0 12m
kube-proxy-crwbg 1/1 Running 11 9d
kube-proxy-hbndh 1/1 Running 9 9d
kube-proxy-rnfxc 1/1 Running 8 9d
kube-proxy-t4bgz 1/1 Running 1 26m
kube-proxy-txfn6 1/1 Running 8 9d
kube-scheduler-d4m1 1/1 Running 13 9d
kube-scheduler-d4m2 1/1 Running 16 (16m ago) 9d
kube-scheduler-d4m3 1/1 Running 0 12m
kube-vip-d4m1 1/1 Running 26 9d
kube-vip-d4m2 1/1 Running 26 (21h ago) 9d
kube-vip-d4m3 1/1 Running 0 77s&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h6&gt;tags: &lt;code&gt;K8S-陳老師-第6期&lt;/code&gt;&lt;span class="hx:absolute hx:-mt-20" id="tags-k8s-陳老師-第6期"&gt;&lt;/span&gt;
&lt;a href="#tags-k8s-%e9%99%b3%e8%80%81%e5%b8%ab-%e7%ac%ac6%e6%9c%9f" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h6&gt;</description></item><item><title>CKA</title><link>https://blog.kubeantony.com/archive/learning-notes/cka/</link><pubDate>Sun, 23 Oct 2022 05:06:04 +0800</pubDate><guid>https://blog.kubeantony.com/archive/learning-notes/cka/</guid><description>
&lt;p&gt;&lt;strong&gt;參考文件&lt;/strong&gt;
1.https://zhuanlan.zhihu.com/p/564737349
2.https://github.com/kubernetes-csi/external-snapshotter
3.https://github.com/kubernetes-csi/csi-driver-host-path
4.https://github.com/kubernetes-csi/csi-driver-host-path/blob/master/examples/csi-storageclass.yaml
5.https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/ha-topology/
6.https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/ha-topology/
7.https://rafay.co/the-kubernetes-current/etcd-kubernetes-what-you-should-know/&lt;/p&gt;
&lt;h2&gt;考試環境圖&lt;span class="hx:absolute hx:-mt-20" id="考試環境圖"&gt;&lt;/span&gt;
&lt;a href="#%e8%80%83%e8%a9%a6%e7%92%b0%e5%a2%83%e5%9c%96" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;img src="https://i.imgur.com/YqD2JWf.png" alt="" loading="lazy" /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;左上角有一個筆記本可以使用，方便寫 yaml 檔（Applications 的 Mousepad）&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;1. Scale&lt;span class="hx:absolute hx:-mt-20" id="1-scale"&gt;&lt;/span&gt;
&lt;a href="#1-scale" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;題型 1：Scale the deployment presenation to 3 pods
題型 2：Scale the deployment loadbalabcer to 6 pods&lt;/p&gt;
&lt;h3&gt;環境準備&lt;span class="hx:absolute hx:-mt-20" id="環境準備"&gt;&lt;/span&gt;
&lt;a href="#%e7%92%b0%e5%a2%83%e6%ba%96%e5%82%99" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;$ kubectl create deploy presenation --image=quay.io/cloudwalker/nginx
$ kubectl create deploy loadbalabcer --image=quay.io/cloudwalker/nginx
$ kubectl get all&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3&gt;解答&lt;span class="hx:absolute hx:-mt-20" id="解答"&gt;&lt;/span&gt;
&lt;a href="#%e8%a7%a3%e7%ad%94" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;題型 1&lt;/p&gt;
&lt;p&gt;&lt;font color=red&gt;$ kubectl scale deploy presentaion &amp;ndash;replicas=3&lt;/font&gt;&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;$ kubectl get all&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;題型 2&lt;/p&gt;
&lt;p&gt;&lt;font color=red&gt;$ kubectl scale deploy loadbalabcer &amp;ndash;replicas=6&lt;/font&gt;&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;$ kubectl get all&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2&gt;2. NetworkPolicy （7%）&lt;span class="hx:absolute hx:-mt-20" id="2-networkpolicy-7"&gt;&lt;/span&gt;
&lt;a href="#2-networkpolicy-7" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Create new NetworkPolicy named &lt;code&gt;allow-port-from-namespace&lt;/code&gt; that allows Pods in the existing namespace &lt;code&gt;internal&lt;/code&gt; to connect to port &lt;code&gt;9000&lt;/code&gt; of other Pods in the same namespace.&lt;/p&gt;
&lt;p&gt;Ensure that the new NetworkPolicy:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;does not allow access to Pods not listening on port&lt;code&gt; 9000&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;does not allow access from Pods not in namespace &lt;code&gt;internal&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;解答&lt;span class="hx:absolute hx:-mt-20" id="解答-1"&gt;&lt;/span&gt;
&lt;a href="#%e8%a7%a3%e7%ad%94-1" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;K8S DOC 查詢關鍵字 :&lt;code&gt; networkpolicy&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;找 &lt;code&gt;Network Policies | Kubernetes&lt;/code&gt; 這篇&lt;/li&gt;
&lt;li&gt;用第一個 YANL 檔&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;檢查 namespace，如果沒有這個 namespace 就直接 create
&lt;code&gt;$ k get namespace&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;看 Namespace 的標籤&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;$ k get ns internal --show-labels
NAME STATUS AGE LABELS
internal Active 3m27s kubernetes.io/metadata.name=internal&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;編輯 YAML 檔&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-port-from-namespace
namespace: internal
spec:
podSelector: {} # 新增 {}
# matchLabels:
# role: db
policyTypes:
- Ingress
ingress:
- from:
# - ipBlock: # remove
# cidr: 172.17.0.0/16 # remove
# except: # remove
# - 172.17.1.0/24 # remove
- namespaceSelector:
matchLabels:
kubernetes.io/metadata.name: internal
# - podSelector: # remove
# matchLabels: # remove
# role: frontend # remove
ports:
- protocol: TCP
port: 9000 # port number 改成 9000
# egress: # remove
# - to: # remove
# - ipBlock: # remove
# cidr: 10.0.0.0/24 # remove
# ports: # remove
# - protocol: TCP # remove
# port: 5978 # remove&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3&gt;驗證&lt;span class="hx:absolute hx:-mt-20" id="驗證"&gt;&lt;/span&gt;
&lt;a href="#%e9%a9%97%e8%ad%89" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;此功能在 flannel 無法成功&lt;/li&gt;
&lt;li&gt;因此使用 Calico ，它的功能比較多&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;撰寫 yaml&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;# 建立 bx pod 並且架網站 port 9000
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: null
labels:
run: bx
name: bx
namespace: internal
spec:
containers:
- image: quay.io/cloudwalker/busybox
name: bx
command:
- /bin/sh
- -c
- |
mkdir www
echo hi &amp;gt; www/index.html
busybox httpd -p 9000 -h www -f
resources: {}
dnsPolicy: ClusterFirst
restartPolicy: Always
status: {}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;驗證同樣在 internal namespace 的 pod 可以透過 9000 port 連線&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;$ kubectl run alp -it --image=quay.io/cloudwalker/alpine -n internal
# nc -w 1 10.244.190.72 9000;echo $?
0&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;在 internal namespace 以外都無法透過 9000 port 連線&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;$ kubectl run alp -it --image=quay.io/cloudwalker/alpine
# nc -w 1 10.244.190.72 9000;echo $?
1&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2&gt;2.2 NetworkPolicy&lt;span class="hx:absolute hx:-mt-20" id="22-networkpolicy"&gt;&lt;/span&gt;
&lt;a href="#22-networkpolicy" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Create a new NetworkPolicy named &lt;code&gt;allow-port-from-namespace&lt;/code&gt; in the existing namespace &lt;code&gt;echo&lt;/code&gt;. Ensure
that the new NetworkPolicy allows Pods in namespace &lt;code&gt;my-app&lt;/code&gt; to connect to port &lt;code&gt;9000&lt;/code&gt; of Pods in namespace &lt;code&gt;echo&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Further ensure that the new NetworkPolicy:&lt;/p&gt;
&lt;p&gt;• does not allow access to Pods, which don’t listen on port &lt;code&gt;9000&lt;/code&gt;
• does not allow access from Pods, which are not in namespace &lt;code&gt;my-app&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;解答&lt;span class="hx:absolute hx:-mt-20" id="解答-2"&gt;&lt;/span&gt;
&lt;a href="#%e8%a7%a3%e7%ad%94-2" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-port-from-namespace
namespace: echo
spec:
podSelector: {}
policyTypes:
- Ingress
ingress:
- from:
- namespaceSelector:
matchLabels:
kubernetes.io/metadata.name: my-app
ports:
- protocol: TCP
port: 9000 &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2&gt;3. Multi-container&lt;span class="hx:absolute hx:-mt-20" id="3-multi-container"&gt;&lt;/span&gt;
&lt;a href="#3-multi-container" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;題型 1:
Create a pod named &lt;code&gt;kucc8&lt;/code&gt; with a single app container for each of the following images runing inside(there may be between 1 and 4 images specified): nginx + memcached&lt;/p&gt;
&lt;p&gt;題型 2:
Create a pod named &lt;code&gt;kucc1&lt;/code&gt; with a single app container for each of the following images runing inside(there may be between 1 and 4 images specified): nginx + redis + memcached + consul&lt;/p&gt;
&lt;h3&gt;解答&lt;span class="hx:absolute hx:-mt-20" id="解答-3"&gt;&lt;/span&gt;
&lt;a href="#%e8%a7%a3%e7%ad%94-3" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;題型 1:&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;產生 YAML 檔
&lt;font color=red&gt;&lt;code&gt;$ export do=&amp;quot;--dry-run=client -o yaml&amp;quot;&lt;/code&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font color=red&gt;$ kubectl run kucc8 &amp;ndash;image=nginx $do &amp;gt; pod.yaml&lt;/font&gt;
編輯 YAML 檔&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;apiVersion: v1
kind: Pod
metadata:
creationTimestamp: null
labels:
run: kucc8
name: kucc8
spec:
containers:
- image: nginx
name: kucc8
resources: {}
- image: memcached # add and change
name: kucc8-1 # add
dnsPolicy: ClusterFirst
restartPolicy: Always
status: {}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;產生 pod&lt;/p&gt;
&lt;p&gt;&lt;font color=red&gt;$ kubectl apply -f pod.yaml&lt;/font&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;題型 2:&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;產生 YAML 檔&lt;/p&gt;
&lt;p&gt;&lt;font color=red&gt;$ kubectl run kucc1 &amp;ndash;image=nginx $do &amp;gt; pod2.yaml&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;編輯 YAML 檔&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;apiVersion: v1
kind: Pod
metadata:
creationTimestamp: null
labels:
run: kucc1
name: kucc1
spec:
containers:
- image: nginx
name: kucc1
resources: {}
- image: redis # add and change
name: kucc1-1 # add
- image: memcached # add and change
name: kucc1-2 # add
- image: consul # add and change
name: kucc1-3 # add
dnsPolicy: ClusterFirst
restartPolicy: Always
status: {}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;產生 pod&lt;/p&gt;
&lt;p&gt;&lt;font color=red&gt;$ kubectl apply -f pod2.yaml&lt;/font&gt;&lt;/p&gt;
&lt;h2&gt;4. CPU&lt;span class="hx:absolute hx:-mt-20" id="4-cpu"&gt;&lt;/span&gt;
&lt;a href="#4-cpu" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;From the pod label &lt;code&gt;name=cpu-loader&lt;/code&gt;,find pods running high CPU workloads and write the name of the pod consuming most CPU to the file &lt;code&gt;/opt/KUTR00401/KURT00401.txt&lt;/code&gt; (while alreay exists).&lt;/p&gt;
&lt;h3&gt;環境準備&lt;span class="hx:absolute hx:-mt-20" id="環境準備-1"&gt;&lt;/span&gt;
&lt;a href="#%e7%92%b0%e5%a2%83%e6%ba%96%e5%82%99-1" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;$ kubectl run nginx --image=quay.io/cloudwalker/nginx --labels=name=cpu-loader
$ kubectl run nginx2 --image=quay.io/cloudwalker/nginx --labels=name=cpu-loader
$ k run alpine1 --image=quay.io/cloudwalker/nginx --labels=name=cpu-loader -- yes &amp;gt; /dev/null&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3&gt;解答&lt;span class="hx:absolute hx:-mt-20" id="解答-4"&gt;&lt;/span&gt;
&lt;a href="#%e8%a7%a3%e7%ad%94-4" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;font color=red&gt;$ kubectl top pod -l &amp;ldquo;name=cpu-loader&amp;rdquo; &amp;ndash;sort-by=cpu -A&lt;/font&gt;&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;NAME CPU(cores) MEMORY(bytes)
alpine1 9m 0Mi
nginx 0m 6Mi
nginx2 0m 2Mi&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;font color=red&gt;$ echo &amp;ldquo;alpine1&amp;rdquo; &amp;gt; /opt/KUTR00401/KURT00401.txt&lt;/font&gt;&lt;/p&gt;
&lt;h2&gt;5. NodeSelector&lt;span class="hx:absolute hx:-mt-20" id="5-nodeselector"&gt;&lt;/span&gt;
&lt;a href="#5-nodeselector" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Schedule a pod as follows:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;name: nginx-kusc00401&lt;/li&gt;
&lt;li&gt;Image: nginx&lt;/li&gt;
&lt;li&gt;Node selector: disk=spinning&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;解答&lt;span class="hx:absolute hx:-mt-20" id="解答-5"&gt;&lt;/span&gt;
&lt;a href="#%e8%a7%a3%e7%ad%94-5" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;產生 YAML 檔&lt;/p&gt;
&lt;font color=red&gt;
$ kubectl get nodes --show-labels | grep "disk=spinning"
&lt;p&gt;$ kubectl label node w1 disk=spinning
$ kubectl run nginx-kusc00401 &amp;ndash;image=nginx &amp;ndash;dry-run=client -o yaml &amp;gt; pod.yaml
&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;編輯 YAML 檔&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;apiVersion: v1
kind: Pod
metadata:
creationTimestamp: null
labels:
run: nginx-kusc00401
name: nginx-kusc00401
spec:
containers:
- image: nginx
name: nginx-kusc00401
resources: {}
dnsPolicy: ClusterFirst
restartPolicy: Always
nodeSelector: # add
disk: spinning # add
status: {}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;產生 pod&lt;/p&gt;
&lt;p&gt;&lt;font color=red&gt;$ kubectl apply -f pod.yaml&lt;/font&gt;
檢查&lt;/p&gt;
&lt;p&gt;&lt;code&gt;$ kubectl get pod -o wide&lt;/code&gt;&lt;/p&gt;
&lt;h2&gt;6. Kubernetes 升級&lt;span class="hx:absolute hx:-mt-20" id="6-kubernetes-升級"&gt;&lt;/span&gt;
&lt;a href="#6-kubernetes-%e5%8d%87%e7%b4%9a" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Given an existing Kubernetes cluster running version 1.24.1, upgrade all of Kubernetes control plane and node components on the master node only to version 1.24.2&lt;/p&gt;
&lt;p&gt;You are also expected to upgrade kubelet and kubectl on the master node.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Be sure to drain the master node before upgrading it and uncordon it after the upgrade.
Do not upgrade the worker nodes, etcd, the container manager, the CNI plugin, the DNS service or any other addons.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;考試環境
3台機器:1台 master 2台 worker&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;drain：進入維護模式，會把這台 nodes 上的 pod 趕到別台 node 上，有人照顧(例如:deployment)的 pod 才會在別台 node 產生，沒人照顧的 pod 就會被刪除。&lt;/li&gt;
&lt;li&gt;uncordon：解除維護模式，之後就可以在這台 node 產生 pod，但被趕走的 pod 並不會在回到這台 node 上。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;解答&lt;/strong&gt;
&lt;a
href="https://kubernetes.io/docs/tasks/administer-cluster/kubeadm/kubeadm-upgrade/"target="_blank" rel="noopener"&gt;文件1&lt;/a&gt;
&lt;a
href="https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm-upgrade/#kubeadm-upgrade-guidance"target="_blank" rel="noopener"&gt;文件2&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;K8S DOC 查詢關鍵字 : &lt;code&gt;upgrading kubeadm&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;找 &lt;code&gt;Upgrading kubeadm clusters | Kubernetes&lt;/code&gt; 這篇
對 Linux 套件 kubeadm 進行升級&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;# ssh 連進 control plane node
$ ssh m1
# 提權，因為考試的環境使用者沒有 sudo 的權限
$ sudo -i
# 這是 ubuntu 的更新套件清單命令
$ apt update
# 看當前主機可以升級 kubeadm 的那些版本
$ apt-cache madison kubeadm | grep 1.24.2
kubeadm | 1.24.2-00 | https://apt.kubernetes.io kubernetes-xenial/main amd64 Packages
# 將 kubeadm 升級至 1.24.2 版
# unhold ，因為現在要升級，解除鎖定
# hold ，讓系統 update 或 upgrade 的時候，忽略 hold 的套件，以後系統在 update upgrade 的時候就不會升級這些套件(鎖定版本)
# 這裡只是針對套件做升級而已，並沒有升級 kubernetes
# alpine 沒有鎖定版本的功能，只要 upgrade 就全部升級了
$ apt-mark unhold kubeadm &amp;amp;&amp;amp; \
apt-get update &amp;amp;&amp;amp; apt-get install -y kubeadm=1.24.2-00 &amp;amp;&amp;amp; \
apt-mark hold kubeadm
# 檢查下載下來的 kubeadm 版本
$ kubeadm version&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;# Drain control-plane node
$ kubectl drain m1 --ignore-daemonsets
# 已成功 drain m1
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
m1 Ready,SchedulingDisabled control-plane 51m v1.24.1
w1 Ready &amp;lt;none&amp;gt; 51m v1.24.1
w2 Ready &amp;lt;none&amp;gt; 51m v1.24.1&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;kubeadm upgrade&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;#檢查下載下來的 kubeadm 版本
$ kubeadm version&lt;/p&gt;
&lt;p&gt;#將 kubeadm 升級至指定版本 : 1.24.2，可以不用打&lt;/p&gt;
&lt;p&gt;&lt;font color=red&gt;$ sudo kubeadm upgrade apply v1.24.2 &amp;ndash;etcd-upgrade=false&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;$ kubectl apply -f pod.yaml&lt;/font&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;成功後，會看到的螢幕輸出&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;[upgrade/successful] SUCCESS! Your cluster was upgraded to &amp;#34;v1.24.2&amp;#34;. Enjoy!
[upgrade/kubelet] Now that your control plane is upgraded, please proceed with upgrading your kubelets if you haven&amp;#39;t already done so.&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Upgrade kubelet and kubectl&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;$ apt-mark unhold kubelet kubectl &amp;amp;&amp;amp; \
apt-get update &amp;amp;&amp;amp; apt-get install -y kubelet=1.24.2-00 kubectl=1.24.2-00 &amp;amp;&amp;amp; \
apt-mark hold kubelet kubectl&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Restart the kubelet&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;# Reload systemd manager configuration
$ systemctl daemon-reload
# 將 kubelet 重啟
$ systemctl restart kubelet
# 檢查 kubelet 狀態
$ systemctl status kubelet&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;回到 bigred&lt;/li&gt;
&lt;li&gt;Uncordon the node&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;# Bring the node back online by marking it schedulable
$ kubectl uncordon m1
檢查 node 狀態&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;code&gt;$ kubectl get nodes&lt;/code&gt;&lt;/p&gt;
&lt;h2&gt;7. Service&lt;span class="hx:absolute hx:-mt-20" id="7-service"&gt;&lt;/span&gt;
&lt;a href="#7-service" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Reconfigure the existing deployment &lt;code&gt;front-end&lt;/code&gt; and add a port specifiction named http exposing port &lt;code&gt;80/tcp&lt;/code&gt; of the existing container &lt;code&gt;nginx&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Create a new service named &lt;code&gt;front-end-svc&lt;/code&gt; exposing the container port &lt;code&gt;http&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Configure the new service to also expose the individual Pods via a NodePort on the nodes on which they are scheduled.&lt;/p&gt;
&lt;h3&gt;解答&lt;span class="hx:absolute hx:-mt-20" id="解答-6"&gt;&lt;/span&gt;
&lt;a href="#%e8%a7%a3%e7%ad%94-6" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;img src="https://i.imgur.com/eULjIhy.jpg" alt="" loading="lazy" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://i.imgur.com/dUg3sEa.png" alt="" loading="lazy" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://i.imgur.com/Vn0PEwh.png" alt="" loading="lazy" /&gt;&lt;/p&gt;
&lt;p&gt;參考文章：https://blog.cptsai.com/2020/11/15/k8s-external-traffic-policy/&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;K8S DOC 查詢關鍵字 : &lt;code&gt;nodeport yaml&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;找 &lt;code&gt;Connecting Applications with Services | Kubernetes&lt;/code&gt; 這篇&lt;/li&gt;
&lt;li&gt;&lt;code&gt;service/networking/nginx-secure-app.yaml&lt;/code&gt; 這個 YAML 檔&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;匯出 YAML 檔
&lt;font color=red&gt;$ kubectl get deploy front-end -o yaml &amp;gt; deploy.yaml&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;編輯 YAML 檔&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;apiVersion: apps/v1
kind: Deployment
......
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- name: http # add
protocol: TCP # add
containerPort: 80 # add&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;font color=red&gt;$ k get pod &amp;ndash;show-labels&lt;/font&gt;&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;front-end-6bc5dc8cbb-mv7hb 1/1 Running 0 33m app=front-end,pod-template-hash=6bc5dc8cbb&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;重新建立&lt;/p&gt;
&lt;p&gt;&lt;font color=red&gt;$ kubectl replace -f deploy.yaml &amp;ndash;force&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;編輯 Service YAML 檔&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;# externalTrafficPolicy: Local 預設是 Cluster，Local 代表這個 node 要有 pod 才能透過 nodeport 連進來
apiVersion: v1
kind: Service
metadata:
name: front-end-svc
# labels: # remove
# run: my-nginx # remove
spec:
type: NodePort
externalTrafficPolicy: Local
# internalTrafficPolicy: Local # 不確定，看文章
ports:
- port: 80
targetPort: 80
protocol: TCP
name: http
# - port: 443 # remove
# protocol: TCP # remove
# name: https # remove
selector:
run: front-end # 看考試時的標籤&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;產生 Service&lt;/p&gt;
&lt;p&gt;&lt;font color=red&gt;$ kubectl apply -f srv.yaml&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;用命令產生&lt;/strong&gt;
&lt;font color=red&gt;$ kubectl expose deployment front-end &amp;ndash;port=80 &amp;ndash;target-port=80 &amp;ndash;type=NodePort &amp;ndash;name=front-end-svc&lt;/font&gt;&lt;/p&gt;
&lt;h2&gt;8. RBAC&lt;span class="hx:absolute hx:-mt-20" id="8-rbac"&gt;&lt;/span&gt;
&lt;a href="#8-rbac" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Context
You have been asked to create a new ClusterRole for a deployment pipeline and bind it to a specific ServiceAccount scoped a specific namespace.&lt;/p&gt;
&lt;p&gt;Task
Create a new &lt;code&gt;ClusterRole&lt;/code&gt; named &lt;code&gt;deployment-clusterrole&lt;/code&gt; that only allows the creation of the following resource types:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Deployment&lt;/li&gt;
&lt;li&gt;StatefulSet&lt;/li&gt;
&lt;li&gt;DaemonSet
Create a new &lt;code&gt;ServiceAccount&lt;/code&gt; named &lt;code&gt;cicd-token&lt;/code&gt; in the existing namespace &lt;code&gt;app-team1&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Limited to namespace &lt;code&gt;app-team1&lt;/code&gt;, bind the new ClusterRole &lt;code&gt;deployment-clusterrole&lt;/code&gt; to the new ServiceAccount &lt;code&gt;cicd-token&lt;/code&gt;.&lt;/p&gt;
&lt;h3&gt;解答&lt;span class="hx:absolute hx:-mt-20" id="解答-7"&gt;&lt;/span&gt;
&lt;a href="#%e8%a7%a3%e7%ad%94-7" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;建立 clusterrole
&lt;font color=red&gt;$ kubectl create clusterrole deployment-clusterrole &amp;ndash;verb=create &amp;ndash;resource=Deployment,StatefulSet,DaemonSet&lt;/font&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;建立 ServiceAccount
&lt;font color=red&gt;$ kubectl create sa cicd-token -n app-team1&lt;/font&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;建立 rolebinding
&lt;font color=red&gt;$ kubectl create -n app-team1 rolebinding haha &lt;br&gt;
&amp;ndash;clusterrole=deployment-clusterrole &lt;br&gt;
&amp;ndash;serviceaccount=app-team1:cicd-token&lt;/font&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;檢查&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;$ k create deploy pipi -n app-team1 --image=quay.io/cloudwalker/alpine --as system:serviceaccount:app-team1:cicd-token
$ k get all -n app-team1
$ k delete deployment.apps/pipi -n app-team1 --as system:serviceaccount:app-team1:cicd-token
-Error from server (Forbidden): deployments.apps &amp;#34;pipi&amp;#34; is forbidden: User &amp;#34;system:serviceaccount:app-team1:cicd-token&amp;#34; cannot delete resource &amp;#34;deployments&amp;#34; in API group &amp;#34;apps&amp;#34; in the namespace &amp;#34;app-team1&amp;#34; &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;使用 can-i 檢查&lt;/p&gt;
&lt;font color=red&gt;
$ k auth can-i --list -n app-team1 --as system:serviceaccount:app-team1:cicd-token&lt;/font&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;$ k auth can-i create pod -n app-team1 --as system:serviceaccount:app-team1:cicd-token
no
$ k auth can-i create deploy -n app-team1 --as system:serviceaccount:app-team1:cicd-token
yes
$ k auth can-i create sts -n app-team1 --as system:serviceaccount:app-team1:cicd-token
yes
$ k auth can-i create ds -n app-team1 --as system:serviceaccount:app-team1:cicd-token
yes&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2&gt;9. Check Ready Node&lt;span class="hx:absolute hx:-mt-20" id="9-check-ready-node"&gt;&lt;/span&gt;
&lt;a href="#9-check-ready-node" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Check to see how many nodes are ready (not including nodes tained NoSchedule) and write the number to &lt;code&gt;/opt/KUSC00402/kusc00402.txt.&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;解答&lt;span class="hx:absolute hx:-mt-20" id="解答-8"&gt;&lt;/span&gt;
&lt;a href="#%e8%a7%a3%e7%ad%94-8" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;font color=red&gt;
$ kubectl get nodes | grep 'Ready'
&lt;p&gt;$ kubectl describe node | grep &amp;lsquo;NoSchedule&amp;rsquo;
$ echo &amp;ldquo;{數量}&amp;rdquo; &amp;gt; /opt/KUSC00402/kusc00402.txt
&lt;/font&gt;&lt;/p&gt;
&lt;h2&gt;10. PVC&lt;span class="hx:absolute hx:-mt-20" id="10-pvc"&gt;&lt;/span&gt;
&lt;a href="#10-pvc" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Create a new &lt;code&gt;PersistentVolumeClaim&lt;/code&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Name: &lt;code&gt;pv-volume&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Class: &lt;code&gt;csi-hostpath-sc&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Capacity: &lt;code&gt;10Mi&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Create a new Pod which mounts the PersistentVolumeClaim as a volume:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Name: &lt;code&gt;web-server&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Image: &lt;code&gt;nginx&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Mount Path: &lt;code&gt;/usr/share/nginx/html&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Configure the new Pod to have &lt;code&gt;ReadWriteOnce&lt;/code&gt; access on the volume.&lt;/p&gt;
&lt;p&gt;Finally,using &lt;code&gt;kubectl edit&lt;/code&gt; or &lt;code&gt;kubectl patch&lt;/code&gt; expand the &lt;code&gt;PersistentVolumeClaim&lt;/code&gt; to a capacity of &lt;code&gt;70Mi&lt;/code&gt; and ==record that change.==&lt;/p&gt;
&lt;h3&gt;解答&lt;span class="hx:absolute hx:-mt-20" id="解答-9"&gt;&lt;/span&gt;
&lt;a href="#%e8%a7%a3%e7%ad%94-9" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;K8S DOC 查詢關鍵字 : &lt;code&gt;pod pv&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;找 &lt;code&gt;Configure a Pod to Use a PersistentVolume for Storage | Kubernetes&lt;/code&gt; 這篇&lt;/li&gt;
&lt;li&gt;找 &lt;code&gt;pods/storage/pv-claim.yaml&lt;/code&gt; 這篇 YAML 檔&lt;/li&gt;
&lt;li&gt;和 &lt;code&gt;pods/storage/pv-pod.yaml&lt;/code&gt; 這篇 YAML 檔
編輯 PVC YANL 檔&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pv-volume # change
spec:
storageClassName: csi-hostpath-sc # change
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi # change&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;產生 PVC&lt;/p&gt;
&lt;p&gt;&lt;font color=red&gt;$ kubectl apply -f pvc.yaml&lt;/font&gt;
編輯 pod YAML&lt;/p&gt;
&lt;p&gt;&lt;font color=red&gt;$ kubectl run web-server &amp;ndash;image=nginx &amp;ndash;dry-run=client -o yaml &amp;gt; pod.yaml&lt;/font&gt;&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;apiVersion: v1
kind: Pod
metadata:
name: web-server # change
spec:
volumes: # add
- name: task-pv-storage # add
persistentVolumeClaim: # add
claimName: pv-volume # change
containers:
- name: task-pv-container
image: nginx
ports:
- containerPort: 80
name: &amp;#34;http-server&amp;#34;
volumeMounts: # add
- mountPath: &amp;#34;/usr/share/nginx/html&amp;#34; # add
name: task-pv-storage # add&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;產生 Pod
&lt;font color=red&gt;$ kubectl apply -f pod.yaml&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;將 PVC 的 capacity 調成 70Mi
用 nano 編輯
&lt;font color=red&gt;$ export KUBE_EDITOR=nano&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;修改 YAML 檔，將 capacity 設為 70Mi
kubectl get pvc pv-volume&lt;/p&gt;
&lt;p&gt;==記得加 record==
&lt;font color=red&gt;$ k edit pvc pv-volume &amp;ndash;record&lt;/font&gt;&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;#檢查
$ k get pvc pv-volume&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2&gt;11. Pod Logs&lt;span class="hx:absolute hx:-mt-20" id="11-pod-logs"&gt;&lt;/span&gt;
&lt;a href="#11-pod-logs" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Monitor the logs of pod &lt;code&gt;bar&lt;/code&gt; and:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Extract log lines corresponding to error &lt;code&gt;unable-to-access-website&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Write them to &lt;code&gt;/opt/KUTR00101/bar&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;解答&lt;span class="hx:absolute hx:-mt-20" id="解答-10"&gt;&lt;/span&gt;
&lt;a href="#%e8%a7%a3%e7%ad%94-10" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;font color=red&gt;
$ kubectl logs bar | grep 'unable-to-access-website' &gt; /opt/KUTR00101/bar
&lt;/font&gt;
&lt;h2&gt;12. PV&lt;span class="hx:absolute hx:-mt-20" id="12-pv"&gt;&lt;/span&gt;
&lt;a href="#12-pv" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;題型 1:
Create a persistent volume with name &lt;code&gt;app-config&lt;/code&gt;, of capacity &lt;code&gt;1Gi&lt;/code&gt; and access mode &lt;code&gt;ReadOnlyMany&lt;/code&gt;, the type of volume is &lt;code&gt;hostPath&lt;/code&gt; and its location is &lt;code&gt;/svc/app-config&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;題型 2：
Create a persistent volume with name &lt;code&gt;app-config&lt;/code&gt;, of capacity &lt;code&gt;2Gi&lt;/code&gt; and access mode &lt;code&gt;ReadWriteMany&lt;/code&gt;, the type of volume is &lt;code&gt;hostPath&lt;/code&gt; and its location is &lt;code&gt;/srv/app-config&lt;/code&gt;.&lt;/p&gt;
&lt;h3&gt;題型 1: 解答&lt;span class="hx:absolute hx:-mt-20" id="題型-1-解答"&gt;&lt;/span&gt;
&lt;a href="#%e9%a1%8c%e5%9e%8b-1-%e8%a7%a3%e7%ad%94" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;K8S DOC 查詢關鍵字 : pod pv
找 &lt;code&gt;Configure a Pod to Use a PersistentVolume for Storage | Kubernetes&lt;/code&gt; 這篇
找 &lt;code&gt;pods/storage/pv-volume.yaml&lt;/code&gt; 這篇 YAML 檔
編輯 PV YAML 檔&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;apiVersion: v1
kind: PersistentVolume
metadata:
name: app-config # change
# labels: # remove
# type: local # remove
spec:
# storageClassName: manual # remove
capacity:
storage: 1Gi # change
accessModes:
- ReadOnlyMany # change
hostPath:
path: &amp;#34;/svc/app-config&amp;#34; # change&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;產生 PV&lt;/p&gt;
&lt;p&gt;&lt;font color=red&gt;$ kubectl apply -f pv.yaml&lt;/font&gt;&lt;/p&gt;
&lt;h3&gt;題型 2: 解答&lt;span class="hx:absolute hx:-mt-20" id="題型-2-解答"&gt;&lt;/span&gt;
&lt;a href="#%e9%a1%8c%e5%9e%8b-2-%e8%a7%a3%e7%ad%94" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;編輯 PV YAML 檔&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;apiVersion: v1
kind: PersistentVolume
metadata:
name: app-config # change
# labels: # remove
# type: local # remove
spec:
# storageClassName: manual # remove
capacity:
storage: 2Gi # change
accessModes:
- ReadWriteMany # change
hostPath:
path: &amp;#34;/srv/app-config&amp;#34; # change&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;產生 PV&lt;/p&gt;
&lt;p&gt;&lt;font color=red&gt;$ kubectl apply -f pv.yaml&lt;/font&gt;&lt;/p&gt;
&lt;h2&gt;13. cordon &amp;amp; drain&lt;span class="hx:absolute hx:-mt-20" id="13-cordon--drain"&gt;&lt;/span&gt;
&lt;a href="#13-cordon--drain" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Set the node named &lt;code&gt;ek8s-node-1&lt;/code&gt; as unavaliable and reschedule all pods running on it.&lt;/p&gt;
&lt;h3&gt;解答&lt;span class="hx:absolute hx:-mt-20" id="解答-11"&gt;&lt;/span&gt;
&lt;a href="#%e8%a7%a3%e7%ad%94-11" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;參考連結: &lt;a
href="https://kubernetes.io/docs/concepts/workloads/pods/disruptions/"target="_blank" rel="noopener"&gt;https://kubernetes.io/docs/concepts/workloads/pods/disruptions/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;#不可以在安排 pod 在這個 node 產生
&lt;font color=red&gt;$ kubectl cordon ek8s-node-1 &lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font color=red&gt;$ kubectl drain ek8s-node-1 &amp;ndash;ignore-daemonsets &amp;ndash;delete-emptydir&amp;ndash;data &amp;ndash;force&lt;/font&gt;
#把 pod 趕到別的 node
#&amp;ndash;ignore-daemonsets 忽略 DaemonSet 管理的 pod
#&amp;ndash;force 把沒有 controller 管理的 pod 刪除&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;Applying a Node Cordon
Cordoning a Node marks it as unavailable to the Kubernetes scheduler. The Node will be ineligible to host any new Pods subsequently added to your cluster.
Use the kubectl cordon command to place a cordon around a named Node:
$ kubectl cordon node-1
node/node-1 cordoned
Existing Pods already running on the Node won’t be affected by the cordon. They’ll remain accessible and will still be hosted by the cordoned Node.
You can check which of your Nodes are currently cordoned with the get nodes command:
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
node-1 Ready,SchedulingDisabled control-plane,master 26m v1.23.3
Cordoned nodes appear with the SchedulingDisabled status.
Draining a Node
The next step is to drain remaining Pods out of the Node. This procedure will evict the Pods so they’re rescheduled onto other Nodes in your cluster. Pods are allowed to gracefully terminate before they’re forcefully removed from the target Node.
Run kubectl drain to initiate a drain procedure. Specify the name of the Node you’re taking out for maintenance:
# drain 完後要等一下子讓 pod 在別的 node 產生
$ kubectl drain node-1
node/node-1 already cordoned
evicting pod kube-system/storage-provisioner
evicting pod default/nginx-7c658794b9-zszdd
evicting pod kube-system/coredns-64897985d-dp6lx
pod/storage-provisioner evicted
pod/nginx-7c658794b9-zszdd evicted
pod/coredns-64897985d-dp6lx evicted
node/node-1 evicted
The drain procedure first cordons the Node if you’ve not already placed one manually. It will then evict running Kubernetes workloads by safely rescheduling them to other Nodes in your cluster.
You can shutdown or destroy the Node once the drain’s completed. You’ve freed the Node from its responsibilities to your cluster. The cordon provides an assurance that no new workloads have been scheduled since the drain completed.&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3&gt;檢查&lt;span class="hx:absolute hx:-mt-20" id="檢查"&gt;&lt;/span&gt;
&lt;a href="#%e6%aa%a2%e6%9f%a5" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;code&gt;$ kubectl get node&lt;/code&gt;&lt;/p&gt;
&lt;h2&gt;14. Trobleshooting - kubelet 故障&lt;span class="hx:absolute hx:-mt-20" id="14-trobleshooting---kubelet-故障"&gt;&lt;/span&gt;
&lt;a href="#14-trobleshooting---kubelet-%e6%95%85%e9%9a%9c" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;A Kubernetes worker node, named &lt;code&gt;wk8s-node-0&lt;/code&gt; is in state &lt;code&gt;NotReady&lt;/code&gt;.
Investigate why this is the case, and perform an appropriate steps to bring the node to a Ready stat, ensuring that any changes are made permanent.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;You can ssh to the failed node using:
ssh wk8s-node-0
You can assume elevated privileges on the node with the following command:
sudo -i&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;解答&lt;span class="hx:absolute hx:-mt-20" id="解答-12"&gt;&lt;/span&gt;
&lt;a href="#%e8%a7%a3%e7%ad%94-12" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;#檢查
$ kubectl get nodes
# 連到 wk8s-node-0 這台 node
$ ssh wk8s-node-0
# 提權
$ sudo -i
# 檢查 kubelet 狀態
$ systemctl status kubelet
# 將 kubelet 重啟
$ systemctl start kubelet
# 將 kubelet 設為開機自動啟動
$ systemctl enable kubelet
# 檢查 kubelet 狀態
$ systemctl status kubelet&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2&gt;15. Sidecar&lt;span class="hx:absolute hx:-mt-20" id="15-sidecar"&gt;&lt;/span&gt;
&lt;a href="#15-sidecar" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Context
Without changing its existing containers, an existing Pod needs to be integrated into Kubernetes’s build-in logging architecture(e.g kubectl logs). Adding a streaming sidecar container is a good and common way to accomplish this requirement.&lt;/p&gt;
&lt;p&gt;Task
Add a busybox sidecar container to the existing Pod &lt;code&gt;big-corp-app&lt;/code&gt;.The new sidecar container has to run the following command:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;/bin/sh -c tail -n+1 -f /var/log/big-corp-app.log&lt;/code&gt;
Use a volume mount named &lt;code&gt;logs&lt;/code&gt; to make the file &lt;code&gt;/var/log/big-corp-app.log&lt;/code&gt; available to the sidecar container.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Don’t modify the existing container.
Don’t modify the path of the log file, both containers must access it at /var/log/bin-corp-app.log&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;解答&lt;span class="hx:absolute hx:-mt-20" id="解答-13"&gt;&lt;/span&gt;
&lt;a href="#%e8%a7%a3%e7%ad%94-13" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;原本的yaml 檔，已經存在&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;apiVersion: v1
kind: Pod
metadata:
name: big-corp-app
spec:
containers:
- name: big-corp-app
image: busybox
args:
- /bin/sh
- -c
- |
mkdir -p /var/log;
i=0;
while true;
do
echo &amp;#34;$(date) INFO $i&amp;#34; &amp;gt;&amp;gt; /var/log/big-corp-app.log;
i=$((i&amp;#43;1));
sleep 1;
done&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;測試：&lt;/strong&gt;
看 log 裡面沒有任何東西
&lt;code&gt;$ k logs big-corp-app&lt;/code&gt;&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;$ tail -n&amp;#43;1 -f aaa
這行命令是 tail 會一直去看 aaa 這個檔案
# -f (file)就是會一直去看檔案
範例
$ tail -n&amp;#43;1 -f aaa
eee
123
haha
yyy
開啟另一個終端機
$ echo eee &amp;gt;&amp;gt; aaa
$ echo 123 &amp;gt;&amp;gt; aaa
$ echo haha &amp;gt;&amp;gt; aaa
$ echo yyy &amp;gt;&amp;gt; aaa&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;再建一個 Container，名字叫 count-log，要去收集已經存在的 Container log 資訊，答案如下：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;答案：&lt;/strong&gt;
K8S DOC 查詢關鍵字 : &lt;code&gt;sidecar yaml&lt;/code&gt;
找 &lt;code&gt;Logging Architecture | Kubernetes&lt;/code&gt; 這篇
ctrl + f 搜尋 : streaming-
匯出 YAML 檔&lt;/p&gt;
&lt;p&gt;&lt;font color=red&gt;$ k get pod big-corp-app -o yaml &amp;gt; sidecar.yaml&lt;/font&gt;
編輯 YAML 檔，要刪除原本的 volumes&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;apiVersion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;v1&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;kind&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Pod&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;annotations&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;kubectl.kubernetes.io/last-applied-configuration&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="sd"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; {&amp;#34;apiVersion&amp;#34;:&amp;#34;v1&amp;#34;,&amp;#34;kind&amp;#34;:&amp;#34;Pod&amp;#34;,&amp;#34;metadata&amp;#34;:{&amp;#34;annotations&amp;#34;:{},&amp;#34;name&amp;#34;:&amp;#34;big-corp-app&amp;#34;,&amp;#34;namespace&amp;#34;:&amp;#34;default&amp;#34;},&amp;#34;spec&amp;#34;:{&amp;#34;containers&amp;#34;:[{&amp;#34;args&amp;#34;:[&amp;#34;/bin/sh&amp;#34;,&amp;#34;-c&amp;#34;,&amp;#34;mkdir -p /var/log;\ni=0;\nwhile true;\ndo\n echo \&amp;#34;$(date) INFO $i\&amp;#34; \u003e\u003e /var/log/big-corp-app.log;\n i=$((i+1));\n sleep 1;\ndone\n&amp;#34;],&amp;#34;image&amp;#34;:&amp;#34;quay.io/cloudwalker/busybox&amp;#34;,&amp;#34;name&amp;#34;:&amp;#34;big-corp-app&amp;#34;}]}}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;creationTimestamp&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;2022-09-29T14:47:24Z&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;big-corp-app&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;namespace&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;default&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;resourceVersion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;34289&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;uid&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;b8598b00-8c2c-4014-80f6-84fa7af04712&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;spec&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;containers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;args&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;/bin/sh&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- -&lt;span class="l"&gt;c&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="sd"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; mkdir -p /var/log;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; i=0;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; while true;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; do
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; echo &amp;#34;$(date) INFO $i&amp;#34; &amp;gt;&amp;gt; /var/log/big-corp-app.log;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; i=$((i+1));
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; sleep 1;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; done&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;quay.io/cloudwalker/busybox &lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;imagePullPolicy&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Always &lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;big-corp-app &lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;resources&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;{}&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;terminationMessagePath&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;/dev/termination-log&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;terminationMessagePolicy&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;File &lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;volumeMounts&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;mountPath&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;/var/run/secrets/kubernetes.io/serviceaccount &lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;kube-api-access-w2w4r &lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;readOnly&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;volumeMounts&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# add&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;logs &lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# add&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;mountPath&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;/var/log &lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# add&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;count-log &lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# add&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;busybox &lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# add&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;args&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="l"&gt;/bin/sh, -c, &amp;#39;tail -n+1 -f /var/log/big-corp-app.log&amp;#39;] &lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# add&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;volumeMounts&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# add&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;logs &lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# add&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;mountPath&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;/var/log &lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# add&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;volumes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# add&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;logs &lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# add&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;emptyDir&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;{}&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# add&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;dnsPolicy&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;ClusterFirst&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;enableServiceLinks&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;nodeName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;w1&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;preemptionPolicy&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;PreemptLowerPriority&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;priority&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;restartPolicy&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Always&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;schedulerName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;default-scheduler&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;securityContext&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;{}&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;serviceAccount&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;default&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;serviceAccountName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;default&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;terminationGracePeriodSeconds&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;30&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;tolerations&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;effect&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;NoExecute&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;node.kubernetes.io/not-ready&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;operator&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Exists&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;tolerationSeconds&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;300&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;effect&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;NoExecute&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;node.kubernetes.io/unreachable&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;operator&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Exists&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;tolerationSeconds&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;300&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;volumes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;kube-api-access-w2w4r &lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;projected&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;defaultMode&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;420&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;sources&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;serviceAccountToken&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;expirationSeconds&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;3607&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;token &lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;configMap&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;items&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;ca.crt &lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;ca.crt &lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;kube-root-ca.crt &lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;downwardAPI&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;items&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;fieldRef&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;apiVersion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;v1 &lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;fieldPath&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;metadata.namespace &lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;namespace &lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;conditions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;lastProbeTime&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;lastTransitionTime&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;2022-09-29T14:47:24Z&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;True&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Initialized&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;lastProbeTime&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;lastTransitionTime&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;2022-09-29T14:47:28Z&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;True&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Ready&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;lastProbeTime&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;lastTransitionTime&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;2022-09-29T14:47:28Z&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;True&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;ContainersReady&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;lastProbeTime&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;lastTransitionTime&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;2022-09-29T14:47:24Z&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;True&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;PodScheduled&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;containerStatuses&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;containerID&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;cri-o://a6a13dcf0b11f0e6fc22eb507b23cfde7360995d24af798e7630ba26ddebb6d1&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;quay.io/cloudwalker/busybox:latest&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;imageID&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;quay.io/cloudwalker/busybox@sha256:f3cfc9d0dbf931d3db4685ec659b7ac68e2a578219da4aae65427886e649b06b&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;lastState&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;{}&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;big-corp-app&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;ready&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;restartCount&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;started&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;state&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;running&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;startedAt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;2022-09-29T14:47:27Z&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;hostIP&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;192.168.61.241&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;phase&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Running&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;podIP&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;10.244.1.16&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;podIPs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;ip&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;10.244.1.16&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;qosClass&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;BestEffort&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;startTime&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;2022-09-29T14:47:24Z&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;產生pod
&lt;font color=red&gt;
$ kubectl replace -f 15.yaml &amp;ndash;force&lt;/p&gt;
&lt;p&gt;$ kubectl get pod big-corp-app
&lt;/font&gt;
檢查
&lt;code&gt;$ kubectl logs big-corp-app -c count-log&lt;/code&gt;&lt;/p&gt;
&lt;h2&gt;16.1 Ingress&lt;span class="hx:absolute hx:-mt-20" id="161-ingress"&gt;&lt;/span&gt;
&lt;a href="#161-ingress" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Create a new nginx Ingress resources as follows:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Name: &lt;code&gt;ping&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Namespace: &lt;code&gt;ing-internal&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Exposing service &lt;code&gt;hi&lt;/code&gt; on path &lt;code&gt;/hi&lt;/code&gt; using service port 5678&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;The avaliability of service hi can be checked using the following command,which should return hi:
curl -kL &amp;lt;INTERNAL_IP&amp;gt;/hi&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;環境準備&lt;span class="hx:absolute hx:-mt-20" id="環境準備-2"&gt;&lt;/span&gt;
&lt;a href="#%e7%92%b0%e5%a2%83%e6%ba%96%e5%82%99-2" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;安裝 metallb&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;$ wget -qO - https://raw.githubusercontent.com/metallb/metallb/v0.13.4/config/manifests/metallb-native.yaml | kubectl apply -f -&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;echo &amp;#39;
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
name: mlb1
namespace: metallb-system
spec:
addresses:
- 120.96.143.30-120.96.143.50
---
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
name: mlb1
namespace: metallb-system&amp;#39; | kubectl apply -f -&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;$ kubectl get pod -n metallb-system -o wide
$ kubectl get service -n ingress-nginx
$ kubectl get ingressclass
$ k run n1 --image=nginx -n ing-internal -l run=nginx
$ kg all -n ing-internal&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;安裝 ingress
&lt;code&gt;$ wget -qO - https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.3.0/deploy/static/provider/cloud/deploy.yaml | sed 's|name: nginx|name: ig1|g' | kubectl apply -f -&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;解答&lt;span class="hx:absolute hx:-mt-20" id="解答-14"&gt;&lt;/span&gt;
&lt;a href="#%e8%a7%a3%e7%ad%94-14" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;K8S DOC 查詢關鍵字 : &lt;code&gt;ingress&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;找 &lt;code&gt;Ingress | Kubernetes&lt;/code&gt; 這篇&lt;/li&gt;
&lt;li&gt;用第一個 YANL 檔
編輯 YAML 檔&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ping
annotations:
kubernetes.io/ingress.class: &amp;#34;nginx&amp;#34; # 加這行 ingress 就會有 address
nginx.ingress.kubernetes.io/rewrite-target: /
namespace: ing-internal
spec:
rules:
- http:
paths:
- path: /hi
pathType: Prefix
backend:
service:
name: hi
port:
number: 5678&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;產生 ingress&lt;/p&gt;
&lt;p&gt;&lt;font color=red&gt;$ k apply -f ingress.yaml&lt;/font&gt;
測試&lt;/p&gt;
&lt;p&gt;&lt;code&gt;$ curl -kL &amp;lt;INTERNAL_IP&amp;gt;/hi&lt;/code&gt;&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;$ curl -w &amp;#39;\n&amp;#39; --resolve k8s.org:80:120.96.143.30 http://k8s.org/hi&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2&gt;16.2 Kubernetes 1.25.0 版的 Ingress 範例操作&lt;span class="hx:absolute hx:-mt-20" id="162-kubernetes-1250-版的-ingress-範例操作"&gt;&lt;/span&gt;
&lt;a href="#162-kubernetes-1250-%e7%89%88%e7%9a%84-ingress-%e7%af%84%e4%be%8b%e6%93%8d%e4%bd%9c" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;$ kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.13.5/config/manifests/metallb-native.yaml&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;$ echo &amp;#39;
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
name: mlb1
namespace: metallb-system
spec:
addresses:
- 192.168.61.220-192.168.61.230&amp;#39; | kubectl apply -f -&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;$ curl https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3 | bash
$ helm repo add nginx-stable https://helm.nginx.com/stable; helm repo update
$ helm search repo nginx-stable
$ helm install ig1 nginx-stable/nginx-ingress --set controller.ingressClass=&amp;#34;ig1&amp;#34;
$ wget -qO - http://www.oc99.org/kube/apple-banana.yaml | kubectl apply -f -&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;$ nano ig1.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ig1
annotations:
kubernetes.io/ingress.class: ig1
spec:
rules:
- host: ig1.k8s.org
http:
paths:
- path: /apple
pathType: Prefix
backend:
service:
name: apple-service
port:
number: 5678
- path: /banana
pathType: Prefix
backend:
service:
name: banana-service
port:
number: 5678&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;$ kubectl apply -f ig1.yaml
$ kubectl get ingress
NAME CLASS HOSTS ADDRESS PORTS AGE
ig1 &amp;lt;none&amp;gt; ig1.k8s.org 120.96.143.240 80 25m
$ curl -k -H &amp;#34;Host: ig1.k8s.org&amp;#34; http://120.96.143.240/apple/
apple&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2&gt;17. Etcd （7%）&lt;span class="hx:absolute hx:-mt-20" id="17-etcd-7"&gt;&lt;/span&gt;
&lt;a href="#17-etcd-7" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;First, create a snapshot of the existing etcd instance running at &lt;code&gt;https://127.0.0.1:2379&lt;/code&gt;, saving the snapshot to &lt;code&gt;/var/lib/backup/etcd-snapshot.db&lt;/code&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Creating a snapshot of the given instance is expected to complete in seconds.
If the operation seems to hang, something’s likely wrong with your command. Use CTRL+C to cancel the operation and try again.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Next, restore an existing, previous snapshot located at &lt;code&gt;/var/lib/backup/etcd-snapshot-previous.db.&lt;/code&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The following TLS certificates/key are supplied for connecting to the server with etcdctl:
CA certificate: /opt/KUIN0061/ca.crt
Client certificate: /opt/KUIN0061/etcd-client.crt
Client key: /opt/KUIN0061/etcd-client.key&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;環境準備&lt;span class="hx:absolute hx:-mt-20" id="環境準備-3"&gt;&lt;/span&gt;
&lt;a href="#%e7%92%b0%e5%a2%83%e6%ba%96%e5%82%99-3" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;ubuntu 安裝 etcdctl 命令
&lt;code&gt;$ sudo apt install etcd-client&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;alpine 安裝 etcdctl 命令&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;$ sudo apk add etcd-ctl \
--no-cache \
--update-cache \
--allow-untrusted \
--repository http://dl-cdn.alpinelinux.org/alpine/edge/testing&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3&gt;解答&lt;span class="hx:absolute hx:-mt-20" id="解答-15"&gt;&lt;/span&gt;
&lt;a href="#%e8%a7%a3%e7%ad%94-15" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;K8S DOC 查詢關鍵字 : &lt;code&gt;etcd backup&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;點選 &lt;code&gt;Operating etcd clusters for Kubernetes | Kubernetes&lt;/code&gt; 這篇文章&lt;/li&gt;
&lt;li&gt;進取之後點藍藍的 &lt;code&gt;backup&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;將 etcd 備份 (考試環境，確認 master node 有無 etcdctl 命令，如沒有則在一開始的終端機做題 )&lt;/li&gt;
&lt;li&gt;參考文章 : &lt;a
href="https://github.com/bmuschko/cka-crash-course/blob/master/exercises/04-etcd-backup-restore/solution/solution.md"target="_blank" rel="noopener"&gt;https://github.com/bmuschko/cka-crash-course/blob/master/exercises/04-etcd-backup-restore/solution/solution.md&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;# 如果題目沒有給檔案路徑就要到 etcd.yaml 這個檔案去找
$ sudo cat /etc/kubernetes/manifests/etcd.yaml | grep file
- --cert-file=/etc/kubernetes/pki/etcd/server.crt # 這行
- --key-file=/etc/kubernetes/pki/etcd/server.key # 這行
- --peer-cert-file=/etc/kubernetes/pki/etcd/peer.crt
- --peer-key-file=/etc/kubernetes/pki/etcd/peer.key
- --peer-trusted-ca-file=/etc/kubernetes/pki/etcd/ca.crt
- --trusted-ca-file=/etc/kubernetes/pki/etcd/ca.crt # 這行
seccompProfile:&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;使用題目給的檔案路徑&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;$ ETCDCTL_API=3 etcdctl --endpoints=https://127.0.0.1:2379 \
--cacert=/opt/KUIN0061/ca.crt \
--cert=/opt/KUIN0061/etcd-client.crt \
--key=/opt/KUIN0061/etcd-client.key \
snapshot save /var/lib/backup/etcd-snapshot.db&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;檢查 save 有沒有成功可以下以下這行指令&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;$ sudo ETCDCTL_API=3 etcdctl --write-out=table snapshot status /var/lib/backup/etcd-snapshot.db&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;將 etcd 還原
&lt;font color=red&gt;save、restore 在本機操作&lt;/font&gt;&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;$ ETCDCTL_API=3 etcdctl --endpoints=https://127.0.0.1:2379 \
--data-dir /var/lib/etcd-1 \ # 要加 data-dir 這個參數
--cacert=/opt/KUIN0061/ca.crt \
--cert=/opt/KUIN0061/etcd-client.crt \
--key=/opt/KUIN0061/etcd-client.key \
snapshot restore /var/lib/backup/etcd-snapshot-previous.db&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;font color=red&gt;修改 yaml 檔要 ssh 進去 master 機&lt;/font&gt;&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;# 修改 etcd.yaml 檔案
$ sudo nano /etc/kubernetes/manifests/etcd.yaml
........
volumeMounts:
- mountPath: /var/lib/etcd
name: etcd-data
- mountPath: /etc/kubernetes/pki/etcd
name: etcd-certs
hostNetwork: true
priorityClassName: system-node-critical
securityContext:
seccompProfile:
type: RuntimeDefault
volumes:
- hostPath:
path: /etc/kubernetes/pki/etcd
type: DirectoryOrCreate
name: etcd-certs
- hostPath:
path: /var/lib/etcd-1 # 修改路徑
type: DirectoryOrCreate
name: etcd-data
status: {}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;檢查&lt;/p&gt;
&lt;p&gt;&lt;code&gt;$ kubectl get pod&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;alpine etcd 備份&lt;span class="hx:absolute hx:-mt-20" id="alpine-etcd-備份"&gt;&lt;/span&gt;
&lt;a href="#alpine-etcd-%e5%82%99%e4%bb%bd" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;$ ETCDCTL_API=3 etcdctl --endpoints=https://127.0.0.1:2379 \
--cacert=/opt/KUIN0061/ca.crt \
--cert=/opt/KUIN0061/etcd-client.crt \
--key=/opt/KUIN0061/etcd-client.key \
snapshot save /var/lib/backup/etcd-snapshot.db&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;將 etcd 還原&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;$ ETCDCTL_API=3 etcdctl --endpoints=https://127.0.0.1:2379 \
--data-dir /var/lib/etcd-1 \ # 要加 data-dir 這個參數
--cacert=/opt/KUIN0061/ca.crt \
--cert=/opt/KUIN0061/etcd-client.crt \
--key=/opt/KUIN0061/etcd-client.key \
snapshot restore /var/lib/backup/etcd-snapshot.db&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;# 修改 etcd.yaml 檔案
$ sudo nano /etc/kubernetes/manifests/etcd.yaml
........
volumeMounts:
- mountPath: /var/lib/etcd
name: etcd-data
- mountPath: /etc/kubernetes/pki/etcd
name: etcd-certs
hostNetwork: true
priorityClassName: system-node-critical
securityContext:
seccompProfile:
type: RuntimeDefault
volumes:
- hostPath:
path: /etc/kubernetes/pki/etcd
type: DirectoryOrCreate
name: etcd-certs
- hostPath:
path: /var/lib/etcd-1 # 修改路徑
type: DirectoryOrCreate
name: etcd-data
status: {}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;檢查&lt;/p&gt;
&lt;p&gt;&lt;code&gt;$ kubectl get pod&lt;/code&gt;&lt;/p&gt;
&lt;h6&gt;tags: &lt;code&gt;CKA&lt;/code&gt;&lt;span class="hx:absolute hx:-mt-20" id="tags-cka"&gt;&lt;/span&gt;
&lt;a href="#tags-cka" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h6&gt;</description></item><item><title>J509教室windows電腦設定</title><link>https://blog.kubeantony.com/archive/learning-notes/j509%E6%95%99%E5%AE%A4windows%E9%9B%BB%E8%85%A6%E8%A8%AD%E5%AE%9A/</link><pubDate>Sun, 08 May 2022 03:56:44 +0800</pubDate><guid>https://blog.kubeantony.com/archive/learning-notes/j509%E6%95%99%E5%AE%A4windows%E9%9B%BB%E8%85%A6%E8%A8%AD%E5%AE%9A/</guid><description>
&lt;h2&gt;系統環境設定&lt;span class="hx:absolute hx:-mt-20" id="系統環境設定"&gt;&lt;/span&gt;
&lt;a href="#%e7%b3%bb%e7%b5%b1%e7%92%b0%e5%a2%83%e8%a8%ad%e5%ae%9a" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;h3&gt;設定BIOS，實體個人電腦復電自動開機&lt;span class="hx:absolute hx:-mt-20" id="設定bios實體個人電腦復電自動開機"&gt;&lt;/span&gt;
&lt;a href="#%e8%a8%ad%e5%ae%9abios%e5%af%a6%e9%ab%94%e5%80%8b%e4%ba%ba%e9%9b%bb%e8%85%a6%e5%be%a9%e9%9b%bb%e8%87%aa%e5%8b%95%e9%96%8b%e6%a9%9f" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;按下電源鍵，啟動 Windows 主機，於開機畫面出現hp圖示時，按 F10&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;img src="https://i.imgur.com/fGnU2I2.png" alt="" loading="lazy" /&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ol start="2"&gt;
&lt;li&gt;輸入密碼: &lt;img src="https://i.imgur.com/48anyad.png" alt="" loading="lazy" /&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;img src="https://i.imgur.com/aVOimqv.jpg" alt="" loading="lazy" /&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ol start="3"&gt;
&lt;li&gt;按鍵盤上的向右鍵，選到&amp;quot;Advanced&amp;quot; &amp;raquo;&amp;gt; &amp;ldquo;在Power-On Option&amp;quot;上按Enter鍵&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;img src="https://i.imgur.com/couFnga.jpg" alt="" loading="lazy" /&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ol start="4"&gt;
&lt;li&gt;按往下，選到After Power Loss ，利用往左或往右鍵，選為On
&lt;ul&gt;
&lt;li&gt;選好後，按F10儲存&lt;/li&gt;
&lt;li&gt;再按一次F10&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;img src="https://i.imgur.com/40hnQ1F.png" alt="" loading="lazy" /&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ol start="5"&gt;
&lt;li&gt;在&amp;quot;Save change and Exit&amp;quot;選項上按Enter&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;img src="https://i.imgur.com/jk4CYre.png" alt="" loading="lazy" /&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ol start="6"&gt;
&lt;li&gt;在&amp;quot;Yes&amp;quot;的地方按Enter鍵， 儲存設定更改
&lt;ul&gt;
&lt;li&gt;系統會自動重新開機&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;img src="https://i.imgur.com/GzGUDVh.png" alt="" loading="lazy" /&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;設定BIOS，啟動CPU的VT-x&lt;span class="hx:absolute hx:-mt-20" id="設定bios啟動cpu的vt-x"&gt;&lt;/span&gt;
&lt;a href="#%e8%a8%ad%e5%ae%9abios%e5%95%9f%e5%8b%95cpu%e7%9a%84vt-x" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;選到Security &amp;raquo;&amp;gt; System Security &amp;raquo;&amp;gt; Virtualization Technology (VTx) &amp;raquo; enable &amp;raquo;&amp;gt; F10 &amp;raquo;&amp;gt; F10 &amp;raquo;&amp;gt; Enter鍵
&lt;img src="https://i.imgur.com/YfYH5ri.jpg" alt="" loading="lazy" /&gt;
&lt;img src="https://i.imgur.com/AVhgQBE.jpg" alt="" loading="lazy" /&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;SysReturn Deluxe還原軟體派送&lt;span class="hx:absolute hx:-mt-20" id="sysreturn-deluxe還原軟體派送"&gt;&lt;/span&gt;
&lt;a href="#sysreturn-deluxe%e9%82%84%e5%8e%9f%e8%bb%9f%e9%ab%94%e6%b4%be%e9%80%81" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;派送的意思，就是直接拷貝發送端的機器裡面所有的資料和環境設定，拷貝過後的機器，基本上裡面的資料和環境設定都會和發送端相同。&lt;/p&gt;
&lt;p&gt;==&lt;strong&gt;超級注意:派送之前要記好發送端以及接收端的網路IP位址，以及是靜態還是動態，子網路遮罩多少，最後還有gateway也要記起來&lt;/strong&gt;==&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;拔掉教室右前方導師機左邊型號為:Zyxel GS1900-48的Switch上面&lt;strong&gt;編號1&lt;/strong&gt;的孔的網路線
&lt;img src="https://i.imgur.com/dsMxq52.jpg" alt="" loading="lazy" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;確認教室的windows電腦&lt;strong&gt;不能上網&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;將&lt;strong&gt;發送端&lt;/strong&gt;的windows電腦重新開機&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;打開命令提示字元(CMD)&lt;/li&gt;
&lt;li&gt;執行&lt;code&gt;shutdown -r -t 1&lt;/code&gt; #電腦將在1秒後重新開機&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;看完內容再動作&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;在電腦開機畫面跑到DHCP時，按ESC鍵
&lt;img src="https://i.imgur.com/Cifcy1E.jpg" alt="" loading="lazy" /&gt;&lt;/li&gt;
&lt;li&gt;看到螢幕顯示變成藍畫面時，立刻按下HOME鍵
&lt;img src="https://i.imgur.com/QOQ9Uu9.jpg" alt="" loading="lazy" /&gt;
&lt;blockquote&gt;
&lt;p&gt;HOME鍵在Delete鍵的右上方
&lt;img src="https://i.imgur.com/yYaMzOa.jpg" alt="" loading="lazy" /&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;輸入還原密碼: cc8050
&lt;img src="https://i.imgur.com/OBsydW7.jpg" alt="" loading="lazy" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;利用鍵盤上的向右鍵，移動到&amp;rdquo;&lt;strong&gt;拷貝工具&lt;/strong&gt;&amp;quot;，然後按下Enter鍵
&lt;img src="https://i.imgur.com/ttSuPu4.jpg" alt="" loading="lazy" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;按下Enter鍵後，畫面會變黑色的，左上角會有數字在倒數，是正常的
&lt;img src="https://i.imgur.com/sbNslbv.jpg" alt="" loading="lazy" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;用滑鼠選擇發送端後，&lt;strong&gt;不要按確定&lt;/strong&gt;，直接點選上方的PXE伺服器
&lt;img src="https://i.imgur.com/Pkpf3Zg.jpg" alt="" loading="lazy" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;輸入
本機IP位址: 192.168.1.?(依當時發送端決定)&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;IP位址，192.168.1.?~192.168.1.?(依當時要還原的機器IP範圍是多少，
假設要還原192.168.1.1~192.168.1.3，這3台電腦，
那IP位址就是填192.168.1.1~192.168.1.3
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;子網路遮罩: 255.255.255.0
以上都填好後。移動滑鼠按下&amp;quot;啟動&amp;quot;
&lt;img src="https://i.imgur.com/pwY8Nsp.jpg" alt="" loading="lazy" /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;再次確認
&lt;ul&gt;
&lt;li&gt;是否有拔掉把教室右前方導師機左邊型號為:Zyxel GS1900-48的Switch上面&lt;strong&gt;編號1&lt;/strong&gt;的埠的網路線&lt;/li&gt;
&lt;li&gt;教室的電腦都不能上網&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;按確定
&lt;img src="https://i.imgur.com/nh0dfLD.jpg" alt="" loading="lazy" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;此時會進到對拷的設定，可以看到教室裡的所有電腦，哪些是離線的，哪些有上線，可以透過滑鼠在標題中不同的欄位上按一下調整順序
&lt;img src="https://i.imgur.com/QuEFNsP.jpg" alt="" loading="lazy" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;將接收端的windows電腦，進行重新開機&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;注意開機畫面要有以下畫面，才會進到對拷的設定&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt; Loading NetCopy from PXE...
Loading bzImage......
Loading linux.gz...................Ready&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;img src="https://i.imgur.com/CD37URu.jpg" alt="" loading="lazy" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;如果成功進到對拷畫面可跳過這個步驟，如果沒有以上畫面，直接進到windows的桌面，此時要再進行一次重新開機，這次要進到BIOS做設定&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;一樣在開機畫面出現hp時，就可以多按幾次F10&lt;/li&gt;
&lt;li&gt;進去以後按向右鍵，選到&amp;quot;advanced&amp;quot;後，按向下鍵，選到&amp;quot;Device Option&amp;quot;，按Enter鍵
&lt;img src="https://i.imgur.com/Mk664R3.jpg" alt="" loading="lazy" /&gt;&lt;/li&gt;
&lt;li&gt;按向下鍵，選到&amp;quot;NIC PXE Option ROM Download&amp;quot;，按向右鍵將Disabled，改成Enabled狀態
&lt;img src="https://i.imgur.com/z70jvFt.jpg" alt="" loading="lazy" /&gt;&lt;/li&gt;
&lt;li&gt;選好後，按F10儲存，再按一次F10
在&amp;quot;Yes&amp;quot;的地方按Enter鍵， 儲存設定更改&lt;/li&gt;
&lt;li&gt;系統會自動重新開機
&lt;img src="https://i.imgur.com/GzGUDVh.png" alt="" loading="lazy" /&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;回到發送端電腦，確定所有接收端都有進到對拷設定，在狀態列顯示線上，代表等等可以順利進行對拷設定
&lt;img src="https://i.imgur.com/QcxDxn8.jpg" alt="" loading="lazy" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;可以用滑鼠在要設定的電腦連點兩下，設定IP位址為&amp;quot;&lt;strong&gt;自動取得IP位址&lt;/strong&gt;&amp;quot;，DNS設定資訊，或其他進階設定，如果陳老師沒有特別指示，就不作任何更動，以上設定好後，移動滑鼠到右下角按確定
&lt;img src="https://i.imgur.com/jNL228n.jpg" alt="" loading="lazy" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;將要對拷的主機都選起來後，按下一步，確定接收端的主機都有選到後，按是
&lt;img src="https://i.imgur.com/KvutDVC.jpg" alt="" loading="lazy" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;選擇要對拷的資料，這邊就把上面3個受保護的磁碟都選起來，可視情況選擇要對拷的磁碟，選好後就按下一步
&lt;img src="https://i.imgur.com/GZ5cvxo.jpg" alt="" loading="lazy" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;這時候對拷就會開始，如果發現有跳紅紅的，可以不用理他，等下對考完後，去接收端檢查設定有沒有對拷過去即可
&lt;img src="https://i.imgur.com/P9wpyvr.jpg" alt="" loading="lazy" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;對拷完後，發送端的主機和所有接收端的主機都會自動重新開機，開機完後，接收端的螢幕右上角會出現以下畫面
&lt;img src="https://i.imgur.com/uSNcwNH.png" alt="" loading="lazy" /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;這時候，按Ctrl+Alt+Delete解鎖螢幕畫面，用student帳號登入，密碼為:student&lt;/li&gt;
&lt;li&gt;登入後，螢幕會出現一個進度條，等他跑完後，系統會自動重新開機
&lt;img src="https://i.imgur.com/xNBQCgR.jpg" alt="" loading="lazy" /&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;接收端的電腦都重新開機兩次後，就可以開始檢查，我們做過的環境設定和資料是否齊全。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;檢查發送端和接收端的所有電腦&lt;span class="hx:absolute hx:-mt-20" id="檢查發送端和接收端的所有電腦"&gt;&lt;/span&gt;
&lt;a href="#%e6%aa%a2%e6%9f%a5%e7%99%bc%e9%80%81%e7%ab%af%e5%92%8c%e6%8e%a5%e6%94%b6%e7%ab%af%e7%9a%84%e6%89%80%e6%9c%89%e9%9b%bb%e8%85%a6" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;h3&gt;移除SysReturn Deluxe還原軟體&lt;span class="hx:absolute hx:-mt-20" id="移除sysreturn-deluxe還原軟體"&gt;&lt;/span&gt;
&lt;a href="#%e7%a7%bb%e9%99%a4sysreturn-deluxe%e9%82%84%e5%8e%9f%e8%bb%9f%e9%ab%94" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;點左下角收尋，輸入&amp;quot;sys&amp;quot;，找到SysReturn Deluxe還原軟體，按開啟
&lt;img src="https://i.imgur.com/qf1tUYa.png" alt="" loading="lazy" /&gt;&lt;/li&gt;
&lt;li&gt;輸入密碼: cc8050，按登入
&lt;img src="https://i.imgur.com/dxDyZks.png" alt="" loading="lazy" /&gt;&lt;/li&gt;
&lt;li&gt;點右下角的3個點，選移除
&lt;img src="https://i.imgur.com/qojrMrA.png" alt="" loading="lazy" /&gt;&lt;/li&gt;
&lt;li&gt;選&amp;quot;保留目前狀態後刪除&amp;quot;，按套用
&lt;img src="https://i.imgur.com/EQUpZeo.png" alt="" loading="lazy" /&gt;&lt;/li&gt;
&lt;li&gt;是否立即啟動，選&amp;quot;是&amp;quot;
&lt;img src="https://i.imgur.com/MdwoQiA.png" alt="" loading="lazy" /&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;電腦重新開機 &amp;raquo;&amp;gt; 等待系統更新起始點 &amp;raquo;&amp;gt; 登入student帳號後 &amp;raquo;&amp;gt; 系統會刪除還原軟體 &amp;raquo;&amp;gt; 再次重新開機 &amp;raquo;&amp;gt; 再次登入student ，還原軟體刪除成功&lt;/p&gt;
&lt;ol start="6"&gt;
&lt;li&gt;檢查還原軟體是否被移除，在左下角收尋打&amp;quot;sys&amp;quot;，沒有顯示出來，代表刪除成功
&lt;img src="https://i.imgur.com/RjyoTZo.png" alt="" loading="lazy" /&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h3&gt;設定IPV4為靜態IP位址&lt;span class="hx:absolute hx:-mt-20" id="設定ipv4為靜態ip位址"&gt;&lt;/span&gt;
&lt;a href="#%e8%a8%ad%e5%ae%9aipv4%e7%82%ba%e9%9d%9c%e6%85%8bip%e4%bd%8d%e5%9d%80" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;打開&amp;quot;檔案總管&amp;quot;，在左側選項的最下面，找到&amp;quot;網路&amp;quot;，滑鼠右鍵點它，選&amp;quot;內容&amp;quot;
&lt;img src="https://i.imgur.com/YwYib0r.png" alt="" loading="lazy" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;選擇左上方的&amp;quot;變更介面卡設定&amp;quot;
&lt;img src="https://i.imgur.com/zOnsZFY.png" alt="" loading="lazy" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;在&amp;quot;Ethernet&amp;quot;那張網卡上，滑鼠右鍵，點&amp;quot;內容&amp;quot;，
&lt;img src="https://i.imgur.com/YIENKcO.png" alt="" loading="lazy" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;往下滑，找到&amp;quot;Internet Protocol Version 4(TCP/IPV4)&amp;quot;，移動滑鼠選它，點&amp;quot;內容&amp;quot;
&lt;img src="https://i.imgur.com/gXrSy5u.png" alt="" loading="lazy" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;點選&amp;quot;使用下列的IP位址(s)&amp;quot;:
IP位址(I) : 192.168.1.25 (本次範例為192.168.1.25，要自己看當時接收端的IP為只要設多少)
子網路遮罩(U) : 255.255.255.0 (J509教室每台電腦都一樣)
預設閘道(D) : 192.168.1.1 (J509教室每台電腦都一樣)
(可以在J509教室正常運作的其他台電腦，打開CMD，打&lt;code&gt;ipconfig&lt;/code&gt;，就可以看到子網路遮罩和預設閘道是設多少)
&lt;strong&gt;以上都設好後，按&amp;quot;確定&amp;quot;&lt;/strong&gt;
&lt;img src="https://i.imgur.com/kaFBPn3.png" alt="" loading="lazy" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;再按&amp;quot;關閉&amp;quot;
&lt;img src="https://i.imgur.com/pgWeEfZ.png" alt="" loading="lazy" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;檢查有沒有成功把IPV4設為靜態IP位址
打開CMD，輸入&lt;code&gt;ipconfig&lt;/code&gt;
可以看到，乙太網路卡 Ethernet那張網卡的IPV4位址，已成功設定為固定的IP(192.168.1.25)，子網路遮罩(255.255.255.0)和預設閘道(192.168.1.1)
&lt;img src="https://i.imgur.com/bDPdzu8.png" alt="" loading="lazy" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;檢查網路內網跟外網有沒有都通&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;先&lt;code&gt;ping&lt;/code&gt;本機看有沒有通
&lt;code&gt;ping 127.0.0.1&lt;/code&gt;
看到封包 : 已傳送 = 4 ，已收到 = 4, 已遺失 = 0 ，代表有通
&lt;img src="https://i.imgur.com/CWp8rsG.png" alt="" loading="lazy" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;再&lt;code&gt;ping&lt;/code&gt;教室其他台電腦的IP看有沒有通
&lt;code&gt;ping 192.168.1.5&lt;/code&gt; (不一定要跟我一樣ping 192.168.1.5，只要是在J509教室的電腦都可以)
看到封包 : 已傳送 = 4 ，已收到 = 4, 已遺失 = 0 ，代表有通
&lt;img src="https://i.imgur.com/ktMKTvm.png" alt="" loading="lazy" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;再&lt;code&gt;ping&lt;/code&gt;預設閘道看有沒有通
&lt;code&gt;ping 192.168.1.1&lt;/code&gt;
看到封包 : 已傳送 = 4 ，已收到 = 4, 已遺失 = 0 ，代表有通
&lt;img src="https://i.imgur.com/UTO7A6T.png" alt="" loading="lazy" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;再&lt;code&gt;ping&lt;/code&gt; Google在美國的一台電腦有沒有通，有通代表可以上網
&lt;code&gt;ping 8.8.8.8&lt;/code&gt;
看到封包 : 已傳送 = 4 ，已收到 = 4, 已遺失 = 0 ，代表有通
&lt;img src="https://i.imgur.com/hWxqumF.png" alt="" loading="lazy" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;測一下DNS有沒有正常
&lt;code&gt;ping www.google.com&lt;/code&gt;
看到封包 : 已傳送 = 4 ，已收到 = 4, 已遺失 = 0 ，代表有通
&lt;img src="https://i.imgur.com/VP6yNxI.png" alt="" loading="lazy" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h3&gt;檢查使用者帳號和群組&lt;span class="hx:absolute hx:-mt-20" id="檢查使用者帳號和群組"&gt;&lt;/span&gt;
&lt;a href="#%e6%aa%a2%e6%9f%a5%e4%bd%bf%e7%94%a8%e8%80%85%e5%b8%b3%e8%99%9f%e5%92%8c%e7%be%a4%e7%b5%84" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;先檢查接收端的主機，一台一台檢查&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;使用student帳號登入接收端的Windows帳號&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;注意，對拷後的接收端，會複製發送端的主控台，所以不能用桌面上的主控台1.msc&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;打開桌面上的主控台1.msc
&lt;img src="https://i.imgur.com/gKm0xmw.png" alt="" loading="lazy" /&gt;&lt;/li&gt;
&lt;li&gt;可以發現在本機與使用者和群組(NC1848394C)，這個選項後的括號，是發送端的電腦名稱，以本次範例就是NC1848394C，所以再次證明，這個主控台不是本機
&lt;img src="https://i.imgur.com/DyBa0eN.png" alt="" loading="lazy" /&gt;&lt;/li&gt;
&lt;li&gt;此時先按右上角的X，關閉視窗，在桌面的主控台1.msc圖示上，按滑鼠右鍵，選擇&amp;quot;刪除&amp;quot;，(如果跳出是否要儲存就按&amp;quot;否&amp;quot;)。
&lt;img src="https://i.imgur.com/rDMfgWa.png" alt="" loading="lazy" /&gt;&lt;/li&gt;
&lt;li&gt;在資源回收桶上按右鍵，選擇&amp;quot;清理資源回收桶&amp;quot;
&lt;img src="https://i.imgur.com/Wv6E3hi.png" alt="" loading="lazy" /&gt;&lt;/li&gt;
&lt;li&gt;系統會再跳出一次訊息，問你是不是真的要刪除，選&amp;quot;是&amp;quot;，我們要刪除它。
&lt;img src="https://i.imgur.com/t9lsiQe.png" alt="" loading="lazy" /&gt;&lt;/li&gt;
&lt;li&gt;在左下角的收尋，收尋&amp;quot;mmc&amp;quot;，在右邊的選項中，選&amp;quot;以系統管理員身分執行(A)&amp;quot;
&lt;img src="https://i.imgur.com/2u7pH75.png" alt="" loading="lazy" /&gt;&lt;/li&gt;
&lt;li&gt;在點左上角檔案，選擇&amp;quot;新增/移除嵌入式管理單元&amp;quot;
&lt;img src="https://i.imgur.com/LNcjvaC.png" alt="" loading="lazy" /&gt;&lt;/li&gt;
&lt;li&gt;點選左邊的&amp;quot;本機使用者和群組&amp;quot;後，點中間的&amp;quot;新增(A)&amp;gt;&amp;quot;
&lt;img src="https://i.imgur.com/wbDKv3V.png" alt="" loading="lazy" /&gt;&lt;/li&gt;
&lt;li&gt;選&amp;quot;本機電腦&amp;quot;後，按完成
&lt;img src="https://i.imgur.com/5ocUSr1.png" alt="" loading="lazy" /&gt;&lt;/li&gt;
&lt;li&gt;點左邊選項中的&amp;quot;在本機電腦上具有進階安全性的Windows Defender防火牆&amp;quot;後，再按&amp;quot;新增(A)&amp;gt;&amp;quot;
&lt;img src="https://i.imgur.com/2YIRAfP.png" alt="" loading="lazy" /&gt;&lt;/li&gt;
&lt;li&gt;選&amp;quot;本機電腦&amp;quot;後，按完成
&lt;img src="https://i.imgur.com/39GGB3Z.png" alt="" loading="lazy" /&gt;&lt;/li&gt;
&lt;li&gt;點左邊選項中的&amp;quot;服務&amp;quot;後，按&amp;quot;新增(A)&amp;gt;&amp;quot;
&lt;img src="https://i.imgur.com/tr5zAyB.png" alt="" loading="lazy" /&gt;&lt;/li&gt;
&lt;li&gt;選&amp;quot;本機電腦&amp;quot;後，按完成
&lt;img src="https://i.imgur.com/NRPtByh.png" alt="" loading="lazy" /&gt;&lt;/li&gt;
&lt;li&gt;點左邊&amp;quot;本機使用者和群組(本機) &amp;raquo;&amp;gt; 使用者&amp;quot;在bigred那欄，按滑鼠右鍵，點內容
&lt;img src="https://i.imgur.com/ZVveyew.png" alt="" loading="lazy" /&gt;&lt;/li&gt;
&lt;li&gt;檢查&amp;quot;使用者不能變更密碼&amp;quot;和&amp;quot;密碼永久有效&amp;quot;兩個有沒有都有打勾
&lt;img src="https://i.imgur.com/PyGjU40.png" alt="" loading="lazy" /&gt;&lt;/li&gt;
&lt;li&gt;點&amp;quot;成員隸屬&amp;quot;，檢查有沒有&amp;quot;Administrator&amp;quot;和&amp;quot;Remote Desktop Users&amp;quot;
&lt;img src="https://i.imgur.com/SGzCwKT.png" alt="" loading="lazy" /&gt;&lt;/li&gt;
&lt;li&gt;在使用者，gbean那欄，按滑鼠右鍵，點內容
&lt;img src="https://i.imgur.com/n69t31U.png" alt="" loading="lazy" /&gt;&lt;/li&gt;
&lt;li&gt;檢查&amp;quot;使用者不能變更密碼&amp;quot;和&amp;quot;密碼永久有效&amp;quot;兩個有沒有都有打勾
&lt;img src="https://i.imgur.com/53rRvP8.png" alt="" loading="lazy" /&gt;&lt;/li&gt;
&lt;li&gt;點&amp;quot;成員隸屬&amp;quot;，檢查有沒有&amp;quot;Remote Desktop Users&amp;quot;
&lt;img src="https://i.imgur.com/uo07Ebg.png" alt="" loading="lazy" /&gt;&lt;/li&gt;
&lt;li&gt;在使用者，rbean那欄，按滑鼠右鍵，點內容
&lt;img src="https://i.imgur.com/nD8tciu.png" alt="" loading="lazy" /&gt;&lt;/li&gt;
&lt;li&gt;檢查&amp;quot;使用者不能變更密碼&amp;quot;和&amp;quot;密碼永久有效&amp;quot;兩個有沒有都有打勾
&lt;img src="https://i.imgur.com/yWna3P2.png" alt="" loading="lazy" /&gt;&lt;/li&gt;
&lt;li&gt;點&amp;quot;成員隸屬&amp;quot;，檢查有沒有&amp;quot;Remote Desktop Users&amp;quot;
&lt;img src="https://i.imgur.com/wNCki0b.png" alt="" loading="lazy" /&gt;&lt;/li&gt;
&lt;li&gt;在使用者，ybean那欄，按滑鼠右鍵，點內容
&lt;img src="https://i.imgur.com/LiaW4VK.png" alt="" loading="lazy" /&gt;&lt;/li&gt;
&lt;li&gt;檢查&amp;quot;密碼永久有效&amp;quot;有沒有都有打勾
&lt;img src="https://i.imgur.com/XxY7Bie.png" alt="" loading="lazy" /&gt;&lt;/li&gt;
&lt;li&gt;點&amp;quot;成員隸屬&amp;quot;，檢查有沒有&amp;quot;Remote Desktop Users&amp;quot;
&lt;img src="https://i.imgur.com/NFjFHw2.png" alt="" loading="lazy" /&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;檢查群組，用滑鼠點一下，主控台根目錄 &amp;raquo;&amp;gt; 本機使用者和群組 &amp;raquo;&amp;gt; 群組
&lt;img src="https://i.imgur.com/c63ZYJP.png" alt="" loading="lazy" /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;在&amp;quot;Administrators&amp;quot;那欄，滑鼠右鍵點內容
&lt;img src="https://i.imgur.com/CuWzAVJ.png" alt="" loading="lazy" /&gt;&lt;/li&gt;
&lt;li&gt;再確認一次有沒有bigred
&lt;img src="https://i.imgur.com/zMUyfmD.png" alt="" loading="lazy" /&gt;&lt;/li&gt;
&lt;li&gt;在&amp;quot;Remote Desktop Users&amp;quot;那欄，滑鼠右鍵點內容
&lt;img src="https://i.imgur.com/hOQqimn.png" alt="" loading="lazy" /&gt;&lt;/li&gt;
&lt;li&gt;再次確認&amp;quot;Remote Desktop Users&amp;quot;群組裡有沒有bigred、gbean和rbean 3位使用者
&lt;img src="https://i.imgur.com/pStuEbp.png" alt="" loading="lazy" /&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;以上都確認好後，&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;按左上角&amp;quot;檔案&amp;quot;，再按&amp;quot;另存新檔&amp;quot;
&lt;img src="https://i.imgur.com/Gq1hi4D.png" alt="" loading="lazy" /&gt;
選桌面&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;點&amp;quot;桌面&amp;quot;，檔名設為:主控台.msc，再按&amp;quot;存檔&amp;quot;
&lt;img src="https://i.imgur.com/ihgj8uu.png" alt="" loading="lazy" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;回到windows桌面，看看有沒有存檔成功
&lt;img src="https://i.imgur.com/74jw0Jq.png" alt="" loading="lazy" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h3&gt;檢查OpenSSH Server&lt;span class="hx:absolute hx:-mt-20" id="檢查openssh-server"&gt;&lt;/span&gt;
&lt;a href="#%e6%aa%a2%e6%9f%a5openssh-server" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ol start="4"&gt;
&lt;li&gt;檢查OpenSSH Server是否為Windows內鍵安裝的
&lt;ul&gt;
&lt;li&gt;左下角開始，點設定
&lt;img src="https://i.imgur.com/99dUZKD.png" alt="" loading="lazy" /&gt;&lt;/li&gt;
&lt;li&gt;選&amp;quot;應用程式&amp;quot;
&lt;img src="https://i.imgur.com/GQb05fI.png" alt="" loading="lazy" /&gt;&lt;/li&gt;
&lt;li&gt;點&amp;quot;選用功能&amp;quot;
&lt;img src="https://i.imgur.com/2q3tkPz.png" alt="" loading="lazy" /&gt;&lt;/li&gt;
&lt;li&gt;確認安裝OpenSSH Server
&lt;img src="https://i.imgur.com/Lzd0rQB.png" alt="" loading="lazy" /&gt;&lt;/li&gt;
&lt;li&gt;檢查OpenSSH Server功能有沒有正常
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;打開CMD&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;打&lt;code&gt;ipconfig&lt;/code&gt;,確認IP位址
&lt;img src="https://i.imgur.com/EQNn99E.png" alt="" loading="lazy" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;到其他台電腦開一個CMD，
執行&lt;code&gt;ssh bigred@192.168.1.25&lt;/code&gt;
打yes，再打密碼:1大兩小3大兩驚嘆
&lt;img src="https://i.imgur.com/Mbzo9N9.png" alt="" loading="lazy" /&gt;&lt;/p&gt;
&lt;p&gt;進去後打個&lt;code&gt;dir&lt;/code&gt;，確認一下可以動作
&lt;img src="https://i.imgur.com/ux8weoq.png" alt="" loading="lazy" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;exit&lt;/code&gt;離開
&lt;img src="https://i.imgur.com/6sYTMM5.png" alt="" loading="lazy" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;再執行&lt;code&gt;ssh rbean@192.168.1.25&lt;/code&gt;，密碼:srerbean
&lt;img src="https://i.imgur.com/bbOP2Aa.png" alt="" loading="lazy" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;進去後打個&lt;code&gt;dir&lt;/code&gt;，確認一下可以動作
&lt;img src="https://i.imgur.com/S7Pawdo.png" alt="" loading="lazy" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;exit&lt;/code&gt;離開
&lt;img src="https://i.imgur.com/TM7Ss4u.png" alt="" loading="lazy" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;再執行&lt;code&gt;ssh gbean@192.168.1.25&lt;/code&gt;，密碼:sregbean
&lt;img src="https://i.imgur.com/uVDjAJi.png" alt="" loading="lazy" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;進去後打個&lt;code&gt;dir&lt;/code&gt;，確認一下可以動作
&lt;img src="https://i.imgur.com/aeNhmT0.png" alt="" loading="lazy" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;exit&lt;/code&gt;離開
&lt;img src="https://i.imgur.com/VucqCRw.png" alt="" loading="lazy" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;再執行&lt;code&gt;ssh ybean@192.168.1.25&lt;/code&gt;，密碼:sreybean
&lt;img src="https://i.imgur.com/FZSB7mG.png" alt="" loading="lazy" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;進去後打個&lt;code&gt;dir&lt;/code&gt;，確認一下可以動作
&lt;img src="https://i.imgur.com/IAWnkr5.png" alt="" loading="lazy" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;exit&lt;/code&gt;離開
&lt;img src="https://i.imgur.com/I3HAVxE.png" alt="" loading="lazy" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;以上都可以正常連線，代表OpenSSH Server OK&lt;/strong&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h3&gt;檢查RDP(Remote Desktop Protocol)通訊協定&lt;span class="hx:absolute hx:-mt-20" id="檢查rdpremote-desktop-protocol通訊協定"&gt;&lt;/span&gt;
&lt;a href="#%e6%aa%a2%e6%9f%a5rdpremote-desktop-protocol%e9%80%9a%e8%a8%8a%e5%8d%94%e5%ae%9a" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;打開檔案總管，到以下目錄，&lt;code&gt;C:\jetpack\RDPWrap&lt;/code&gt;，找到install.bat這個批次檔，按滑鼠右鍵，選&amp;quot;以系統管理員身分執行&amp;quot;
&lt;img src="https://i.imgur.com/lvfml3a.png" alt="" loading="lazy" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;等到CMD裡面跑完後，跳出以下視窗，
注意內容要看到:&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;Diagnostics
Wrapper state: Installed ver 1.5.0.0
Service state: Running ver 10.0.19041.1620
Listener state: Listening [fully supported]&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;img src="https://i.imgur.com/OAP9Ivu.png" alt="" loading="lazy" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;一定要有4個綠色的英文，還有注意port號:2599&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h3&gt;檢查電源選項(bigred、rbean、gbean和ybean都要做)&lt;span class="hx:absolute hx:-mt-20" id="檢查電源選項bigredrbeangbean和ybean都要做"&gt;&lt;/span&gt;
&lt;a href="#%e6%aa%a2%e6%9f%a5%e9%9b%bb%e6%ba%90%e9%81%b8%e9%a0%85bigredrbeangbean%e5%92%8cybean%e9%83%bd%e8%a6%81%e5%81%9a" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;桌面滑鼠右鍵 -&amp;gt; 顯示設定 -&amp;gt; 電源與睡眠
&lt;img src="https://i.imgur.com/L5GhJHz.png" alt="" loading="lazy" /&gt;
螢幕調15分鐘後關閉，睡眠調成&lt;strong&gt;永不&lt;/strong&gt;
&lt;img src="https://i.imgur.com/L0C3Uko.png" alt="" loading="lazy" /&gt;&lt;/p&gt;
&lt;h3&gt;檢查關閉關機選項(bigred、rbean、gbean和ybean都要做)&lt;span class="hx:absolute hx:-mt-20" id="檢查關閉關機選項bigredrbeangbean和ybean都要做"&gt;&lt;/span&gt;
&lt;a href="#%e6%aa%a2%e6%9f%a5%e9%97%9c%e9%96%89%e9%97%9c%e6%a9%9f%e9%81%b8%e9%a0%85bigredrbeangbean%e5%92%8cybean%e9%83%bd%e8%a6%81%e5%81%9a" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;按左下角開始，點student，登出student帳號
&lt;img src="https://i.imgur.com/pNQ8KyT.png" alt="" loading="lazy" /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;用bigred帳號登入，按左下角開始，再按電源，查看關機鍵和睡眠鍵有沒有拔掉，有拔掉的話，會顯示&amp;quot;目前沒有可用的電源選項&amp;quot;
&lt;img src="https://i.imgur.com/gStRTgR.png" alt="" loading="lazy" /&gt;&lt;/li&gt;
&lt;li&gt;用滑鼠左鍵點兩下桌面上的&amp;quot;VMware Workstation 16 player&amp;quot;
&lt;img src="https://i.imgur.com/ytg67Sc.png" alt="" loading="lazy" /&gt;&lt;/li&gt;
&lt;li&gt;查看是否只有這個視窗
&lt;img src="https://i.imgur.com/lkQkcG9.png" alt="" loading="lazy" /&gt;&lt;/li&gt;
&lt;li&gt;若出現以下畫面，代表失敗。
&lt;img src="https://i.imgur.com/kdbHwFQ.png" alt="" loading="lazy" /&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;用gbean、rbean和ybean帳號，重複做以上動作:登出帳號 &amp;raquo;&amp;gt; 看關機鍵和睡眠鍵有沒有拔掉 &amp;raquo;&amp;gt; 用滑鼠左鍵點兩下桌面上的&amp;quot;VMware Workstation 16 player&amp;quot; ，看是否有跳出其他視窗&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h3&gt;檢查Windows關閉更新&lt;span class="hx:absolute hx:-mt-20" id="檢查windows關閉更新"&gt;&lt;/span&gt;
&lt;a href="#%e6%aa%a2%e6%9f%a5windows%e9%97%9c%e9%96%89%e6%9b%b4%e6%96%b0" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;選&amp;quot;更新與安全性&amp;quot;
&lt;img src="https://i.imgur.com/yoJsvHw.png" alt="" loading="lazy" /&gt;&lt;/li&gt;
&lt;li&gt;確認無法更新
&lt;img src="https://i.imgur.com/uS4n8ka.png" alt="" loading="lazy" /&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3&gt;檢查CMD Autorun(bigred、rbean、gbean和ybean都要做)&lt;span class="hx:absolute hx:-mt-20" id="檢查cmd-autorunbigredrbeangbean和ybean都要做"&gt;&lt;/span&gt;
&lt;a href="#%e6%aa%a2%e6%9f%a5cmd-autorunbigredrbeangbean%e5%92%8cybean%e9%83%bd%e8%a6%81%e5%81%9a" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;打開CMD
輸入: &lt;code&gt;echo %boss%&lt;/code&gt;
&lt;img src="https://i.imgur.com/9VnxWWQ.png" alt="" loading="lazy" /&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3&gt;檢察關閉IPV6&lt;span class="hx:absolute hx:-mt-20" id="檢察關閉ipv6"&gt;&lt;/span&gt;
&lt;a href="#%e6%aa%a2%e5%af%9f%e9%97%9c%e9%96%89ipv6" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;打開&amp;quot;檔案總管&amp;quot;，在左側選項的最下面，找到&amp;quot;網路&amp;quot;，滑鼠右鍵點它，選&amp;quot;內容&amp;quot;
&lt;img src="https://i.imgur.com/YwYib0r.png" alt="" loading="lazy" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;選擇左上方的&amp;quot;變更介面卡設定&amp;quot;
&lt;img src="https://i.imgur.com/zOnsZFY.png" alt="" loading="lazy" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;在&amp;quot;Ethernet&amp;quot;那張網卡上，滑鼠右鍵，點&amp;quot;內容&amp;quot;，
&lt;img src="https://i.imgur.com/YIENKcO.png" alt="" loading="lazy" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;往下滑，確認&amp;quot;Internet Protocol Version 6 (TCP/IP)&amp;ldquo;沒有打勾
&lt;img src="https://i.imgur.com/J5e6aff.png" alt="" loading="lazy" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h3&gt;==檢查防火牆關閉(很重要!!!沒關的話，落地雲會無法連線!!!)==&lt;span class="hx:absolute hx:-mt-20" id="檢查防火牆關閉很重要沒關的話落地雲會無法連線"&gt;&lt;/span&gt;
&lt;a href="#%e6%aa%a2%e6%9f%a5%e9%98%b2%e7%81%ab%e7%89%86%e9%97%9c%e9%96%89%e5%be%88%e9%87%8d%e8%a6%81%e6%b2%92%e9%97%9c%e7%9a%84%e8%a9%b1%e8%90%bd%e5%9c%b0%e9%9b%b2%e6%9c%83%e7%84%a1%e6%b3%95%e9%80%a3%e7%b7%9a" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;打開&amp;quot;檔案總管&amp;rdquo;，在左側選項的最下面，找到&amp;quot;網路&amp;quot;，滑鼠右鍵點它，選&amp;quot;內容&amp;quot;
&lt;img src="https://i.imgur.com/YwYib0r.png" alt="" loading="lazy" /&gt;&lt;/li&gt;
&lt;li&gt;點左下角的&amp;quot;Windows Defender防火牆&amp;quot;，確認都是紅色的XX
&lt;img src="https://i.imgur.com/vspcLw5.png" alt="" loading="lazy" /&gt;
&lt;img src="https://i.imgur.com/rBpqtSk.png" alt="" loading="lazy" /&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h3&gt;使用者設定(bigred、rbean、gbean和ybean都要做)&lt;span class="hx:absolute hx:-mt-20" id="使用者設定bigredrbeangbean和ybean都要做"&gt;&lt;/span&gt;
&lt;a href="#%e4%bd%bf%e7%94%a8%e8%80%85%e8%a8%ad%e5%ae%9abigredrbeangbean%e5%92%8cybean%e9%83%bd%e8%a6%81%e5%81%9a" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;打開&amp;quot;檔案總管&amp;quot;，點上面的&amp;quot;檢視&amp;quot;，將附檔名打勾，再點旁邊的選項&lt;img src="https://i.imgur.com/h2xpJYd.png" alt="" loading="lazy" /&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src="https://i.imgur.com/KWnught.png" alt="" loading="lazy" /&gt;
2. 點選&amp;quot;檢視&amp;quot;，往下滑，將&amp;quot;顯示所有資料夾&amp;quot;打勾
&lt;img src="https://i.imgur.com/SKXLLyy.png" alt="" loading="lazy" /&gt;&lt;/p&gt;
&lt;ol start="3"&gt;
&lt;li&gt;
&lt;p&gt;將工作列沒有要用到的應用程式取消訂選
&lt;img src="https://i.imgur.com/B0w4rWZ.png" alt="" loading="lazy" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;最後只保留以下這3個，檔案總管、CMD和Google Chrome
&lt;img src="https://i.imgur.com/6dyMYaD.png" alt="" loading="lazy" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;打開CMD，點左上角
&lt;img src="https://i.imgur.com/b73xpzh.png" alt="" loading="lazy" /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;點預設值
&lt;img src="https://i.imgur.com/Q6fYeNy.png" alt="" loading="lazy" /&gt;&lt;/li&gt;
&lt;li&gt;將字型調成20
&lt;img src="https://i.imgur.com/Wb9RgnQ.png" alt="" loading="lazy" /&gt;&lt;/li&gt;
&lt;li&gt;選&amp;quot;色彩&amp;quot;，將螢幕背景選成白色
&lt;img src="https://i.imgur.com/IRZaPsT.png" alt="" loading="lazy" /&gt;&lt;/li&gt;
&lt;li&gt;螢幕文字選成黑色，好了以後按確定
&lt;img src="https://i.imgur.com/oAYLsDG.png" alt="" loading="lazy" /&gt;&lt;/li&gt;
&lt;li&gt;關掉CMD，再打開一次，檢查有沒有更改成功
&lt;img src="https://i.imgur.com/RmNtkBD.png" alt="" loading="lazy" /&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2&gt;所有系統設定和環境都確定好後，再把SysReturn Deluxe還原軟體安裝回來&lt;span class="hx:absolute hx:-mt-20" id="所有系統設定和環境都確定好後再把sysreturn-deluxe還原軟體安裝回來"&gt;&lt;/span&gt;
&lt;a href="#%e6%89%80%e6%9c%89%e7%b3%bb%e7%b5%b1%e8%a8%ad%e5%ae%9a%e5%92%8c%e7%92%b0%e5%a2%83%e9%83%bd%e7%a2%ba%e5%ae%9a%e5%a5%bd%e5%be%8c%e5%86%8d%e6%8a%8asysreturn-deluxe%e9%82%84%e5%8e%9f%e8%bb%9f%e9%ab%94%e5%ae%89%e8%a3%9d%e5%9b%9e%e4%be%86" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;打開&amp;quot;檔案總管&amp;quot;，到以下目錄，&lt;code&gt;C:\Tools\SysReturn Deluxe V10.0.011-20201130\Client Setup(W525)&lt;/code&gt;
找到Setup.bat，滑鼠右鍵點它，選&amp;quot;以系統管理員身分執行&amp;quot;
&lt;img src="https://i.imgur.com/xj2HjnT.png" alt="" loading="lazy" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;使用預設&amp;quot;中文繁體&amp;quot;，按確定
&lt;img src="https://i.imgur.com/bl3SeQZ.png" alt="" loading="lazy" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;授權合約，按下一步
&lt;img src="https://i.imgur.com/KNmXNQk.png" alt="" loading="lazy" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;使用預設安裝路徑，按下一步
&lt;img src="https://i.imgur.com/MxsCs0o.png" alt="" loading="lazy" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;都跟預設一樣，不要動，直接按下一步
&lt;img src="https://i.imgur.com/jOjFjId.png" alt="" loading="lazy" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;將Windows 更新安裝策略選為&amp;quot;保持原來設定&amp;quot;，按下一步
&lt;img src="https://i.imgur.com/eMrt9p6.png" alt="" loading="lazy" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;選擇要保護的磁碟，把D槽以外的都選起來，好了後按下一步
&lt;img src="https://i.imgur.com/PwTOvxm.png" alt="" loading="lazy" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;選擇還原模式，選&amp;quot;暫不還原&amp;quot;，按下一步
&lt;img src="https://i.imgur.com/YGOb5l9.png" alt="" loading="lazy" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;參數設定，選使用指定密碼，密碼: cc8050，按下一步
&lt;img src="https://i.imgur.com/adIKW09.png" alt="" loading="lazy" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;連接設定，使用預設port:7910，其他不要動，按下一步
&lt;img src="https://i.imgur.com/cE4ZrQA.png" alt="" loading="lazy" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;按否
&lt;img src="https://i.imgur.com/O1C9kOX.png" alt="" loading="lazy" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;參數確認，注意還原模式要:妹次啟動都保留，密碼:cc8050，好了以後按下一步就會開始安裝
&lt;img src="https://i.imgur.com/lIuifO4.png" alt="" loading="lazy" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;正在安裝中&amp;hellip;
&lt;img src="https://i.imgur.com/XI1DbhF.png" alt="" loading="lazy" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;按是，重新開機
&lt;img src="https://i.imgur.com/5mPEvC8.png" alt="" loading="lazy" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;重新開機後，用student帳號登入windows電腦&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;在左下角收尋打sys，打開SysReturn Deluxe還原軟體
&lt;img src="https://i.imgur.com/Iw6Ki7D.png" alt="" loading="lazy" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;填註冊名稱: mcu.edu.tw
產品序號: B35AA14BA346CFFDCF401DBD1 (在&lt;code&gt;C:\Tools\SysReturn Deluxe V10.0.011-20201130\Client Setup(W525)\10.bat.txt&lt;/code&gt; 裡面有)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;好了以後，打開SysReturn Deluxe還原軟體，輸入密碼，就會看到Root，系統自動幫我們現在這個環境建好的還原點
&lt;img src="https://i.imgur.com/n48WV1w.png" alt="" loading="lazy" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;點上方選項的還原點管理
&lt;img src="https://i.imgur.com/8Jmev9r.png" alt="" loading="lazy" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;按新增還原點
&lt;img src="https://i.imgur.com/DhW3qQF.png" alt="" loading="lazy" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;在名稱打: SRE第四期，按確定，系統就會開始把現在的環境和設定，建立一個新的還原點&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;儲存成功，按確定
&lt;img src="https://i.imgur.com/Y4LTKiK.png" alt="" loading="lazy" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h6&gt;tags: &lt;code&gt;J509教室&lt;/code&gt;&lt;span class="hx:absolute hx:-mt-20" id="tags-j509教室"&gt;&lt;/span&gt;
&lt;a href="#tags-j509%e6%95%99%e5%ae%a4" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h6&gt;</description></item></channel></rss>