kubernetes负载均衡-service,2024年最新Linux运维面试题2024高级

4、在集群内进行访问测试验证

访问service默认,默认的是采用iptables的转发策略,如果pod的新增会自动加入service中,删除会自动在service进行清除

while sleep 0.5 ;do curl 10.106.49.247:8888;done 

在这里插入图片描述

5、测试自动加入service和退出service

只需要修改replicaset副本数量
在这里插入图片描述

增加
在这里插入图片描述
减少
在这里插入图片描述

6、编写固定的clusterIP地址,方便记忆

运行以下命令查看 Kubernetes 集群中 Service IP 地址范围的配置:
在这里插入图片描述

apiVersion: v1
kind: Service
metadata:
   name: daemon-svc-02

spec:
  clusterIP: 10.96.1.1
  type: ClusterIP
  selector:
    app: web
  ports:
  - name: http
    port: 8888
    targetPort: 80 

验证
在这里插入图片描述

while sleep 0.5 ;do curl 10.96.1.1:8888;done 

在这里插入图片描述

四、Service的实践-NodePort

1、 NodePort
apiVersion: v1
kind: Service
metadata:
   name: daemon-svc-03

spec:
  type: NodePort
  selector:
    app: web
  ports:
  - name: http
    port: 8888
    targetPort: 80  

在这里插入图片描述
通过浏览器访问:nodeIP + 30695
在这里插入图片描述
在这里插入图片描述

2、NodePort的端口范围

在 Kubernetes 集群中,Service 的端口范围是由 kube-apiserver 的 --service-node-port-range 标志来定义的。这个标志用于指定允许使用的 NodePort 端口范围。

要查看 Kubernetes 集群中 Service 端口范围的配置,可以按照以下步骤进行操作:

1、登录到 Kubernetes 集群的主节点或任意一个运行 kube-apiserver 的节点。

2、查看 kube-apiserver 的配置文件,通常为 /etc/kubernetes/manifests/kube-apiserver.yaml(根据你的安装方式和配置可能会有所不同)。

3、在该配置文件中找到 kube-apiserver 容器的启动参数部分,查找 --service-node-port-range 参数。

4、–service-node-port-range 参数的值将指定 Service 允许使用的 NodePort 端口范围。默认情况下,NodePort 的范围是从30000到32767。

如果你无法直接查看 kube-apiserver 的配置文件,你也可以通过以下命令查看当前 kube-apiserver 的运行参数:

ps aux | grep kube-apiserver

在这里插入图片描述

cat /etc/kubernetes/manifests/kube-apiserver.yaml

在这里插入图片描述
两者输出的信息是一样的

3、修改NodePort的端口范围

(因实验失败后续补充)

4、指定nodePort的端口
apiVersion: v1
kind: Service
metadata:
   name: daemon-svc-03

spec:
  type: NodePort
  selector:
    app: web
  ports:
  - name: http
    port: 8888    ## 这个service+ IP 进行访问
    targetPort: 80   ## pod服务端口
    nodePort: 32000  ## Nodeport + IP进行访问

五、Service的实践-externalname

1、externalname
apiVersion: v1
kind: Service
metadata:
  name: daemon-external
spec:
  type: ExternalName
  externalName: www.king.com

2、验证测试

启动一个tools的pod进行测试
(存在疑问后续补充)

六、service和Endpoints关系

1、Endpoints与容器探针

Service对象借助Endpoint资源来跟踪其关联的后端端点,Endpoint对象会根据Service标签选择器筛选出的后端端点的IP地址分别保存在subsets.address字段和subsets.notReadyAddress字段中,它通过APIServer持续、动态跟踪每个端点的状态变化,并即使反应到端点IP所属的字段中。

  • subsets.address:保存就绪的容器IP,也就意味着service可以直接将请求调度至该地址段。
  • subsets.notReadyAddress:保存未就绪容器IP,也就意味着Service不会将请求调度至该地址段。
apiVersion: v1
kind: Service
metadata:
  name: demoapp-readiness-service
spec:
  publishNotReadyAddresses: true
  selector:
    role: web-readiness
  ports:
  - protocol: TCP
    port: 8888
    targetPort: 80

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: demoapp2
spec:
  replicas: 2
  selector:
    matchLabels:
      role: web-readiness
  template:
    metadata:
      labels:
        role: web-readiness
    spec:
      containers:
      - name: demoapp2
        image: registry.cn-hangzhou.aliyuncs.com/mokeyking/k8s-oldxu:daemon-app-v1
        readinessProbe:                 # 就绪探针
          httpGet:
            path: '/readyz'
            port: 80
          initialDelaySeconds: 15         # 初次检测延时时长
          periodSeconds: 10               # 检测周期

