此程序將指導您建置 Linux 自訂機器映像,以便在 AWS、Azure 或 vSphere 上建立叢集時使用。它分為以下各節。有關 Tanzu Kubernetes Grid 中的叢集類型的詳細資訊,請參閱工作負載叢集。
如程序中所述,根據您是為基於類的叢集還是基於計劃的 (舊版) 叢集建置映像,某些步驟會有所不同。
若要建置 Linux 自訂機器映像,您需要:
aws
命令列介面 (CLI)az
CLI在 vSphere 上建置映像以用於基於類別的叢集時,您必須擷取與要用於自訂映像的 Kubernetes 版本之預設 Ubuntu OVA 關聯的作業系統映像版本。您需要將此作業系統映像版本指派給以下建置 Linux 映像步驟中的自訂映像。
要擷取作業系統映像版本,請根據您的使用案例執行以下其中一項:
如果您有使用目前 Tanzu Kubernetes Grid 版本的預設 Kubernetes 版本建立正在執行的管理叢集,則可以從該叢集中擷取作業系統映像版本:
將 kubectl
內容設定為管理叢集。
從可用 TKr 清單中,選擇要用於自訂映像的 Kubernetes 版本的 Tanzu Kubernetes 版本 (TKr)。例如,v1.27.5---vmware.2-tkg.1
。如要列出可用的 TKr,請執行:
kubectl get tkr
開啟 TKr 並找到 osImages
屬性。此屬性指定與 TKr 關聯的 OSImage
物件的名稱。
找到並開啟預設 Ubuntu OVA 的 OSImage
物件。OSImage
物件的名稱與 TKr 中的 osImages
名稱之一相符。
kubectl get osimages
在預設 Ubuntu OVA 的 OSImage
物件中,找到 version
屬性的值並將其記錄在 spec.image.ref
下。例如,v1.27.5+vmware.1-tkg.1-765d418b72c247c2310384e640ee075e
。
如果您沒有使用目前 Tanzu Kubernetes Grid 版本的預設 Kubernetes 版本建立正在執行的管理叢集,則可以本機或從 vSphere,從預設 Ubuntu OVA 擷取作業系統映像版本:
要在本地擷取作業系統映像版本,請執行以下操作:
.ofv
檔。在 .ofv
檔中,搜尋 OVA VERSION
內容並記錄其值。例如,v1.27.5+vmware.1-tkg.1-765d418b72c247c2310384e640ee075e
。此內容看起來類似如下:
<Property ovf:key="VERSION" ovf:type="string" ovf:userConfigurable="false" ovf:value="v1.27.5+vmware.1-tkg.1-765d418b72c247c2310384e640ee075e"/>
如果已為目標 Kubernetes 版本上傳到 vSphere 的預設 Ubuntu OVA,也可以透過在 vSphere UI 中檢查 OVA 虛擬機器內容或使用 govc
CLI 來擷取作業系統映像版本。要使用此方法,請在將 OVA 虛擬機器轉換為範本之前擷取作業系統映像版本。
如要從 vSphere UI 擷取作業系統映像版本,請執行以下操作:
v1.27.5+vmware.1-tkg.1-765d418b72c247c2310384e640ee075e
。如要使用 govc
CLI 擷取作業系統映像版本,請執行 govc vm.info
命令。例如:
govc vm.info -json /dc0/vm/ubuntu-2004-kube-v1.27.5+vmware.1-tkg.1 | jq
在輸出中,搜尋 "Id": "VERSION"
並記錄"DefaultValue"
內容的值。例如:
{
"Key": 10,
"ClassId": "",
"InstanceId": "",
"Id": "VERSION",
"Category": "Cluster API Provider (CAPI)",
"Label": "VERSION",
"Type": "string",
"TypeReference": "",
"UserConfigurable": false,
"DefaultValue": "v1.27.5+vmware.1-tkg.1-765d418b72c247c2310384e640ee075e",
"Value": "",
"Description": ""
}
為您的基礎架構設定身份驗證:
vSphere:建立一個認證 JSON 檔案,並填入其值:
{
"cluster": "",
"convert_to_template": "false",
"create_snapshot": "true",
"datacenter": "",
"datastore": "",
"folder": "",
"insecure_connection": "false",
"linked_clone": "true",
"network": "",
"password": "",
"resource_pool": "",
"template": "",
"username": "",
"vcenter_server": ""
}
AWS:登入 aws
CLI。當出現提示時,請驗證身份並指定您的地區:
aws configure
Azure:登入 az
CLI。然後建立一個組態 JSON 檔 azure-sig.json
並填寫 Azure 特定資訊。可以在此處找到此類檔案的範例。
從 projects.registry.vmware.com
下載 Linux 資源服務包容器:
確保您的工作站可以存取 VMware 映像登錄 projects.registry.vmware.com
。
使用 Image Builder 建立 Linux OVA 所需的 Kubernetes Linux 二進位檔案下載並執行容器:
docker pull projects.registry.vmware.com/tkg/linux-resource-bundle:v1.27.5_vmware.1-tkg.1
docker run -d -p 3000:3000 projects.registry.vmware.com/tkg/linux-resource-bundle:v1.27.5_vmware.1-tkg.1
下載 Image Builder 組態目錄:
確定 Image Builder 組態版本,以從中建置。
TKG Image Builder
,以列出可用的版本。TKG-Image-Builder-for-Kubernetes-v1.27.5-on-TKG-v2.4.0-master.zip
為 Tanzu Kubernetes Grid v2.4.0 建立 Kubernetes v1.27.5 映像。下列步驟說明如何為 Tanzu Kubernetes Grid v2.4.0 建置 Kubernetes v1.27.5 映射。
下載組態程式碼 zip 檔案,然後解壓縮其內容。
執行 cd
移至 TKG-Image-Builder-
目錄,以將 tkg.json
檔案放在目前目錄中。
vSphere 對於 vSphere,請在 Image Builder 目錄中建立一個 metadata.json
檔案,該檔案會將版本字串設定為與後面的步驟中自訂 TKr 中列出的內容相符:
以類別為基礎:使用您在上述步驟擷取作業系統映像版本擷取的值,例如:
{
"VERSION": "v1.27.5+vmware.1-tkg.1-765d418b72c247c2310384e640ee075e"
}
以計劃為基礎:Image-builder 會為 OVA 提供建立的與 VMware 發佈的 OVA 相同的版本字串,例如 v1.27.5+vmware.1-tkg.1
。對於自訂映像,VMware 建議將 -tkg.1
取代為對您的組織有意義的字串,例如:
{
"VERSION": "v1.27.5+vmware.1-myorg.0"
}
編輯 tkg.json
檔案以填寫 <IP>
和 <PORT>
的 containerd_url
和 kubernetes_http_source
設定和自訂,其中:
IP
對應於執行 Docker 容器的機器的 IP。PORT
會讓 Docker 主機上未使用的連接埠與容器上的連接埠 3000 產生關聯,例如 3001:3000
。容器透過連接埠 3000 公開構件。如要包含以下選項,請繼續編輯 tkg.json
檔案:
Photon:如果建置 Photon-3 OVA,請編輯 tkg.json
中的 "extra_rpms"
,以反映受支援的其他自訂套件:
"extra_rpms": "sysstat nfs-utils ethtool apparmor-parser"
STIG 和 CIS 強化:如要在預設等級上強化自訂 Ubuntu 映像,請執行以下操作:
新增一行,將 ansible_user_vars
的以下部分或全部變數設定為 true
。以下變數預設為 false
:
STIG:
install_aide
- 啟動 AIDE (進階入侵檢測環境)install_sshd_login_banner
- 安裝 DoD 登入橫幅remove_existing_ca_certs
- 保留 DoD PKI 基礎架構install_audispd_plugins
- 安裝事件多工器 (audispd) 外掛程式CIS:
install_aide
- 啟動 AIDE (進階入侵檢測環境)install_clamav
- 啟動 ClamAV AntiVirusinstall_systemd_timesyncd
- 使用 timesyncd 而不是 chronyinstall_protect_kernel_defaults
- 設定上游核心保護預設值透過為 STIG 新增 custom_role_names
或為 CIS 新增 /home/imagebuilder/stig_ubuntu_2004
來修改 /home/imagebuilder/cis_ubuntu_2004
設定。
例如,對於其他 CIS 強化:
"ansible_user_vars": "install_aide=true install_clamav=true install_systemd_timesyncd=true install_protect_kernel_defaults=true",
"custom_role_names": "/home/imagebuilder/tkg /home/imagebuilder/cis_ubuntu_2004",
附註不支援透過
ansible_user_vars
進行其他強化的自訂 Photon 映像。
FIPS:若要建置啟用 FIPS 的映像,請移除以設定 (如有):
"ansible_user_vars": "install_fips=no"
網際網路受限:對於透過 HTTP Proxy 伺服器來存取網際網路的網際網路受限的環境,若要建置其映像,請新增以下內容:
"http_proxy": "http://proxy.acme.com:80",
"https_proxy": "http://proxy.acme.com:80",
"no_proxy": "localhost, 127.0.0.1, acme.com, 10.0.0.0/8"
啟用了 GPU 的叢集:如要為啟用了 GPU 的叢集建置映像,請新增以下內容:
"vmx_version": "17"
您可以向 tkg.json
新增其他自訂或將它們放在單獨的 customizations.json
檔案中。
收集下列參數字串,以便在下個步驟中插入至 docker
命令。其中有很多參數會指定 docker run -v
參數,以便將您目前的工作目錄複製到用來建置映像的容器的 /home/imagebuilder
目錄中:
AUTHENTICATION
:複製本機 CLI 目錄。適用情況:
/PATH/TO/CREDENTIALS.json:/home/imagebuilder/vsphere.json
~/.aws:/home/imagebuilder/.aws
~/.azure:/home/imagebuilder/.azure
SOURCES
:複製存放庫 tkg.json
檔案,其中列出已版本化作業系統、Kubernetes、容器網路介面 (CNI) 映像的下載來源:
/PATH/TO/tkg.json:/home/imagebuilder/tkg.json
ROLES
:複製存放庫的 tkg
目錄,其中含有 Image Builder 所需的 Ansible 角色。
TESTS
:複製專為映像的目標基礎結構、作業系統和 Kubernetes 版本所設計的 goss
測試目錄:
goss
目錄中檔的檔名。amazon-ubuntu-1.27.5+vmware.1-goss-spec.yaml
CUSTOMIZATIONS
:複製 JSON 格式的自訂檔。
PACKER_VAR_FILES
:上述 JSON 檔案的空格分隔清單,其中包含適用於 Packer 的變數。AZURE-CREDS
:Azure 認證檔的路徑,如 Image Builder 說明文件中所述。COMMAND
:視自訂映像作業系統而定,使用下列命令之一。若為 vSphere 和 Azure 映像,則命令的開頭是 build-node-ova-
和 build-azure-sig-
:
build-ami-ubuntu-2004
:Ubuntu v20.04build-ami-ubuntu-1804
:Ubuntu v18.04build-ami-amazon-2
:Amazon Linux 2build-node-ova-vsphere-ubuntu-2004
:啟用了 GPU 的叢集使用上述字串,在從 VMware 登錄 projects.registry.vmware.com
的 Docker 容器中,執行 Image Builder
如果您不是為 vSphere 和metadata.json
建置映像,且如果您不是為 Azure 建置映像,請忽略 env-file
:
export ROLES="... the value for roles you created above"
export SOURCES="... ..."
docker run -it --rm \
-v $AUTHENTICATION \
-v $SOURCES \
-v $ROLES \
-v /PATH/TO/goss/TESTS.yaml:/home/imagebuilder/goss/goss.yaml \
-v /PATH/TO/metadata.json:/home/imagebuilder/metadata.json \
-v /PATH/TO/CUSTOMIZATIONS.json:/home/imagebuilder/CUSTOMIZATIONS.json \
--env PACKER_VAR_FILES="tkg.json CUSTOMIZATIONS.json" \
--env-file AZURE-CREDS \
--env IB_OVFTOOL=1 \
projects.registry.vmware.com/tkg/image-builder:v0.1.13_vmware.2 \
COMMAND
附註此命令可能需要幾分鐘來完成。
範例
vSphere:.ova
檔將儲存至工作站的本機檔案系統中。無論您希望將這些 OVA 儲存在哪個資料夾,都應掛接到容器內的 /home/imagebuilder/output
中。然後,使用容器映像來建立 OVA:
docker run -it --rm \
-v /PATH/TO/CREDENTIALS.json:/home/imagebuilder/vsphere.json \
-v $(pwd)/tkg.json:/home/imagebuilder/tkg.json \
-v $(pwd)/tkg:/home/imagebuilder/tkg \
-v $(pwd)/goss/vsphere-ubuntu-1.27.5+vmware.1-goss-spec.yaml:/home/imagebuilder/goss/goss.yaml \
-v $(pwd)/metadata.json:/home/imagebuilder/metadata.json \
-v /PATH/TO/OVA/DIR:/home/imagebuilder/output \
--env PACKER_VAR_FILES="tkg.json vsphere.json" \
--env OVF_CUSTOM_PROPERTIES=/home/imagebuilder/metadata.json \
--env IB_OVFTOOL=1 \
projects.registry.vmware.com/tkg/image-builder:v0.1.13_vmware.2 \
build-node-ova-vsphere-ubuntu-2004
啟用了 GPU 的叢集:在執行命令建立 OVA 時,我們需要包括在上述步驟中建立的 customizations.json
檔案:
docker run -it --rm \
-v /PATH/TO/CREDENTIALS.json:/home/imagebuilder/vsphere.json \
-v $(pwd)/tkg.json:/home/imagebuilder/tkg.json \
-v $(pwd)/tkg:/home/imagebuilder/tkg \
-v $(pwd)/goss/vsphere-ubuntu-1.27.5+vmware.1-goss-spec.yaml:/home/imagebuilder/goss/goss.yaml \
-v $(pwd)/metadata.json:/home/imagebuilder/metadata.json \
-v $(pwd)/customizations.json:/home/imagebuilder/customizations.json \
-v /PATH/TO/OVA/DIR:/home/imagebuilder/output \
--env PACKER_VAR_FILES="tkg.json vsphere.json customizations.json" \
--env OVF_CUSTOM_PROPERTIES=/home/imagebuilder/metadata.json \
--env IB_OVFTOOL=1 \
projects.registry.vmware.com/tkg/image-builder:v0.1.13_vmware.2 \
build-node-ova-vsphere-ubuntu-2004
RHEL:若要建置 RHEL OVA,您需要使用 Linux 機器,而不是 macOS,因為 macOS 上的 Docker 不支援 --network host
選項。
您還必須將作業系統登錄為獲得 Red Hat 授權,並將以下內容新增到上面的 docker run
命令,來註冊更新:
-v $(pwd)/isos/rhel-8.4-x86_64-dvd.iso:/rhel-8.4-x86_64-dvd.iso \
--network host \
--env RHSM_USER=USER --env RHSM_PASS=PASS
其中:
RHSM_USER
和 RHSM_PASS
是您 Red Hat Subscription Manager 帳戶的使用者名稱和密碼。$(pwd)/isos/rhel-8.4-x86-64-dvd.iso
,以作為額外磁碟區。AWS:若要使用 Ubuntu v20.04 和 Kubernetes v1.27.5 來建立自訂映像,以便在 AWS 上執行,請從含有 tkg.json
的目錄執行:
docker run -it --rm \
-v ~/.aws:/home/imagebuilder/.aws \
-v $(pwd)/tkg.json:/home/imagebuilder/tkg.json \
-v $(pwd)/tkg:/home/imagebuilder/tkg \
-v $(pwd)/goss/amazon-ubuntu-1.27.5+vmware.1-goss-spec.yaml:/home/imagebuilder/goss/goss.yaml \
-v /PATH/TO/CUSTOMIZATIONS.json /home/imagebuilder/aws.json \
--env PACKER_VAR_FILES="tkg.json aws.json" \
--env IB_OVFTOOL=1 \
projects.registry.vmware.com/tkg/image-builder:v0.1.13_vmware.2 \
build-ami-ubuntu-2004
將映像上傳至雲端提供者。
若要將 Linux 映像設定為未來 Kubernetes 版本的預設映像,請根據該映像來建立 TKr。否則,請跳至將 Linux 映像用於工作負載叢集。
下圖簡要概述了如何在 vSphere 上為自訂 Linux 映像建立 TKr。
如要建立 TKr,請執行以下操作:
在 ~/.config/tanzu/tkg/bom/
目錄中,開啟對應至自訂映像 Kubernetes 版本的 TKr BoM。Kubernetes v1.27.5 的檔案名稱範例 tkr-bom-v1.27.5+vmware.1-tkg.1.yaml
。
如果目錄中缺少您需要的 TKr BOM 檔案,則可以部署具有您所要 Kubernetes 版本的叢集來將其帶入,如使用非預設 Kubernetes 版本來部署叢集中所述。
在 BOM 檔案中,找出基礎結構的映像定義區塊:ova
表示 vSphere、ami
表示 AWS,azure
表示 Azure。每個映像定義區塊都包含 osinfo.name
、osinfo.version
和 osinfo.arch
,其中:
若要新增作業系統映像的參考,請在 ova
、ami
或 azure
下新增映像定義區塊 (視您的目標基礎結構而定)。如上所述,映像定義區塊必須包含 osinfo.name
、osinfo.version
和 osinfo.arch
。此外,在以下項目上新增映像定義區塊時:
vSphere:
name:
包含作業系統版本的唯一 OVA 名稱,例如 my-ova-ubuntu-2004
。version:
在建立 OVA 時使用 metadata.json
中指派的唯一 VERSION
,例如 v1.27.5+vmware.1-myorg.0
。附註
version
必須與metadata.json
中的相同VERSION
完全相符。
id
值格式,但在末尾使用唯一的十六進位字串,例如 ami-693a5e2348b25e428
。如果 BOM 檔案將映像定義在地區之下,則自訂映像定義區塊必須先列在其地區中。在每個地區內,叢集建立程序會挑選清單中第一個合適的映像。
在 release.version
值中,藉由新增尾碼來設定自訂版本。請勿藉由新增前置詞來自訂版本。例如,將 v1.27.5+vmware.1-tkg.1
變更為 v1.27.5+vmware.1-tkg.1-mycustomtkr
。
使用您在上一個步驟中指定給 release.version
的相同自訂尾碼,來儲存 BOM 檔案。
如果檔案名稱包含加號 (+
) 字元,請將 +
取代為三條虛線 (---
)。
例如,將 BOM 檔案另存為 tkr-bom-v1.27.5---vmware.2-tkg.1-mycustomtkr.yaml
。
base64
- 將檔案內容編碼為二進位字串,例如:
cat tkr-bom-v1.27.5---vmware.2-tkg.1-mycustomtkr.yaml | base64 -w 0
建立 ConfigMap YAML 檔案 (例如,名為 configmap-v1.27.5---vmware.2-tkg.1-mycustomtkr.yaml
),且其中的值如下:
apiVersion: v1
kind: ConfigMap
metadata:
name: CUSTOM-TKG-BOM
labels:
tanzuKubernetesRelease: CUSTOM-TKR
binaryData:
bomContent: "BOM-BINARY-CONTENT"
其中:
CUSTOM-TKG-BOM
是 ConfigMap
的名稱,它必須包含您指定於 BOM 檔案中的 TKr release.version
值,並將任何 + 符號取代為三條虛線 (—)。例如,設定 v1.27.5---vmware.2-tkg.1-mycustomtkr
。CUSTOM-TKR
是 TKr 的名稱,它必須與您指定給 CUSTOM-TKG-BOM
的值相符。例如,v1.27.5---vmware.2-tkg.1-mycustomtkr
。BOM-BINARY-CONTENT
是您在上一個步驟中產生的自訂 BOM 檔案的 base64
編碼內容。例如:
apiVersion: v1
kind: ConfigMap
metadata:
name: v1.27.5---vmware.2-tkg.1-mycustomtkr
labels:
tanzuKubernetesRelease: v1.27.5---vmware.2-tkg.1-mycustomtkr
binaryData:
bomContent: "YXBpVmVyc2lvbjogcnVuLnRhbnp1...."
儲存 ConfigMap
檔案,將 kubectl
內容設定為您想在其中新增 TKr 的管理叢集,並將該檔案套用至於叢集,例如:
kubectl -n tkr-system apply -f configmap-v1.27.5---vmware.2-tkg.1-mycustomtkr.yaml
TKr 控制器透過建立 TanzuKubernetesRelease
來協調新的 ConfigMap
物件。預設協調週期為 600 秒。您可以刪除 TKr 控制器 Pod 來避免這樣的延遲,這會立即還原及協調網繭:
列出 tkr-system
命名空間中的 Pod:
kubectl get pod -n tkr-system
擷取 TKr 控制器 Pod 的名稱,類似於 tkr-controller-manager-f7bbb4bd4-d5lfd
刪除網繭:
kubectl delete pod -n tkr-system TKG-CONTROLLER
其中,TKG-CONTROLLER
是 TKr 控制器 Pod 的名稱。
若要檢查是否新增了自訂 TKr,請執行 tanzu kubernetes-release get
或 kubectl get tkr
,然後在輸出中尋找您在上面所設定的 CUSTOM-TKR
值。
一旦 kubectl
和 tanzu
CLI 列出您的自訂 TKr 後,您可以用它來建立管理叢集或工作負載叢集,如下所述。
若要建立管理叢集,且其使用您的自訂映像作為其節點的基礎作業系統,請執行以下動作:
如需詳細資訊,請參閱如何產生基礎作業系統映像選項。
從 Linux 映像建立工作負載叢集的程序有所不同,具體取決於您是否在上述為 Linux 映像建立 TKr 中建立 TKr。
如果您建立了 TKr,請將 tanzu kubernetes-release get
列出的 TKr 名稱傳遞至 tanzu cluster create
的 --tkr
選項。
如果未建立 TKr,請執行下列步驟:
複製管理叢集組態檔,並遵循組態檔和物件規格中的程序,使用新名稱來儲存該檔案。
在新的組態檔中,新增或修改以下內容:
VSPHERE_TEMPLATE: LINUX-IMAGE
其中,LINUX-IMAGE
是您在建置 Linux 映像中所建立的 Linux 映像的名稱。
移除 CLUSTER_NAME
及其設定 (若有的話)。
依照建立工作負載叢集中所述,來部署工作負載叢集。