部署 Nginx 應用
命令行的方式
1. 創建 deployment 控制器的 pod?
# --image=nginx:這個會從 docker.io 中拉取,這個網站拉不下來
# kubectl create deployment mynginx --image=nginx# 使用國內鏡像源拉取
kubectl create deployment mynginx --image=docker.m.daocloud.io/nginx
命令說明:
- kubectl:Kubernetes 的命令行工具,用于和集群交互。
- create:動作:創建資源。
- deployment:創建的資源類型是 deployment 控制器類型
- mynginx:自定義的 Deployment 名字
- --image=nginx:1.28.0:指定 Deployment 中使用的容器鏡像為 nginx(默認從 Docker Hub 拉取)。1.28.0 是指定nginx的版本號,如果不寫版本號,默認使用的是 latest 標簽
查看創建的 deployment
kubectl get deployment
查看創建的 pod
kubectl get pods
2. 對外暴露端口
kubectl expose deployment mynginx --type=NodePort --port=80
命令說明:
- expose:暴露一個已有的資源(如 Pod、Deployment、ReplicaSet 等)為一個 Service
- deployment mynginx:指定要暴露的資源是名為 mynginx 的 Deployment。
- --type=NodePort:指定創建的 Service 類型是 NodePort,這表示可以通過集群中任意一個節點的 IP 和映射端口(30000~32767)訪問服務。
- --port=80:指定 Service 對外暴露的端口是容器的?80 端口。(現在還在容器內)
查看暴露的服務端口
kubectl get svc
?
刪除服務的命令
kubectl delete svc mynginx
3. 外部瀏覽器訪問服務
隨機端口
瀏覽器訪問:http://ip:31353? ? ? ? ? ?// 31353 是?kubectl get svc 命令查出來的 PORT 值
固定端口,轉發
kubectl port-forward --address 0.0.0.0 svc/mynginx 80:80
命令說明:
- port-forward:表示要啟用端口轉發(port forwarding)。這個功能可以將你本地的一個端口流量轉發到 Kubernetes 內部資源(Pod 或 Service)。
- --address 0.0.0.0:默認情況下,端口轉發只監聽 127.0.0.1(本機回環地址),這個參數讓它監聽所有 IP 地址(即:可以通過其他設備訪問你的主機)。例如在局域網內用其他電腦訪問這臺機器的 80 端口。
- svc/mynginx:表示要轉發目標是名為 mynginx 的 Service。你也可以用 pod/<pod-name> 來轉發到 Pod。
- 80:80:表示將本地的 80 端口 轉發到 Service 的 80 端口,格式是:本地端口:目標端口。
異常處理
kubectl get pods 查詢 STATUS 不是成功的狀態。
使用如下命令查看異常信息:
# kubectl describe pod <pod名稱>
kubectl describe pod mynginx-xxxxxx-xxx
命令說明:
- describe:顯示資源的詳細信息(比 get 更詳細)。
- pod:說明你要查看的資源類型是 Pod。
- mynginx-xxxxxx-xxx:這是某個 Pod 的全名,由 Deployment 控制器自動生成,格式通常是:<Deployment名>-<隨機哈希>。你可以用 kubectl get pods 查到真實名稱。
修改完異常后,可以刪除 deployment 再重新創建
kubectl delete deployment mynginx && kubectl create deployment mynginx --image=nginx
yaml 腳本文件的方式
創建一個名為 my-nginx.yaml 的文件,內容如下:
## 表示這個資源的 API 版本,apps/v1 是 Deployment 當前穩定的版本
apiVersion: apps/v1
## 表示這是一個 "Deployment" 類型的資源對象,用于聲明一個應用如何部署和管理
kind: Deployment## 元數據,name 是這個 Deployment 的名字,kubectl 管理時用到,比如 kubectl get deployment mynginx
metadata:name: mynginx## spec 是核心的配置部分。
spec:## replicas: 2 表示所有節點運行應用的副本(Pod)數量是 2 個,用于高并發replicas: 2## selector 選擇器,表示這個 Deployment 會管理具有標簽 app=nginx 的 Pod# 這個選擇器必須和下面 template.metadata.labels 一致,才能綁定在一起selector:matchLabels:app: nginx## template 是 Pod 的模板,Deployment 根據它創建實際運行的 Podtemplate:metadata:## labels 是給 Pod 添加的標簽,供上面 selector 匹配使用labels:app: nginxspec:## 是一個容器數組,可以運行多個容器containers:## 自定義容器名字- name: nginx## 使用的鏡像名,nginx 是 Docker Hub 上的官方鏡像。這里使用 國內鏡像源的 nginximage: docker.m.daocloud.io/nginxports:## 表示容器內部監聽 80 端口- containerPort: 80## 配置 pod 使用的資源resources:## 表示容器啟動和運行需要的最少資源requests:## 表示容器至少需要 250 毫核 CPU(即 0.25 個 CPU)。單位:m:毫核1000m = 1 核。core 或 空值:核cpu: "250m"## 表示容器至少需要 512MB 內存。單位:B:字節,Ki:千字節,Mi:兆字節,Gi:吉字節,M:十進制單位(用于文件系統)。1M:1,000,000 字節,G:十進制單位(用于文件系統)。1G:1,000,000,000 字節memory: "512Mi" # 請求 512 MB 內存## 表示容器啟動和運行使用的最大資源。避免資源被單個容器占用過多,影響其他容器limits:## 表示容器最多使用 500 毫核 CPU(即 0.5 個 CPU)。單位:m:毫核1000m = 1 核。core 或 空值:核cpu: "500m"## 表示容器最多使用 1GB 內存。單位:B:字節,Ki:千字節,Mi:兆字節,Gi:吉字節,M:十進制單位(用于文件系統)。1M:1,000,000 字節,G:十進制單位(用于文件系統)。1G:1,000,000,000 字節memory: "1Gi"## --- 是 YAML 文件中的分隔符,多資源之間必須存在分隔符
---
## 這是一個 Service 類型的資源,名字叫 my-nginx-service,用于暴露 Pod。
apiVersion: v1
kind: Service
metadata:name: my-nginx-service
spec:## selector 表示這個 Service 會選中所有有標簽 app=nginx 的 Pod,并轉發請求給它們。selector:app: nginxports:## 表示客戶端訪問 Service 使用的端口(集群內部訪問用)- port: 80## 表示轉發到 Pod 的容器監聽的端口(即 containerPort)targetPort: 80## 表示集群外訪問使用的端口(綁定在每個 Node 的 30080 端口上)nodePort: 30080## Service 類型。NodePort 允許從集群外訪問服務,通過 <任意NodeIP>:30080。type: NodePort
然后執行
kubectl apply -f my-nginx.yaml
驗證
kubectl get pods,svc
外部訪問
http://<NodeIP>:30080
刪除 yaml 文件中定義的所有資源
kubectl delete -f my-nginx.yaml
生成默認的 .yaml 文件
生成 Deployment 的默認 YAML 文件
kubectl create deployment mynginx --image=nginx --dry-run=client -o yaml > mynginx-deployment.yaml
參數說明:
- mynginx:自定義的?deployment 名稱
- --dry-run=client:表示不實際創建資源,而是只生成 YAML 配置文件
- -o yaml:用于指定輸出格式為 YAML
- > mynginx-deployment.yaml:將輸出內容保存到 mynginx-deployment.yaml 文件中
生成 Service 的默認 YAML 文件
kubectl expose deployment mynginx --port=80 --target-port=80 --type=NodePort --dry-run=client -o yaml > mynginx-service.yaml
生成 Pod 的默認 YAML 文件
kubectl run mypod --image=nginx --dry-run=client -o yaml > mypod.yaml
生成 ConfigMap 的默認 YAML 文件
kubectl create configmap myconfig --from-literal=key=value --dry-run=client -o yaml > myconfigmap.yaml
生成 Secret 的默認 YAML 文件
kubectl create secret generic mysecret --from-literal=password=secret --dry-run=client -o yaml > mysecret.yaml