k8s (5) service服务详解

service

什么是服务

服务是将运行在一组 Pods 上的应用程序公开为网络服务的抽象方法。

使用 Kubernetes,你无需修改应用程序即可使用不熟悉的服务发现机制。 Kubernetes 为 Pods 提供自己的 IP 地址,并为一组 Pod 提供相同的 DNS 名, 并且可以在它们之间进行负载均衡

为什么使用service

创建和销毁 Kubernetes Pod 以匹配集群状态。 Pod 是非永久性资源。 如果你使用 Deployment 来运行你的应用程序,则它可以动态创建和销毁 Pod。

每个 Pod 都有自己的 IP 地址,但是在 Deployment 中,在同一时刻运行的 Pod 集合可能与稍后运行该应用程序的 Pod 集合不同。

这导致了一个问题: 如果一组 Pod(称为“后端”)为集群内的其他 Pod(称为“前端”)提供功能, 那么前端如何找出并跟踪要连接的 IP 地址,以便前端可以使用提供工作负载的后端部分

定义和使用service

下述yaml定义了一个简单的service

apiVersion: v1
kind: Service
metadata:
  name: myservice
spec:
  selector:
    app: MyApp
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80

上述配置创建一个名称为 “myservice” 的 Service 对象,它会将请求代理到使用 TCP 端口 80,并且具有标签 “app=MyApp” 的 Pod 上。

[k8s@node1 yaml]$ kubectl describe svc myservice 
Name:              myservice
Namespace:         default
Labels:            <none>
Annotations:       <none>
Selector:          app=myapp
Type:              ClusterIP
IP Families:       <none>
IP:                10.107.235.167
IPs:               10.107.235.167
Port:              <unset>  80/TCP
TargetPort:        80/TCP
Endpoints:         10.244.2.38:80,10.244.2.39:80,10.244.2.40:80 + 3 more...
Session Affinity:  None
Events:            <none>

Kubernetes 为该服务分配一个 IP 地址,如上述 10.107.235.167(有时称为 “集群IP”),该 IP 地址由服务代理使用。 服务选择算符的控制器不断扫描与其选择器匹配的 Pod,然后将所有更新发布到也称为 “myservice” 的 Endpoint 对象。

服务的默认协议是 TCP;你还可以使用任何其他受支持的协议。
由于许多服务需要公开多个端口,因此 Kubernetes 在服务对象上支持多个端口定义。 每个端口定义可以具有相同的 protocol,也可以具有不同的协议。

发布服务

对一些应用的某些部分(如前端),可能希望将其暴露给 Kubernetes 集群外部 的 IP 地址。
Kubernetes ServiceTypes 允许指定你所需要的 Service 类型,默认是 ClusterIP。
Type 的取值以及行为如下:

ClusterIP

通过集群的内部 IP 暴露服务,选择该值时服务只能够在集群内部访问。 这也是默认的 ServiceType。

NodePort

通过每个节点上的 IP 和静态端口(NodePort)暴露服务。 NodePort 服务会路由到自动创建的 ClusterIP 服务。 通过请求 <节点 IP>:<节点端口>,你可以从集群的外部访问一个 NodePort 服务。

 kind: Service
apiVersion: v1
kind: Service
metadata:
  name: myservice
spec:
  ports:
    - port: 80
      protocol: TCP
      targetPort: 80
  selector:
    app: myapp
  type: NodePort

测试

[k8s@node1 yaml]$ kubectl describe svc myservice 
Name:                     myservice
Namespace:                default
Labels:                   <none>
Annotations:              <none>
Selector:                 app=myapp
Type:                     NodePort
IP Families:              <none>
IP:                       10.107.235.167
IPs:                      10.107.235.167
Port:                     <unset>  80/TCP
TargetPort:               80/TCP
NodePort:                 <unset>  32174/TCP
Endpoints:                10.244.2.38:80,10.244.2.39:80,10.244.2.40:80 + 3 more...
Session Affinity:         None
External Traffic Policy:  Cluster
Events:                   <none>
[k8s@node1 yaml]$ curl 172.25.254.101:32174/hostname.html
deployment-myapp-6d7ffcdd54-7t2ht
[k8s@node1 yaml]$ curl 172.25.254.101:32174/hostname.html
deployment-myapp-6d7ffcdd54-l5cw6
[k8s@node1 yaml]$ curl 172.25.254.101:32174/hostname.html
deployment-myapp-6d7ffcdd54-94hhh
[k8s@node1 yaml]$ curl 172.25.254.101:32174/hostname.html
deployment-myapp-6d7ffcdd54-8vk86 //负载均衡

