Kubernetes 学习笔记(四):详解 k8s 的各项资源
Service
Service 通過標(biāo)簽選擇 pod,將各 pod 的 ip 保存到它的 endpoints 屬性中。Service 的收到的請(qǐng)求會(huì)被均攤到這一組 endpoints 上。
DNS
在 k8s 中做服務(wù)發(fā)現(xiàn),最常用的方式是通過 DNS 解析。
在我們的 k8s 集群配置了 dns 服務(wù)(最常用的是 coredns)的前提下,我們就可以直接通過全限定域名(FQDN)來訪問別的服務(wù)。
全限定域名的格式如下:
# 格式
<service-name>.<namespace>.svc.cluster.local # 域名 .svc.cluster.local 是可自定義的
# 舉例:訪問 default 名字空間下的 nginx 服務(wù)
nginx.default.svc.cluster.local
如果兩個(gè)服務(wù)在同一個(gè)名字空間內(nèi),可以省略掉后面的 .<namespace>.svc.cluster.local,直接以服務(wù)名稱為 DNS 訪問別的服務(wù)
P.S. DNS 服務(wù)發(fā)現(xiàn)的實(shí)現(xiàn)方式:修改每個(gè)容器的 /etc/resolv.conf,使容器訪問 k8s 自己的 dns 服務(wù)器。而該 dns 服務(wù)器知道系統(tǒng)中的所有服務(wù),所以它能給出正確的響應(yīng)。
SRV 記錄
Service 除了會(huì)使用最常見的 A 記錄做 Pod 的負(fù)載均衡外,還提供一種 SRV 記錄,這種類型的服務(wù)被稱為 Headless Service.
將 Service 的 spec.ClusterIP 設(shè)為 None,得到的就是一個(gè) Headless Service。
普通的 Service 擁有自己的 ClusterIP 地址,service name 會(huì)被 DNS 解析到這個(gè)虛擬的 ClusterIP(A 記錄或 CNAME 記錄),然后被 kubectl proxy 轉(zhuǎn)發(fā)到具體的 Pod。
而 Headless Service 沒有自己的 ClusterIP(這個(gè)值被指定成了 None),service name 只提供 SRV 記錄的 DNS 解析,返回一個(gè) Pods 的 ip/dns 列表。
有狀態(tài)集可能會(huì)比較需要 SRV 記錄。
最佳實(shí)踐
總是使用 Deployment,避免直接使用 ReplicaSet/Pod
為 Pod 的 Port 命名(比如命名成 http/https),然后在 Service 的 targetPort 中通過端口名稱(http/https)來指定目標(biāo)端口(容器端口)。
更直觀,也更靈活
應(yīng)用通過 dns 查找/發(fā)現(xiàn)其他服務(wù)
同一名字空間下的應(yīng)用,可以直接以服務(wù)名稱為域名發(fā)現(xiàn)別的服務(wù),如通過 http://nginx 訪問 nginx
Service 配置會(huì)話親和性為 ClientIP 可能會(huì)更好(會(huì)話將被同一個(gè) pod 處理,不會(huì)發(fā)生轉(zhuǎn)移)
配置 externalTrafficPolicy: Local 可以防止不必要的網(wǎng)絡(luò)跳數(shù),但是可能會(huì)導(dǎo)致 pod 之間的流量分配不均。
總結(jié)
以上是生活随笔為你收集整理的Kubernetes 学习笔记(四):详解 k8s 的各项资源的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: UART协议驱动设计
- 下一篇: laravel artisan工具的使