首页 > 其他分享 >容器网络域名解析

容器网络域名解析

时间:2023-07-16 10:44:06浏览次数:40  
标签:容器 cluster 0.0 svc 域名解析 网络 10.244 hostnames KUBE

使用service的原因

1. Pod的IP不是固定的。
2. Pod实例之间需要负载均衡。

部署Service和Deploy

使用selector字段来声明这个Service只代理携带了app=hostnames标签的Pod。这个Service的80端口,代理的是Pod的9376端口。

apiVersion: v1
kind: Service
metadata:
  name: hostnames
spec:
  selector:
    app: hostnames
  ports:
  - name: default
    protocol: TCP
    port: 80
targetPort: 9376

应用的作用是每次访问9376端口时返回自己的hostname。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: hostnames
spec:
  selector:
    matchLabels:
      app: hostnames
  replicas: 3
  template:
    metadata:
      labels:
        app: hostnames
    spec:
      containers:
      - name: hostnames
        image: k8s.gcr.io/serve_hostname
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 9376
          protocol: TCP

手动下载serve_hostname镜像

docker pull anjia0532/google-containers.serve_hostname
docker tag docker.io/anjia0532/google-containers.serve_hostname:latest k8s.gcr.io/serve_hostname

查看ep

被selector选中的Pod称为Service的Endpoints。
只有处于Running状态且readinessProbe检查通过的Pod,才会出现在Service的Endpoints列表里。

$ kubectl get pod -owide 
NAME                         READY   STATUS    RESTARTS   AGE     IP            NODE            NOMINATED NODE   READINESS GATES
hostnames-7c89f997cf-pdg7p   1/1     Running   0          4m29s   10.244.1.8    192.168.0.106   <none>           <none>
hostnames-7c89f997cf-tzmcn   1/1     Running   0          3m22s   10.244.1.10   192.168.0.106   <none>           <none>
hostnames-7c89f997cf-vc4qc   1/1     Running   0          4m29s   10.244.1.9    192.168.0.106   <none>           <none>

$ kubectl get ep hostnames
NAME        ENDPOINTS                                          AGE
hostnames   10.244.1.10:9376,10.244.1.8:9376,10.244.1.9:9376   12m

访问service(负载均衡方式是轮询)

$ kubectl get svc hostnames
NAME        TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
hostnames   ClusterIP   10.102.11.183   <none>        80/TCP    16m

$ curl 10.102.11.183:80
hostnames-7c89f997cf-tzmcn

实现原理

Service是由kube-proxy + iptables来实现的。kube-proxy通过Service的Informer感知hostnames Service对象的添加,在每个主机上创建iptables规则。

无法ping通cluster ip的原因

因为10.99.149.144只是一条iptables规则上的配置,没有真正的网络设备,所以ping这个地址是不会有响应的。

iptables规则

PREROUTING nat

# KUBE-SERVICES链插在DOCKER链前面
$ iptables -t nat -nvL PREROUTING
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
  138 44896 KUBE-SERVICES  all  --  *      *       0.0.0.0/0            0.0.0.0/0            /* kubernetes service portals */
    9   932 DOCKER     all  --  *      *       0.0.0.0/0            0.0.0.0/0            ADDRTYPE match dst-type LOCAL

# DNAT 通过轮询的方式把包传给ep
# KUBE-MARK-MASQ对流入的IP包设置标志(--set-xmark)
$ iptables -t nat -nvL KUBE-SERVICES
Chain KUBE-SERVICES (2 references)
 pkts bytes target     prot opt in     out     source               destination         
    ...
    0     0 KUBE-MARK-MASQ  tcp  --  *      *      !10.244.0.0/16        10.102.11.183        /* default/hostnames:default cluster IP */ tcp dpt:80
    0     0 KUBE-SVC-ODX2UBAZM7RQWOIU  tcp  --  *      *       0.0.0.0/0            10.102.11.183        /* default/hostnames:default cluster IP */ tcp dpt:80
    ...

# 为了保证每条被选中的概率都相同,probability字段的值分别设置为 1/3(0.333…)、1/2 和 1。
# 第一条规则被选中的概率就是1/3;如果第一条规则没有被选中,那么只剩下两条规则了,第二条规则的probability设置为1/2;最后一条设置为1。
$ iptables -t nat -nvL KUBE-SVC-ODX2UBAZM7RQWOIU
Chain KUBE-SVC-ODX2UBAZM7RQWOIU (1 references)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 KUBE-SEP-N6BO7JPFL3IPM3GK  all  --  *      *       0.0.0.0/0            0.0.0.0/0            statistic mode random probability 0.33332999982
    0     0 KUBE-SEP-XBIWV66JPBUXLYCY  all  --  *      *       0.0.0.0/0            0.0.0.0/0            statistic mode random probability 0.50000000000
    0     0 KUBE-SEP-ZDT36JFL743NS3VU  all  --  *      *       0.0.0.0/0            0.0.0.0/0
