首頁 > 軟體

設定Kubernetes外網存取叢集

2022-03-31 16:01:20

查詢 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)。

設定 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 initkubeadm 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。

到此這篇關於設定Kubernetes外網存取叢集的文章就介紹到這了。希望對大家的學習有所幫助,也希望大家多多支援it145.com。


IT145.com E-mail:sddin#qq.com