理想狀態下,我們可以認為Kubernetes Pod是健壯的。但是,理想與現實的差距往往是非常大的。很多情況下,Pod中的容器可能會因為發生故障而死掉。Deployment等Controller會通過動態創建和銷毀Pod來保證應用整體的健壯性。眾所周知,每個Pod都擁有自己的IP地址,當新的Controller用新的Pod替代發生故障的Pod時,我們會發現,新的IP地址可能跟故障的Pod的IP地址可能不一致。此時,客戶端如何訪問這個服務呢?Kubernetes中的Service應運而生。
成都創新互聯公司主營鏡湖網站建設的網絡公司,主營網站建設方案,重慶APP軟件開發,鏡湖h5成都微信小程序搭建,鏡湖網站營銷推廣歡迎鏡湖等地區企業咨詢Kubernetes Service 邏輯上代表了一組具有某些label關聯的Pod,Service擁有自己的IP,這個IP是不變的。無論后端的Pod如何變化,Service都不會發生改變。創建YAML如下:
apiVersion: apps/v1beta1
kind: Deployment
metadata:
name: httpd
spec:
replicas: 4
template:
metadata:
labels:
run: httpd
spec:
containers:
- name: httpd
image: httpd
ports:
- containerPort: 80
配置命令:
[root@k8s-m ~]# kubectl apply -f Httpd-Deployment.yaml
deployment.apps/httpd created
稍后片刻:
[root@k8s-m ~]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE
httpd-79c4f99955-dbbx7 1/1 Running 0 7m32s 10.244.2.35 k8s-n2 <none>
httpd-79c4f99955-djv44 1/1 Running 0 7m32s 10.244.1.101 k8s-n1 <none>
httpd-79c4f99955-npqxz 1/1 Running 0 7m32s 10.244.1.102 k8s-n1 <none>
httpd-79c4f99955-vkjk6 1/1 Running 0 7m32s 10.244.2.36 k8s-n2 <none>
[root@k8s-m ~]# curl 10.244.2.35
<html><body><h2>It works!</h2></body></html>
[root@k8s-m ~]# curl 10.244.2.36
<html><body><h2>It works!</h2></body></html>
[root@k8s-m ~]# curl 10.244.1.101
<html><body><h2>It works!</h2></body></html>
[root@k8s-m ~]# curl 10.244.1.102
<html><body><h2>It works!</h2></body></html>
創建YAML如下:
apiVersion: v1
kind: Service
metadata:
name: httpd-svc
spec:
selector:
run: httpd
ports:
- protocol: TCP
port: 8080
targetPort: 80
配置完成并觀察:
[root@k8s-m ~]# kubectl apply -f Httpd-Service.yaml
service/httpd-svc created
[root@k8s-m ~]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
httpd-svc ClusterIP 10.110.212.171 <none> 8080/TCP 14s
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 11d
[root@k8s-m ~]# curl 10.110.212.171:8080
<html><body><h2>It works!</h2></body></html>
[root@k8s-m ~]# kubectl describe service httpd-svc
Name: httpd-svc
Namespace: default
Labels: <none>
Annotations: kubectl.kubernetes.io/last-applied-configuration:
{"apiVersion":"v1","kind":"Service","metadata":{"annotations":{},"name":"httpd-svc","namespace":"default"},"spec":{"ports":[{"port":8080,"...
Selector: run=httpd
Type: ClusterIP
IP: 10.110.212.171
Port: <unset> 8080/TCP
TargetPort: 80/TCP
Endpoints: 10.244.1.101:80,10.244.1.102:80,10.244.2.35:80 + 1 more...
Session Affinity: None
Events: <none>
從以上內容中的Endpoints可以看出服務httpd-svc下面包含我們指定的labels的Pod,cluster-ip通過iptables成功映射到Pod IP,成功。再通過iptables-save命令看一下相關的iptables規則。
[root@k8s-m ~]# iptables-save |grep "10.110.212.171"
-A KUBE-SERVICES ! -s 10.244.0.0/16 -d 10.110.212.171/32 -p tcp -m comment --comment "default/httpd-svc: cluster IP" -m tcp --dport 8080 -j KUBE-MARK-MASQ
-A KUBE-SERVICES -d 10.110.212.171/32 -p tcp -m comment --comment "default/httpd-svc: cluster IP" -m tcp --dport 8080 -j KUBE-SVC-RL3JAE4GN7VOGDGP
[root@k8s-m ~]# iptables-save|grep -v 'default/httpd-svc'|grep 'KUBE-SVC-RL3JAE4GN7VOGDGP'
:KUBE-SVC-RL3JAE4GN7VOGDGP - [0:0]
-A KUBE-SVC-RL3JAE4GN7VOGDGP -m statistic --mode random --probability 0.25000000000 -j KUBE-SEP-R5YBMKYSG56R4KDU
-A KUBE-SVC-RL3JAE4GN7VOGDGP -m statistic --mode random --probability 0.33332999982 -j KUBE-SEP-7G5ANBWSVVLRNZAH
-A KUBE-SVC-RL3JAE4GN7VOGDGP -m statistic --mode random --probability 0.50000000000 -j KUBE-SEP-2PT6QZGNQHS4OL4I
-A KUBE-SVC-RL3JAE4GN7VOGDGP -j KUBE-SEP-I4PXZ6UARQLLOV4E
我們可以進一步查看相關的轉發規則,此處省略。iptables將訪問Service的流量轉發到后端Pod,使用類似于輪詢的的負載均衡策略。
我們的平臺是通過kubeadm部署的,版本是v1.12.1,這個版本自帶的dns相關組件是coredns。
[root@k8s-m ~]# kubectl get deployment --namespace=kube-system
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
coredns 2 2 2 2 17d
通過創建一個臨時的隔離環境來驗證一下DNS是否生效。
[root@k8s-m ~]# kubectl run -it --rm busybox --image=busybox /bin/sh
kubectl run --generator=deployment/apps.v1beta1 is DEPRECATED and will be removed in a future version. Use kubectl create instead.
If you don't see a command prompt, try pressing enter.
/ # wget httpd-svc.default:8080
Connecting to httpd-svc.default:8080 (10.110.212.171:8080)
index.html 100% |*******************************************************************************************************************************| 45 0:00:00 ETA
/ # cat index.html
<html><body><h2>It works!</h2></body></html>
順便提一下,在未來版本中,kubectl run可能不再被支持,推薦使用kubectl create替代。此處偷了個懶,后續不建議如此操作。
在以上例子中,臨時的隔離環境的namespace為default,與我們新建的httpd-svc都在同一namespace內,httpd-svc.default的default可以省略。如果跨namespace訪問的話,那么namespace是不能省略的。
通常情況下,我們可以通過四種方式來訪問Kubeenetes的Service,分別是ClusterIP,NodePort,Loadbalance,ExternalName。在此之前的實驗都是基于ClusterIP的,集群內部的Node和Pod均可通過Cluster IP來訪問Service。NodePort是通過集群節點的靜態端口對外提供服務。
接下來我們將以NodePort為例來進行實際演示。修改之后的Service的YAML如下:
apiVersion: v1
kind: Service
metadata:
name: httpd-svc
spec:
type: NodePort
selector:
run: httpd
ports:
- protocol: TCP
nodePort: 31688
port: 8080
targetPort: 80
配置后觀察:
[root@k8s-m ~]# kubectl apply -f Httpd-Service.yaml
service/httpd-svc configured
[root@k8s-m ~]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
httpd-svc NodePort 10.110.212.171 <none> 8080:31688/TCP 117m
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 12d
Service httpd-svc的端口被映射到了主機的31688端口。YAML文件如果不指定nodePort的話,Kubernetes會在30000-32767范圍內為Service分配一個端口。此刻我們就可以通過瀏覽器來訪問我們的服務了。在與node網絡互通的環境中,通過任意一個Node的IP:31688即可訪問剛剛部署好的Service。
另外有需要云服務器可以了解下創新互聯cdcxhl.cn,海內外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業上云的綜合解決方案,具有“安全穩定、簡單易用、服務可用性高、性價比高”等特點與優勢,專為企業上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。
新聞名稱:Kubernetes中,通過Service訪問Pod快速入門-創新互聯
文章地址:http://vcdvsql.cn/article20/hosco.html
成都網站建設公司_創新互聯,為您提供商城網站、建站公司、網站策劃、搜索引擎優化、云服務器、企業建站
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