通过修改deployment的replicaset的副本数量

kubectl  scale  deployment  demoapp2  --replicas=3

在这里插入图片描述

while sleep 10s ;do curl 10.101.87.51 ;done

在这里插入图片描述

七、自定义endpoint实践

service通过selector和pod建立关联,k8s会根据service关联到的pOdIP信息组合成-个endpoint。若service定义中没有selector字段,service被创建时,endpoint controller不会自动创建endpoint。

我们可以通过配置清单创建Service,而无需使用标签选择器,而后自行创建一个同名的endpoint对象,指定对应的IP。这种一般用于将外部MySQL\Redis等应用引入Kubernetes集群内部,让内部通过Service的方式访问外部资源。

在这里插入图片描述

实验一: 将外部mysql数据库引入service集群中

1、准备外部数据库
# 安装mariadb
yum install mariadb mariadb-server -y
systemctl enable mariadb --now
#登陆maridb数据库
mysql

# 授权
grant all privileges on *.* to 'king' identified by 'king395';
flush privileges;

2、创建Endpoints资源清单
# 自定义 service和endpoints
apiVersion: v1
kind: Service 
metadata:
  name: mysql-external
spec:
  type: ClusterIP
  ports: 
  - port: 3366
    targetPort: 3306


---
apiVersion: v1
kind: Endpoints 
metadata:
  name: mysql-external
subsets:
  - addresses:
    - ip: 192.168.1.100 
    ports:
    - protocol: TCP
      port: 3306               # 定义后端的端口是多少

在这里插入图片描述

4、测试验证
# 使用tools,该镜像带有mysql命令
[root@master service]# kubectl exec -it tools -- /bash/bin 
# 登陆数据库
[root@tools /]# mysql -h mysql-external -P3366 -uking -pking395 
# 创建库,创建表
create database king;
use king;
CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(50)
);


在这里插入图片描述
在这里插入图片描述

5、登陆数据库再次验证

在这里插入图片描述
本次实验试验成功

八、service相关字段

1、sessionAffinity

如果要将来自于特定客户端的连接调度至同一Pod,可以使用sessionAffinity 基于客户端的 IP 地址进行会话保持。

还可以通过sessionAffinityConfig.clientIP.timeoutSeconds来设置最大会话停留时间。(默认10800秒,即3小时)

apiVersion: v1
kind: Service
metadata:
  name: session-svc
spec:
  type: ClusterIP
  selector:
    app: web
  ports:
  - name: http
    port: 80                  # Service的端口,后期所有的用户通过该端口进行访问
    targetPort: 80              # Pod的端口
  sessionAffinity: ClientIP
  sessionAffinityConfig:
    clientIP:
      timeoutSeconds: 60   #会话保持60秒

 curl 10.101.87.51 

在这里插入图片描述
会话记录会保持60秒

2、externalTrafficPolicy

外部流量策略:当外部用户通过NodePort请求Service,是将外部流量路由到本地节点上的Pod,还是路由到集群范围的Pod:

  • Cluster(默认):将用户请求路由到集群范围的所有Pod节点,具有良好的整体负载均衡。
  • Local:仅会将流量调度至请求的目标节点本地运行的Pod对象之上,以减少网络跳跃,降低网络延迟,但当请求指向的节点本地不存在目标Service相关的Pod对象时直接丢弃该报文。
2.1 Cluster模式
apiVersion: v1
kind: Service
metadata:
  name: demoapp-svc-external-traffic
spec:
  externalTrafficPolicy: Cluster     # 有两种模式Cluster和Local
  type: NodePort
  selector:
    app: web
  ports:
  - name: http
    port: 8888                  # Service的端口,后期所有的用户通过该端口进行访问
    targetPort: 80              # Pod的端口
    nodePort: 32001             # 

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
会分别到不同的node节点中去

2.1 Local模式
apiVersion: v1
kind: Service
metadata:
  name: demoapp-svc-external-traffic
spec:
  externalTrafficPolicy: Local # 有两种模式Cluster和Local
  type: NodePort
  selector:
    app: web
  ports:
  - name: http
    port: 8888                  # Service的端口,后期所有的用户通过该端口进行访问
    targetPort: 80              # Pod的端口
    nodePort: 32001             # 

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
不管怎么刷新,只会在指定的node进行返回

3、internalTrafficPolicy

本地流量策略:当本地Pod对Service发起访问时,是将流量路由到本地节点上的Pod,还是路由到集群范围的Pod:

  • Cluster(默认):将Pod的请求路由到集群范围的所有Pod节点具有良好的整体负载均衡。
  • Local:将请求路由到与发起方处于相同节点的端点,这种机制有助于节省开销,提升效率。但当请求指向的节点本地不存在目标Service相关的Pod对象时直接丢弃该报文。

