容器编排系统k8s之Service资源

时间:2021-08-10 05:31:58

  前文我们了解了k8s上的DemonSet、Job和CronJob控制器的相关话题,回顾请参考:https://www.cnblogs.com/qiuhom-1874/p/14157306.html;今天我们来了解下k8s上的service资源的相关话题;

  Service资源在k8s上主要用来解决pod访问问题;我们知道在k8s上pod由于各种原因重建,对于重建后的podip地址和名称都是变化的,这样一来使得我们访问pod就变得有些不便;为了解决pod访问能有一个固定的端点,在k8s上就是用service来解决的;简单来讲,service对象就是工作在节点上的一组iptables或ipvs规则,用于将到达service对象ip地址的流量调度转发至相应endpoint对象指向的ip地址和端口之上;工作于每个节点的kube-proxy组件通过apiserver持续监控着各service及其关联的pod对象,并将其创建或变动实时反映至当前工作节点上相应的iptables或ipvs规则;其实service和pod或其他资源的关联,本质上不是直接关联,它依靠一个中间组件endpoint;endpoint主要作用就是引用后端pod或其他资源(比如k8s外部的服务也可以被endpoint引用);所谓endpoint就是ip地址+端口;

容器编排系统k8s之Service资源

  提示:在k8s上kube-proxy它会监视着apiserver上的service资源变动,及时将变动转化为本机的iptables或ipvs规则;对应客户端pod访问对应serverpod,报文首先会从本机的iptables或ipvs规则所匹配,然后再由对应规则逻辑把请求调度到对应的pod上;

  service代理模式模式

  在k8s上service代理模式有三种,早期的k8s版本(1.1之前包含1.1的版本)默认的代理模式为userspace,后面的版本(1.11起)默认代理模式为ipvs,如果对应ipvs的模块没有加载,它会自动降级为iptables;

  userspace代理模式

容器编排系统k8s之Service资源

  提示:userspace是指Linux操作系统上的用户空间;在这种代理模型下iptables只是做转发并不调度,对应调度由kube-proxy完成;userspace这种调度模型用户请求从内核空间到用户空间再到内核空间,性能效率比较低下;

  iptables代理模式

容器编排系统k8s之Service资源

  提示:iptables这种代理模式,对于每个service对象,kube-proxy会创建iptables规则直接捕获到达Clusterip和port的流量,并将其重定向至当前service对象的后端pod资源;对于每个endpoint对象,service资源会为其创建iptables规则并关联至挑选的后端pod资源对象;相对于userspace代理模式来说,该模式用户请求无须在用户空间和内核空间来回切换,因此效率高效;此种模式下kube-proxy就只负责生成iptalbes规则,调度有iptables规则完成;

  ipvs代理模式

容器编排系统k8s之Service资源

  提示:ipvs代理模式,kube-proxy会跟踪apiserver上service和endpoint对象的变动,据此来调用netlink接口创建ipvs规则,并确保与apiserver中的变动保持同步;这种模式与iptables的模式不同之处仅在于其请求调度由ipvs完成,余下其他功能仍由iptables完成;比如流量捕获,nat等等功能都会由iptables完成;ipvs代理模型类似iptables模型,ipvs构建于netfilter的钩子函数之上,但它使用hash表作为底层数据结构并工作于内核空间,因此具有流量转发速度快,规则同步性能好的特点,除此之外,ipvs还支持众多调度算法,比如rr,lc,sh,dh等等;

  service类型

  在k8s上service的类型有4种,第一种是clusterIP,我们在创建service资源时,如果不指定其type类型,默认就是clusterip;第二种是NodePort类型,第三种是LoadBalancer,第四种是ExternalName;不同类型的service,其功能和作用也有所不同;

  ClusterIP

容器编排系统k8s之Service资源

  提示:如上所示,ClusterIP类型的service就是在k8s节点上创建一个满足serviceip地址的iptables或ipvs规则;这种类型的service的ip地址一定是我们在初始化集群时,指定的service网络(10.96.0.0/12)中的地址;这也意味着这种类型service不能被集群外部客户端所访问,仅能在集群节点*问;

  NodePort

