在前面幾篇文章中,我們學習了 kubeadm 、kubectl 的一些命令,也學會了 Deployment、Service、ReplicaSet 的用法以及配置。本篇的內容主要是介紹如何配置網絡,使得能夠在外部網絡訪問集群。
在開始之前,需要根據 淺入Kubernetes(6):CKAD認證中的部署教程、淺入Kubernetes(7):應用部署實例,Deployment、Service、ReplicaSet 這兩篇文章中的過程,部署好集群以及部署 nginx 應用。
查詢 Service
關於 Service,讀者可以查看官方文檔的資料:https://kubernetes.io/zh/docs/concepts/services-networking/service/
Service 是 k8s 中為多個 pod 公開網絡服務的抽象方法。在 k8s 中,每個 pod 都有自己的 ip 地址,而且 Service 可以為一組 pod 提供相同的 DNS ,使得多個 pod 之間可以相互通訊,k8s 可以在這些 pod 之間進行負載均衡。
查詢 pod:
kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-585449566-d2fdc 1/1 Running 0 4h14m
nginx-585449566-krsch 1/1 Running 0 67m
nginx-585449566-l2j6h 1/1 Running 0 67m
查看 Service:
kubectl get services
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 29h
nginx ClusterIP 10.101.245.225 <none> 80/TCP 4h19m
kubectl exec {pod名稱} {要執行的命令}
可以在 pod 中執行某個命令,這里我們可以打印某個 pod 的環境變量。
kubectl exec nginx-585449566-d2fdc -- pritenv
# 或者
# kubectl exec nginx-585449566-d2fdc env
... ...
KUBERNETES_PORT=tcp://10.96.0.1:443
KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443
KUBERNETES_PORT_443_TCP_PROTO=tcp
KUBERNETES_PORT_443_TCP_PORT=443
KUBERNETES_PORT_443_TCP_ADDR=10.96.0.1
NGINX_VERSION=1.19.10
... ...
Service 外部服務類型
k8s 中可以將一個 Service 暴露到集群外部,外界可以通過 ip 訪問這個 Service。Service 有個 ServiceType ,允許我們指定如何暴露服務。
Type 有三種類型,其取值說明如下:
-
ClusterIP
通過集群內部 IP 暴露服務,也就是說只能在集群內部訪問,ClusterIP 是 ServiceType 的默認值。
-
NodePort
通過每個節點上的 IP 和靜態端口(
NodePort
)暴露服務。由於其是節點上的 ,所以具有通過集群外部訪問這個服務。 -
LoadBalancer
使用雲提供商的負載均衡器向外部暴露服務。 外部負載均衡器可以將流量路由到自動創建的
NodePort
服務和ClusterIP
服務上。 -
ExternalName
通過返回
CNAME
和對應值,可以將服務映射到externalName
字段的內容(例如,foo.bar.example.com
)。
【圖來源:https://blog.csdn.net/yang75108/article/details/101101384】
配置 ServiceType
我們刪除之前 Deployment 部署 nginx 時,通過 expose 創建的 Service。
kubectl delete service nginx
然后重新創建 service。
kubectl expose deployment nginx --type=LoadBalancer
查詢 Service(kubectl get services
):
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 29h
nginx LoadBalancer 10.97.249.37 <pending> 80:31036/TCP 30s
這里我們說一下這個端口的一些說明。
Service 是針對一個 Pod 或多個 Pod 起效,它為一組 pod 暴露相同的端口。也就是說,同一個 Service 中的 pod 不能分別設置不同的 端口。而且前面我們的一個 Service 中,是為一個 nginx 創建 Deployment ,並且設置副本集,所以他們的 端口是一致的。
Service 不會直接把 pod 暴露的 端口映射到公網,Service 默認在 30000-32767 之間為我們映射端口。所以筆者服務器上,是 310361(外網) 映射了 80(內網)。
這時已經可以直接通過外網訪問 Service 中的服務了。如果你不知道服務器的公網 ip,可以通過命令查詢:
curl ifconfig.io
然后訪問 http://x.x.x.x:31036 即可。
當使用 LoadBalancer 暴露服務到集群外部網絡時,我們訪問的實際上是 Service,而不是具體的某個 pod,然后 Service 會將流量重定向到后端 pod 中。這個要看實際環境和雲服務商的支持。
伸縮數量
kubectl scale
命令可以擴容或縮容 Deployment、ReplicaSet、Replication Controller 或 Job 中Pod數量。在上一篇文件中中我們已經使用到。這里我們繼續使用這個命令來伸縮 nginx 副本的數量,然后觀察外部網絡訪問 Service 時的結果。
現在將我們的 nginx 副本數量設置為 0。
kubectl scale deployment nginx --replicas=0
再訪問 公網的 31036 端口(具體端口看你查詢出來的),發現無法訪問了,因為 pod 數量為 0 ,Service 找不到 pod 來提供服務。
如果我們把 ReplicaSet
數量設置為 1 或以上,則又可以繼續訪問了。
kubectl scale deployment nginx --replicas=2
階段總結
到此為止,我們的學習已經完成一個小階段,能夠創建集群、加入新的 Node、部署 pod 以及暴露公網 ip,允許外部訪問,還可以提供多副本以負載均衡。接下來我們總結一下學習到的工具、命令,后續的學習會在這些基礎之上開展。
-
kubeadm
kubeadm init
、kubeadm join
創建集群和使節點加入集群。 -
kubectl
kubectl 原理是請求 apiserver 完成某些操作,日常操作中,最常用的就是 kubectl。
kubectl create {對象}
,創建 deployment、job 等對象。kubectl apply -f
應用 yaml 文件,完成某些操作。kubectl get {對象}
查詢對象。kubectl scale {對象}
伸縮對象數量(ReplicaSet)。kubectl expose
創建 Service。kubectl describe
獲取對象詳細的信息。kubectl exec
在對象中執行命令,例如 pod。