注意:在一个Service上,当externalTrafficPolicy已设置为 Local时,internalTrafficPolicy则无法使用。 换句话说在一个集群的不同 Service 上可以同时使用这两个特性,但在一个Service 上不行

3.1 Cluster模式
apiVersion: v1
kind: Service
metadata:
  name: demoapp-svc-internal-traffic
spec:
  internalTrafficPolicy: Cluster # 有两种模式Cluster和Local,当externalTrafficPolicy已设置为 Local时,internalTrafficPolicy则无法使用
  selector:
    app: web
  ports:
  - name: http
    port: 80                  # Service的端口,后期所有的用户通过该端口进行访问
    targetPort: 80              # Pod的端口


在这里插入图片描述

## 使用tools镜像进行测试
kubectl  exec -it tools  -- /bin/bash 

在这里插入图片描述

3.2 Local模式
apiVersion: v1
kind: Service
metadata:
  name: demoapp-svc-internal-traffic
spec:
  internalTrafficPolicy: Local # 有两种模式Cluster和Local,当externalTrafficPolicy已设置为 Local时,internalTrafficPolicy则无法使用
  selector:
    app: web
  ports:
  - name: http
    port: 80                  # Service的端口,后期所有的用户通过该端口进行访问
    targetPort: 80              # Pod的端口

在这里插入图片描述

4、publishNotReadyAddresses

publishNotReadyAddresses:表示Pod就绪探针探测失败,也不会将失败的PodIP加入notReadyAddress列表中

4.1、检查当前Service对应的后端列表;
apiVersion: v1
kind: Service
metadata:
  name: demoapp-readiness-service
spec:
  publishNotReadyAddresses: true
  selector:
    role: web-readiness
  ports:
  - protocol: TCP
    port: 8888
    targetPort: 80

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: demoapp2
spec:
  replicas: 4
  selector:
    matchLabels:
      role: web-readiness
  template:
    metadata:
      labels:
        role: web-readiness
    spec:
      containers:
      - name: demoapp2
        image: oldxu3957/demoapp:v1.0
        readinessProbe:                 # 就绪探针
          httpGet:
            path: '/readyz'
            port: 80
          initialDelaySeconds: 15         # 初次检测延时时长
          periodSeconds: 10               # 检测周期

# 查看svc详情
kubectl  describe  svc demoapp-readiness-service 
# 按照标签进行查看pod
kubectl get pod --show-labels
kubectl get pods -l  role=web-readiness -o wide 

在这里插入图片描述

4.2、将其中的某个Pod设定为不就绪,看看是否会将该PodIP加入到NotReadAddress字段中
apiVersion: v1
kind: Service
metadata:
  name: demoapp-readiness-service
spec:
  publishNotReadyAddresses: true  ## 添加该字段
  selector:
    role: web-readiness
  ports:
  - protocol: TCP
    port: 8888
    targetPort: 80

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: demoapp2
spec:
  replicas: 2
  selector:
    matchLabels:
      role: web-readiness
  template:
    metadata:
      labels:
        role: web-readiness
    spec:
      containers:
      - name: demoapp2
        image: oldxu3957/demoapp:v1.0
        readinessProbe:                 # 就绪探针
          httpGet:
            path: '/readyz'
            port: 80
          initialDelaySeconds: 15         # 初次检测延时时长
          periodSeconds: 10               # 检测周期

  • 将pod设置成未就绪
curl -s -X POST -d  'readyz=err' 10.244.2.62/readyz
# 如果想将pod设置成就绪状态,只需要将pod进行删除重建就可以了

在这里插入图片描述

  • 无论如何请求,只会请求只就绪的pod中
    在这里插入图片描述
  • 添加参数后的svc
spec:
'''
  publishNotReadyAddresses: true
''''

在这里插入图片描述
可以调用到未就绪的pod中
在这里插入图片描述

这种应用场景比较少

九、service的进阶-iptables和IPVS

1、service访问场景:

访问Service会出现如下4中情况:

  • 1、Pod-A>Service >调度>Pod-B/Pod-C
  • 2、Pod-A->Service >调度->Pod-A
  • 3、Docker>Service>调度→>Pod-B/Pod-C
  • 4、NodePort>Service>调度→>Pod-B/Pod-C

2、iptables规则

场景一,clusterIP规则

Pod-A>Service >调度>Pod-B/Pod-C

1、编写资源
apiVersion: apps/v1
kind: Deployment
metadata:
  name: demoapp

