服务
- service
- 什么是服务
- 为什么使用service
- 定义和使用service
- 发布服务
- ClusterIP
- NodePort
- LoadBalancer
- ExternalName
- 外部 IP
- kube-proxy代理模式
- userspace 代理模式
- iptables 代理模式
- IPVS 代理模式
- 如何实现ipvs代理模式?
- 无头服务(Headless Services)
- Headless与普通服务对比
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