09.kubernetes笔记 Service(三) 两种特殊类型的SVC Headless Service、ExternalName

目录

  • Headless Service
    示例1.无头服务解析
  • Service类型中的第四种:ExternalName
    示例2:www.baidu.com cname到svc

两种特殊类型的svc

Headless Service

  • Headless Service
    有时不需要或不想要负载均衡,以及单独的 Service IP 。遇到这种情况,可以通过指定 Cluster IP(spec.clusterIP) 的值为 “None” 来创建 Headless Service 。这类 Service 并不会分配 Cluster IP, kube-
    proxy 不会处理它们,而且平台也不会为它们进行负载均衡和路由每个个体都具有一定程度的独特性,由其存储的状态决定;
    Headless Services是一种特殊的service,其spec:clusterIP表示为None,这样在实际运行时就不会被分配ClusterIP。也被称为无头服务。
  1. headless Service和普通Service的区别
    headless不分配clusterIP
    headless service可以通过解析service的DNS,返回所有Pod的地址和DNS(statefulSet部署的Pod才有DNS) 普通的service,只能通过解析service的DNS返回service的ClusterIP
  2. statefulSet和Deployment控制器的区别
    statefulSet下的Pod有DNS地址,通过解析Pod的DNS可以返回Pod的IP
    deployment下的Pod没有DNS
  3. 普通Service解析service的DNS结果
  • headless Service 就是没头的Service,有什么使用场景呢?
    第一种: 自主选择权,有时候client想自己决定使用哪个Real Server,可以通过查询DNS来获取Real Server的信息
    第二种: headless service关联的每个endpoint(也就是Pod),都会有对应的DNS域名;这样Pod之间就可以互相访问

  • headless service一般和statefulSet结合使用
    为什么要用headless service+statefulSet部署有状态应用?

  1. headless service会为关联的Pod分配一个域
    <service name>.$<namespace name>.svc.cluster.local
  2. StatefulSet会为关联的Pod保持一个不变的Pod Name
    statefulset中Pod的hostname格式为$(StatefulSet name)-$(pod序号)
  3. StatefulSet会为关联的Pod分配一个dnsName
    $<Pod Name>.$<service name>.$<namespace name>.svc.cluster.local
示例1.Headless Service无头服务解析
[root@k8s-master svc]# cat demoapp-headless-svc.yaml
apiVersion: v1
kind: Service
metadata:
  name: demoapp-headless-svc
spec:
  clusterIP: None  #必须为None
  selector:
    app: demoapp
  ports:
  - port: 80
    targetPort: 80
    name: http  

[root@k8s-master centos]# kubectl exec centos-deployment-66d8cd5f8b-nrfnv -it -- /bin/bash

root@centos-deployment-66d8cd5f8b-nrfnv /]# nslookup -query=A demoapp-headless-svc    #解析到是后端pod IP
Server:     10.96.0.10
Address:    10.96.0.10#53

Name:   demoapp-headless-svc.default.svc.cluster.local
Address: 10.244.1.103
Name:   demoapp-headless-svc.default.svc.cluster.local
Address: 10.244.2.99
Name:   demoapp-headless-svc.default.svc.cluster.local
Address: 10.244.2.97
Name:   demoapp-headless-svc.default.svc.cluster.local
Address: 10.244.1.102

[root@centos-deployment-66d8cd5f8b-nrfnv /]# nslookup -query=PTR  10.244.1.103 #对pod IP进行反解 得到所有绑定的SVC
Server:     10.96.0.10
Address:    10.96.0.10#53

103.1.244.10.in-addr.arpa   name = 10-244-1-103.demoapp-svc.default.svc.cluster.local.
103.1.244.10.in-addr.arpa   name = 10-244-1-103.demoapp-nodeport-svc.default.svc.cluster.local.
103.1.244.10.in-addr.arpa   name = 10-244-1-103.demoapp-loadbalancer-svc.default.svc.cluster.local.
103.1.244.10.in-addr.arpa   name = 10-244-1-103.demoapp-externalip-svc.default.svc.cluster.local.
103.1.244.10.in-addr.arpa   name = 10-244-1-103.demoapp-headless-svc.default.svc.cluster.local.