spec:
  replicas: 3
  selector:
    matchLabels:
      app: web
  template:
    metadata:
      labels:
        app: web
    spec:
      containers:
      - name: webservers
        image: oldxu3957/demoapp:v1.0
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 80

---
apiVersion: v1
kind: Service
metadata:
  name: demoapp-svc
spec:
  type: ClusterIP
  selector:
    app: web
  ports:
  - port: 80
    targetPort: 80

在这里插入图片描述

2、登陆pod,访问svc

在这里插入图片描述

3、iptables规则查看

iptables的流程:
入站本机:PREROUTING -->INPUT
从本机流入: OUTPUT --》 POSTROUTING
经过节点: PREROUTING --》FORWRD --》POSTROUTING

整体流程:
OUTPUT–>KUBE-SERVICES–>KUBE-SVC-–>KUBE-SEP------>POSTROUTING-----> KUBEPOSTROUTING ---->interface

第一步:所有从OUTPUT出去的数据包,都必须经过KUBE-SERVICES自定义链;
	
[root@node02 ~]# iptables -S OUTPUT
-P OUTPUT ACCEPT
-A OUTPUT -m conntrack --ctstate NEW -m comment --comment "kubernetes service portals" -j KUBE-SERVICES
-A OUTPUT -j KUBE-FIREWALL
-A OUTPUT -o virbr0 -p udp -m udp --dport 68 -j ACCEPT

第二步:分析KUBE-SERVICES
当发现请求的ServiceIP是 10.110.217.207的80端口时,则跳转KUBE-SVC-HASH这个自定义链上;	
[root@node2 ~]# iptables -t nat -S KUBE-SERVICES | grep demoapp-svc
-A KUBE-SERVICES -d 10.110.217.207/32 -p tcp -m comment --comment "default/demoapp-svc cluster IP" -m tcp --dport 80 -j KUBE-SVC-EHL433DY3T7P3MZN


第三步:
第一条:创建自定义链;
第二条:如果来源不是POd的地址段,则将这个请求直接跳转到KUBE-MARK-MASQ这个自定义链上去; 然后给这个请求打上对应的标记 0x4000/0x4000
第三条到第五条:将请求通过调度算法调度到对应的自定义链上;  --> 第一次请求第一条有1/3  第二次请求50% 第三次 100%

[root@node2 ~]# iptables -t nat -S KUBE-SVC-EHL433DY3T7P3MZN
-N KUBE-SVC-EHL433DY3T7P3MZN
-A KUBE-SVC-EHL433DY3T7P3MZN ! -s 10.244.0.0/16 -d 10.110.217.207/32 -p tcp -m comment --comment "default/demoapp-svc cluster IP" -m tcp --dport 80 -j KUBE-MARK-MASQ
### 通过轮休的方式进行调度到指定的地址上
-A KUBE-SVC-EHL433DY3T7P3MZN -m comment --comment "default/demoapp-svc" -m statistic --mode random --probability 0.33333333349 -j KUBE-SEP-OKCWPUIB7WHDSNLK
-A KUBE-SVC-EHL433DY3T7P3MZN -m comment --comment "default/demoapp-svc" -m statistic --mode random --probability 0.50000000000 -j KUBE-SEP-47KFJORAGBSAGTDM
-A KUBE-SVC-EHL433DY3T7P3MZN -m comment --comment "default/demoapp-svc" -j KUBE-SEP-GDD5ADYI2DAT4RQT

[root@node2 ~]# iptables -t nat -S KUBE-MARK-MASQ
-N KUBE-MARK-MASQ
-A KUBE-MARK-MASQ -j MARK --set-xmark 0x4000/0x4000   #请求打上对应的标记 0x4000/0x4000

		
	第四步:
		
	第一条:创建自定义链;
	第二条:如果10.244.1.46 访问得是自己的Service,然后又被Service调度给自己本身,这个时候就将这个请求打上对应的标签  0x4000/0x4000
	第三条:进行dnat操作,就是将请求Service的IP,替换为Service后端的Pod的IP地址;
