習(xí)筆記:部署nginx)
本文首發(fā)于 欄軒·閣歡迎訪問閱讀原文獲取更好的閱讀體驗。一、前言本文在已有 KubeSphere 環(huán)境和 K8s 集群的基礎(chǔ)上記錄如何通過 KubeSphere 部署一個完整的 Nginx 網(wǎng)站。適用場景已在本地通過 Docker Desktop 啟用 K8s 集群已安裝 KubeSphereks-core希望通過可視化界面 命令行結(jié)合的方式管理網(wǎng)站部署本文重點創(chuàng)建配置字典ConfigMap管理 Nginx 配置文件創(chuàng)建持久卷PVC掛載網(wǎng)站靜態(tài)文件創(chuàng)建工作負載Deployment并配置掛載創(chuàng)建 LoadBalancer 服務(wù)暴露到宿主機通過kubectl cp上傳 HTML 文件二、整體架構(gòu)用戶訪問 → localhost:8888 → envoy 代理容器(LoadBalancer) → K8s NodePort → Pod:80(Nginx) ├── /usr/share/nginx/html (PVC 持久卷) └── /etc/nginx/conf.d/ (ConfigMap 配置)三、創(chuàng)建配置字典ConfigMap3.1 什么是配置字典配置字典ConfigMap是 K8s 中用來存儲配置文件的資源對象。這里用來存儲 Nginx 的配置文件掛載到 Pod 中后 Nginx 可以直接讀取。3.2 創(chuàng)建步驟在 KubeSphere 項目中進入配置 → 配置字典點擊創(chuàng)建。3.3 nginx.conf主配置用來控制 Nginx 的全局行為包括工作進程數(shù)、日志格式、事件模型等user nginx; worker_processes 1; events { worker_connections 1024; } http { include /etc/nginx/mime.types; default_type application/octet-stream; log_format main $remote_addr - $remote_user [$time_local] $request $status $body_bytes_sent $http_referer $http_user_agent $http_x_forwarded_for; access_log /var/log/nginx/access.log main; sendfile on; keepalive_timeout 65; include /etc/nginx/conf.d/*.conf; }3.4 default.conf站點配置用來配置具體的虛擬主機定義監(jiān)聽端口、站點根目錄等server { listen 80; server_name localhost; location / { root /usr/share/nginx/html; index index.html index.htm; } error_page 500 502 503 504 /50x.html; location /50x.html { root /usr/share/nginx/html; } }注意站點根目錄root指向/usr/share/nginx/html這就是后面要掛載持久卷的位置。四、創(chuàng)建持久卷PVC持久卷PersistentVolumeClaimPVC用于持久化存儲網(wǎng)站靜態(tài)文件。這樣即使 Pod 重啟上傳的 HTML 文件也不會丟失。在 KubeSphere 中創(chuàng)建進入存儲 → 持久卷聲明點擊創(chuàng)建。容量按需設(shè)置本例設(shè)為 10Gi訪問模式選擇單節(jié)點讀寫RWO。存儲卷創(chuàng)建后會自動綁定到后端的存儲類StorageClass。五、創(chuàng)建應(yīng)用工作負載5.1 鏡像地址docker.1ms.run/library/nginx:latest使用國內(nèi)鏡像源加速拉取。如果使用 Docker Hub 官方鏡像地址為nginx:latest。5.2 掛載持久卷將上一步創(chuàng)建的 PVC 掛載到容器內(nèi) Nginx 的網(wǎng)頁根目錄用于存放 HTML 靜態(tài)文件。字段值掛載路徑/usr/share/nginx/html存儲卷選擇已創(chuàng)建的 PVC讀寫權(quán)限讀寫5.3 掛載配置字典Nginx 有兩個關(guān)鍵配置文件需要掛載涉及多個路徑需分別配置存儲卷容器內(nèi)掛載路徑子路徑Key 名稱nginx 配置字典/etc/nginx/nginx.confnginx.confnginx 配置字典/etc/nginx/conf.d/default.confdefault.conf六、兩種掛載方式的區(qū)別在配置字典掛載時KubeSphere 提供了兩種掛載方式理解其區(qū)別非常重要6.1 指定子路徑subPath適用于精準(zhǔn)掛載單個文件。當(dāng)配置字典包含多個 Key 時直接填寫目標(biāo)Key 名稱如nginx.conf掛載路徑填寫容器內(nèi)完整文件路徑如/etc/nginx/nginx.conf。該方式僅替換指定文件不會清空目標(biāo)目錄原有內(nèi)容。使用場景只想替換某個配置文件保留 Nginx 鏡像自帶的其余默認配置。6.2 選擇指定鍵items 模式需先指定掛載路徑為容器內(nèi)的父目錄再逐一為配置字典里的每個 Key 單獨分配容器內(nèi)子路徑名。該模式會先清空目標(biāo)父目錄再放入指定文件。使用場景需要批量掛載多個配置文件且不關(guān)心容器原有默認配置。6.3 使用建議想要保留容器原有文件如 Nginx 原生配置、僅替換個別配置文件優(yōu)先使用指定子路徑。需要批量掛載多個文件、且允許清空目標(biāo)目錄時再使用選擇指定鍵。二者不要同時勾選避免掛載異常。七、創(chuàng)建服務(wù)暴露到宿主機7.1 創(chuàng)建 Service工作負載部署完成后需要創(chuàng)建 Service 才能外部訪問。在 KubeSphere 中進入服務(wù) → 服務(wù)點擊創(chuàng)建服務(wù)類型LoadBalancer端口映射Pod 端口80→ Service 端口8888或其他你想要的端口注意不需要配置鍵值對標(biāo)簽Docker Desktop 會自動創(chuàng)建 envoy 代理容器供外部訪問。7.2 LoadBalancer 原理說明在 Docker Desktop 的 K8s 環(huán)境中Service 改為 LoadBalancer 類型后kind-cloud-provider組件會自動創(chuàng)建一個 envoy 代理容器將宿主機端口映射到集群內(nèi)部localhost:8888 → envoy 容器:8888 → NodePort → Pod:80??注意如果 Host 端口和已有的 Docker 容器端口沖突如本地已有 Nginx 占用了 80 端口LoadBalancer 會卡在pending狀態(tài)需要手動指定一個空閑端口。7.3 查看 Service 狀態(tài)kubectl get svc-n項目名稱Expected output:NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE nginx LoadBalancer 10.96.135.68 172.18.0.6 8888:31056/TCP 2hEXTERNAL-IP出現(xiàn) IP 地址而非pending代表 LoadBalancer 創(chuàng)建成功。八、上傳 HTML 文件8.1 403 問題Service 創(chuàng)建成功后訪問http://localhost:8888會出現(xiàn)403 Forbidden原因很簡單——頁面根目錄/usr/share/nginx/html是空的Nginx 找不到默認頁面。8.2 使用 kubectl cp 上傳文件首先查看 Pod 名稱kubectl get pods-n項目名稱上傳本地dist/目錄下的文件到 Podkubectlcp./dist/.Pod名稱:/usr/share/nginx/html/-n項目名稱?? 路徑注意./dist/.—— 把dist目錄里面的內(nèi)容上傳到目標(biāo)路徑正確./dist/—— 把dist目錄本身上傳到目標(biāo)路徑會變成html/dist/錯誤8.3 刪除或重新上傳如果傳錯目錄結(jié)構(gòu)需要先清理再重新上傳kubectlexec-n項目名稱Pod名稱--rm-rf/usr/share/nginx/html/*??注意rm -rf *通配符在部分 shell 環(huán)境中可能不生效改用精確路徑更可靠kubectlexec-n項目名稱Pod名稱--rm-rf/usr/share/nginx/html/dist命令說明kubectl exec可以進入容器內(nèi)部執(zhí)行 Linux 命令--后面跟的就是要在容器內(nèi)執(zhí)行的命令。8.4 訪問驗證文件上傳后再次訪問http://localhost:8888可以看到頁面正常顯示。九、常用運維命令9.1 查看 Pod 狀態(tài)和詳情# 查看項目下所有 Podkubectl get pods-n項目名稱# 查看 Pod 詳細信息包括掛載、事件等kubectl describe pod-n項目名稱Pod名稱9.2 查看配置字典內(nèi)容kubectl get configmap-n項目名稱配置名稱-oyaml9.3 查看持久卷PVCkubectl get pvc-n項目名稱9.4 查看 Service 和 External-IPkubectl get svc-n項目名稱9.5 查看 Pod 內(nèi)部文件結(jié)構(gòu)kubectlexec-n項目名稱Pod名稱--ls-la/usr/share/nginx/html/十、總結(jié)階段操作要點配置創(chuàng)建 ConfigMap掛載時注意區(qū)分 subPath 和 items 模式存儲創(chuàng)建 PVC掛載到/usr/share/nginx/html部署創(chuàng)建 Deployment配置鏡像和掛載路徑暴露創(chuàng)建 LoadBalancer Service注意端口沖突Docker Desktop 自動創(chuàng)建 envoy 代理上傳kubectl cp路徑用./dist/.不是./dist/運維kubectl exec進入容器執(zhí)行命令方便調(diào)試和管理通過 KubeSphere 可視化界面結(jié)合kubectl命令行可以很方便地在本地 K8s 環(huán)境中完成 Nginx 網(wǎng)站部署。理解 ConfigMap 掛載機制和 LoadBalancer 在 Docker Desktop 下的工作原理能幫助我們更快排查問題。