LoadBalancer

使用云提供商的负载均衡器向外部暴露服务。 外部负载均衡器可以将流量路由到自动创建的 NodePort 服务和 ClusterIP 服务上。

说明:
在使用支持外部负载均衡器的云提供商的服务时,设置 type 的值为 “LoadBalancer”, 将为 Service 提供负载均衡器。 负载均衡器是异步创建的,关于被提供的负载均衡器的信息将会通过 Service 的 status.loadBalancer 字段发布出去。

[k8s@node1 yaml]$ kubectl apply -f myservice.yml 
service/myservice created
[k8s@node1 yaml]$ cat myservice.yml 
kind: Service
apiVersion: v1
kind: Service
metadata:
  name: myservice
spec:
  ports:
    - port: 80
      protocol: TCP
      targetPort: 80
  selector:
    app: myapp
  type: LoadBalancer
[k8s@node1 yaml]$ kubectl get svc myservice 
NAME        TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
myservice   LoadBalancer   10.108.213.11   <pending> //正在调用外部负载均衡器    80:31789/TCP   27s

ExternalName

通过返回 CNAME 和对应值,可以将服务映射到 externalName 字段的内容(例如,foo.bar.example.com)。 无需创建任何 类型代理。

说明:
类型为 ExternalName 的服务将服务映射到 DNS 名称,而不是典型的选择器,
警告:
对于一些常见的协议,包括 HTTP 和 HTTPS, 使用 ExternalName 可能会遇到问题

[k8s@node1 yaml]$ cat myservice.yml 
kind: Service
apiVersion: v1
kind: Service
metadata:
  name: myservice
spec:
  ports:
    - port: 80
      protocol: TCP
      targetPort: 80
  selector:
    app: myapp
  type: ExternalName
  externalName: www.baidu.com   //指定外部域名
[k8s@node1 yaml]$ kubectl describe svc myservice 
Name:              myservice
Namespace:         default
Labels:            <none>
Annotations:       <none>
Selector:          app=myapp
Type:              ExternalName
IP Families:       <none>
IP:                
IPs:               <none>
External Name:     www.baidu.com
Port:              <unset>  80/TCP
TargetPort:        80/TCP
Endpoints:         10.244.2.41:80,10.244.2.42:80,10.244.2.43:80 + 5 more...
Session Affinity:  None
Events:
  Type    Reason  Age   From                Message
  ----    ------  ----  ----                -------
  Normal  Type    22s   service-controller  LoadBalancer -> ExternalName
[k8s@node1 yaml]$ sudo dig myservice.default.svc.cluster.local. @10.96.0.10 ##要加上sudo 负责无法访问/etc/resolv.conf
; <<>> DiG 9.9.4-RedHat-9.9.4-72.el7 <<>> myservice.default.svc.cluster.local. @10.96.0.10
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 21295
;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; WARNING: recursion requested but not available

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;myservice.default.svc.cluster.local. IN        A

;; ANSWER SECTION:
myservice.default.svc.cluster.local. 30 IN CNAME www.baidu.com.

;; Query time: 11 msec
;; SERVER: 10.96.0.10#53(10.96.0.10)
;; WHEN: Sun Feb 14 12:14:36 CST 2021
;; MSG SIZE  rcvd: 126

外部 IP

如果外部的 IP 路由到集群中一个或多个 Node 上,Kubernetes Service 会被暴露给这些 externalIPs。 通过外部 IP(作为目的 IP 地址)进入到集群,打到 Service 的端口上的流量, 将会被路由到 Service 的 Endpoint 上。 externalIPs 不会被 Kubernetes 管理,它属于集群管理员的职责范畴

[k8s@node1 yaml]$ cat myservice.yml
kind: Service
apiVersion: v1
kind: Service
metadata:
  name: myservice
spec:
  ports:
    - port: 80
      protocol: TCP
      targetPort: 80
  selector:
    app: myapp
  type: ClusterIP
  externalIPs:
    - 172.25.254.100 