[root@node2 ~]# iptables -t nat -S KUBE-SEP-OKCWPUIB7WHDSNLK
-N KUBE-SEP-OKCWPUIB7WHDSNLK
-A KUBE-SEP-OKCWPUIB7WHDSNLK -s 10.244.1.46/32 -m comment --comment "default/demoapp-svc" -j KUBE-MARK-MASQ
-A KUBE-SEP-OKCWPUIB7WHDSNLK -p tcp -m comment --comment "default/demoapp-svc" -m tcp -j DNAT --to-destination 10.244.1.46:80
[root@node2 ~]# iptables -t nat -S KUBE-SEP-47KFJORAGBSAGTDM
-N KUBE-SEP-47KFJORAGBSAGTDM
-A KUBE-SEP-47KFJORAGBSAGTDM -s 10.244.2.64/32 -m comment --comment "default/demoapp-svc" -j KUBE-MARK-MASQ
-A KUBE-SEP-47KFJORAGBSAGTDM -p tcp -m comment --comment "default/demoapp-svc" -m tcp -j DNAT --to-destination 10.244.2.64:80
[root@node2 ~]# iptables -t nat -S KUBE-SEP-GDD5ADYI2DAT4RQT
-N KUBE-SEP-GDD5ADYI2DAT4RQT
-A KUBE-SEP-GDD5ADYI2DAT4RQT -s 10.244.3.77/32 -m comment --comment "default/demoapp-svc" -j KUBE-MARK-MASQ
-A KUBE-SEP-GDD5ADYI2DAT4RQT -p tcp -m comment --comment "default/demoapp-svc" -m tcp -j DNAT --to-destination 10.244.3.77:80
	

第五步:
第一条:创建自定义链;
第二条:无条件调度到KUBE-POSTROUTING这个自定义链上;
第三条: docker相关的;忽略;
第四条:由于源地址是 192.168.122.0/16 目标 192.168.122.0/16,所以RETURN了;又回到了POSTROUTING链;看默认的规则是什么;ACEEPT; 数据包就会被送出;

[root@node2 ~]# iptables -t nat -S POSTROUTING
-P POSTROUTING ACCEPT
-A POSTROUTING -m comment --comment "kubernetes postrouting rules" -j KUBE-POSTROUTING
-A POSTROUTING -s 172.17.0.0/16 ! -o docker0 -j MASQUERADE
-A POSTROUTING -s 192.168.122.0/24 -d 224.0.0.0/24 -j RETURN
-A POSTROUTING -s 192.168.122.0/24 -d 255.255.255.255/32 -j RETURN
-A POSTROUTING -s 192.168.122.0/24 ! -d 192.168.122.0/24 -p tcp -j MASQUERADE --to-ports 1024-65535
-A POSTROUTING -s 192.168.122.0/24 ! -d 192.168.122.0/24 -p udp -j MASQUERADE --to-ports 1024-65535
-A POSTROUTING -s 192.168.122.0/24 ! -d 192.168.122.0/24 -j MASQUERADE
-A POSTROUTING -s 10.244.0.0/16 -d 10.244.0.0/16 -m comment --comment "flanneld masq" -j RETURN
-A POSTROUTING -s 10.244.0.0/16 ! -d 224.0.0.0/4 -m comment --comment "flanneld masq" -j MASQUERADE
-A POSTROUTING ! -s 10.244.0.0/16 -d 10.244.2.0/24 -m comment --comment "flanneld masq" -j RETURN
-A POSTROUTING ! -s 10.244.0.0/16 -d 10.244.0.0/16 -m comment --comment "flanneld masq" -j MASQUERADE

第六步:
第一条:创建自定义链;
第二条:如果这个请求没有对应的标记,那么RETURN返回到POSTROUTING链;

[root@node2 ~]# iptables -t nat -S KUBE-POSTROUTING
-N KUBE-POSTROUTING
-A KUBE-POSTROUTING -m mark ! --mark 0x4000/0x4000 -j RETURN
-A KUBE-POSTROUTING -j MARK --set-xmark 0x4000/0x0
-A KUBE-POSTROUTING -m comment --comment "kubernetes service traffic requiring SNAT" -j MASQUERADE
		

在这里插入图片描述
在这里插入图片描述

4、iptables 的clusterIP模式图解

在这里插入图片描述

5、iptables的NodePort模式
apiVersion: apps/v1
kind: Deployment
metadata:
  name: demoapp

spec:
  replicas: 3
  selector:
    matchLabels:
      app: web
  template:
    metadata:
      labels:
        app: web
    spec:
      containers:
      - name: webservers
        image: oldxu3957/demoapp:v1.0
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 80

---
apiVersion: v1
kind: Service
metadata:
  name: demoapp-svc
spec:
  type: NodePort
  selector:
    app: web
  ports:
  - port: 80
    targetPort: 80
    nodePort: 32000

在这里插入图片描述

NodePort类型的service进行分析;Iptables规则:

PREROUTING -->FORWARD>POSTROUTING>interface

第一步:
	所有经过PREROUTING链的请求,都会被拦截到KUBE-SERVICES自定义链上;
[root@node2 ~]# iptables -t nat -S PREROUTING
-P PREROUTING ACCEPT
-A PREROUTING -m comment --comment "kubernetes service portals" -j KUBE-SERVICES
-A PREROUTING -m addrtype --dst-type LOCAL -j DOCKER