容器编排系统k8s之Service资源

  提示:NodePort类型的service,是建构在ClusterIP的基础上做的扩展,主要解决了集群外部客户端访问问题;如上图所示,NodePort类型service在创建时,它会每个节点上创建一条DNAT规则,外部客户端访问集群任意节点的指定端口,都会被DNAT到对应的service上,从而实现访问集群内部Pod;对于集群内部客户端的访问它还是通过ClusterIP进行的;NodePort类型service与ClusterIP类型service唯一不同的是,NodePort类型service能够被外部客户端所访问,在集群每个节点上都有对应的DNAT规则;

  LoadBalancer

容器编排系统k8s之Service资源

  提示:LoadBalancer这种类型的service是在NodePort的基础上做的扩展,这种类型service只能在底层是云环境的K8s上创建,如果底层是非云环境,这种类型无法实现,只能手动搭建反向代理进行对NodePort类型的service进行反代;它主要解决NodePort类型service被集群外部访问时的端口映射以及负载;

  ExternalName

容器编排系统k8s之Service资源

  提示:ExternalName这种类型service主要用来解决对应service引用集群外部的服务;我们知道对于service来说,它就是一条iptables或ipvs规则,对于后端引用的资源是什么,取决于对应endpoint关联的是什么资源的ip地址和端口;如果我们需要在集群中使用集群外部的服务,我们就可以创建ExternalName类型的service,指定后端关联外部某个服务端ip地址或域名即可;它的工作流程如上图所示,在集群内部客户端访问对应service时,首先要去core-DNS上查询对应域名的ip地址,然后再根据dns返回的ip地址去连接对应的服务;使用这种类型service的前提是对应的coredns能够连接到外部网络解析对应的域名;

  service资源的创建

  示例:创建ClusterIP类型的service

[root@master01 ~]# cat ngx-dep-svc-demo.yaml
apiVersion: v1
kind: Service
metadata:
name: ngx-dep-svc
namespace: default
spec:
ports:
- name: http
port: 80
targetPort: 80
selector:
app: ngx-dep-pod
[root@master01 ~]#

  提示:在创建service资源时,主要要需要在spec字段中指定port和targetPort,port是service的端口,targetPort是后端资源的端口;其次就是需要定义标签选择器,这里的标签选择器用selector字段指定,它的值是一个字典,即kv键值对;默认不指定type类型就是使用的ClusterIP类型,默认不指定ClusterIP就表示自动生成对应的ClusterIP;

  应用资源清单

[root@master01 ~]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 40h
[root@master01 ~]# kubectl apply -f ngx-dep-svc-demo.yaml
service/ngx-dep-svc created
[root@master01 ~]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 40h
ngx-dep-svc ClusterIP 10.107.159.92 <none> 80/TCP 5s
[root@master01 ~]#

  验证:访问对应的ClusterIP看看是否能够访问到对应的资源?

[root@master01 ~]# curl 10.107.159.92
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p> <p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p> <p><em>Thank you for using nginx.</em></p>
</body>
</html>
[root@master01 ~]#

  提示:可以看到访问对应serviceip地址能够访问到对应的pod;

  查看service详细信息

[root@master01 ~]# kubectl describe svc ngx-dep-svc
Name: ngx-dep-svc
Namespace: default
Labels: <none>
Annotations: <none>
Selector: app=ngx-dep-pod
Type: ClusterIP
IP Families: <none>
IP: 10.107.159.92
IPs: 10.107.159.92
Port: http 80/TCP
TargetPort: 80/TCP
Endpoints: 10.244.2.93:80,10.244.3.86:80,10.244.4.14:80
Session Affinity: None
Events: <none>
[root@master01 ~]#

  提示:可以看到对应service的type类型为ClusterIP,port为80,targetPort为80,endpoins对应了3个podip地址+targetPort;其实在创建service时,系统默认会创建一个同service相同名称的endpoints;

  查看endpoints

[root@master01 ~]# kubectl get endpoints
NAME ENDPOINTS AGE
kubernetes 192.168.0.41:6443 40h
ngx-dep-svc 10.244.2.93:80,10.244.3.86:80,10.244.4.14:80 4m53s
[root@master01 ~]# kubectl describe endpoints/ngx-dep-svc
Name: ngx-dep-svc
Namespace: default
Labels: <none>
Annotations: endpoints.kubernetes.io/last-change-trigger-time: 2020-12-20T08:50:52Z
Subsets:
Addresses: 10.244.2.93,10.244.3.86,10.244.4.14
NotReadyAddresses: <none>
Ports:
Name Port Protocol
---- ---- --------
http 80 TCP Events: <none>
[root@master01 ~]#

  提示:可以看到ngx-dep-svc这个endpoint关联了3个podip地址;

  示例:创建NodePort类型service