$ iptables -t nat -nvL KUBE-SEP-N6BO7JPFL3IPM3GK
Chain KUBE-SEP-N6BO7JPFL3IPM3GK (1 references)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 KUBE-MARK-MASQ  all  --  *      *       10.244.1.10          0.0.0.0/0           
    0     0 DNAT       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp to:10.244.1.10:9376


$ iptables -t nat -nvL KUBE-SEP-XBIWV66JPBUXLYCY
Chain KUBE-SEP-XBIWV66JPBUXLYCY (1 references)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 KUBE-MARK-MASQ  all  --  *      *       10.244.1.8           0.0.0.0/0           
    0     0 DNAT       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp to:10.244.1.8:9376


$ iptables -t nat -nvL KUBE-SEP-ZDT36JFL743NS3VU
Chain KUBE-SEP-ZDT36JFL743NS3VU (1 references)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 KUBE-MARK-MASQ  all  --  *      *       10.244.1.9           0.0.0.0/0           
0     0 DNAT       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp to:10.244.1.9:9376

如果源地址不是容器网络网段,那么需要设置标志,即不设置标志的情况是源地址不是容器网络网段中该Service后端Pod IP,DNAT处理后变成了容器之间直接访问。 
针对源地址不是容器网络网段的场景,设置标志的原因是nodePort场景:

                client 
                  \ v
                   \ \ 
                    v \ 
   node 1 <--- node 2 
    | v SNAT 
    | |  ---> 
    v | 
 endpoint

当外部client通过node 2的地址访问Service时,node2把请求转发给Pod所在的node1,node1中Pod处理完请求后响应node2,node2响应client。 
设置了标志的IP包,需要执行SNAT,即node2执行SNAT 如果不执行SNAT,那么client发送给node2的请求,会由node1来响应,报错。

