弄好 Service 之後,三個 Pod 回的都還是 nginx 那個預設歡迎頁。今天要把首頁換成自己的內容,順便認識 ConfigMap
設定或內容如果直接寫死在 Image 裡面,那每改一個字都要重新 build、重新推、重新部署。ConfigMap 的用途就是把這些會變的東西從 Image 裡面拉出來,變成叢集上的一份資料
configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: web-content
namespace: ithome-lab
data:
index.html: |
<html>
<body>
<h1>ithome-lab day11</h1>
<p>this page comes from a ConfigMap</p>
</body>
</html>
data 底下每一個鍵就是一份設定。這裡的 index.html 是鍵名,後面那個直立線是 YAML 的多行字串語法,意思是接下來縮排的那幾行都算同一個值,換行會被保留
等一下掛進 Pod 的時候,鍵名會變成檔名、值會變成檔案內容
然後改deployment.yaml,加兩段東西
spec:
containers:
- name: nginx
image: nginx:alpine
ports:
- containerPort: 80
volumeMounts:
- name: web-content
mountPath: /usr/share/nginx/html/index.html
subPath: index.html
volumes:
- name: web-content
configMap:
name: web-content
/usr/share/nginx/html 是 nginx 放靜態檔案的預設位置。這裡要注意,如果直接把 ConfigMap 掛在這個目錄上,整個目錄會被換掉,image 內建的檔案像 50x.html 就不見了。只想換掉其中一個檔案就加 subPath,指定要掛的是 ConfigMap 裡的哪一個鍵,這樣被換掉的就只有 index.html
套用
kubectl apply -f manifests/base
kubectl rollout status deployment/web -n ithome-lab
因為 deployment.yaml 的 template 改了,apply 下去會自動觸發一次滾動更新
驗證
kubectl port-forward -n ithome-lab service/web 8080:80

也可以直接進 Pod 裡面確認檔案真的在
kubectl exec deploy/web -n ithome-lab -- ls /usr/share/nginx/html
kubectl exec deploy/web -n ithome-lab -- cat /usr/share/nginx/html/index.html
deploy/web 會自己挑一個 Pod 進去,不用先去查 Pod 叫什麼,比前面要複製一長串亂碼方便多了
隨便改一下 configmap.yaml 裡面的文字,重新 apply,然後回去重整頁面
kubectl apply -f manifests/base/configmap.yaml
會發現沒變。ConfigMap 已經更新了,但 Pod 一個都沒動。這件事背後有好幾層原因,Day 22 會整篇拆開來講,今天先知道怎麼解決就好
解法是叫它重啟
kubectl rollout restart deployment/web -n ithome-lab
kubectl rollout status deployment/web -n ithome-lab

如果內容比較長,不想整段塞在 YAML 裡面,可以直接從檔案生
kubectl create configmap web-content -n ithome-lab --from-file=index.html --dry-run=client -o yaml
明天見 :D
