乐趣区

关于kubernetes:09kubernetes笔记-Service三特殊类型SVC-Headless-ServiceExternalName

两种非凡类型的 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。也被称为无头服务。
  • headless Service 和一般 Service 的区别
    headless 不调配 clusterIP
    headless service 能够通过解析 service 的 DNS,返回所有 Pod 的地址和 DNS(statefulSet 部署的 Pod 才有 DNS) 一般的 service,只能通过解析 service 的 DNS 返回 service 的 ClusterIP
  • statefulSet 和 Deployment 控制器的区别
    statefulSet 下的 Pod 有 DNS 地址, 通过解析 Pod 的 DNS 能够返回 Pod 的 IP
    deployment 下的 Pod 没有 DNS
  • 一般 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/…

退出移动版