本主題說明如何使用 ytt
覆疊來設定由 Tanzu Kubernetes Grid (TKG) 部署的舊版 TKC 和以計劃為基礎的工作負載叢集,以設定無法由叢集組態檔中的組態變數設定的叢集和基礎物件內容,如使用組態檔設定主管部署的叢集 (適用於 TKC 叢集) 或組態檔變數參考 (適用於以計劃為基礎的叢集) 所列。
有關如何下載和安裝 ytt
的資訊,請參見安裝 Carvel 工具。
以類別為基礎的叢集不需要也不支援 ytt
覆疊,因為可設定內容都可在簡化的 Cluster
物件本身的高階模式下設定。當 Tanzu CLI 針對以類別為基礎的叢集執行 ytt
時,如果在您的機器上偵測到 tanzu cluster create
,則會輸出 It seems like you have done some customizations to the template overlays.
錯誤
對於 TKC 和以計劃為基礎的工作負載叢集的進階組態,若要設定的物件內容無法以叢集組態變數來設定,您可以在任何啟動機器的本機 ~/.config/tanzu/tkg/providers/infrastructure-tkg-service-vsphere
目錄中,自訂 TKC、以計劃為基礎的叢集和叢集計劃組態檔。
您可以直接新增或修改組態檔或使用 ytt
覆疊,來自訂這些組態。
直接自訂組態檔更簡單,但如果熟悉 ytt
覆疊,它們允許您在不同的範圍內自訂組態並管理多個模組化組態檔,而不需對上游和繼承的組態值進行破壞性編輯。ytt
覆疊僅適用於使用 Tanzu CLI 建立的新 TKC 和以計劃為基礎的工作負載叢集。
如需各種叢集組態的運作原理和優先順序的詳細資訊,請參閱〈關於 Tanzu Kubernetes Grid〉中的關於舊版 TKC 和以計劃為基礎的叢集組態。
ytt
行為和慣例ytt
處理程序的行為和慣例包括:
優先順序:ytt
會依檔案名稱的字母順序,以深度優先方式周遊目錄,並在進行期間覆寫重複的設定。當存在重複的定義時,則 ytt
最後處理的定義將優先採用。
覆疊類型:不同的 ytt
覆疊類型會變更或設定不同的內容:
資料值檔案設定或修改組態值,而不修改物件的結構。其中包括用料表清單 (BoM) 檔案,以及 (依慣例) 檔案名稱中包含 data
的檔案。
覆疊檔案變更物件結構定義。依慣例,這些檔案的檔案名稱中會有 overlay
。
如需 ytt
(包括覆疊範例和互動式驗證器工具) 的詳細資訊,請參閱:
ytt
> Interactive Playground對於 TKC 和以計劃為基礎的叢集,啟動機器的 ~/.config/tanzu/tkg/providers/
目錄包括 ytt
目錄和不同層級的 overlay.yaml
檔案,允許您確定每個層級的組態設定範圍。
ytt
目錄。例如,~/.config/tanzu/tkg/providers/infrastructure-tkg-service-vsphere/v1.1.0
。
base-template.yaml
檔案包含全大寫的預留位置 (如 "${CLUSTER_NAME}"
),且不應進行編輯。overlay.yaml
檔案已經過調整,以將值覆疊到 base-template.yaml
中。ytt
目錄。例如,~/.config/tanzu/tkg/providers/infrastructure-tkg-service-vsphere/ytt
。
ytt
目錄,~/.config/tanzu/tkg/providers/infrastructure-tkg-service-vsphere/ytt
。
ytt
子目錄的組態,建立 /04_user_customizations
子目錄。ytt
覆疊本節包含用於自訂由獨立管理叢集部署的以計劃為基礎的工作負載叢集以及建立新叢集計劃的覆疊。
限制:
ytt
覆疊修改工作負載叢集。不支援使用 ytt
覆疊修改獨立管理叢集。以下範例說明如何使用組態覆疊檔,來自訂工作負載叢集和建立新的叢集計劃。
對於在叢集中自訂受信任憑證的覆疊,請參閱管理叢集秘密金鑰和憑證主題中的設定具有多個受信任登錄的叢集。
此範例是將一或多個自訂名稱伺服器,新增到 vSphere 上舊版 Tanzu Kubernetes Grid 叢集中的工作節點和控制平面節點。它會停用從 DHCP 進行 DNS 解析,以便優先使用自訂名稱伺服器。
若要在以類別為基礎的叢集中設定自訂名稱伺服器,請使用組態變數 CONTROL_PLANE_NODE_NAMESERVERS
和 WORKER_NODE_NAMESERVERS
。
其中兩個覆疊檔案適用於控制平面節點,另兩個則適用於工作節點。您可以將這四個檔案全新增到 ~/.config/tanzu/tkg/providers/infrastructure-vsphere/ytt/
目錄。
覆疊檔案會因節點是以 Ubuntu 或 Photon 機器映像為基礎而異,而且 Ubuntu 不需要 DHCP 覆疊檔案。
每個 overlay-dns
檔案中的一行都會設定名稱伺服器位址。以下程式碼顯示單一名稱伺服器,但您可以將多個名稱伺服器指定成清單,例如 nameservers: ["1.2.3.4","5.6.7.8"]
。
vsphere-overlay-dns-control-plane.yaml
檔案:
Ubuntu:
#@ load("@ytt:overlay", "overlay")
#@ load("@ytt:data", "data")
#@overlay/match by=overlay.subset({"kind":"VSphereMachineTemplate", "metadata": {"name": data.values.CLUSTER_NAME+"-control-plane"}})
---
spec:
template:
spec:
network:
devices:
#@overlay/match by=overlay.all, expects="1+"
-
#@overlay/match missing_ok=True
nameservers: ["8.8.8.8"]
#@overlay/match missing_ok=True
dhcp4Overrides:
useDNS: false
Photon:
#@ load("@ytt:overlay", "overlay")
#@ load("@ytt:data", "data")
#@overlay/match by=overlay.subset({"kind":"VSphereMachineTemplate", "metadata": {"name": data.values.CLUSTER_NAME+"-control-plane"}})
---
spec:
template:
spec:
network:
devices:
#@overlay/match by=overlay.all, expects="1+"
-
#@overlay/match missing_ok=True
nameservers: ["8.8.8.8"]
vsphere-overlay-dns-workers.yaml
檔案:
Ubuntu:
#@ load("@ytt:overlay", "overlay")
#@ load("@ytt:data", "data")
#@overlay/match by=overlay.subset({"kind":"VSphereMachineTemplate", "metadata": {"name": data.values.CLUSTER_NAME+"-worker"}})
---
spec:
template:
spec:
network:
devices:
#@overlay/match by=overlay.all, expects="1+"
-
#@overlay/match missing_ok=True
nameservers: ["8.8.8.8"]
#@overlay/match missing_ok=True
dhcp4Overrides:
useDNS: false
Photon:
#@ load("@ytt:overlay", "overlay")
#@ load("@ytt:data", "data")
#@overlay/match by=overlay.subset({"kind":"VSphereMachineTemplate", "metadata": {"name": data.values.CLUSTER_NAME+"-worker"}})
---
spec:
template:
spec:
network:
devices:
#@overlay/match by=overlay.all, expects="1+"
-
#@overlay/match missing_ok=True
nameservers: ["8.8.8.8"]
vsphere-overlay-dhcp-control-plane.yaml
檔案 (僅限 Photon):
#@ load("@ytt:overlay", "overlay")
#@ load("@ytt:data", "data")
#@overlay/match by=overlay.subset({"kind":"KubeadmControlPlane"})
---
spec:
kubeadmConfigSpec:
preKubeadmCommands:
#! disable dns from being emitted by dhcp client
#@overlay/append
- echo '[DHCPv4]' >> /etc/systemd/network/10-cloud-init-eth0.network
#@overlay/append
- echo 'UseDNS=false' >> /etc/systemd/network/10-cloud-init-eth0.network
#@overlay/append
- '/usr/bin/systemctl restart systemd-networkd 2>/dev/null'
vsphere-overlay-dhcp-workers.yaml
檔案 (僅限 Photon):
#@ load("@ytt:overlay", "overlay")
#@ load("@ytt:data", "data")
#@overlay/match by=overlay.subset({"kind":"KubeadmConfigTemplate"}),expects="1+"
---
spec:
template:
spec:
#@overlay/match missing_ok=True
preKubeadmCommands:
#! disable dns from being emitted by dhcp client
#@overlay/append
- echo '[DHCPv4]' >> /etc/systemd/network/10-cloud-init-eth0.network
#@overlay/append
- echo 'UseDNS=false' >> /etc/systemd/network/10-cloud-init-eth0.network
#@overlay/append
- '/usr/bin/systemctl restart systemd-networkd 2>/dev/null'
若要在 vSphere with NSX Advanced Load Balancer 上建立工作負載叢集,並將 VSPHERE_CONTROL_PLANE_ENDPOINT
設定為 FQDN 而非 IP 位址,請在 .config/tanzu/tkg/providers/infrastructure-vsphere/ytt/
目錄 (如 fqdn-cert-api.yaml
) 中建立覆疊檔案,其內容如下:
#@ load("@ytt:overlay", "overlay")
#@ load("@ytt:data", "data")
#@overlay/match by=overlay.subset({"kind":"KubeadmControlPlane"}), expects="1+"
#@overlay/match-child-defaults missing_ok=True
---
apiVersion: controlplane.cluster.x-k8s.io/v1beta1
kind: KubeadmControlPlane
metadata:
name: #@ "{}-control-plane".format(data.values.CLUSTER_NAME)
spec:
kubeadmConfigSpec:
clusterConfiguration:
apiServer:
certSANs:
- CONTROLPLANE-FQDN
其中,CONTROLPLANE-FQDN
是工作負載叢集控制平面的 FQDN。
在覆疊就位後建立叢集。
建立叢集後,請按照設定節點 DHCP 預留和端點 DNS 記錄 (僅限 vSphere) 中所述的程序來建立 DNS 記錄。
在建立具有 FQDN 端點的其他每個叢集之前,請視需要在覆疊中修改 CONTROLPLANE-FQDN
設定。
在現代 Linux 系統中,如果嘗試解析的主機名稱,其網域尾碼的結尾是 .local
,則可能會解析失敗。發生此問題的原因是,systemd-networkd
(大多數 Linux 發行版中的 DNS 解析程式) 會嘗試透過多點傳播 DNS (mDNS) 來解析 .local
網域,而不是透過標準 DNS 伺服器來解析。
若要在以類別為基礎的叢集中設定 .local
網域解析,請使用組態變數 CONTROL_PLANE_NODE_SEARCH_DOMAINS
和 WORKER_NODE_SEARCH_DOMAINS
。
若要在舊版叢集中解決這個已知問題,請在 vsphere-overlay-dns-control-plane.yaml
尾端,新增帶有本機網域尾碼的 searchDomains
字行,以及在 ~/.config/tanzu/tkg/providers/infrastructure-vsphere/ytt/
目錄中新增 vsphere-overlay-dns-workers.yaml
檔案。
vsphere-overlay-dns-control-plane.yaml
檔案的範例:
#@ load("@ytt:overlay", "overlay")
#@ load("@ytt:data", "data")
#@overlay/match by=overlay.subset({"kind":"VSphereMachineTemplate", "metadata": {"name": data.values.CLUSTER_NAME+"-control-plane"}})
---
spec:
template:
spec:
network:
devices:
#@overlay/match by=overlay.all, expects="1+"
-
#@overlay/match missing_ok=True
nameservers: ["8.8.8.8"]
searchDomains: ["corp.local"]
vsphere-overlay-dns-workers.yaml
檔案的範例:
#@ load("@ytt:overlay", "overlay")
#@ load("@ytt:data", "data")
#@overlay/match by=overlay.subset({"kind":"VSphereMachineTemplate", "metadata": {"name": data.values.CLUSTER_NAME+"-worker"}})
---
spec:
template:
spec:
network:
devices:
#@overlay/match by=overlay.all, expects="1+"
-
#@overlay/match missing_ok=True
nameservers: ["8.8.8.8"]
searchDomains: ["corp.local"]
在 Tanzu Kubernetes Grid 叢集內進行 TLS 驗證時,需要精確的時間同步。在大多數以 DHCP 為基礎的環境中,您可以使用 DHCP 選項 42 來設定同步。
如果您要在沒有 DHCP 選項 42 的 vSphere 環境中部署舊版叢集,請依如下所示使用覆疊程式碼,以便讓 Tanzu Kubernetes Grid 使用維持同步的 NTP 伺服器來建立叢集
若要在以類別為基礎的叢集中設定 NTP,請使用組態變數 NTP_SERVERS
。
在 ~/.config/tanzu/tkg/providers/infrastructure-vsphere/ytt/
目錄中,建立一個新的 .yaml
檔案,或使用以下程式碼來擴展現有覆疊檔,以便將 time.google.com
範例變更為您要的 NTP 伺服器:
#@ load("@ytt:overlay", "overlay")
#@ load("@ytt:data", "data")
#@overlay/match by=overlay.subset({"kind":"KubeadmControlPlane"})
---
spec:
kubeadmConfigSpec:
#@overlay/match missing_ok=True
ntp:
#@overlay/match missing_ok=True
enabled: true
#@overlay/match missing_ok=True
servers:
- time.google.com
#@overlay/match by=overlay.subset({"kind":"KubeadmConfigTemplate"}),expects="1+"
---
spec:
template:
spec:
#@overlay/match missing_ok=True
ntp:
#@overlay/match missing_ok=True
enabled: true
#@overlay/match missing_ok=True
servers:
- time.google.com
建立舊版叢集時,此覆疊會將持續性標籤指派給叢集節點。這非常有用,因為透過 kubectl
手動套用的標籤,不會因節點取代而持續存在。
請參閱 ytt
覆疊中的額外變數。
若要在以類別為基礎的叢集中,為控制平面節點設定自訂節點標籤,請使用組態變數 CONTROL_PLANE_NODE_LABELS
。
在 ~/.config/tanzu/tkg/providers/infrastructure-vsphere/ytt/
目錄中,建立新的 .yaml
檔案,或使用以下程式碼來擴展現有的覆疊檔。
對於控制平面節點標籤,請設定 initConfiguration
和 joinConfiguration
區段,以便將標籤套用至所建立的第一個節點以及在以下命令後所加入的所有節點:
#@ load("@ytt:overlay", "overlay")
#@ load("@ytt:data", "data")
#@overlay/match by=overlay.subset({"kind":"KubeadmControlPlane"})
---
spec:
kubeadmConfigSpec:
initConfiguration:
nodeRegistration:
kubeletExtraArgs:
#@overlay/match missing_ok=True
node-labels: NODE-LABELS
joinConfiguration:
nodeRegistration:
kubeletExtraArgs:
#@overlay/match missing_ok=True
node-labels: NODE-LABELS
其中,NODE-LABELS
是一個以逗號分隔的標籤索引鍵/值字串清單,其中包括 node-type=control-plane
(例如 "examplekey1=labelvalue1,examplekey2=labelvalue2"
)。
對於工作節點標籤:
#@ load("@ytt:overlay", "overlay")
#@ load("@ytt:data", "data")
#@overlay/match by=overlay.subset({"kind":"KubeadmConfigTemplate"}),expects="1+"
---
spec:
template:
spec:
joinConfiguration:
nodeRegistration:
kubeletExtraArgs:
#@overlay/match missing_ok=True
node-labels: NODE-LABELS
其中,NODE-LABELS
是一個以逗號分隔的標籤索引鍵/值字串清單,其中包括 node-type=worker
(例如 "examplekey1=labelvalue1,examplekey2=labelvalue2"
)。
有關在 AWS 上停用工作負載叢集 Bastion 主機的覆疊範例,請參閱 TKG Lab 存放庫中的在 AWS 上停用 Bastion 伺服器。
nginx
此範例將新增並設定一項新的工作負載叢集計劃 nginx
,且該計劃將執行 nginx 伺服器。該計劃使用叢集資源集 (CRS) 將 nginx 伺服器部署至使用 vSphere 叢集 API 提供者 v1.7.1 所建立的 vSphere 叢集。
在 .tkg/providers/infrastructure-vsphere/v1.7.1/
中,新增一個新的 cluster-template-definition-nginx.yaml
檔案,且其內容與 cluster-template-definition-dev.yaml
和 cluster-template-definition-prod.yaml
檔案相同:
apiVersion: run.tanzu.vmware.com/v1alpha1
kind: TemplateDefinition
spec:
paths:
- path: providers/infrastructure-vsphere/v1.7.1/ytt
- path: providers/infrastructure-vsphere/ytt
- path: providers/ytt
- path: bom
filemark: text-plain
- path: providers/config_default.yaml
存在這個檔案時,將建立一項新計劃,且 tanzu
CLI 會解析其檔案名稱來建立 nginx
選項,以便傳遞給 tanzu cluster create --plan
。
在 ~/.config/tanzu/tkg/providers/ytt/04_user_customizations/
中,建立一個新的 deploy_service.yaml
檔案,其中含有:
#@ load("@ytt:overlay", "overlay")
#@ load("@ytt:data", "data")
#@ load("@ytt:yaml", "yaml")
#@ def nginx_deployment():
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
selector:
matchLabels:
app: nginx
replicas: 2
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
#@ end
#@ if data.values.TKG_CLUSTER_ROLE == "workload" and data.values.CLUSTER_PLAN == "nginx":
---
apiVersion: addons.cluster.x-k8s.io/v1beta1
kind: ClusterResourceSet
metadata:
name: #@ "{}-nginx-deployment".format(data.values.CLUSTER_NAME)
labels:
cluster.x-k8s.io/cluster-name: #@ data.values.CLUSTER_NAME
spec:
strategy: "ApplyOnce"
clusterSelector:
matchLabels:
tkg.tanzu.vmware.com/cluster-name: #@ data.values.CLUSTER_NAME
resources:
- name: #@ "{}-nginx-deployment".format(data.values.CLUSTER_NAME)
kind: ConfigMap
---
apiVersion: v1
kind: ConfigMap
metadata:
name: #@ "{}-nginx-deployment".format(data.values.CLUSTER_NAME)
type: addons.cluster.x-k8s.io/resource-set
stringData:
value: #@ yaml.encode(nginx_deployment())
#@ end
在這個檔案中,條件式 #@ if data.values.TKG_CLUSTER_ROLE == "workload" and data.values.CLUSTER_PLAN == "nginx":
會將下面的覆疊套用至 nginx
計劃的工作負載叢集。
如果 04_user_customizations
目錄不存在於頂層 ytt
目錄之下,請建立該目錄。
ytt
覆疊中的額外變數覆疊會將其組態套用至所有新建立的叢集。若要使用不同的覆疊設定來個別自訂叢集,您可以將覆疊與新增至叢集組態中的自訂變數合併在一起。
此範例顯示如何使用額外的叢集組態變數,為不同的叢集設定自訂節點標籤。
附註升級 Tanzu CLI 後,您需要將這些變更重新套用至新的
~/.config/tanzu/tkg/providers
目錄。舊版本將重新命名,以作為一個帶有時間戳記的備份。
將 WORKER_NODE_LABELS
變數新增到預設組態和叢集組態檔,可建立具有不同工作節點標籤的新叢集。
編輯 ~/.config/tanzu/tkg/providers/config_default.yaml
,並在底部新增自訂變數預設值:
#! ---------------------------------------------------------------------
#! Custom variables
#! ---------------------------------------------------------------------
WORKER_NODE_LABELS: ""
如果叢集的組態檔缺少此變數,則設定此預設值,可防止將不需要的標籤新增到叢集。
在靠近 ~/.config/tanzu/tkg/providers/ytt/lib/config_variable_association.star
尾端處新增一行 (最後一個右括弧的上方),可讓新變數與提供者類型產生關聯。
"WORKER_NODE_LABELS": ["vsphere", "aws", "azure"],
}
end
在 ~/.config/tanzu/tkg/providers/infrastructure-vsphere/ytt/
目錄中建立一個新的 .yaml
檔案,或使用以下程式碼來擴展現有覆疊檔,以便將 WORKER_NODE_LABELS
變數新增為資料值:
#@ load("@ytt:overlay", "overlay")
#@ load("@ytt:data", "data")
#@overlay/match by=overlay.subset({"kind":"KubeadmConfigTemplate"}),expects="1+"
---
spec:
template:
spec:
joinConfiguration:
nodeRegistration:
kubeletExtraArgs:
#@overlay/match missing_ok=True
node-labels: #@ data.values.WORKER_NODE_LABELS
對於任何新的工作負載叢集,現在可以在其叢集組態變數檔中設定 WORKER_NODE_LABEL
,以將其值當成標籤來套用至每個叢集節點。
WORKER_NODE_LABELS: "workload-classification=production"
ytt
覆寫僅適用於使用登入獨立管理叢集的 Tanzu CLI 部署的以計劃為基礎的新工作負載叢集。若要修改既有叢集的資源,您需要在獨立管理叢集中修改它,並將其推送到工作負載叢集,如下所述。
此程序會提供相同的修改 (亦即,在沒有 DHCP 選項 42 的情況下設定 NTP (vSphere) 覆疊套用至新叢集的修改內容) 給現有叢集。
修改現有叢集上的 NTP 設定時,您需要:
KubeadmConfigTemplate
資源,以反映新設定MachineDeployment
,以指向新資源KubeadmControlPlane
資源,以更新控制平面節點
若要修改現有叢集上的 NTP 設定,請從管理叢集以及從包含要修改之叢集的命名空間中,執行以下命令 (在本範例中名為 cluster1
):
針對每個 KubeadmConfigTemplate
/ MachineDeployment
配對,建立新的 KubeadmConfigTemplate
資源並更新 MachineDeployment
。針對 prod
計劃叢集,請執行此程序三次:
為工作節點建立新的 KubeadmConfigTemplate
資源。
尋找現有 KubeadmConfigTemplate
,並將其匯出至 yaml
檔案進行編輯。
kubectl get KubeadmConfigTemplate
kubectl get KubeadmConfigTemplate cluster1-md-0 -o yaml > cluster1-md-0.yaml
編輯匯出的檔案,方法是將 ntp
區段新增至現有 spec.template.spec
區段下方,並將 -v1
附加至 metadata
之下的 name
欄位,並假設這是第一次更新:
metadata:
...
name: cluster1-md-0-v1 # from cluster1-md-0
...
kubeadmConfigSpec:
ntp:
enabled: true
servers:
- time.google.com
套用已更新的 yaml
檔案,以建立新資源。
kubectl apply -f cluster1-md-0.yaml
更新 MachineDeployment
資源,以指向新建立的 KubeadmConfigTemplate
資源。
尋找並編輯叢集的現有 MachineDeployment
資源。
kubectl get MachineDeployment
kubectl edit MachineDeployment cluster1-md-0
編輯 spec.template.spec.bootstrap.configRef.name
值,以設定 KubeadmConfigTemplate
資源的新名稱。
spec:
template:
...
spec:
bootstrap:
configRef:
apiVersion: bootstrap.cluster.x-k8s.io/v1beta1
kind: KubeadmConfigTemplate
name: cluster1-md-0-v1 # from cluster1-md-0
儲存並結束檔案,這會觸發重新建立工作節點。
編輯控制平面節點的 KubeadmControlPlane
資源,以包含 NTP 伺服器。
尋找並編輯叢集的現有 KubeadmControlPlane
資源。
kubectl get KubeadmControlPlane
kubectl edit KubeadmControlPlane cluster1-control-plane
編輯 spec.kubeadmConfigSpec
區段,作法是新增下面的新 ntp
區段。儲存並結束該檔案。
kubeadmConfigSpec:
ntp:
enabled: true
servers:
- time.google.com