[k8s@node1 yaml]$ kubectl apply -f myservice.yml 
service/myservice configured
[k8s@node1 yaml]$ ip a
9: kube-ipvs0: <BROADCAST,NOARP> mtu 1500 qdisc noop state DOWN group default 
    link/ether 72:f7:c6:73:e0:dd brd ff:ff:ff:ff:ff:ff
    inet 10.96.0.1/32 scope global kube-ipvs0
       valid_lft forever preferred_lft forever
    inet 10.96.0.10/32 scope global kube-ipvs0
       valid_lft forever preferred_lft forever
    inet 10.98.104.148/32 scope global kube-ipvs0
       valid_lft forever preferred_lft forever
    inet 172.25.254.100/32 scope global kube-ipvs0
       valid_lft forever preferred_lft forever
[k8s@node1 yaml]$ sudo ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  172.25.254.100:80 rr
  -> 10.244.2.41:80               Masq    1      0          0         
  -> 10.244.2.42:80               Masq    1      0          0         
  -> 10.244.2.43:80               Masq    1      0          0         
  -> 10.244.2.44:80               Masq    1      0          0         
  -> 10.244.3.40:80               Masq    1      0          0         
  -> 10.244.3.41:80               Masq    1      0          0         
  -> 10.244.3.42:80               Masq    1      0          0         
  -> 10.244.3.43:80               Masq    1      0          0         
[k8s@node1 yaml]$ curl 172.25.254.100 ##从外部访问
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
[k8s@node1 yaml]$ curl 172.25.254.100/hostname.html ##负载均衡
deployment-myapp-59dff4cf5d-t2ghh
[k8s@node1 yaml]$ curl 172.25.254.100/hostname.html
deployment-myapp-59dff4cf5d-4l7wk
[k8s@node1 yaml]$ curl 172.25.254.100/hostname.html
deployment-myapp-59dff4cf5d-dzprw

kube-proxy代理模式

userspace 代理模式

在这里插入图片描述

说明:
1、为每个service在node上打开一个随机端口(代理端口)
2、建立iptables规则,将clusterip的请求重定向到代理端口
3、到达代理端口(用户空间)的请求再由kubeproxy转发到后端pod。

默认情况下,用户空间模式下的 kube-proxy 通过轮转算法选择后端
因为kube-proxy 监听的端口在用户空间,所以需要一层 iptables 把访问服务的连接重定向给 kube-proxy 服务,这里就存在内核态到用户态的切换,代价很大,因此就有了iptables。

iptables 代理模式

在这里插入图片描述

说明:
1、kube-proxy 会监视 Kubernetes 控制节点对 Service 对象和 Endpoints 对象的添加和移除。
2、kube-proxy 对每个 Service,它会配置 iptables 规则,从而捕获到达该 Service 的 clusterIP 和端口的请求
3、kube-proxy 将请求重定向到 Service 的一组后端中的某个 Pod 上面。

使用 iptables 处理流量具有较低的系统开销,因为流量由 Linux netfilter 处理, 而无需在用户空间和内核空间之间切换。
iptables由kube-proxy动态的管理,让kube-proxy不再负责转发,数据包的走向完全由iptables规则决定,这样的过程不存在内核态到用户态的切换,效率明显会高很多。但是随着service的增加,iptables规则会不断增加,导致内核十分繁忙(等于在读一张很大的没建索引的表)。

IPVS 代理模式

在 ipvs 模式下,kube-proxy 监视 Kubernetes 服务和端点,调用 netlink 接口相应地创建 IPVS 规则, 并定期将 IPVS 规则与 Kubernetes 服务和端点同步。 该控制循环可确保IPVS 状态与所需状态匹配。访问服务时,IPVS 将流量定向到后端Pod之一。

IPVS代理模式基于类似于 iptables 模式的 netfilter 挂钩函数, 但是使用哈希表作为基础数据结构,并且在内核空间中工作。 这意味着,与 iptables 模式下的 kube-proxy 相比,IPVS 模式下的 kube-proxy 重定向通信的延迟要短,并且在同步代理规则时具有更好的性能。 与其他代理模式相比,IPVS 模式还支持更高的网络流量吞吐量。
在这里插入图片描述

如何实现ipvs代理模式?

  • 1 在各个节点上安装ipvsadm

说明:
要在 IPVS 模式下运行 kube-proxy,必须在启动 kube-proxy 之前使 IPVS 在节点上可用。
当 kube-proxy 以 IPVS 代理模式启动时,它将验证 IPVS 内核模块是否可用。 如果未检测到IPVS 内核模块,则 kube-proxy 将退回到以 iptables 代理模式运行。

