參考b站叩丁狼總結:完整版Kubernetes(K8S)全套入門+微服務實戰項目,帶你一站式深入掌握K8S核心能力
在master節點執行
kubectl create deployment nginx --image=nginxkubectl expose deployment nginx --port=80 --type=NodePort
1. kubectl create deployment nginx --image=nginx
命令解析
kubectl create deployment nginx --image=nginx
kubectl
:Kubernetes 的命令行工具,用于管理 Kubernetes 集群。create
:創建一個新的資源。deployment
:指定要創建的資源類型為Deployment
。Deployment
是 Kubernetes 中的一種控制器,用于管理無狀態應用的 Pod 的生命周期,確保指定數量的 Pod 始終處于運行狀態。nginx
:這是Deployment
的名稱,你可以根據需要自定義。--image=nginx
:指定 Pod 中容器使用的鏡像。這里使用的是官方的nginx
鏡像。
具體行為
-
創建一個
Deployment
:- Kubernetes 會創建一個名為
nginx
的Deployment
。 - 這個
Deployment
會啟動一個 Pod,該 Pod 中運行一個容器,使用nginx
鏡像。 - 默認情況下,
Deployment
會確保始終有一個 Pod 在運行。
- Kubernetes 會創建一個名為
-
Pod 的配置:
- Pod 的名稱會自動生成,類似于
nginx-<隨機字符串>
。 - Pod 中的容器會監聽默認的
nginx
端口(通常是80
)。
- Pod 的名稱會自動生成,類似于
-
結果:
- 你可以通過以下命令查看創建的
Deployment
和 Pod:kubectl get deployment kubectl get pods
- 你可以通過以下命令查看創建的
2. kubectl expose deployment nginx --port=80 --type=NodePort
命令解析
kubectl expose deployment nginx --port=80 --type=NodePort
kubectl
:Kubernetes 的命令行工具。expose
:將現有的資源(如Deployment
或Pod
)暴露為一個服務。deployment nginx
:指定要暴露的資源是名為nginx
的Deployment
。--port=80
:指定 Pod 內部容器監聽的端口。這里指定為80
,因為nginx
容器默認監聽80
端口。--type=NodePort
:指定服務的類型為NodePort
。NodePort
類型的服務會在集群的每個節點上開放一個端口(通常是高端口,如30000-32767
),并將請求轉發到 Pod 的指定端口。
具體行為
-
創建一個
Service
:- Kubernetes 會創建一個名為
nginx
的Service
,類型為NodePort
。 - 這個
Service
會將集群中某個節點的某個端口(NodePort
)映射到 Pod 的80
端口。
- Kubernetes 會創建一個名為
-
端口映射:
- Kubernetes 會自動分配一個
NodePort
(通常是30000-32767
范圍內的端口)。 - 你可以通過以下命令查看分配的
NodePort
:kubectl get service nginx
- 輸出示例:
在這個例子中,NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE nginx NodePort 10.106.223.10 <none> 80:31570/TCP 11m
NodePort
被分配為31570
。
- Kubernetes 會自動分配一個
-
訪問服務:
- 你可以通過集群中任何一個節點的 IP 地址加上
NodePort
來訪問服務。例如:curl <節點IP>:31570
- Kubernetes 的網絡代理(如
kube-proxy
)會捕獲這個請求,并將其轉發到某個運行nginx
的 Pod 的80
端口。
- 你可以通過集群中任何一個節點的 IP 地址加上
總結
-
kubectl create deployment nginx --image=nginx
:- 創建一個名為
nginx
的Deployment
,啟動一個 Pod,Pod 中運行一個使用nginx
鏡像的容器。
- 創建一個名為
-
kubectl expose deployment nginx --port=80 --type=NodePort
:- 將
nginx
Deployment
暴露為一個NodePort
類型的服務。 - 創建一個
Service
,將集群中某個節點的某個端口(NodePort
)映射到 Pod 的80
端口。 - 你可以通過集群中任何一個節點的 IP 地址加上
NodePort
來訪問服務。
- 將
驗證
可以通過以下命令驗證整個過程:
-
查看
Deployment
和 Pod:kubectl get deployment kubectl get pods
-
查看
Service
:kubectl get service nginx
-
訪問服務:
curl <節點IP>:<NodePort>
- 可以通過
kubectl get svc,pod
觀察nginx狀態:
chenaws@k8smaster:~$ kubectl get svc,pod
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 15d
service/myhello-svc NodePort 10.110.50.145 <none> 80:30000/TCP 15d
service/nginx NodePort 10.106.223.10 <none> 80:31570/TCP 49mNAME READY STATUS RESTARTS AGE
pod/myhello-rc-5j2l5 1/1 Running 5 (72m ago) 15d
pod/myhello-rc-989q7 1/1 Running 5 (72m ago) 15d
pod/myhello-rc-bc8pz 1/1 Running 5 (72m ago) 15d
pod/myhello-rc-cv58k 1/1 Running 5 (72m ago) 15d
pod/myhello-rc-r8lgx 1/1 Running 5 (72m ago) 15d
pod/nginx-8f458dc5b-vt2sd 1/1 Running 0 50m
chenaws@k8smaster:~$
實際使用時如果發現nginx節點服務遲遲沒有running,可以通過describe觀察pod狀態
-
使用:
kubectl describe pod nginx-8f458dc5b-vt2sd
主要查看Events是否有報錯,如果卡在pulling,可以嘗試到對應節點重新docker pull nginx
-
如何查看pod被分配到哪個節點?
后續可以在集群任意節點訪問集群內任意節點ip的
31570
端口來訪問133這個節點的nginx服務
為什么是31570
端口?
1. 端口映射關系
在 Kubernetes 中,NodePort
類型的服務會將集群中的某個端口(通常是高端口,如 30000-32767)映射到 Pod 的內部端口。具體來說:
nginx
服務:- ClusterIP:
10.106.223.10
(僅在集群內部可訪問) - NodePort:
31570
(在集群的每個節點上都可以通過這個端口訪問服務) - 目標端口:
80
(Pod 內部的 Nginx 服務監聽的端口)
- ClusterIP:
這意味著,無論你訪問集群中哪個節點的 31570
端口,Kubernetes 都會將請求轉發到某個運行 Nginx 的 Pod 的 80
端口。
2. 為什么可以訪問三個 IP 地址
我的 Kubernetes 集群有三個節點(192.168.132.131
、192.168.132.132
、192.168.132.133
)。因為 nginx
服務的類型是 NodePort
,所以可以通過任何一個節點的 31570
端口訪問 Nginx 服務。
3. 訪問這個端口時發生了什么
當通過 curl 192.168.132.131:31570
發起請求時:
- 請求到達節點:請求發送到集群中的一個節點(比如
192.168.132.131
)的31570
端口。 - Kubernetes 服務代理:Kubernetes 的網絡代理(如 kube-proxy)會捕獲這個請求,并根據服務的定義(
nginx
服務)將請求轉發到192.168.132.133這個運行 Nginx 的 Pod。 - Pod 處理請求:請求被轉發到 Nginx Pod 的
80
端口,由 Nginx 服務器處理。 - 返回響應:Nginx 服務器處理完請求后,將響應返回給 kube-proxy,kube-proxy 再將響應返回給客戶端。
4. 驗證和總結
- 端口映射:
31570
端口是 Kubernetes 為nginx
服務分配的外部訪問端口,它會將請求轉發到 Pod 的80
端口。 - 多節點訪問:因為
NodePort
服務在集群的每個節點上都暴露了相同的端口,所以你可以通過任何一個節點的 IP 地址加上31570
端口來訪問服務。 - 負載均衡:Kubernetes 會自動選擇一個運行 Nginx 的 Pod 來處理請求,實現了簡單的負載均衡。
如何實現work節點使用kubectl
- 剛配置完k8s時,如果在work節點執行,會報錯
- 我們可以通過執行以下命令實現work使用kubectl
# 1.將master節點中/etc/kubernetes/admin.conf拷貝到要運行的work節點服務器,/etc/kubernetes目錄中,使用:
# 注意 chenaws是要拷貝的機器的用戶名,@后是主機名
scp /etc/kubernetes/admin.conf chenaws@k8snode2:/etc/kubernetes# 2.在對應拷貝到的服務器上配置環境變量:
echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
source ~/.bash_profile
-
使用
scp /etc/kubernetes/admin.conf chenaws@k8snode2:/etc/kubernetes
傳輸時,要求要在root模式, -
也可以用下面這條可以傳到不受限制的用戶目錄
-
sudo scp /etc/kubernetes/admin.conf chenaws@k8snode2:~
-
當然后續也要把這個文件移到work的
/etc/kubernetes/
下 -
sudo mv ~/admin.conf /etc/kubernetes/
出現這個直接yes
-
然后繼續配置環境變量即可
-
成功!
為什么需要拷貝 admin.conf
?
- 默認情況下,work節點使用
kubectl
會查找~/.kube/config
文件作為配置文件。 - 我們可以通過比較一開始的 master 節點和 worker 節點的
~/.kube/config
文件配置來找到答案:
- 可以看到,worker節點根本就沒有指明配置,所以使用不了 kubectl,那么我們的解決方案就是把master的配置直接復制到work上去
為什么需要配置環境變量?
- 如果你將
admin.conf
拷貝到了/etc/kubernetes
目錄下,需要通過設置環境變量KUBECONFIG
來告訴kubectl
使用這個新的配置文件路徑。 - 配置環境變量后,
kubectl
就可以正確加載admin.conf
文件,從而訪問 Kubernetes 集群。
為什么不用 cp
?
cp
是本地拷貝命令,只能在同一臺主機上使用。scp
是跨主機拷貝命令,用于在不同主機之間傳輸文件。因為admin.conf
文件在 master 節點上,而你需要將它拷貝到工作節點上,所以必須使用scp
。
命令解析
scp /etc/kubernetes/admin.conf root@k8snode2:/etc/kubernetes
scp
:這是一個安全拷貝命令,用于在不同主機之間拷貝文件。它基于 SSH 協議,因此傳輸過程是加密的。/etc/kubernetes/admin.conf
:這是 Kubernetes 集群的管理員配置文件,包含了訪問集群所需的認證信息(如證書、令牌等)。root@k8snode2
:目標主機的用戶名和主機名。這里假設目標主機的用戶名是root
,主機名是k8snode2
。/etc/kubernetes
:目標路徑,將文件拷貝到目標主機的/etc/kubernetes
目錄下。
命令解析
echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
source ~/.bash_profile
echo
:用于輸出字符串。export KUBECONFIG=/etc/kubernetes/admin.conf
:設置環境變量KUBECONFIG
,指定kubectl
使用的配置文件路徑。>> ~/.bash_profile
:將輸出追加到~/.bash_profile
文件中。~/.bash_profile
是用戶登錄時加載的配置文件之一,用于設置環境變量。source ~/.bash_profile
:重新加載~/.bash_profile
文件,使剛剛設置的環境變量生效。
總結
-
拷貝
admin.conf
:- 使用
scp
將admin.conf
從 master 節點拷貝到工作節點的/etc/kubernetes
目錄。 - 這樣可以讓工作節點上的
kubectl
使用這個配置文件訪問集群。
- 使用
-
配置環境變量:
- 設置
KUBECONFIG
環境變量,指定kubectl
使用的配置文件路徑。 - 通過
source ~/.bash_profile
使環境變量生效。
- 設置
https://github.com/0voice