|NO.Z.00161|——————————|CloudNative|——|KuberNetes&服務釋出.V12|-------------------------------------------------------|service.v04|service常用型別|
阿新 • • 發佈:2022-03-30
[CloudNative:KuberNetes&服務釋出.V12] [Applications.KuberNetes] [在k8s中如何釋出服務|service|使用service代理k8s外部服務|使用service反代外部域名|service常用型別|]
一、service常用型別:service型別一:ClusterIP:在叢集內部使用,也是預設值。
### --- 型別一:ClusterIP:在叢集內部使用,也是預設值。 ~~~ 這個service的地址,在安裝的時候不要和公司的網段去重複。 ~~~ 還有Pod的網段是不建議去重複。 ~~~ 這個service的地址是基於k8s叢集內部去管理的,外部網路是不可以訪問的。 ~~~ 在node節點是可以訪問的,pod也是可以訪問的,但是k8s外部網路是不可以訪問的。
[root@k8s-master01 ~]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 11d
二、service型別二:ExternalName:通過返回定義的CNAME別名。
### --- 型別二:ExternalName:通過返回定義的CNAME別名。 ~~~ 在這個ExternalName定義了一個外部的域名, ~~~ 解析這個名稱nginx-externalname就可以解析到ExternalName對應的dns記錄。 ~~~ 然後就可以訪問到它了www.baidu.com
三、service型別三:NodePort:kube-proxy的節點代理埠[root@k8s-master01 ~]# cat nginx-externalName.yaml app: nginx-externalname name: nginx-externalname spec: type: ExternalName externalName: www.baidu.com [root@k8s-master01 ~]# kubectl get svc nginx-externalname ExternalName <none> www.baidu.com <none> 17m
### --- 型別三:NodePort:在所有安裝了kube-proxy的節點上開啟一個埠,此埠可以代理至後端Pod,
~~~ # 然後叢集外部可以使用節點的IP地址和NodePort的埠號訪問到叢集Pod的服務。
~~~ # NodePort埠範圍預設是30000-32767。
~~~ 這個dashboard在建立的時候會建立一個service,這個service的型別是NodePort,
~~~ 它會會做一個對映,就是在安裝了kube-proxy的節點上都會啟動一個埠;30000埠
~~~ 就是在宿主機上打開了一個埠,這個埠就可以到k8s內部的k8s-service,
~~~ 這樣就可以通過任何一個宿主機的IP地址,加上埠號就可以訪問到我們的服務。
~~~ 我們通過這個就可以訪問到:https://192.168.1.20:30008/
~~~ 這個埠可以在apiserver的配置檔案中檢視到
### --- 檢視svc對應的地址及埠
[root@k8s-master01 ~]# kubectl get svc -n kubernetes-dashboard
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
dashboard-metrics-scraper ClusterIP 10.103.18.41 <none> 8000/TCP 11d
kubernetes-dashboard NodePort 10.104.232.53 <none> 443:30008/TCP 11d
[root@k8s-master01 ~]# netstat -antp |grep 30008
tcp 0 0 0.0.0.0:30008 0.0.0.0:* LISTEN 19452/kube-proxy
### --- 檢視kube-apiserver.service地址範圍
~~~ 比如之前有一個service,只能在k8s內部去訪問, 我們配置更改為外部網路也是可以訪問
[root@k8s-master01 ~]# cat /usr/lib/systemd/system/kube-apiserver.service
--service-cluster-ip-range=10.96.0.0/12 \
--service-node-port-range=30000-32767 \ // 這個埠號也是可以更改的
### --- 檢視service地址
~~~ 之前這個service只能在k8s內部去訪問,我們可以更改它的型別。並設定為外部網路可以訪問
[root@k8s-master01 ~]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
nginx-svc ClusterIP 10.101.145.83 <none> 80/TCP,443/TCP 20h
四、檢視nginx-service配置引數
### --- 檢視nginx-service配置引數
~~~ 我們可以通過31000可以訪問到nginx:http://192.168.1.20:31000/:
~~~ 輸出:Welcome to nginx!
[root@k8s-master01 ~]# kubectl edit svc nginx-svc
spec:
clusterIP: 10.101.145.83
clusterIPs:
- 10.101.145.83
ports:
- name: http
port: 80
protocol: TCP
targetPort: 80
nodePort: 31000 // 且為NodePort指定一個埠號,若是不指定,它會隨機生成一個。
- name: https
port: 443
protocol: TCP
targetPort: 443
selector:
app: nginx
sessionAffinity: None
type: NodePort // 型別更改為NodePort,
[root@k8s-master01 ~]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
nginx-svc NodePort 10.101.145.83 <none> 80:31000/TCP,443:32765/TCP 20h
### --- 所以說NodePort也是可以訪問到叢集內部的一種方式:
~~~ # 使用場景:
~~~ 若是你在k8s內部部署了Redis或者mysql,一般情況下這些服務都不會暴露在外,
~~~ 因為在叢集內部訪問筆記安全,但是開發臨時性的需要訪問到叢集內部的Redis或者mysql。
~~~ 這個時候可以通過臨時性的建立一個NodePort,讓它訪問一次,訪問完之後可以給他關掉。
~~~ 當然不建議給你的應用程式直接暴露一個埠號給別人去訪問的。
~~~ IP地址+埠號:NodePort的效能是不怎麼樣的。
五、service型別四:LoadBalancer:使用雲提供商的負載均衡器公開服務。
### --- 型別四:LoadBalancer:使用雲提供商的負載均衡器公開服務。
~~~ 若是你在雲服務上話是支援loadbalancer這個格式,把它的TYPE更改為loadbalancer,
~~~ 但是這種使用起來是有成本的。
~~~ 用的最多的是clusterIP
[root@k8s-master01 ~]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 11d
===============================END===============================
Walter Savage Landor:strove with none,for none was worth my strife.Nature I loved and, next to Nature, Art:I warm'd both hands before the fire of life.It sinks, and I am ready to depart ——W.S.Landor
來自為知筆記(Wiz)