一、service資源概述
? ? ? ? 每當(dāng)我們企業(yè)的業(yè)務(wù)pod迭代功能的時(shí)候,都會(huì)修改pod,修改后重新啟動(dòng)pod,ip就會(huì)變化,那么在生產(chǎn)環(huán)境當(dāng)中,從用戶到宿主機(jī)、從宿主機(jī)到pod,這一個(gè)訪問流程,都是事先寫好的,一旦pod修改后,ip產(chǎn)生變化,就需要重新配置,因此,k8s提供了service資源用于解決這一問題;
二、service資源類型
創(chuàng)建一個(gè)工作目錄
[root@k8s231 pod]# mkdir -pv /xinjizhiwa/service
[root@k8s231 pod]# cd /xinjizhiwa/service
1,service的cluster IP類型
· 編輯service資源清單
[root@k8s231 service]# cat 01-service-clusterip.yaml?
apiVersion: v1
kind: Service
metadata:
? name: svc-01
spec:
? #聲明clusterip類型,不指定默認(rèn)也是這個(gè)類型;
? type: ClusterIP
? #指定pod的標(biāo)簽
? selector:?
? ? k8s: xinjizhiwa
? #指定service的ip地址
? clusterIP: 10.200.100.100
? #用戶訪問service時(shí),訪問哪個(gè)端口?
? ports:
? ? #指定訪問協(xié)議,若不指定協(xié)議,默認(rèn)也是TCP
? - protocol: TCP
? ? #service的端口
? ? port: 80
? ? #pod的容器端口(目標(biāo)端口)
? ? targetPort: 80
· 編輯pod資源清單
[root@k8s231 service]# cat pod.yaml?
apiVersion: v1
kind: Pod
metadata:
? name: p5
? labels:
? ? k8s: xinjizhiwa
spec:
? containers:
? - name: c1
? ? image: nginx:1.20.1-alpine
? ? ports:
? ? - containerPort: 80
· 創(chuàng)建資源
[root@k8s231 service]# kubectl apply -f .
· 測(cè)試訪問service和pod資源看是否都能訪問到容器
2,service的nodeport類型
? ? ? ? nodeport類型,就是clusterip類型的升級(jí)版,它可以使用宿主機(jī)的端口,映射到service開放的端口上,從而,使得用戶訪問宿主機(jī),宿主機(jī)轉(zhuǎn)發(fā)到service資源,進(jìn)而訪問到pod資源;
· 編輯service資源清單
[root@k8s231 service]# cat 01-service-clusterip.yaml?
apiVersion: v1
kind: Service
metadata:
? name: svc-02
spec:
? #聲明nodePort類型;
? type: NodePort
? #指定pod的標(biāo)簽
? selector:?
? ? k8s: xinjizhiwa
? #指定service的ip地址(在nodeport類型中可以不設(shè)置,會(huì)隨機(jī)生成)
? clusterIP: 10.200.100.101
? #用戶訪問service時(shí),訪問哪個(gè)端口?
? ports:
? ? #指定訪問協(xié)議,若不指定協(xié)議,默認(rèn)也是TCP
? - protocol: TCP
? ? #service的端口
? ? port: 80
? ? #pod的容器端口(目標(biāo)端口)
? ? targetPort: 80
? ? #訪問宿主機(jī)的哪個(gè)端口,可以轉(zhuǎn)發(fā)訪問到service?
? ? #注意,默認(rèn)只能使用宿主機(jī)的30000-32767區(qū)間的端口號(hào)(可以放開限制,之后再說);
? ? nodePort: 30000
· 創(chuàng)建svc資源
[root@k8s231 service]# kubectl apply -f 01-service-clusterip.yaml
· 瀏覽器訪問宿主機(jī)端口測(cè)試是否能夠訪問到容器
3,service的loadbalancer類型(了解即可)
? ? ? ? 日后我們使用云環(huán)境負(fù)載均衡器的時(shí)候,就將vip地址填寫到這個(gè)類型之下,就可以實(shí)現(xiàn)云負(fù)載均衡訪問svc訪問pod;
· 模擬宿主機(jī)的vip
? ? ? ? 也就是說,模擬負(fù)載均衡器(模擬例如keepalive的bip地址)vip;
[root@k8s231 service]# ifconfig eth0:1 10.0.0.88
· 編輯svc資源清單
[root@k8s231 service]# vim 03-service-loadbalancer.yaml?
kind: Service
apiVersion: v1
metadata:
? name: svc-loadbalancer
spec:
? # 指定service類型為L(zhǎng)oadBalancer,注意,一般用于云環(huán)境
? type: LoadBalancer
? selector:
? ? k8s: xinjizhiwa
? ports:
? - protocol: TCP
? ? port: 80
? ? targetPort: 80
? ? # 注意,將來這個(gè)nodeProt也對(duì)應(yīng)的是云環(huán)境負(fù)載均衡的地址
? ? nodePort: 30001
? # 指定LoadBalancer云環(huán)境的負(fù)載均衡地址,要確保K8S集群能和負(fù)載均衡的IP地址進(jìn)行通信!
? #用戶通過vip:10.0.0.88就可以訪問到svc資源了;
? externalIPs:
? - 10.0.0.88
· 創(chuàng)建svc資源
[root@k8s231 service]# kubectl apply -f 03-service-loadbalancer.yaml
· 宿主機(jī)瀏覽器訪問
4,service的externalname類型(了解即可)
? ? ? ? 就是域名轉(zhuǎn)發(fā)功能,就是做了一個(gè)跳轉(zhuǎn),將來用戶訪問svc就會(huì)直接訪問到我們?cè)O(shè)置的挑戰(zhàn)的地址上,寫上“百度”,就跳轉(zhuǎn)到“百度”。
· 編寫svc資源清單
[root@k8s231 service]# vim 06-svc-ex.yaml
apiVersion: v1
kind: Service
metadata:
? name: svc-externalname
spec:
? # svc類型
? type: ExternalName
? # 指定跳轉(zhuǎn)到外部的域名地址
? externalName: www.baidu.com
· 創(chuàng)建svc資源
[root@k8s231 service]# kubectl apply -f 06-svc-ex.yaml
· 隨便創(chuàng)建一個(gè)pod查看其dns解析地址
[root@k8s231 service]# vim 02-pod-nginx.yaml?
apiVersion: v1
kind: Pod
metadata:
? name: p1
spec:
? containers:
? ? - name: c1
? ? ? image: nginx:1.20.1-alpine
· 進(jìn)入pod查看dns解析地址
[root@k8s231 service]# kubectl exec p1 -it -- sh
/ # cat /etc/resolv.conf?
nameserver 10.200.0.10
search default.svc.xinjizhiwa.com svc.xinjizhiwa.com xinjizhiwa.com
· 測(cè)試訪問
[root@k8s231 ~]# dig @10.200.0.10 svc-externalname.default.svc.xinjizhiwa.com +short
www.baidu.com.
www.a.shifen.com.
110.242.68.3
110.242.68.4
三、nodeport的端口范圍設(shè)置和svc的endpoint列表
? ? ? ? 還記得在svc資源nodeport類型中,宿主機(jī)端口映射的范圍必須在30000-32767之間,否則會(huì)報(bào)錯(cuò);
? ? ? ? 但是,這個(gè)范圍是可以修改的;只需要進(jìn)入到靜態(tài)pod目錄中,找到kube-apiserver的pod資源,進(jìn)入添加一條命令【- --service-node-port-range=3000-50000】;
? ? ? ? 提那家完畢這個(gè)命令后,宿主機(jī)端口映射就變成了3000-50000了;
1,修改apiservice的宿主機(jī)映射端口范圍
[root@k8s231 service]# vim /etc/kubernetes/manifests/kube-apiserver.yaml?
apiVersion: v1
kind: Pod
metadata:
? annotations:
? ? kubeadm.kubernetes.io/kube-apiserver.advertise-address.endpoint: 10.0.0.231:6443
? creationTimestamp: null
? labels:
? ? component: kube-apiserver
? ? tier: control-plane
? name: kube-apiserver
? namespace: kube-system
spec:
? containers:
? - command:
? ? ......? ?#就是這一條命令;
? ? - --service-node-port-range=3000-50000
? ? - --advertise-address=10.0.0.231
......
2,創(chuàng)建svc測(cè)試能否實(shí)現(xiàn)宿主機(jī)端口范圍的映射
[root@k8s231 service]# cat 06-svc-ex.yaml?
apiVersion: v1
kind: Service
metadata:
? name: svc-externalname
spec:
? type: NodePort
? selector:
? ? k8s: xinjizhiwa
? clusterIP: 10.200.1.100
? ports:
? - protocol: TCP
? ? port: 88
? ? targetPort: 99
? ? nodePort: 8080
3,查看svc的詳細(xì)信息
[root@k8s231 service]# kubectl describe svc svc-externalname?
Name: ? ? ? ? ? ? ? ? ? ? svc-externalname
Namespace: ? ? ? ? ? ? ? ?default
Labels: ? ? ? ? ? ? ? ? ? <none>
Annotations: ? ? ? ? ? ? ?<none>
Selector: ? ? ? ? ? ? ? ? k8s=xinjizhiwa
Type: ? ? ? ? ? ? ? ? ? ? NodePort
IP Family Policy: ? ? ? ? SingleStack
IP Families: ? ? ? ? ? ? ?IPv4
IP: ? ? ? ? ? ? ? ? ? ? ? 10.200.1.100
IPs: ? ? ? ? ? ? ? ? ? ? ?10.200.1.100
Port: ? ? ? ? ? ? ? ? ? ? <unset> ?88/TCP
TargetPort: ? ? ? ? ? ? ? 99/TCP
NodePort: ? ? ? ? ? ? ? ? <unset> ?8080/TCP#還沒有匹配到pod,所以Endpoints是none,匹配到的話,就會(huì)顯示pod的ip地址
Endpoints: ? ? ? ? ? ? ? ?<none>
Session Affinity: ? ? ? ? None
External Traffic Policy: ?Cluster
Events: ? ? ? ? ? ? ? ? ? <none>
4,創(chuàng)建pod
[root@k8s231 service]# vim pod.yaml?
apiVersion: v1
kind: Pod
metadata:
? name: p7
? labels:
? ? k8s: xinjizhiwa
spec:
? containers:
? - name: c1
? ? image: nginx:1.20.1-alpine
? ? ports:
? ? - containerPort: 99
[root@k8s231 service]# kubectl apply -f pod.yaml?
pod/p7 created
5,再次查看svc的詳細(xì)信息
[root@k8s231 service]# kubectl describe svc svc-externalname
四、svc小結(jié)(重點(diǎn))
1,service資源的四種類型:
? ? ? ? · ClusterIP:給svc資源一個(gè)固定的IP地址,默認(rèn)的類型;
? ? ? ? · NodePort:在ClusterIP基礎(chǔ)上,映射到宿主機(jī)(物理機(jī))的端口號(hào),默認(rèn)是30000-32767可修改;
? ? ? ? · LoadBalancer:可以添加云環(huán)境的負(fù)載均衡VIP地址和負(fù)載均衡器的宿主機(jī)端口號(hào),用戶通過訪問VIP+負(fù)載均衡器的端口訪問到svc資源,進(jìn)而訪問到pod==容器==服務(wù)中;
? ? ? ? · ExternalName:類似于HTTP請(qǐng)求的302/301跳轉(zhuǎn),可以將訪問svc的請(qǐng)求轉(zhuǎn)發(fā)到指定的地址上;主要是轉(zhuǎn)發(fā)功能;
2,修改svc的NodePort類型中宿主機(jī)映射端口的范圍
? ? ? ? 默認(rèn)是30000-32767,可以通過靜態(tài)pod目錄下的kube-apiserver.yaml的pod資源清單中加上一條命令,來設(shè)置宿主機(jī)的映射端口范圍;
3,svc的endpoint列表
? ? ? ? 用戶通過訪問SVC資源,進(jìn)而將請(qǐng)求轉(zhuǎn)發(fā)到endpoint列表中的pod中,endpoint列表,就是svc將請(qǐng)求轉(zhuǎn)發(fā)到的目的地;
五、service資源中endpoint列表關(guān)聯(lián)外部服務(wù)
1,創(chuàng)建一個(gè)svc資源
· 編輯資源清單
[root@k8s231 endpoint]# vim svc.yaml
apiVersion: v1
kind: Service
metadata:
? name: svc01
spec:
? ports:
? - port: 888
· 創(chuàng)建svc資源
[root@k8s231 endpoint]# kubectl apply -f svc.yaml
· 查看svc資源
[root@k8s231 endpoint]# kubectl describe svc svc01
? ? ? ? 可以看到endpoint列表中什么都沒有,也就是說,現(xiàn)在訪問svc資源,什么都訪問不到;我們還記得上面說的,svc資源是通過“標(biāo)簽選擇”來將pod提那家到svc的endpoint列表中的,那么我們?nèi)绾螌8s集群外部的容器添加到endpoint列表中納?
? ? ? ? 舉例:在生產(chǎn)環(huán)境中,我們的數(shù)據(jù)庫(kù)服務(wù),都是常年運(yùn)行的歷史性業(yè)務(wù)服務(wù),當(dāng)企業(yè)的應(yīng)用上k8s時(shí),數(shù)據(jù)庫(kù)的遷移工作非常的繁瑣,所以,如果能將外部的SQL服務(wù),提那家到svc資源的endpoint列表中,就節(jié)省了數(shù)據(jù)庫(kù)遷移k8s的繁雜工作;
2,svc資源與endpoint資源關(guān)聯(lián)
? ? ? ? 對(duì),你看的沒錯(cuò),endpoint本質(zhì)上也是一個(gè)單獨(dú)的資源,只是在我們創(chuàng)建svc資源的時(shí)候,系統(tǒng)自動(dòng)給我們創(chuàng)建的;
? ? ? ? svc資源與endpoint資源是通過元數(shù)據(jù)(metadata中的)名稱,進(jìn)行關(guān)聯(lián)的,只要endpoint資源的名稱與svc資源的名稱相同,則,endpoint資源的服務(wù)IP就會(huì)出現(xiàn)在svc資源的endpoint列表中,即關(guān)聯(lián)成功;
· k8s集群外部拉取一個(gè)mysql服務(wù)容器
? ? ? ? 隨便找一個(gè)k8s集群之外的虛擬機(jī),本次我們拿harbor虛擬機(jī)做演示;
[root@harbor ~]#?docker run --name=xinjizhiwa-mysql \
? -p 13306:3306 -d \
? -e MYSQL_ALLOW_EMPTY_PASSWORD=yes \
? -e MYSQL_DATABASE=wordpress \
? -e MYSQL_USER=admin \
? -e MYSQL_PASSWORD=xinjizhiwa \
? --restart always \
? mysql:8.0 \
? --default-authentication-plugin=mysql_native_password \
? --character-set-server=utf8 \
? --collation-server=utf8_bin
· 測(cè)試登錄mysql容器和添加測(cè)試數(shù)據(jù)
[root@harbor ~]# docker exec -it xinjizhiwa-mysql mysql -u admin -pxinjizhiwa
..............mysql> show databases;
+--------------------+
| Database ? ? ? ? ? |
+--------------------+
| information_schema |
| wordpress ? ? ? ? ?|
+--------------------+
..............mysql> show tables from wordpress;
· k8s集群中創(chuàng)建endpoint資源
[root@k8s231 endpoint]# vim endpoint.yaml
apiVersion: v1
kind: Endpoints
metadata:
? name: svc01
subsets:
#指定外部endpoints的宿主機(jī)ip
- addresses:
? - ip: 10.0.0.230
? ports:
? - port: 13306
[root@k8s231 endpoint]# kubectl apply -f endpoint.yaml
此時(shí)再次查看svc資源,發(fā)現(xiàn)endpoints列表中,出現(xiàn)了外部服務(wù)的ip+端口;
我們、成功了;
六、案例:wordpress博客案例
? ? ? ? 提醒,上述內(nèi)容中,我們已經(jīng)有了mysql,那么接下來,我們就搭建一套簡(jiǎn)單的架構(gòu),用戶通過訪問宿主機(jī),轉(zhuǎn)發(fā)到wordpress服務(wù)pod容器中,wordpress通過svc資源,訪問到k8s外部數(shù)據(jù)庫(kù)服務(wù)實(shí)現(xiàn)數(shù)據(jù)存儲(chǔ)于查詢;
· 創(chuàng)建wordpress的pod和svc資源
[root@k8s231 endpoint]# cat wp-pod.yaml?
apiVersion: v1
kind: Pod
metadata:
? name: wp-pod
? labels:?
? ? k8s: xinjizhiwa
spec:
? containers:
? - name: wp-c1
? ? image: wordpress:latest
? ? ports:
? ? - containerPort: 80
? ? env:
? ? ? ? - name: WORDPRESS_DB_HOST
? ? ? ? ? #外部mysql服務(wù)的svc資源名稱及端口;
? ? ? ? ? value: svc01:888
? ? ? ? - name: WORDPRESS_DB_USER
? ? ? ? ? value: admin
? ? ? ? - name: WORDPRESS_DB_PASSWORD
? ? ? ? ? value: xinjizhiwa
---apiVersion: v1
kind: Service
metadata:
? name: wp-svc
spec:
? type: NodePort
? selector:
? ? k8s: xinjizhiwa
? ports:
? - port: 80
? ? targetPort: 80
? ? nodePort: 30080
[root@k8s231 endpoint]# kubectl apply -f wp-pod.yaml
· 瀏覽器訪問測(cè)試
? ? ? ? 可見訪問成功,至此service資源就先告一段落;文章來源:http://www.zghlxwxcb.cn/news/detail-835320.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-835320.html
到了這里,關(guān)于11-k8s中網(wǎng)絡(luò)資源service的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!