[k8s@node1 yaml]$ lsmod | grep ip_vs
ip_vs_sh               12688  0 
ip_vs_wrr              12697  0 
ip_vs_rr               12600  0 
ip_vs                 145497  6 ip_vs_rr,ip_vs_sh,ip_vs_wrr
nf_conntrack          133095  7 ip_vs,nf_nat,nf_nat_ipv4,xt_conntrack,nf_nat_masquerade_ipv4,nf_conntrack_netlink,nf_conntrack_ipv4
libcrc32c              12644  4 xfs,ip_vs,nf_nat,nf_conntrack
  • 2 编辑kubeproxy的代理模式
[k8s@node1 yaml]$ kubectl edit cm kube-proxy -n kube-system
43     metricsBindAddress: ""
44     mode: "ipvs"
45     nodePortAddresses: null
configmap/kube-proxy edited
  • 3 删除kube-proxy

说明:
kube-proxy是daemonset控制器来管理的,保证每个节点都会有一个,所以放心大胆的删

测试:

[k8s@node1 yaml]$ sudo ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  172.25.254.101:32174 rr
  -> 10.244.2.38:80               Masq    1      0          0         
  -> 10.244.2.39:80               Masq    1      0          0         
  -> 10.244.2.40:80               Masq    1      0          0         
  -> 10.244.3.37:80               Masq    1      0          0         
  -> 10.244.3.38:80               Masq    1      0          0         
  -> 10.244.3.39:80               Masq    1      0          0         
TCP  10.96.0.1:443 rr
  -> 172.25.254.101:6443          Masq    1      0          0         
TCP  10.96.0.10:53 rr
  -> 10.244.0.8:53                Masq    1      0          0         
  -> 10.244.0.9:53                Masq    1      0          0         
TCP  10.96.0.10:9153 rr
  -> 10.244.0.8:9153              Masq    1      0          0         
  -> 10.244.0.9:9153              Masq    1      0          0         
TCP  10.107.235.167:80 rr
  -> 10.244.2.38:80               Masq    1      0          0         
  -> 10.244.2.39:80               Masq    1      0          0         
  -> 10.244.2.40:80               Masq    1      0          0         
  -> 10.244.3.37:80               Masq    1      0          0         
  -> 10.244.3.38:80               Masq    1      0          0         
  -> 10.244.3.39:80               Masq    1      0          0         
TCP  10.244.0.0:32174 rr
  -> 10.244.2.38:80               Masq    1      0          0         
  -> 10.244.2.39:80               Masq    1      0          0         
  -> 10.244.2.40:80               Masq    1      0          0         
  -> 10.244.3.37:80               Masq    1      0          0         
  -> 10.244.3.38:80               Masq    1      0          0         
  -> 10.244.3.39:80               Masq    1      0          0         
TCP  10.244.0.1:32174 rr
  -> 10.244.2.38:80               Masq    1      0          0         
  -> 10.244.2.39:80               Masq    1      0          0         
  -> 10.244.2.40:80               Masq    1      0          0         
  -> 10.244.3.37:80               Masq    1      0          0         
  -> 10.244.3.38:80               Masq    1      0          0         
  -> 10.244.3.39:80               Masq    1      0          0         
TCP  127.0.0.1:32174 rr
  -> 10.244.2.38:80               Masq    1      0          0         
  -> 10.244.2.39:80               Masq    1      0          0         
  -> 10.244.2.40:80               Masq    1      0          0         
  -> 10.244.3.37:80               Masq    1      0          0         
  -> 10.244.3.38:80               Masq    1      0          0         
  -> 10.244.3.39:80               Masq    1      0          0         
TCP  172.17.0.1:32174 rr
  -> 10.244.2.38:80               Masq    1      0          0         
  -> 10.244.2.39:80               Masq    1      0          0         
  -> 10.244.2.40:80               Masq    1      0          0         
  -> 10.244.3.37:80               Masq    1      0          0         
  -> 10.244.3.38:80               Masq    1      0          0         
  -> 10.244.3.39:80               Masq    1      0          0         
UDP  10.96.0.10:53 rr
  -> 10.244.0.8:53                Masq    1      0          0         
  -> 10.244.0.9:53                Masq    1      0          0
