kubernetes從入門到精通系列08-Service 配置清單

kubernetes從入門到精通系列目錄:


kubernetes從入門到精通系列08-Service 配置清單


Service 為 POD 控制器控制的 POD 集群提供一個固定的訪問端點,Service 的工作還依賴於 K8s 中的一個附件,就是 CoreDNS ,它將 Service 地址提供一個域名解析。

8.1 Service 工作模式

  1. userspace: 1.1 之前版本
  2. iptables: 1.10 之前版本
  3. ipvs:1.11 之後版本

8.2 Service 類型

類型作用ClusterIP默認值,分配一個 Service 網絡的地址,僅用於集群內部通信NodePort如果需要集群外部訪問,可以使用這個類型ExternalName把集群外部的服務引入到集群內部,方便在集群內部使用LoadBalancerK8S 工作在雲環境中,調用雲環境創建負載均衡器

8.3 資源記錄

SVC_NAME.NS_NAME.DOMAIN.LTD

例如:redis.default.svc.cluster.local.

8.4 Service 清單

  • 清單組成
<code>apiVersion  <string>    # api 版本號,v1
kind <string> # 資源類別,標記創建什麼類型的資源
metadata <object> # POD 元數據
spec <object> # 元數據
/<object>/<object>/<string>/<string>/<code>

8.5 service.spec 規範

  1. clusterIP:指定 Service 處於 service 網絡的哪個 IP,默認為動態分配
  2. type: service 類型,可用:ExternalName, ClusterIP, NodePort, and LoadBalancer

8.6 ClusterIP 類型的 service

<code>apiVersion: v1
kind: Service
metadata:
name: redis
namespace: default
spec:
selector:
app: redis
role: logstor
type: ClusterIP
clusterIP: 10.96.0.100
ports:
- port: 6379 # service 端口
targetPort: 6379 # pod 監聽的端口
protocol: TCP
/<code>

8.7 NodePort 類型的 service

NodePort 是在 ClusterIP 類型上增加了一個暴露在了 node 的網絡命名空間上的一個 nodePort,所以用戶可以從集群外部訪問到集群了,因而用戶的請求流程是:Client -> NodeIP:NodePort -> ClusterIP:ServicePort -> PodIP:ContainerPort。

可以理解為 NodePort 增強了 ClusterIP 的功能,讓客戶端可以在每個集群外部訪問任意一個 nodeip 從而訪問到 clusterIP,再由 clusterIP 進行負載均衡至 POD。

  • 清單示例
<code>apiVersion: v1
kind: Service
metadata:
name: myapp
namespace: default
spec:
selector:
app: myapp
release: canary
type: NodePort
ports:
- port: 80 # service 端口
targetPort: 80 # pod 監聽的端口
nodePort: 30080 # service 會在每個 node 上添加 iptables/ipvs 規則重定向這個端口的訪問,所以必須保證所有 node 的這個端口沒被佔用
protocol: TCP
/<code>
<code>在集群外部就可以使用: http://172.16.100.102:30080 來訪問這個 service 地址了
/<code>
<code>在集群內可以使用 service 的域名在 coredns 上解析得到 service 地址: dig -t A myapp.default.svc.cluster.local @10.96.0.10
/<code>

8.8 loadBalancerIP 類型

service 在每臺主機的 iptables/ipvs 規則內,訪問任意一臺 node 都可以到達 pod,所以應該在這些 nodeip 前加負載均衡器,如果工作在公有云,可以使用 k8s 內置的 loadBalancerIP,操作公有云的負載均衡器即服務,實現動態的增刪。

可以理解為 loadBalancerIP 增強了 NodePort 類型的 service ,在集群外部對每臺 nodeip 進行負載均衡。

8.9 無集群地址的 Service

無頭 service 表示 service 沒有 ClusterIP 也不映射 NodePort,而是將 service 的域名直接解析為 nodeIP 從而直接訪問 nodeIP 上的 POD。

  • 清單示例
<code>apiVersion: v1
kind: Service
metadata:
name: myapp-nohead
namespace: default
spec:
selector:
app: myapp-nohead
release: canary
type: ClusterIP
clusterIP: None
ports:
- port: 80 # service 端口
targetPort: 80 # pod 監聽的端口
/<code>
  • 查看 CoreDNS 服務器的地址
<code>kubectl get svc -n kube-system
/<code>
  • 在集群內使用 CoreDNS 的地址解析無頭的 serive 域名,得到的直接為 nodeip 中的 pod 地址,利用 dns 的多條 A 記錄來負載均衡
<code>dig -t A myapp-nohead.default.svc.cluster.local. @10.96.0.10
/<code>
<code>;; ANSWER SECTION:
myapp-nohead.default.svc.cluster.local. 5 IN A 10.244.1.75
myapp-nohead.default.svc.cluster.local. 5 IN A 10.244.2.74
/<code>

8.10 externalName 類型

當 POD 需要訪問一個集群外部的服務時候,externalName 可以映射一個集群外部的服務到集群內部,供集群內 POD 訪問。

就是把外部的一個域名地址,映射為集群內部 coredns 解析的一個內部地址,提供集群內部訪問。


分享到:


相關文章: