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