Service 的功能:
- Service主要用于提供網(wǎng)絡(luò)服務(wù),通過Service的定義,能夠?yàn)榭蛻舳藨?yīng)用提供穩(wěn)定的訪問地址(域名或IP地址)和負(fù)載均衡功能,以及屏蔽后端Endpoint的變化,是K8s實(shí)現(xiàn)微服務(wù)的核心資源。
Service主要解決了什么問題:
- 引入Service主要是解決Pod的動(dòng)態(tài)變化,通過創(chuàng)建Service,可以為一組具有相同功能的容器應(yīng)用提供一個(gè)統(tǒng)一的入口地址,并且將請(qǐng)求負(fù)載分發(fā)到后端的各個(gè)容器應(yīng)用上。
- 由于pod的不穩(wěn)定性,比如水平擴(kuò)展時(shí),pod異常時(shí)生成新的pod,都會(huì)讓pod擁有新的ip地址,這不利于前端的訪問,所以需要把pod綁定到固定的IP(域名)上,所以Service就出現(xiàn)了。
本文主要介紹Service的創(chuàng)建方法,命令行模式和聲明模式,
Service主要是為Pod提供統(tǒng)一訪問入口的資源對(duì)象,所有需要先創(chuàng)建一個(gè)pod
-
創(chuàng)建Pod
kubectl run nginx --image=nginx --port=80 --labels="app=nginx"
-
kubectl run nginx
: 創(chuàng)建一個(gè)名為nginx的pod -
--image=nginx
:使用nginx鏡像文件 -
--port=80
:聲明服務(wù)的端口 -
--labels="app=nginx"
:給pod打上標(biāo)簽
note: 如果pod想要外部訪問,必須打上標(biāo)簽
-
命令行模式創(chuàng)建service并綁定“ app = nginx” 的pod
kubectl expose pod nginx --port=80 --target-port=80 --type=NodePort
-
kubectl expose pod nginx
: 創(chuàng)建一個(gè)svc,svc的名稱就是nginx,自動(dòng)選擇nginx pod的標(biāo)簽 -
--port=80
: svc的端口 -
--target-port=80
:容器的端口 -
--type=NodePort
:svc的類型,NodePort模式,會(huì)自動(dòng)把svc的80端口映射到所有node主機(jī)的隨機(jī)端口(端口范圍:30000-32767),這樣客戶端可以通過任意node主機(jī)的IP + 端口訪問到Pod。
svc的幾種類型
類型 | 描述 |
---|---|
ClusterIP | 集群內(nèi)部使用 |
NodePort | 對(duì)外暴露應(yīng)用端口(集群外可訪問) |
LoadBalancer | 對(duì)外暴露應(yīng)用,將Service映射到一個(gè)已存在的負(fù)載均衡器的IP地址上,適合公有云 |
ExternalName | 將Service映射為一個(gè)外部域名地址,通過externalName字段進(jìn)行設(shè)置 |
查看svc
# kubectl get svc nginx -o wide
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
nginx NodePort 10.105.125.73 <none> 80:30974/TCP 12m app=nginx
-
CLUSTER-IP
: Service地址(是一個(gè)不會(huì)變化的ip地址) -
PORT(S)
: svc端口和node端口的映射 -
SELECTOR
: 通過標(biāo)簽選擇綁定哪些Pod
由于已經(jīng)通過NodePort模式將svc的端口映射到了node主機(jī)的 30974 端口,即可以通過node的ip加端口訪問到Pod的服務(wù)
-
通過yaml 文件聲明式的創(chuàng)建svc
編寫yaml文件# cat nginx.yaml
apiVersion: v1 # api版本 kind: Service # 綁定資源類型,首字符必須大寫 metadata: # metadata 元數(shù)據(jù) name: nginx-svc # 定義 svc的名稱 labels: # 下面是定義標(biāo)簽 tier: frontend spec: # 規(guī)格 ports: # 定義端口,svc和pod - port: 80 # svc的端口 protocol: TCP # 協(xié)議 targetPort: 80 # 容器的端口 selector: # 標(biāo)簽選擇 app: nginx type: NodePort # svc 類型
創(chuàng)建svc(svc 是service的簡(jiǎn)寫)
查看那些資源對(duì)象存在簡(jiǎn)寫:
kubectl api-resources
# kubectl create -f nginx.yaml
查看svc
# kubectl get svc nginx-svc -o wide
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR nginx-svc NodePort 10.107.55.165 <none> 80:32238/TCP 5m40s app=nginx
-
-
o wide
: 顯示更多信息svc nginx-svc的類型為 NodePort 同樣可以通過 node的ip加端口訪問到pod 里的容器服務(wù)。
Additional information:
可以使用命令行創(chuàng)建svc的使用使用 -o yaml輸出yaml格式信息。
例如:文章來源:http://www.zghlxwxcb.cn/news/detail-837278.html
kubectl expose pod nginx --port=80 --target-port=80 --type=NodePort --dry-run=client -o yaml
apiVersion: v1
kind: Service
metadata:
creationTimestamp: null
labels:
app: nginx
name: nginx
spec:
ports:
- port: 80
protocol: TCP
targetPort: 80
selector:
app: nginx
type: NodePort
status:
loadBalancer: {}
-
--dry-run=client
: 以客戶端的模式運(yùn)行(運(yùn)行測(cè)試并不生效) -
-o yaml
:以yaml格式輸出
--dry-run=client
,以客戶端的方式嘗試運(yùn)行,配置 -o yaml 輸出簡(jiǎn)略的信息--dry-run=server
,以服務(wù)端的方式運(yùn)行,配合-o yaml 輸出非常詳細(xì)的信息文章來源地址http://www.zghlxwxcb.cn/news/detail-837278.html
kubectl expose pod nginx --port=80 --target-port=80 --type=NodePort --dry-run=server -o yaml
Error from server (AlreadyExists): services "nginx" already exists
- 在server模式下,由于 svc nginx 已經(jīng)存在所以報(bào)錯(cuò),刪除svc nginx即可正常顯示
到了這里,關(guān)于k8s service的概念以及創(chuàng)建方法的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!