[root@master01 ~]# cat ngx-dep-svc-demo.yaml
apiVersion: v1
kind: Service
metadata:
name: ngx-dep-svc-nodeport
namespace: default
spec:
ports:
- name: http
port: 80
nodePort: 30080
targetPort: 80
selector:
app: ngx-dep-pod
type: NodePort
[root@master01 ~]#

  提示:创建nodeport类型service需要在spec字段中使用type字段来指定其类型为NodePort;只有type的值为NodePort,对应ports字段中指定的nodePort 才有意义,默认不指定它会随机生成一个端口,指定nodePort就相当于固定了端口;通常不建议指定nodePort;

  应用资源配置清单

[root@master01 ~]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 40h
ngx-dep-svc ClusterIP 10.107.159.92 <none> 80/TCP 21m
[root@master01 ~]# kubectl apply -f ngx-dep-svc-demo.yaml
service/ngx-dep-svc-nodeport created
[root@master01 ~]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 40h
ngx-dep-svc ClusterIP 10.107.159.92 <none> 80/TCP 21m
ngx-dep-svc-nodeport NodePort 10.97.166.233 <none> 80:30080/TCP 4s
[root@master01 ~]#

  提示:可以看到nodeport类型的service,对应port就有两个值,后面的30080就是外部客户端访问集群内部资源的端口;

  验证:使用浏览器访问k8s任意节点的30080端口,看看是否能够访问到对应的pod?

容器编排系统k8s之Service资源

  提示:可以看到集群外部客户端可以通过访问集群节点上的一个端口实现访问对应集群内部资源;

  示例:创建无头service

[root@master01 ~]# cat handless-svc-demo.yaml
apiVersion: v1
kind: Service
metadata:
name: handless-svc-demo
namespace: default
spec:
clusterIP: None
ports:
- name: http
port: 80
targetPort: 80
selector:
app: ngx-dep-pod
[root@master01 ~]#

  提示:所谓无头service是指没有clusterIP的service,我们知道clusterip是service作为访问后端pod的入口,那么没有clusterip,它怎么访问后端pod呢?没有ip地址我们只能使用名称来访问;在k8s上无头service默认会被coredns把对应名称的service解析为后端关联的多个pod地址;

  应用资源配置清单

[root@master01 ~]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 42h
ngx-dep-svc ClusterIP 10.107.159.92 <none> 80/TCP 103m
ngx-dep-svc-nodeport NodePort 10.97.166.233 <none> 80:30080/TCP 82m
[root@master01 ~]# kubectl apply -f handless-svc-demo.yaml
service/handless-svc-demo created
[root@master01 ~]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
handless-svc-demo ClusterIP None <none> 80/TCP 4s
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 42h
ngx-dep-svc ClusterIP 10.107.159.92 <none> 80/TCP 103m
ngx-dep-svc-nodeport NodePort 10.97.166.233 <none> 80:30080/TCP 82m
[root@master01 ~]#

  提示:可以看到对应service没有clusterIP;

  验证:进入任一pod,使用名称访问service,看看对应名称是否能够访问到pod?