第二步:
	所有的规则都不会被匹配,但是会匹配最后一条规则,最后一条规则是跳转到KUBE-NODEPORTS这个自定义链中;

[root@node2 ~]# iptables -t nat -S KUBE-SERVICES
-N KUBE-SERVICES
-A KUBE-SERVICES -d 10.110.217.207/32 -p tcp -m comment --comment "default/demoapp-svc cluster IP" -m tcp --dport 80 -j KUBE-SVC-EHL433DY3T7P3MZN
-A KUBE-SERVICES -d 10.96.0.1/32 -p tcp -m comment --comment "default/kubernetes:https cluster IP" -m tcp --dport 443 -j KUBE-SVC-NPX46M4PTMTKRN6Y
-A KUBE-SERVICES -d 10.96.0.10/32 -p udp -m comment --comment "kube-system/kube-dns:dns cluster IP" -m udp --dport 53 -j KUBE-SVC-TCOU7JCQXEZGVUNU
-A KUBE-SERVICES -d 10.96.0.10/32 -p tcp -m comment --comment "kube-system/kube-dns:dns-tcp cluster IP" -m tcp --dport 53 -j KUBE-SVC-ERIFXISQEP7F7OF4
-A KUBE-SERVICES -d 10.96.0.10/32 -p tcp -m comment --comment "kube-system/kube-dns:metrics cluster IP" -m tcp --dport 9153 -j KUBE-SVC-JD5MR3NA4I4DYORP
-A KUBE-SERVICES -d 10.100.82.155/32 -p tcp -m comment --comment "kube-system/metrics-server:https cluster IP" -m tcp --dport 443 -j KUBE-SVC-Z4ANX4WAEWEBLCTM
-A KUBE-SERVICES -m comment --comment "kubernetes service nodeports; NOTE: this must be the last rule in this chain" -m addrtype --dst-type LOCAL -j KUBE-NODEPORTS

第三步:
	如果请求的是节点的32000端口;那么则跳转到 KUBE-SVC-<HASH>
[root@node2 ~]# iptables -t nat -S KUBE-NODEPORTS
-N KUBE-NODEPORTS
-A KUBE-NODEPORTS -p tcp -m comment --comment "default/demoapp-svc" -m tcp --dport 32000 -j KUBE-SVC-EHL433DY3T7P3MZN

第四步:
	如果来源不是Pod的地址端,但是请求的是Service的IP,ClusterIP,目标端口是80,那么则跳转KUBE-MARK-MASQ 这个自定义链进行打标记;
	如果请求的是节点的32000端口,那么则跳转到KUBE-MARK-MASQ这个自定义链,进行打标记 (0x4000/0x4000)

[root@node2 ~]# iptables -t nat -S KUBE-SVC-EHL433DY3T7P3MZN
-N KUBE-SVC-EHL433DY3T7P3MZN
-A KUBE-SVC-EHL433DY3T7P3MZN ! -s 10.244.0.0/16 -d 10.110.217.207/32 -p tcp -m comment --comment "default/demoapp-svc cluster IP" -m tcp --dport 80 -j KUBE-MARK-MASQ
-A KUBE-SVC-EHL433DY3T7P3MZN -p tcp -m comment --comment "default/demoapp-svc" -m tcp --dport 32000 -j KUBE-MARK-MASQ
-A KUBE-SVC-EHL433DY3T7P3MZN -m comment --comment "default/demoapp-svc" -m statistic --mode random --probability 0.33333333349 -j KUBE-SEP-SI5EEDPDQ7NVQF2Y
-A KUBE-SVC-EHL433DY3T7P3MZN -m comment --comment "default/demoapp-svc" -m statistic --mode random --probability 0.50000000000 -j KUBE-SEP-O7GW75MMOH2ZK4J5
-A KUBE-SVC-EHL433DY3T7P3MZN -m comment --comment "default/demoapp-svc" -j KUBE-SEP-ZOJBNUN3LSLJECDO

[root@node2 ~]# iptables -t nat -S KUBE-MARK-MASQ
-N KUBE-MARK-MASQ
-A KUBE-MARK-MASQ -j MARK --set-xmark 0x4000/0x4000

第五步:
	直接进行DNAT操作;

[root@node2 ~]# iptables -t nat -S KUBE-SEP-O7GW75MMOH2ZK4J5
-N KUBE-SEP-O7GW75MMOH2ZK4J5
-A KUBE-SEP-O7GW75MMOH2ZK4J5 -s 10.244.2.65/32 -m comment --comment "default/demoapp-svc" -j KUBE-MARK-MASQ
-A KUBE-SEP-O7GW75MMOH2ZK4J5 -p tcp -m comment --comment "default/demoapp-svc" -m tcp -j DNAT --to-destination 10.244.2.65:80