$ iptables -t nat -nvL POSTROUTING
Chain POSTROUTING (policy ACCEPT 6 packets, 360 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    ...
 1984  122K KUBE-POSTROUTING  all  --  *      *       0.0.0.0/0            0.0.0.0/0            /* kubernetes postrouting rules */
 ...
 
 $ iptables -t nat -nvL KUBE-POSTROUTING
Chain KUBE-POSTROUTING (1 references)
 pkts bytes target     prot opt in     out     source               destination         
0     0 MASQUERADE  all  --  *      *       0.0.0.0/0            0.0.0.0/0            /* kubernetes service traffic requiring SNAT */ mark match 0x4000/0x4000

解析内部域名

Deployment的yaml文件中不能指定spec.serviceName,StatefulSet的yaml文件中需要指定spec.serviceName。 

Deployment常用ClusterIP模式的Service,解析svc的域名。 
StatefulSet常用Headless模式的Service,解析Pod的域名。

解析service域名

ClusterIP模式的Service,记录格式是svc-name.namespace.svc.cluster.local,指向Cluster IP。 
指定coredns后端实例来解析svc域名。

$ nslookup kubernetes.default.svc.cluster.local -po=53 10.244.1.2
Server:		10.244.1.2
Address:	10.244.1.2#53

Name:	kubernetes.default.svc.cluster.local
Address: 10.96.0.1

指定了clusterIP=None的Headless Service,记录格式也是svc-name.namespace.svc.cluster.local,返回所有被代理的Pod的IP地址的集合。

# nslookup hostnames.default.svc.cluster.local -po=53 10.244.1.2
Server:		10.244.1.2
Address:	10.244.1.2#53

Name:	hostnames.default.svc.cluster.local
Address: 10.244.1.22
Name:	hostnames.default.svc.cluster.local
Address: 10.244.1.21
Name:	hostnames.default.svc.cluster.local
Address: 10.244.1.20

解析Pod域名

ClusterIP模式和Headless模式的Service,代理的Pod记录格式是pod-name.svc-name.namespace.svc.cluster.local,指向Pod的IP地址。

1. 针对无状态应用的Pod,解析失败。

$ nslookup hostnames-7c89f997cf-bx2f7.hostnames.default.svc.cluster.local -po=53 10.244.1.2
Server:		10.244.1.2
Address:	10.244.1.2#53

** server can't find hostnames-7c89f997cf-bx2f7.hostnames.default.svc.cluster.local: NXDOMAIN

2. 针对有状态应用的Pod,解析成功。

$ nslookup hostnames-0.hostnames.default.svc.cluster.local -po=53 10.244.1.2
Server:		10.244.1.2
Address:	10.244.1.2#53

Name:	hostnames-0.hostnames.default.svc.cluster.local
Address: 10.244.1.23

配置域名解析配置文件

$ cat /etc/resolv.conf
# Generated by NetworkManager
nameserver 10.96.0.10 # kube-dns service clusterIP 解析k8s域名
nameserver 192.168.1.1
nameserver 192.168.0.1

# 域名解析成功
$ nslookup hostnames-0.hostnames.default.svc.cluster.local
Server:		10.96.0.10
Address:	10.96.0.10#53

Name:	hostnames-0.hostnames.default.svc.cluster.local
Address: 10.244.1.23

域名解析出IPv6地址

# -query=AAAA 表示 IPv6。
nslookup -query=AAAA -po=53 域名 一个kube-dns的Pod的ipv6地址
或者
nslookup -query=AAAA 域名

参考资料

《深入剖析Kubernetes》

 

标签:容器,cluster,0.0,svc,域名解析,网络,10.244,hostnames,KUBE
From: https://www.cnblogs.com/WJQ2017/p/17557556.html

相关文章

  • docker restart 多個容器
    Dockerrestart多个容器的流程为了实现Dockerrestart多个容器,我们可以按照以下步骤进行操作:步骤描述1找到需要重启的容器2停止容器3重新启动容器下面是每一步具体需要做的操作和相应的代码:步骤1:找到需要重启的容器首先,我们需要确定需要重启的容器的......
  • 网络编程 p1 网络基础
    网络基础网络通信概念:两台设备之间通过网络实现数据传输;网络通信:将数据通过网络从一台设备传输到另一台设备;java.net包下提供了一系列的类或接口,供程序员使用,完成网络通信;网络概念:两台或多台设备通过一定物理设备连接起来构成了网络;根据网络的覆盖范围不同,对网络进行分......
  • 强化学习:基于蒙特卡洛树和策略价值网络的深度强化学习五子棋(含码源)
    强化学习:基于蒙特卡洛树和策略价值网络的深度强化学习五子棋(含码源)特点自我对弈详细注释流程简单代码结构net:策略价值网络实现mcts:蒙特卡洛树实现server:前端界面代码legacy:废弃代码docs:其他文件utils:工具代码network.py:移植过来的网络结构代码model_5400.p......
  • python3: pip3 网络源配置
    python3:pip3网络源配置    一、pip3网络源配置 1、没有的路径、文件,要自己建立。[[email protected]]$cd~/.pip[[email protected]]$[[email protected]]$[[email protected]]$lspip.conf[[email protected]]$[[email protected]]$[[email protected]]$catpip.conf[global]index-ur......
  • python,质谱数据,加噪声后用小波神经网络,二分类预测
    #库的导入importnumpyasnpimportpandasaspdimportmath#激活函数deftanh(x):return(np.exp(x)-np.exp(-x))/(np.exp(x)+np.exp(-x))#激活函数偏导数defde_tanh(x):return(1-x**2)#小波基函数defwavelet(x):return(math.cos(1.75*x))*(np.......
  • Neutron网络模型
    网络类型VLAN模型VXLAN模型VXLAN和VLANVID转换针对不同场景,VID说法不同。针对VXLAN来说是VNI,针对VLAN来说是VLANID。VLAN和VXLAN共用br-int网桥时,VXLAN解封装后变成VLAN报文,防止br-int上VXLAN报文解封装成VLAN后的内部VLANID可能与VLAN报文的内部VLANID冲突。VLANID......
  • php开发网络游戏中的一些技巧
    classMap//地图类{var$Map_ID;functionMap_bg_css($Map_ID){$this->Map_ID=$Map_ID;mysql_select_db($db_name,$link);$sql="select*frommapwhereMap_ID='".$this->Map_ID."'limit1";$result=mysql_query($sql,$link)......
  • php在开发网络游戏上的使用
    PHP即“超文本预处理器”,是一种通用开源脚本语言。PHP是在服务器端执行的脚本语言,与C语言类似,是常用的网站编程语言。PHP独特的语法混合了C、Java、Perl以及PHP自创的语法。利于学习,使用广泛,主要适用于Web开发领域。很多小伙伴在初学PHP的时候,都可能会有这样的疑问,PHP能开发游......
  • 【转】Docker入门笔记01:Docker容器技术的发展历程
    原文:https://zhuanlan.zhihu.com/p/304623118最近因为工作需要,要学习一些基本的Docker知识,所以整理了一些docker的入门知识,感兴趣的小白可以看看,一起学习进步。要学习一个新的东西,我的习惯一般是先了解它是什么,它是怎么来的,发展历史是怎样的,用来解决什么问题,有什么优缺点。所以......
  • 计算机网络自顶而下第二章笔记
     应用层原理网络应用的体系结构可能的应用架构:r客户-服务器模式(C/S:client/server)r对等模式(P2P:PeerToPeer)r混合体:客户-服务器和对等体系客户-服务器(C/S)体系结构r服务器:m一直运行m固定的IP地址和周知的端口号(约定)m扩展性:服务器场•对数据中心进行扩......