????????我們不應(yīng)該期望k8s Pod是健壯的,而是要假設(shè)Pod中的容器很可能因為各種原因發(fā)生故障而死掉。Deployment等Controller會通過動態(tài)的創(chuàng)建和銷毀Pod來保證應(yīng)用整體的健壯性。換句話說,Pod是脆弱的,但應(yīng)用是健壯的。
? ? ? ? 每個Pod都有自己的IP地址,當Controller用新的Pod替代發(fā)生故障的Pod時,新Pod會分配新的IP地址,這就產(chǎn)生了一個問題:如果一組Pod對外提供服務(wù),它們的IP很有可能發(fā)生變化,那么客戶端如何找到并訪問這個服務(wù)呢?答案就是Service。
一、創(chuàng)建Service
K8s Service從邏輯上代表一組Pod,具體是哪些Pod則是由label來挑選的。Service有自己的IP,而且這個IP是不變的。客戶端只需要訪問Service的IP,k8s則負責建立和維護Service與Pod的映射關(guān)系。無論后端Pod如何變化,對客戶端不會有任何影響,因為Service沒有變。
(1)創(chuàng)建deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: httpd-deployment
labels:
app: httpd
spec:
replicas: 3
selector:
matchLabels:
app: httpd
template:
metadata:
labels:
app: httpd
spec:
containers:
- name: httpd
image: httpd:latest
ports:
- containerPort: 80
(2)apply一下
zy@k8s-master:~$ kubectl apply -f httpd.yml
deployment.apps/httpd-deployment created
(3)查看pod
pod分配了各自的IP,這些IP只能被Kubernetes Cluster中的容器和節(jié)點訪問。
zy@k8s-master:~$ kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
httpd-deployment-59fc85cfcd-kz4m8 1/1 Running 0 92s 10.244.1.17 k8s-node1 <none> <none>
httpd-deployment-59fc85cfcd-m2tc4 1/1 Running 0 92s 10.244.2.11 k8s-node2 <none> <none>
httpd-deployment-59fc85cfcd-nz4x5 1/1 Running 0 92s 10.244.2.12 k8s-node2 <none> <none>
(4)創(chuàng)建Service
編寫service配置文件
apiVersion: v1
kind: Service
metadata:
name: httpd-svc
spec:
selector:
run: httpd
ports:
- protocol: TCP
port: 8080
targetPort: 80
以上代碼是 Kubernetes 中的 YAML 文件,用于創(chuàng)建一個名為
httpd-svc
的 Service 資源。該 Service 資源會將流量路由到擁有標簽run=httpd
的 Pod 上,同時將流量從端口 8080 轉(zhuǎn)發(fā)到 Pod 中的端口 80。具體來說,代碼的各個部分含義如下:
apiVersion: v1
: 指定 Kubernetes API 版本為 v1,也就是最基本的 API 版本。kind: Service
: 指定創(chuàng)建的資源類型為 Service。metadata
: 定義元數(shù)據(jù),包括資源的名稱等信息。name: httpd-svc
: 指定該 Service 資源的名稱為httpd-svc
。spec
: 定義 Service 的規(guī)范,包括 Service 所要匹配的 Pod 標簽以及端口信息。selector
: 指定 Service 所要匹配的 Pod 標簽,這里是run=httpd
,表示該 Service 會將流量路由到所有擁有標簽run=httpd
的 Pod 上。ports
: 定義 Service 的端口映射規(guī)則,包括協(xié)議、端口號和目標端口號。這里的含義是將 Service 的 8080 端口映射到 Pod 中的 80 端口上。
apply一下:
zy@k8s-master:~$ kubectl apply -f httpd-service.yml
service/httpd-svc created
查看service:
zy@k8s-master:~$ kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
httpd-svc ClusterIP 10.98.248.61 <none> 8080/TCP 3m13s
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 26h
(5)查看service的詳細信息
y@k8s-master:~$ kubectl describe service httpd-service
Name: httpd-service
Namespace: default
Labels: <none>
Annotations: <none>
Selector: app=httpd,run=httpd
Type: ClusterIP
IP: 10.102.206.215
Port: http 80/TCP
TargetPort: 80/TCP
Endpoints: 10.244.1.21:80,10.244.1.22:80,10.244.2.16:80
Session Affinity: None
Events: <none>
endpoints羅列了三個Pod的IP和端口。我們知道Pod的IP是在容器中配置的,那么service的集群IP又是在哪里配置的呢?集群IP如何映射到pod的IP呢?答案是 iptables
二、外網(wǎng)如何訪問Service
出來Cluster內(nèi)部可以訪問Service,很多情況下我們也希望應(yīng)用的Service能夠暴露給Cluster外部。K8s提供了多種類型的Service,默認是ClusterIP。
(1)ClusterIP
? ? ? ? Service通過集群內(nèi)部的IP對外提供服務(wù),只有Cluster內(nèi)的節(jié)點和pod可訪問,這是默認的service類型。
(2)NodePort
? ? ? ? service通過Cluster節(jié)點的靜態(tài)端口對外提供服務(wù)。Cluster外部可以通過 <NodeIP>:<NodePort>訪問Service
(3)LoadBalancer文章來源:http://www.zghlxwxcb.cn/news/detail-446772.html
? ? ? ? Service利用cloud provider 特有的負載均衡對外提供服務(wù),云提供者負責將負載均衡的流量導(dǎo)向Service。文章來源地址http://www.zghlxwxcb.cn/news/detail-446772.html
到了這里,關(guān)于玩轉(zhuǎn)k8s(四)—— 通過Service訪問Pod的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!