[root@centos-deployment-66d8cd5f8b-nrfnv /]# curl 10.244.1.103
iKubernetes demoapp v1.0 !! ClientIP: 10.244.1.104, ServerName: demoapp-66db74fcfc-2jf49, ServerIP: 10.244.1.103!
[root@centos-deployment-66d8cd5f8b-nrfnv /]# 
[root@centos-deployment-66d8cd5f8b-nrfnv /]# 
[root@centos-deployment-66d8cd5f8b-nrfnv /]# curl demoapp-headless-svc   #需要注意的是Headless Service只有集群内部能访问,宿主机上因为无法解析到SVC IP是访问的
iKubernetes demoapp v1.0 !! ClientIP: 10.244.1.104, ServerName: demoapp-66db74fcfc-5dp5n, ServerIP: 10.244.1.102!
[root@centos-deployment-66d8cd5f8b-nrfnv /]# curl demoapp-headless-svc
iKubernetes demoapp v1.0 !! ClientIP: 10.244.1.104, ServerName: demoapp-66db74fcfc-z682r, ServerIP: 10.244.2.99!
[root@centos-deployment-66d8cd5f8b-nrfnv /]# curl demoapp-headless-svc
iKubernetes demoapp v1.0 !! ClientIP: 10.244.1.104, ServerName: demoapp-66db74fcfc-9wkgj, ServerIP: 10.244.2.97!
[root@centos-deployment-66d8cd5f8b-nrfnv /]# exit

[root@k8s-master svc]# curl demoapp-headless-svc  #无法访问
curl: (6) Could not resolve host: demoapp-headless-svc; Unknown error

Service类型中的第四种:ExternalName

externalName Service是k8s中一个特殊的service类型,它不需要指定selector去选择哪些pods实例提供服务,而是使用DNS CNAME机制把自己CNAME到你指定的另外一个域名上,你可以提供集群内的名字,比如mysql.db.svc这样的建立在db命名空间内的mysql服务,也可以指定http://mysql.example.com这样的外部真实域名。

CNAME是很有用的一个功能,在不同的域名之间搭建桥梁达到明一个域名暗另一个域名,比如github就通过CNAME机制来达到为用户提供私有域名站点的功能,云服务商也都是使用CNAME为用户提供各种各样的服务。作为明域名的所有者,我可以用A云来提供服务,哪天我口味变了,我换成B云提供服务,对我的用户的来说没有任何感知。

示例2:www.baidu.com cname到svc
[root@k8s-master svc]# cat externalname-redis-svc.yaml 
apiVersion: v1
kind: Service
metadata:
  name: externalname-http-svc
  namespace: default
spec:
  type: ExternalName
  externalName: www.baidu.com
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
  selector: {}

[root@k8s-master svc]# kubectl get svc
NAME                    TYPE           CLUSTER-IP       EXTERNAL-IP     PORT(S)   AGE
demoapp-deploy          ClusterIP      10.109.159.225   <none>          80/TCP    3d3h
externalname-http-svc   ExternalName   <none>           www.baidu.com   80/TCP    87m

#新增Pod测试
[root@k8s-master storage]# kubectl run pod-$RANDOM --image=ikubernetes/admin-box:latest -it --rm --command -- /bin/sh
root@pod-7813 # nslookup -query=A  externalname-http-svc
Server:     10.96.0.10
Address:    10.96.0.10#53

externalname-http-svc.default.svc.cluster.local canonical name = www.baidu.com.
www.baidu.com   canonical name = www.a.shifen.com.
Name:   www.a.shifen.com
Address: 180.101.49.11
Name:   www.a.shifen.com
Address: 180.101.49.12


root@pod-7813 # curl -H "host:www.baidu.com" externalname-http-svc.default.svc.cluster.local
<!DOCTYPE html>
<!--STATUS OK--><html> <head><meta http-equiv=content-type content=text/html;charset=utf-8><meta http-equiv=X-UA-Compatible content=IE=Edge><meta content=always name=referrer><link rel=stylesheet type=text/css href=http://s1.bdstatic.com/r/www/cache/bdorz/baidu.min.css><title>百度一下,你就知道
....
root@pod-7813 # 

参考链接:

https://zhuanlan.zhihu.com/p/113195379

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,635评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,628评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,971评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,986评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,006评论 6 394
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,784评论 1 307
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,475评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,364评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,860评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,008评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,152评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,829评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,490评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,035评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,156评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,428评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,127评论 2 356

推荐阅读更多精彩内容