第六步:
	所有流经FORWARD这个链中的报文,都必须先到KUBE-FORWARD自定义链中;
[root@node2 ~]# iptables -S FORWARD
-P FORWARD ACCEPT
-A FORWARD -m comment --comment "kubernetes forwarding rules" -j KUBE-FORWARD

第七步:
	所有流经POSTROUTING这个链中的报文,都必须先到KUBE-POSTROUTING自定义链中;
[root@node2 ~]# iptables -t nat -S POSTROUTING
-P POSTROUTING ACCEPT
-A POSTROUTING -m comment --comment "kubernetes postrouting rules" -j KUBE-POSTROUTING
-A POSTROUTING -s 172.17.0.0/16 ! -o docker0 -j MASQUERADE
-A POSTROUTING -s 192.168.122.0/24 -d 224.0.0.0/24 -j RETURN
-A POSTROUTING -s 192.168.122.0/24 -d 255.255.255.255/32 -j RETURN
-A POSTROUTING -s 192.168.122.0/24 ! -d 192.168.122.0/24 -p tcp -j MASQUERADE --to-ports 1024-65535
-A POSTROUTING -s 192.168.122.0/24 ! -d 192.168.122.0/24 -p udp -j MASQUERADE --to-ports 1024-65535
-A POSTROUTING -s 192.168.122.0/24 ! -d 192.168.122.0/24 -j MASQUERADE
-A POSTROUTING -s 10.244.0.0/16 -d 10.244.0.0/16 -m comment --comment "flanneld masq" -j RETURN
-A POSTROUTING -s 10.244.0.0/16 ! -d 224.0.0.0/4 -m comment --comment "flanneld masq" -j MASQUERADE
-A POSTROUTING ! -s 10.244.0.0/16 -d 10.244.2.0/24 -m comment --comment "flanneld masq" -j RETURN
-A POSTROUTING ! -s 10.244.0.0/16 -d 10.244.0.0/16 -m comment --comment "flanneld masq" -j MASQUERADE

第八步:

[root@node2 ~]# iptables -t nat -S KUBE-POSTROUTING
-N KUBE-POSTROUTING
-A KUBE-POSTROUTING -m mark ! --mark 0x4000/0x4000 -j RETURN
-A KUBE-POSTROUTING -j MARK --set-xmark 0x4000/0x0
-A KUBE-POSTROUTING -m comment --comment "kubernetes service traffic requiring SNAT" -j MASQUERADE


十、IPVS模型分析

1、会在每个节点上创建一个名为kube-ipvs0的虚拟接口,并将集群所有Service对象的ClusterIP都配置在该接口:2、Kube-Proxy将每个Service生成一个虚拟服务器VirtualServer的定义;

注意:ipvs仅需要借助极少量的iptables规则完成源地址转换、源端口转换等;

1、设置集群为IPVS模式

在这里插入图片描述

1.1 修改ipvs模式
kubectl  edit  configmaps  kube-proxy -n kube-system 

  ipvs:
      excludeCIDRs: null
      minSyncPeriod: 0s
      scheduler: ""
      strictARP: false
      syncPeriod: 0s
      tcpFinTimeout: 0s
      tcpTimeout: 0s
      udpTimeout: 0s
    kind: KubeProxyConfiguration
    metricsBindAddress: ""
    mode: "ipvs" #指定ipvs规则

1.2、删除kube-proxy的pod,重启kube-proxy
kubectl  delete  pod $(kubectl get pod -n kube-system | grep proxy | awk '{print $1}') -n kube-system 

kubectl  delete  pod $(kubectl get pod -l k8s-app=kube-proxy -n kube-system | awk 'NR>1 {print $1}') -n kube-system 

# 只删除第2和第三个pod
kubectl  delete  pod $(kubectl get pod -l k8s-app=kube-proxy -n kube-system | awk 'NR==3 || NR==4 {print $1}') -n kube-system 

在这里插入图片描述

1.3 IPVS 规则查看
## 全部规则查看
ipvsadm -L -n
## IPVS的映射网卡查看
ip a  s  ## 查看网卡
kubect get svc ## 查看svc 
如图所示,正式映射关系



**自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。**

**深知大多数Linux运维工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!**