[root@master01 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
deploy-demo-6d795f958b-6pjgw 1/1 Running 0 123m
deploy-demo-6d795f958b-m4vfb 1/1 Running 0 123m
deploy-demo-6d795f958b-qcl6m 1/1 Running 0 123m
[root@master01 ~]# kubectl exec -it pod/deploy-demo-6d795f958b-m4vfb -- /bin/sh
/ # wget -O - -q handless-svc-demo
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p> <p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p> <p><em>Thank you for using nginx.</em></p>
</body>
</html>
/ #

  提示:在pod内部使用名称service名称可以访问到对应的pod;

  验证:查看coredns是否将对应service名称解析为对应拥有service指定的标签选择器的podip呢?

[root@master01 ~]# kubectl get pod --show-labels -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES LABELS
deploy-demo-6d795f958b-6pjgw 1/1 Running 0 131m 10.244.2.93 node02.k8s.org <none> <none> app=ngx-dep-pod,pod-template-hash=6d795f958b
deploy-demo-6d795f958b-m4vfb 1/1 Running 0 131m 10.244.4.14 node04.k8s.org <none> <none> app=ngx-dep-pod,pod-template-hash=6d795f958b
deploy-demo-6d795f958b-qcl6m 1/1 Running 0 131m 10.244.3.86 node03.k8s.org <none> <none> app=ngx-dep-pod,pod-template-hash=6d795f958b
[root@master01 ~]# kubectl exec -it pod/deploy-demo-6d795f958b-m4vfb -- /bin/sh
/ # nslookup handless-svc-demo
nslookup: can't resolve '(null)': Name does not resolve Name: handless-svc-demo
Address 1: 10.244.4.14 deploy-demo-6d795f958b-m4vfb
Address 2: 10.244.3.86 10-244-3-86.handless-svc-demo.default.svc.cluster.local
Address 3: 10.244.2.93 10-244-2-93.handless-svc-demo.default.svc.cluster.local
/ #

  提示:可以看到coredns把对应名称解析成了3个地址;这三个地址都是对应pod上拥有service指定的标签选择器上的标签的podip地址;

  配置k8s使用ipvs代理模式

  编写加载ipvs相关模块脚本

[root@master01 ~]# cat /etc/sysconfig/modules/ipvs.modules
#!/bin/bash
ipvs_mods_dir="/usr/lib/modules/$(uname -r)/kernel/net/netfilter/ipvs"
for mod in $(ls $ipvs_mods_dir | grep -o "^[^.]*"); do
/sbin/modinfo -F filename $mod &> /dev/null
if [ $? -eq 0 ]; then
/sbin/modprobe $mod
fi
done
[root@master01 ~]#

  提示:以上脚本主要做了一件事,就是把ipvs_mods_dir所指定的目录下的所有模块加载到内核;

  给脚本添加执行权限

[root@master01 ~]# ll /etc/sysconfig/modules/ipvs.modules
-rw-r--r-- 1 root root 253 Dec 20 18:50 /etc/sysconfig/modules/ipvs.modules
[root@master01 ~]# chmod +x /etc/sysconfig/modules/ipvs.modules
[root@master01 ~]# ll /etc/sysconfig/modules/ipvs.modules
-rwxr-xr-x 1 root root 253 Dec 20 18:50 /etc/sysconfig/modules/ipvs.modules
[root@master01 ~]#

  复制该脚本到其他节点

[root@master01 ~]# scp -p /etc/sysconfig/modules/ipvs.modules node01:/etc/sysconfig/modules/ipvs.modules
ipvs.modules 100% 253 132.8KB/s 00:00
[root@master01 ~]# scp -p /etc/sysconfig/modules/ipvs.modules node02:/etc/sysconfig/modules/ipvs.modules
ipvs.modules 100% 253 102.5KB/s 00:00
[root@master01 ~]# scp -p /etc/sysconfig/modules/ipvs.modules node03:/etc/sysconfig/modules/ipvs.modules
ipvs.modules 100% 253 80.8KB/s 00:00
[root@master01 ~]# scp -p /etc/sysconfig/modules/ipvs.modules node04:/etc/sysconfig/modules/ipvs.modules
ipvs.modules 100% 253 121.0KB/s 00:00
[root@master01 ~]#

  提示:把脚本放在/etc/sysconfig/modules目录下以点modules结尾的脚本,在系统重启以后,它会自动执行对应目录下的脚本;

  执行脚本,加载模块

[root@master01 ~]# bash /etc/sysconfig/modules/ipvs.modules
[root@master01 ~]# ssh node01 'bash /etc/sysconfig/modules/ipvs.modules'
[root@master01 ~]# ssh node02 'bash /etc/sysconfig/modules/ipvs.modules'
[root@master01 ~]# ssh node03 'bash /etc/sysconfig/modules/ipvs.modules'
[root@master01 ~]# ssh node04 'bash /etc/sysconfig/modules/ipvs.modules'
[root@master01 ~]#

  验证:查看对应模块是否加载?

[root@master01 ~]# lsmod |grep ip_vs
ip_vs_wlc 12519 0
ip_vs_sed 12519 0
ip_vs_pe_sip 12697 0
nf_conntrack_sip 33860 1 ip_vs_pe_sip
ip_vs_nq 12516 0
ip_vs_lc 12516 0
ip_vs_lblcr 12922 0
ip_vs_lblc 12819 0
ip_vs_ftp 13079 0
ip_vs_dh 12688 0
ip_vs_sh 12688 0
ip_vs_wrr 12697 0
ip_vs_rr 12600 0
ip_vs 141092 26 ip_vs_dh,ip_vs_lc,ip_vs_nq,ip_vs_rr,ip_vs_sh,ip_vs_ftp,ip_vs_sed,ip_vs_wlc,ip_vs_wrr,ip_vs_pe_sip,ip_vs_lblcr,ip_vs_lblc
nf_nat 26787 4 ip_vs_ftp,nf_nat_ipv4,xt_nat,nf_nat_masquerade_ipv4
nf_conntrack 133387 8 ip_vs,nf_nat,nf_nat_ipv4,xt_conntrack,nf_nat_masquerade_ipv4,nf_conntrack_netlink,nf_conntrack_sip,nf_conntrack_ipv4
libcrc32c 12644 4 xfs,ip_vs,nf_nat,nf_conntrack
[root@master01 ~]#

  提示:能够看到以上信息表示ipvs相关模块已经加载;

  编辑kube-proxy的配置

[root@master01 ~]# kubectl edit cm kube-proxy -n kube-system

  修改mode字段的值为“ipvs”,然后保存退出

容器编排系统k8s之Service资源

  删除现有k8s kube-proxy pod

[root@master01 ~]# kubectl get pod -n kube-system --show-labels
NAME READY STATUS RESTARTS AGE LABELS
coredns-7f89b7bc75-k9gdt 1/1 Running 10 12d k8s-app=kube-dns,pod-template-hash=7f89b7bc75
coredns-7f89b7bc75-kp855 1/1 Running 8 12d k8s-app=kube-dns,pod-template-hash=7f89b7bc75
etcd-master01.k8s.org 1/1 Running 11 12d component=etcd,tier=control-plane
kube-apiserver-master01.k8s.org 1/1 Running 8 12d component=kube-apiserver,tier=control-plane
kube-controller-manager-master01.k8s.org 1/1 Running 9 12d component=kube-controller-manager,tier=control-plane
kube-flannel-ds-cx8d5 1/1 Running 12 12d app=flannel,controller-revision-hash=64465d999,pod-template-generation=1,tier=node
kube-flannel-ds-jz6r4 1/1 Running 3 46h app=flannel,controller-revision-hash=64465d999,pod-template-generation=1,tier=node
kube-flannel-ds-ndzl6 1/1 Running 13 12d app=flannel,controller-revision-hash=64465d999,pod-template-generation=1,tier=node
kube-flannel-ds-rjtn9 1/1 Running 14 12d app=flannel,controller-revision-hash=64465d999,pod-template-generation=1,tier=node
kube-flannel-ds-zgq92 1/1 Running 12 12d app=flannel,controller-revision-hash=64465d999,pod-template-generation=1,tier=node
kube-proxy-8wfcx 1/1 Running 3 46h controller-revision-hash=c449f5b75,k8s-app=kube-proxy,pod-template-generation=1
kube-proxy-dl8jd 1/1 Running 8 12d controller-revision-hash=c449f5b75,k8s-app=kube-proxy,pod-template-generation=1
kube-proxy-lz4zc 1/1 Running 9 12d controller-revision-hash=c449f5b75,k8s-app=kube-proxy,pod-template-generation=1
kube-proxy-pjv9s 1/1 Running 12 12d controller-revision-hash=c449f5b75,k8s-app=kube-proxy,pod-template-generation=1
kube-proxy-pwl5v 1/1 Running 8 12d controller-revision-hash=c449f5b75,k8s-app=kube-proxy,pod-template-generation=1
kube-scheduler-master01.k8s.org 1/1 Running 9 12d component=kube-scheduler,tier=control-plane
[root@master01 ~]# kubectl get pod -n kube-system -l k8s-app=kube-proxy
NAME READY STATUS RESTARTS AGE
kube-proxy-8wfcx 1/1 Running 3 46h
kube-proxy-dl8jd 1/1 Running 8 12d
kube-proxy-lz4zc 1/1 Running 9 12d
kube-proxy-pjv9s 1/1 Running 12 12d
kube-proxy-pwl5v 1/1 Running 8 12d
[root@master01 ~]# kubectl delete pod -n kube-system -l k8s-app=kube-proxy
pod "kube-proxy-8wfcx" deleted
pod "kube-proxy-dl8jd" deleted
pod "kube-proxy-lz4zc" deleted
pod "kube-proxy-pjv9s" deleted
pod "kube-proxy-pwl5v" deleted
[root@master01 ~]#

  提示:kube-proxy是一个ds控制器所管理的pod,它能容忍主节点上的污点在集群每个节点上创建对应pod;我们手动删除它,对应控制器会重新新建对应数量的pod,从而实现应用新配置的目的;生成环境不提倡这样修改,应该在集群初始化前就规划好使用哪种代理模式;

  验证:在集群任意节点安装ipvs客户端工具,看看是否有对应的ipvs规则生成?

  安装ipvsadm

[root@master01 ~]# yum install -y ipvsadm

  使用ipvsadm查看是否生成的有ipvs规则?

[root@master01 ~]# 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:30080 rr
-> 10.244.2.93:80 Masq 1 0 0
-> 10.244.3.86:80 Masq 1 0 0
-> 10.244.4.14:80 Masq 1 0 0
TCP 192.168.0.41:30080 rr
-> 10.244.2.93:80 Masq 1 0 0
-> 10.244.3.86:80 Masq 1 0 0
-> 10.244.4.14:80 Masq 1 0 0
TCP 10.96.0.1:443 rr
-> 192.168.0.41:6443 Masq 1 0 0
TCP 10.96.0.10:53 rr
-> 10.244.0.20:53 Masq 1 0 0
-> 10.244.0.21:53 Masq 1 0 0
TCP 10.96.0.10:9153 rr
-> 10.244.0.20:9153 Masq 1 0 0
-> 10.244.0.21:9153 Masq 1 0 0
TCP 10.97.166.233:80 rr
-> 10.244.2.93:80 Masq 1 0 0
-> 10.244.3.86:80 Masq 1 0 0
-> 10.244.4.14:80 Masq 1 0 0
TCP 10.107.159.92:80 rr
-> 10.244.2.93:80 Masq 1 0 0
-> 10.244.3.86:80 Masq 1 0 0
-> 10.244.4.14:80 Masq 1 0 0
TCP 10.244.0.0:30080 rr
-> 10.244.2.93:80 Masq 1 0 0
-> 10.244.3.86:80 Masq 1 0 0
-> 10.244.4.14:80 Masq 1 0 0
TCP 10.244.0.1:30080 rr
-> 10.244.2.93:80 Masq 1 0 0
-> 10.244.3.86:80 Masq 1 0 0
-> 10.244.4.14:80 Masq 1 0 0
TCP 127.0.0.1:30080 rr
-> 10.244.2.93:80 Masq 1 0 0
-> 10.244.3.86:80 Masq 1 0 0
-> 10.244.4.14:80 Masq 1 0 0
UDP 10.96.0.10:53 rr
-> 10.244.0.20:53 Masq 1 0 0
-> 10.244.0.21:53 Masq 1 0 0
[root@master01 ~]#

  提示:能够看到有ipvs规则生成,说明此时k8s就是使用的ipvs代理模式;

容器编排系统k8s之Service资源的更多相关文章

  1. 容器编排系统k8s之Ingress资源

    前文我们了解了k8s上的service资源的相关话题,回顾请参考:https://www.cnblogs.com/qiuhom-1874/p/14161950.html:今天我们来了解下k8s上的In ...

  2. 容器编排系统K8s之APIService资源

    前文我们聊到了k8s上crd资源的使用和相关说明,回顾请参考:https://www.cnblogs.com/qiuhom-1874/p/14267400.html:今天我们来了解下k8s的第二种扩展 ...

  3. 容器编排系统K8s之crd资源

    前文我们了解了k8s节点污点和pod的对节点污点容忍度相关话题,回顾请参考:https://www.cnblogs.com/qiuhom-1874/p/14255486.html:今天我们来聊一下扩展 ...

  4. 容器编排系统K8s之HPA资源

    前文我们了解了用Prometheus监控k8s上的节点和pod资源,回顾请参考:https://www.cnblogs.com/qiuhom-1874/p/14287942.html:今天我们来了解下 ...

  5. 容器编排系统K8s之NetworkPolicy资源

    前文我们了解了k8s的网络插件flannel的基础工作逻辑,回顾请参考:https://www.cnblogs.com/qiuhom-1874/p/14225657.html:今天我们来聊一下k8s上 ...

  6. 容器编排系统K8s之ConfigMap、Secret资源

    前文我们了解了k8s上的pv/pvc/sc资源的使用和相关说明,回顾请参考:https://www.cnblogs.com/qiuhom-1874/p/14188621.html:今天我们主要来聊一下 ...

  7. 容器编排系统K8s之PV、PVC、SC资源

    前文我们聊到了k8s中给Pod添加存储卷相关话题,回顾请参考:https://www.cnblogs.com/qiuhom-1874/p/14180752.html:今天我们来聊一下持久存储卷相关话题 ...

  8. 容器编排系统K8s之Volume的基础使用

    前文我们聊到了k8s上的ingress资源相关话题,回顾请参考:https://www.cnblogs.com/qiuhom-1874/p/14167581.html:今天们来聊一下k8s上volum ...

  9. 容器编排系统K8s之访问控制--用户认证

    前文我们聊到了k8s的statefulset控制器相关使用说明,回顾请参考:https://www.cnblogs.com/qiuhom-1874/p/14201103.html:今天我们来聊一下k8 ...

随机推荐

  1. Xamarin&period;Android再体验之简单的登录Demo

    一.前言 在空闲之余,学学新东西 二.服务端的代码编写与部署 这里采取的方式是MVC+EF返回Json数据,(本来是想用Nancy来实现的,想想电脑太卡就不开多个虚拟机了,用用IIS部署也好) 主要是 ...

  2. php CLI 模式下的传参方法

    在CLI模式(命令行界面 Command Line Interface)下,传入参数有如下3种方法: 一. getopt函数(PHP 4 >= 4.3.0, PHP 5) getopt - 从命 ...

  3. node实现http上传文件进度条 -我们到底能走多远系列(37)

    我们到底能走多远系列(37) 扯淡: 又到了一年一度的跳槽季,相信你一定准备好了,每每跳槽,总有好多的路让你选,我们的未来也正是这一个个选择机会组合起来的结果,所以尽可能的找出自己想要的是什么再做决定 ...

  4. LeetCode&lpar;9&rpar; - Palindrome Number

    题目要求判断一个整数是不是回文数,假设输入是1234321,就返回true,输入的是123421,就返回false.题目要求in-place,思路其实很简单,在LeetCode(7)里面我们刚好做了r ...

  5. word2vec初探(用python简单实现)

    为什么要用这个? 因为看论文和博客的时候很常见,不论是干嘛的,既然这么火,不妨试试. 如何安装 从网上爬数据下来 对数据进行过滤.分词 用word2vec进行近义词查找等操作 完整的工程传到了我的gi ...

  6. filter以及reduce的用法

    简单的写了就几个例子 # 删掉偶数 li = [1,2,3,4,5,6,7,8,9,10] print(list(filter( lambda x : not x % 2 ==0 ,li))) #保留 ...

  7. jQuery添加自定义函数的三种方法

    原文链接:http://caibaojian.com/284.html 方法一: jQuery.fn.setApDiv=function () { //apDiv浮动层显示位置居中控制 var whe ...

  8. ftruncate(改变文件大小)

    ftruncate(改变文件大小) 定义函数 int ftruncate(int fd,off_t length); 函数说明 ftruncate()会将参数fd指定的文件大小改为参数length指定 ...

  9. 洛谷 P1507 NASA的食物计划 【二维费用背包】 &vert;&vert; 【DFS】

    题目链接:https://www.luogu.org/problemnew/show/P1507 题目背景 NASA(美国航空航天局)因为航天飞机的隔热瓦等其他安全技术问题一直大伤脑筋,因此在各方压力 ...

  10. 抓包之网络分析器- Wiresshark

    https://www.wireshark.org/ Wireshark(前称Ethereal)是一个网络封包分析软件.网络封包分析软件的功能是撷取网络封包,并尽可能显示出最为详细的网络封包资料.Wi ...