[k8s@node1 yaml]$ kubectl describe svc myservice 
Name:                     myservice
Namespace:                default
Labels:                   <none>
Annotations:              <none>
Selector:                 app=myapp
Type:                     NodePort
IP Families:              <none>
IP:                       10.96.152.84
IPs:                      10.96.152.84
Port:                     <unset>  80/TCP
TargetPort:               80/TCP
NodePort:                 <unset>  30910/TCP
Endpoints:                10.244.2.38:80,10.244.2.39:80,10.244.2.40:80 + 3 more...
Session Affinity:         None
External Traffic Policy:  Cluster
Events:                   <none>
[k8s@node1 yaml]$ curl 10.96.152.84/hostname.html
deployment-myapp-6d7ffcdd54-94hhh
[k8s@node1 yaml]$ curl 10.96.152.84/hostname.html
deployment-myapp-6d7ffcdd54-7t2ht
[k8s@node1 yaml]$ curl 10.96.152.84/hostname.html
deployment-myapp-6d7ffcdd54-vfqfx
[k8s@node1 yaml]$ sudo ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  172.17.0.1:30910 rr
  -> 10.244.2.38:80               Masq    1      0          0         
  -> 10.244.2.39:80               Masq    1      0          0         
  -> 10.244.2.40:80               Masq    1      0          0         
  -> 10.244.3.37:80               Masq    1      0          0         
  -> 10.244.3.38:80               Masq    1      0          0         
  -> 10.244.3.39:80               Masq    1      0          0         
TCP  172.25.254.101:30910 rr
  -> 10.244.2.38:80               Masq    1      0          0         
  -> 10.244.2.39:80               Masq    1      0          0         
  -> 10.244.2.40:80               Masq    1      0          0         
  -> 10.244.3.37:80               Masq    1      0          0         
  -> 10.244.3.38:80               Masq    1      0          0         
  -> 10.244.3.39:80               Masq    1      0          0         
TCP  10.96.0.1:443 rr
  -> 172.25.254.101:6443          Masq    1      0          0         
TCP  10.96.0.10:53 rr
  -> 10.244.0.8:53                Masq    1      0          0         
  -> 10.244.0.9:53                Masq    1      0          0         
TCP  10.96.0.10:9153 rr
  -> 10.244.0.8:9153              Masq    1      0          0         
  -> 10.244.0.9:9153              Masq    1      0          0         
TCP  10.96.152.84:80 rr
  -> 10.244.2.38:80               Masq    1      0          0         
  -> 10.244.2.39:80               Masq    1      0          0         
  -> 10.244.2.40:80               Masq    1      0          0         
  -> 10.244.3.37:80               Masq    1      0          1 //轮替算法     
  -> 10.244.3.38:80               Masq    1      0          1 //负载均衡         
  -> 10.244.3.39:80               Masq    1      0          1

无头服务(Headless Services)

有时不需要或不想要负载均衡,以及单独的 Service IP。 遇到这种情况,可以通过指定 Cluster IP(spec.clusterIP)的值为 “None” 来创建 Headless Service。

Headless与普通服务对比

[k8s@node1 yaml]$ kubectl describe deployments.apps -n kube-system coredns
Name:                   coredns
Namespace:              kube-system
CreationTimestamp:      Mon, 08 Feb 2021 01:19:01 +0800
[k8s@node1 yaml]$ kubectl get svc -n kube-system 
NAME       TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)                  AGE
kube-dns   ClusterIP   10.96.0.10   <none>        53/UDP,53/TCP,9153/TCP   6d9h
[k8s@node1 yaml]$ kubectl describe svc -n kube-system kube-dns 
Name:              kube-dns
Namespace:         kube-system
Labels:            k8s-app=kube-dns
                   kubernetes.io/cluster-service=true
                   kubernetes.io/name=KubeDNS
Annotations:       prometheus.io/port: 9153
                   prometheus.io/scrape: true
Selector:          k8s-app=kube-dns
Type:              ClusterIP
IP Families:       <none>
IP:                10.96.0.10
IPs:               10.96.0.10
Port:              dns  53/UDP
TargetPort:        53/UDP
Endpoints:         10.244.0.8:53,10.244.0.9:53
Port:              dns-tcp  53/TCP
TargetPort:        53/TCP
Endpoints:         10.244.0.8:53,10.244.0.9:53
Port:              metrics  9153/TCP
TargetPort:        9153/TCP
Endpoints:         10.244.0.8:9153,10.244.0.9:9153
Session Affinity:  None
Events:            <none>
[k8s@node1 yaml]$ dig myservice.default.svc.cluster.local. @10.96.0.10