**因此收集整理了一份《2024年Linux运维全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。**
![img](https://img-blog.csdnimg.cn/img_convert/788817adbee7daa0cd655e1f6b920c68.png)
![img](https://img-blog.csdnimg.cn/img_convert/4a463838969cb3afc76546385f9e1b91.png)
![img](https://img-blog.csdnimg.cn/img_convert/ececea96eb7d22a0e95cdeccfd31d1c8.png)
![img](https://img-blog.csdnimg.cn/img_convert/83966b5f3324f7bd5cab419e66d46071.png)
![img](https://img-blog.csdnimg.cn/img_convert/0ac6dcdad3852c6d6ec4735046debfb6.png)

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Linux运维知识点,真正体系化!**

**由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**

**如果你觉得这些内容对你有帮助,可以添加VX:vip1024b (备注Linux运维获取)**
![img](https://img-blog.csdnimg.cn/img_convert/e228d8a48f22eae07e9cd18e9e2669ad.jpeg)

![](https://img-blog.csdnimg.cn/img_convert/9a8cb5f8c0ec69e6499adead0da6e95b.png)



最全的Linux教程,Linux从入门到精通

======================

1.  **linux从入门到精通(第2版)**

2.  **Linux系统移植**

3.  **Linux驱动开发入门与实战**

4.  **LINUX 系统移植 第2版**

5.  **Linux开源网络全栈详解 从DPDK到OpenFlow**



![华为18级工程师呕心沥血撰写3000页Linux学习笔记教程](https://img-blog.csdnimg.cn/img_convert/59742364bb1338737fe2d315a9e2ec54.png)



第一份《Linux从入门到精通》466页

====================

内容简介

====

本书是获得了很多读者好评的Linux经典畅销书**《Linux从入门到精通》的第2版**。本书第1版出版后曾经多次印刷,并被51CTO读书频道评为“最受读者喜爱的原创IT技术图书奖”。本书第﹖版以最新的Ubuntu 12.04为版本,循序渐进地向读者介绍了Linux 的基础应用、系统管理、网络应用、娱乐和办公、程序开发、服务器配置、系统安全等。本书附带1张光盘,内容为本书配套多媒体教学视频。另外,本书还为读者提供了大量的Linux学习资料和Ubuntu安装镜像文件,供读者免费下载。



![华为18级工程师呕心沥血撰写3000页Linux学习笔记教程](https://img-blog.csdnimg.cn/img_convert/9d4aefb6a92edea27b825e59aa1f2c54.png)



**本书适合广大Linux初中级用户、开源软件爱好者和大专院校的学生阅读,同时也非常适合准备从事Linux平台开发的各类人员。**

> 需要《Linux入门到精通》、《linux系统移植》、《Linux驱动开发入门实战》、《Linux开源网络全栈》电子书籍及教程的工程师朋友们劳烦您转发+评论




**一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**
![img](https://img-blog.csdnimg.cn/img_convert/70651ecb14e3a6ba2c97b4c9b85d71d1.jpeg)

![](https://img-blog.csdnimg.cn/img_convert/9a8cb5f8c0ec69e6499adead0da6e95b.png)



最全的Linux教程,Linux从入门到精通

======================

1.  **linux从入门到精通(第2版)**

2.  **Linux系统移植**

3.  **Linux驱动开发入门与实战**

4.  **LINUX 系统移植 第2版**

5.  **Linux开源网络全栈详解 从DPDK到OpenFlow**



![华为18级工程师呕心沥血撰写3000页Linux学习笔记教程](https://img-blog.csdnimg.cn/img_convert/59742364bb1338737fe2d315a9e2ec54.png)



第一份《Linux从入门到精通》466页

====================

内容简介

====

本书是获得了很多读者好评的Linux经典畅销书**《Linux从入门到精通》的第2版**。本书第1版出版后曾经多次印刷,并被51CTO读书频道评为“最受读者喜爱的原创IT技术图书奖”。本书第﹖版以最新的Ubuntu 12.04为版本,循序渐进地向读者介绍了Linux 的基础应用、系统管理、网络应用、娱乐和办公、程序开发、服务器配置、系统安全等。本书附带1张光盘,内容为本书配套多媒体教学视频。另外,本书还为读者提供了大量的Linux学习资料和Ubuntu安装镜像文件,供读者免费下载。



![华为18级工程师呕心沥血撰写3000页Linux学习笔记教程](https://img-blog.csdnimg.cn/img_convert/9d4aefb6a92edea27b825e59aa1f2c54.png)



**本书适合广大Linux初中级用户、开源软件爱好者和大专院校的学生阅读,同时也非常适合准备从事Linux平台开发的各类人员。**

> 需要《Linux入门到精通》、《linux系统移植》、《Linux驱动开发入门实战》、《Linux开源网络全栈》电子书籍及教程的工程师朋友们劳烦您转发+评论




**一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**
[外链图片转存中...(img-4tR4hKif-1712669176121)]

  • 20
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值