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)]