; <<>> DiG 9.9.4-RedHat-9.9.4-72.el7 <<>> myservice.default.svc.cluster.local. @10.96.0.10
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 28627
;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; WARNING: recursion requested but not available

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;myservice.default.svc.cluster.local. IN        A

;; ANSWER SECTION:
myservice.default.svc.cluster.local. 30 IN A    10.96.152.84

;; Query time: 5 msec
;; SERVER: 10.96.0.10#53(10.96.0.10)
;; WHEN: Sun Feb 14 10:22:24 CST 2021
;; MSG SIZE  rcvd: 115
[k8s@node1 yaml]$ cat myservice.yml 
kind: Service
apiVersion: v1
kind: Service
metadata:
  name: myservice
spec:
  ports:
    - port: 80
      protocol: TCP
      targetPort: 80
  selector:
    app: myapp
  clusterIP: None ##类型设置为none
[k8s@node1 yaml]$ kubectl describe svc myservice 
Name:              myservice
Namespace:         default
Labels:            <none>
Annotations:       <none>
Selector:          app=myapp
Type:              ClusterIP
IP Families:       <none>
IP:                None ##虽然没有ip,但后端也有endpoints
IPs:               None
Port:              <unset>  80/TCP
TargetPort:        80/TCP
Endpoints:         10.244.2.38:80,10.244.2.39:80,10.244.2.40:80 + 3 more...
Session Affinity:  None
Events:            <none>

访问service:

[k8s@node1 yaml]$ dig myservice.default.svc.cluster.local. @10.96.0.10

; <<>> DiG 9.9.4-RedHat-9.9.4-72.el7 <<>> myservice.default.svc.cluster.local. @10.96.0.10
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 44737
;; flags: qr aa rd; QUERY: 1, ANSWER: 6, AUTHORITY: 0, ADDITIONAL: 1
;; WARNING: recursion requested but not available

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;myservice.default.svc.cluster.local. IN        A

;; ANSWER SECTION:
myservice.default.svc.cluster.local. 30 IN A    10.244.2.38
myservice.default.svc.cluster.local. 30 IN A    10.244.3.37
myservice.default.svc.cluster.local. 30 IN A    10.244.2.40
myservice.default.svc.cluster.local. 30 IN A    10.244.3.39
myservice.default.svc.cluster.local. 30 IN A    10.244.3.38
myservice.default.svc.cluster.local. 30 IN A    10.244.2.39

;; Query time: 39 msec
;; SERVER: 10.96.0.10#53(10.96.0.10)
;; WHEN: Sun Feb 14 11:04:49 CST 2021
;; MSG SIZE  rcvd: 370

滚动更新后

[k8s@node1 yaml]$ vim myapp.yml 
[k8s@node1 yaml]$ kubectl apply -f myapp.yml 
deployment.apps/deployment-myapp configured
[k8s@node1 yaml]$ dig myservice.default.svc.cluster.local. @10.96.0.10

; <<>> DiG 9.9.4-RedHat-9.9.4-72.el7 <<>> myservice.default.svc.cluster.local. @10.96.0.10
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 61495
;; flags: qr aa rd; QUERY: 1, ANSWER: 8, AUTHORITY: 0, ADDITIONAL: 1
;; WARNING: recursion requested but not available

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;myservice.default.svc.cluster.local. IN        A

;; ANSWER SECTION:
myservice.default.svc.cluster.local. 30 IN A    10.244.3.42 //新的后端
myservice.default.svc.cluster.local. 30 IN A    10.244.3.43
myservice.default.svc.cluster.local. 30 IN A    10.244.2.41
myservice.default.svc.cluster.local. 30 IN A    10.244.3.41
myservice.default.svc.cluster.local. 30 IN A    10.244.2.43
myservice.default.svc.cluster.local. 30 IN A    10.244.2.42
myservice.default.svc.cluster.local. 30 IN A    10.244.3.40
myservice.default.svc.cluster.local. 30 IN A    10.244.2.44

;; Query time: 11 msec
;; SERVER: 10.96.0.10#53(10.96.0.10)
;; WHEN: Sun Feb 14 11:09:08 CST 2021
;; MSG SIZE  rcvd: 472
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值