配置Kubernetes外網(wǎng)訪問集群
查詢 Service
關(guān)于 Service,讀者可以查看官方文檔的資料:https://kubernetes.io/zh/docs/concepts/services-networking/service/
Service 是 k8s 中為多個 pod 公開網(wǎng)絡(luò)服務(wù)的抽象方法。在 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名稱} {要執(zhí)行的命令}
可以在 pod 中執(zhí)行某個命令,這里我們可以打印某個 pod 的環(huán)境變量。
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 外部服務(wù)類型
k8s 中可以將一個 Service 暴露到集群外部,外界可以通過 ip 訪問這個 Service。Service 有個 ServiceType ,允許我們指定如何暴露服務(wù)。
Type 有三種類型,其取值說明如下:
ClusterIP
通過集群內(nèi)部 IP 暴露服務(wù),也就是說只能在集群內(nèi)部訪問,ClusterIP 是 ServiceType 的默認值。
NodePort
通過每個節(jié)點上的 IP 和靜態(tài)端口(
NodePort
)暴露服務(wù)。由于其是節(jié)點上的 ,所以具有通過集群外部訪問這個服務(wù)。LoadBalancer
使用云提供商的負載均衡器向外部暴露服務(wù)。 外部負載均衡器可以將流量路由到自動創(chuàng)建的
NodePort
服務(wù)和ClusterIP
服務(wù)上。ExternalName
通過返回
CNAME
和對應(yīng)值,可以將服務(wù)映射到externalName
字段的內(nèi)容(例如,foo.bar.example.com
)。
配置 ServiceType
我們刪除之前 Deployment 部署 nginx 時,通過 expose 創(chuàng)建的 Service。
kubectl delete service nginx
然后重新創(chuàng)建 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 不能分別設(shè)置不同的 端口。而且前面我們的一個 Service 中,是為一個 nginx 創(chuàng)建 Deployment ,并且設(shè)置副本集,所以他們的 端口是一致的。
Service 不會直接把 pod 暴露的 端口映射到公網(wǎng),Service 默認在 30000-32767 之間為我們映射端口。所以筆者服務(wù)器上,是 310361(外網(wǎng)) 映射了 80(內(nèi)網(wǎng))。
這時已經(jīng)可以直接通過外網(wǎng)訪問 Service 中的服務(wù)了。如果你不知道服務(wù)器的公網(wǎng) ip,可以通過命令查詢:
curl ifconfig.io
然后訪問 http://x.x.x.x:31036 即可。
當使用 LoadBalancer 暴露服務(wù)到集群外部網(wǎng)絡(luò)時,我們訪問的實際上是 Service,而不是具體的某個 pod,然后 Service 會將流量重定向到后端 pod 中。這個要看實際環(huán)境和云服務(wù)商的支持。
伸縮數(shù)量
kubectl scale
命令可以擴容或縮容 Deployment、ReplicaSet、Replication Controller 或 Job 中Pod數(shù)量。在上一篇文件中中我們已經(jīng)使用到。這里我們繼續(xù)使用這個命令來伸縮 nginx 副本的數(shù)量,然后觀察外部網(wǎng)絡(luò)訪問 Service 時的結(jié)果。
現(xiàn)在將我們的 nginx 副本數(shù)量設(shè)置為 0。
kubectl scale deployment nginx --replicas=0
再訪問 公網(wǎng)的 31036 端口(具體端口看你查詢出來的),發(fā)現(xiàn)無法訪問了,因為 pod 數(shù)量為 0 ,Service 找不到 pod 來提供服務(wù)。
如果我們把 ReplicaSet
數(shù)量設(shè)置為 1 或以上,則又可以繼續(xù)訪問了。
kubectl scale deployment nginx --replicas=2
階段總結(jié)
到此為止,我們的學習已經(jīng)完成一個小階段,能夠創(chuàng)建集群、加入新的 Node、部署 pod 以及暴露公網(wǎng) ip,允許外部訪問,還可以提供多副本以負載均衡。接下來我們總結(jié)一下學習到的工具、命令,后續(xù)的學習會在這些基礎(chǔ)之上開展。
kubeadm
kubeadm init
、kubeadm join
創(chuàng)建集群和使節(jié)點加入集群。kubectl
kubectl 原理是請求 apiserver 完成某些操作,日常操作中,最常用的就是 kubectl。
kubectl create {對象}
,創(chuàng)建 deployment、job 等對象。kubectl apply -f
應(yīng)用 yaml 文件,完成某些操作。kubectl get {對象}
查詢對象。kubectl scale {對象}
伸縮對象數(shù)量(ReplicaSet)。kubectl expose
創(chuàng)建 Service。kubectl describe
獲取對象詳細的信息。kubectl exec
在對象中執(zhí)行命令,例如 pod。
到此這篇關(guān)于配置Kubernetes外網(wǎng)訪問集群的文章就介紹到這了。希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Kubernetes(K8S)容器集群管理環(huán)境完整部署詳細教程-中篇
本系列文章主要介紹了Kubernetes(K8S)容器集群管理環(huán)境完整部署的詳細教程,分為上中下三篇文章,此為中篇,需要的朋友可以參考下2022-01-01kubernetes中的namespace、node、pod介紹
這篇文章介紹了kubernetes中的namespace、node、pod,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2022-03-03Kubernetes ApiServer三大server權(quán)限與數(shù)據(jù)存儲解析
這篇文章主要為大家介紹了Kubernetes ApiServer三大server權(quán)限與數(shù)據(jù)存儲解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-11-11使用kubeadm命令行工具創(chuàng)建kubernetes集群
這篇文章介紹了使用kubeadm命令行工具創(chuàng)建kubernetes集群的方法,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2022-03-03Docker與K8s關(guān)系介紹不會Docker也可以使用K8s
想學K8s,必須得先學會Docker嗎?這是很多網(wǎng)友在開始有想法想要學?K8s的時候都會冒出來的想法,要回答這個問題,我們需要先搞清楚?Docker?和?K8s?他們的角色是什么,相互之間是什么關(guān)系2022-06-06Dashboard管理Kubernetes集群與API訪問配置
這篇文章介紹了Dashboard管理Kubernetes集群與API訪問配置的方法,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2022-04-04Kubernetes關(guān)鍵組件與結(jié)構(gòu)組成介紹
這篇文章介紹了Kubernetes的關(guān)鍵組件與結(jié)構(gòu)組成,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2022-03-03