当前位置: 首页 > news >正文

k8s--NetworkPolicy资源对象

目录

一、概述

1、什么是NetworkPolicy?

2、NetworkPolicy的基本原理

二、规则分析

2.1NetworkPolicy特性与使用

2.2分点介绍

2.2.1入站方式筛选规则

2.2.2命名空间选择器(NamespaceSelector)

2.2.3Pod 选择器 + 命名空间选择器(组合)

2.2.4 IP 块(IPBlock)

2.2.5**端口(Port) **

2.2.6 出站方式筛选规则

2.2.7 命名空间选择器(NamespaceSelector)

2.2.8 Pod 选择器 + 命名空间选择器(组合)

2.2.9 IP 块(IPBlock)

networkpokicy模版

案例yaml配置文件以及调用进行说明

三、案例

2.1两个命名空间之间通信

2.2同命名空间入站策略

2.3跨命名空间入站策略

2.4全命名空间入站策略

2.5跨命名空间出站策略

总结


一、概述


在Kubernetes中,NetworkPolicy是一项关键功能,它允许开发者定义和控制Pod之间的网络通信。本文将深入研究Kubernetes中的NetworkPolicy,详细介绍其原理、用途,并通过实际示例演示如何使用NetworkPolicy来确保集群中的网络安全。

1、什么是NetworkPolicy?


NetworkPolicy是Kubernetes中用于定义Pod之间网络通信规则的资源对象。通过NetworkPolicy,开发者可以控制哪些Pod可以与另外哪些Pod通信,以及使用何种方式进行通信。这种细粒度的网络控制有助于提高集群的安全性,防止未经授权的访问和通信。

2、NetworkPolicy的基本原理


NetworkPolicy的工作原理基于以下几个核心概念:

Pod选择器(PodSelector)& namespaceSelector:NetworkPolicy使用标签选择器来选择特定的Pod。通过标签,可以将网络策略应用于特定的Pod群体。
Ingress规则:定义了允许从其他Pod进入被选中Pod的规则,包括允许的协议、端口范围等。
Egress规则:定义了允许被选中Pod访问其他Pod或外部网络的规则。
Peer Pod:NetworkPolicy中的规则是基于Peer Pod(对等Pod)的。通过选择Peer Pod,可以精确定义通信策略。


二、规则分析


2.1NetworkPolicy特性与使用


VPC与NetworkPolicy概念区分:VPC可以看作是不同的网络环境,NetworkPolicy是同网络环境下的ACL流量规则。
命名空间隔离:NetworkPolicy 是命名空间级别的资源,仅对同一命名空间的 Pod 生效,也可作用整个命名空间,但无法跨命名空间使用。
默认行为:
若 Pod 未被任何 NetworkPolicy 匹配,允许所有流量。
若被至少一个 NetworkPolicy 匹配,则仅允许规则明确允许的流量。
规则累加:多个 NetworkPolicy 可同时匹配一个 Pod,规则会合并生效。
策略逻辑:不管是入站还是出站都像是防火墙策略,只要是声明但不匹配就全部为拒绝,不设置就相当于是关闭防火墙。
这个策略逻辑可能有点绕,但意思就是我如果不配置任何NetworkPolicy就相当于关闭防火墙没有任何限制的状态,但我只要配置规则,那只要绑定生效的Pod的流量就会受到NetworkPolicy中声明的规则限制,加入出站配置了允许访问某个地址,那么除此之外其他地址都无法访问,入站同理,允许了含有某个标签的Pod访问,其他标签不匹配的机会全部拒绝。

2.2分点介绍


如果在policyTypes启用Ingress(入站)或者Engress(出站)但未配置任何规则,那么将会拒绝入站或者出站的所有流量。

2.2.1入站方式筛选规则


Pod 选择器(PodSelector)
通过标签匹配同一命名空间内的特定 Pod,只有这些 Pod 的流量被允许进入目标 Pod。


示例:

ingress:- from:- podSelector:matchLabels:app: frontend  # 允许标签为app=frontend的Pod访问
2.2.2命名空间选择器(NamespaceSelector)

通过标签匹配特定命名空间,该命名空间内的所有 Pod 的流量都被允许进入目标 Pod。
示例:

ingress:- from:- namespaceSelector:matchLabels:env: production  # 允许标签为env=production的命名空间内的Pod访问
2.2.3Pod 选择器 + 命名空间选择器(组合)

同时匹配特定命名空间和该命名空间内的特定 Pod(逻辑 “与” 关系)。
示例:

ingress:- from:- podSelector:matchLabels:app: backendnamespaceSelector:matchLabels:env: staging  # 允许staging命名空间中标签为app=backend的Pod访问
2.2.4 IP 块(IPBlock)

通过 CIDR 范围指定允许访问的外部 IP 或网段,支持排除特定 IP(except字段)。
示例:

ingress:- from:- ipBlock:cidr: 192.168.0.0/16  # 允许192.168网段的IP访问except:- 192.168.1.0/24  # 排除192.168.1网段
2.2.5**端口(Port) **

允许访问的端口和协议,限制流量只能通过指定端口进入 Pod。支持的协议包括 TCP、UDP(部分网络插件支持)等。

示例:

ingress:- ports:- protocol: TCPport: 80  # 允许TCP协议的80端口- protocol: UDPport: 53  # 允许UDP协议的53端口
2.2.6 出站方式筛选规则

Pod 选择器(PodSelector)
允许访问同一命名空间内具有特定标签的 Pod。
示例:

egress:- to:- podSelector:matchLabels:app: database  # 允许访问标签为app=database的Pod
2.2.7 命名空间选择器(NamespaceSelector)

允许访问特定命名空间内的所有 Pod(通过命名空间标签匹配)。
示例:

egress:- to:- namespaceSelector:matchLabels:env: external  # 允许访问标签为env=external的命名空间内的Pod
2.2.8 Pod 选择器 + 命名空间选择器(组合)

同时匹配特定命名空间和该命名空间内的特定 Pod(逻辑 “与” 关系)。
示例:

egress:- to:- podSelector:matchLabels:app: cachenamespaceSelector:matchLabels:env: shared  # 允许访问shared命名空间中标签为app=cache的Pod
2.2.9 IP 块(IPBlock)

允许访问指定的外部 IP 或网段(通过 CIDR 表示),支持排除特定 IP(except字段)。
示例:

egress:- to:- ipBlock:cidr: 10.0.0.0/8  # 允许访问10.0.0.0网段except:- 10.96.0.0/12  # 排除Kubernetes服务网段

端口(Port)

允许访问的目标端口和协议(如 TCP、UDP),限制流量只能通过指定端口发送到外部。
示例:

egress:- ports:- protocol: TCPport: 443  # 允许通过TCP 443端口访问外部- protocol: UDPport: 53  # 允许通过UDP 53端口(DNS)访问外部
networkpokicy模版
apiVersion: networking.k8s.io/v1  # 固定API版本
kind: NetworkPolicy
metadata:name: <策略名称>namespace: <目标命名空间>  # 策略仅在当前命名空间生效
spec:podSelector:  # 匹配哪些Pod(通过标签)matchLabels:app: <目标Pod标签>policyTypes:  # 规则类型:Ingress(入站)、Egress(出站)- Ingress- Egressingress:  # 入站规则(允许哪些流量进入匹配的Pod)- from:  # 流量来源- podSelector:  # 来自特定标签的PodmatchLabels:app: <来源Pod标签>- namespaceSelector:  # 来自特定标签的命名空间matchLabels:env: prod- ipBlock:  # 来自特定IP范围cidr: 192.168.0.0/16except:  # 排除某个IP段- 192.168.1.0/24ports:  # 允许访问的端口和协议- protocol: TCPport: 8080egress:  # 出站规则(允许哪些流量从匹配的Pod发出)- to:  # 流量目的地(格式同from)- podSelector:  #到特定标签的PodmatchLabels:app: dbports:  #允许访问的端口和协议- protocol: TCPport: 5432
案例yaml配置文件以及调用进行说明
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:name: networkpolicy-a  #规则名称namespace: ns-a   #指定网络策略在哪个命名空间
spec:#podSelector网络策略要应用到哪个pod上,通过标签的方式来控制pod,只能应用到和网络策略相同namespace的podpodSelector:#如果matchLabels下面没写标签,则应用网络策略到当前namespace下的所有podmatchLabels:#nginx-a:把网络策略应用到标签为app:nginx-a的pod上app: nginx-a#policyTypes:启用的是入站规则还是出站规则,只有Ingress表示只定义入站规则policyTypes:- Ingress#ingress:入站规则ingress:#允许哪些客户端可以访问- from:#标签为app: netshoot-a的pod可以访问- podSelector:matchLabels:app: netshoot-aports:#可以访问TCP协议为80的端口- protocol: TCPport: 80

三、案例

2.1两个命名空间之间通信

两个不同的命名空间之间是可以相互通信的
1.准备两个命名空间

[root@k8s-master net]# kubectl create ns ns-a 
namespace/ns-a created
[root@k8s-master net]# kubectl create ns ns-b
namespace/ns-b created

2.每个命名空间跑个nginx用于测验:

pod

nginx-a

[root@k8smaster network]# cat ns-a-deploy.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:name: nginx-anamespace: ns-a
spec:selector:matchLabels:app: nginx-atemplate:metadata:labels:app: nginx-aspec:containers:- name: nginx-aimage: nginx:latestports:- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:name: nginx-anamespace: ns-a
spec:selector:app: nginx-aports:- protocol: TCPport: 80targetPort: 80

pod

nginx-b:

[root@k8smaster network]# cat ns-b-deploy.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:name: nginx-bnamespace: ns-b
spec:selector:matchLabels:app: nginx-btemplate:metadata:labels:app: nginx-bspec:containers:- name: nginx-bimage: nginx:latestports:- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:name: nginx-bnamespace: ns-b
spec:selector:app: nginx-bports:- protocol: TCPport: 80targetPort: 80

3.每个命名空间创建pod测试客户端用于访问


netshoot-a

[root@k8smaster network]# cat netshoot-a.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:name: netshoot-anamespace: ns-a
spec:selector:matchLabels:app: netshoot-areplicas: 1template:metadata:labels:app: netshoot-aspec:containers:- name: pod1image: swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/nicolaka/netshoot:v0.13imagePullPolicy: IfNotPresentcommand: ["sleep", "3600"] # 容器启动后保持运行状态

netshoot-b

[root@k8smaster network]# cat netshoot-b.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:name: netshoot-bnamespace: ns-b
spec:selector:matchLabels:app: netshoot-breplicas: 1template:metadata:labels:app: netshoot-bspec:containers:- name: pod1image: swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/nicolaka/netshoot:v0.13imagePullPolicy: IfNotPresentcommand: ["sleep", "3600"] # 容器启动后保持运行状态

提交资源清单

[root@k8s-master net]# kubectl apply -f ns-a-deploy.yaml 
deployment.apps/nginx-a created
service/nginx-a created
[root@k8s-master net]# kubectl apply -f ns-b-deploy.yaml 
deployment.apps/nginx-b created
service/nginx-b created
[root@k8s-master net]# kubectl apply -f netshoot-a.yaml 
deployment.apps/netshoot-a created
[root@k8s-master net]# kubectl apply -f netshoot-b.yaml 
deployment.apps/netshoot-b created

4、查看状态

5.修改nginx页面内容:

        是为了方便进行测试,分辨

[root@k8s-master net]# kubectl -n ns-b exec -it nginx-b-9976779c-27xdd -- bash -c "echo nginx-b >/usr/share/nginx/html/index.html"
[root@k8s-master net]# kubectl -n ns-a exec -it nginx-a-69d8458cb5-cthb6 -- bash -c "echo nginx-a >/usr/share/nginx/html/index.html"

6、验证

[root@k8s-master net]# curl 10.244.36.86  
nginx-a[root@k8s-master net]# curl 10.244.169.176 
nginx-b

两个命名空间之间通信

[root@k8s-master net]# kubectl -n ns-a exec -it nginx-a-69d8458cb5-cthb6 -- bash -c "curl 10.244.169.176"
nginx-b
[root@k8s-master net]# kubectl -n ns-b exec -it nginx-b-9976779c-27xdd -- bash -c "curl 10.244.36.86"
nginx-a

2.2同命名空间入站策略

接下来通过配置networkpolicy策略来进行限制

例如ns-a的nginx只允许带有标签app: netshoot-a的pod访问80端口

vim networkpolicy-a.yaml

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:name: networkpolicy-a  #规则名称namespace: ns-a   #指定网络策略在哪个命名空间
spec:#podSelector网络策略要应用到哪个pod上,通过标签的方式来控制pod,只能应用到和网络策略相同namespace的podpodSelector:#如果matchLabels下面没写标签,则应用网络策略到当前namespace下的所有podmatchLabels:#nginx-a:把网络策略应用到标签为app:nginx-a的pod上app: nginx-a#policyTypes:启用的是入站规则还是出站规则,只有Ingress表示只定义入站规则policyTypes:- Ingress#ingress:入站规则ingress:#允许哪些客户端可以访问- from:#标签为app: netshoot-a的pod可以访问- podSelector:matchLabels:app: netshoot-aports:#可以访问TCP协议为80的端口- protocol: TCPport: 80

[root@k8s-master net]# kubectl apply -f networkpolicy-a.yaml 
networkpolicy.networking.k8s.io/networkpolicy-a created

作用对象​:该策略仅对带有标签 app: nginx-a 的 Pod 生效

        该规则中只允许 netshoot-a 通过,其他无法通过

[root@k8s-master net]# kubectl get networkpolicies -n ns-a
NAME              POD-SELECTOR   AGE
networkpolicy-a   app=nginx-a    34s

验证:

pod为netshoot-a访问pod为nginx-a,正确返回结果

标签为nginx-a的可以返回结果
ns-b空间的pod访问ns-a空间的pod,则访问不了

这是因为网络策略作用在标签为nginx-a的pod上,入站规则限制了必须通空间的netshoot-a通过80号端口访问

[root@k8s-master net]# kubectl get pod -n ns-a
NAME                         READY   STATUS    RESTARTS      AGE
netshoot-a-c794d98c8-7rfhd   1/1     Running   1 (23m ago)   86m
nginx-a-69d8458cb5-cthb6     1/1     Running   0             87m[root@k8s-master net]# kubectl -n ns-a exec -it netshoot-a-c794d98c8-7rfhd -- bash -c "curl 10.244.36.86"
nginx-a

[root@k8s-master net]# kubectl -n ns-b exec -it nginx-b-9976779c-27xdd -- bash -c "curl 10.255.36.86"
curl: (7) Failed to connect to 10.255.36.86 port 80 after 21024 ms: Couldn't connect to server
command terminated with exit code 7

2.3跨命名空间入站策略

现在我们是想要netshoot-b这个ns-b的命名空间来访问nginx-a Pod,接下来我们继续修改networkpolicy文件配置

这个入站规则就相当于是白名单,默认只匹配自己命名空间下的pod,如果是跨命名空间,要先允许对应命名空间的流量进来,然后再通过标签的形式精准指定某个pod可以访问。
修改 networkpolicy-a.yaml 配置文件

[root@k8smaster network]# cat networkpolicy-a.yaml 
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:name: networkpolicy-a  #规则名称namespace: ns-a   #指定网络策略在哪个命名空间
spec:#podSelector网络策略要应用到哪个pod上,通过标签的方式来控制pod,只能应用到和网络策略相同namespace的podpodSelector:#如果matchLabels下面没写标签,则应用网络策略到当前namespace下的所有podmatchLabels:#nginx-a:把网络策略应用到标签为app:nginx-a的pod上app: nginx-a#policyTypes:启用的是入站规则还是出站规则,只有Ingress表示只定义入站规则policyTypes:- Ingress#ingress:入站规则ingress:#允许哪些客户端可以访问- from:#标签为app: netshoot-a的pod可以访问- podSelector:matchLabels:app: netshoot-aports:#可以访问TCP协议为80的端口- protocol: TCPport: 80- from:           #标签为app: netshoot-b的pod可以访问- podSelector:matchLabels:app: netshoot-bnamespaceSelector:matchLabels:kubernetes.io/metadata.name: ns-b  # 匹配netshoot-b所在的命名空间ports:#可以访问TCP协议为80的端口- protocol: TCPport: 80
[root@k8s-master net]# kubectl apply -f networkpolicy-a.yaml 
networkpolicy.networking.k8s.io/networkpolicy-a unchanged

验证:

允许ns-b空间的pod为netshoot-b-66d7c4c6c-7ftfn访问ns-a空间的nginx-a-69d8458cb5-cthb6

[root@k8s-master net]# kubectl get po -n ns-a -o wide --show-labels 
NAME                         READY   STATUS    RESTARTS      AGE    IP             NODE        NOMINATED NODE   READINESS GATES   LABELS
netshoot-a-c794d98c8-7rfhd   1/1     Running   1 (39m ago)   102m   10.244.36.87   k8s-node1   <none>           <none>            app=netshoot-a,pod-template-hash=c794d98c8
nginx-a-69d8458cb5-cthb6     1/1     Running   0             103m   10.244.36.86   k8s-node1   <none>           <none>            app=nginx-a,pod-template-hash=69d8458cb5
[root@k8s-master net]# kubectl get po -n ns-b -o wide --show-labels 
NAME                         READY   STATUS    RESTARTS      AGE    IP               NODE        NOMINATED NODE   READINESS GATES   LABELS
netshoot-b-66d7c4c6c-7ftfn   1/1     Running   1 (40m ago)   103m   10.244.169.177   k8s-node2   <none>           <none>            app=netshoot-b,pod-template-hash=66d7c4c6c
nginx-b-9976779c-27xdd       1/1     Running   0             103m   10.244.169.176   k8s-node2   <none>           <none>            app=nginx-b,pod-template-hash=9976779c[root@k8s-master net]# kubectl -n ns-b exec -it netshoot-b-66d7c4c6c-7ftfn -- bash -c "curl 10.244.36.86"
nginx-a

2.4全命名空间入站策略

例如只允许同命名空间Pod访问
先删除ns-a的规则:

        kubectl delete networkpolicy networkpolicy-a -n ns-a

[root@k8s-master net]# kubectl delete networkpolicy networkpolicy-a -n ns-a
networkpolicy.networking.k8s.io "networkpolicy-a" deleted
[root@k8smaster network]# cat namespace-wide-policy.yaml 
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:name: namespace-wide-policynamespace: ns-a  # 策略所在的命名空间
spec:# 关键:空的podSelector表示应用于ns-a中的所有PodpodSelector: {}  # 不指定任何标签,匹配所有PodpolicyTypes:- Ingressingress:- from:# 只允许同一命名空间内的Pod访问- podSelector: {}  # 匹配当前命名空间(ns-a)的所有Pod
[root@k8s-master net]# kubectl apply -f namespace-wide-policy.yaml 
networkpolicy.networking.k8s.io/namespace-wide-policy created
[root@k8s-master net]# kubectl describe networkpolicy namespace-wide-policy -n ns-a
Name:         namespace-wide-policy
Namespace:    ns-a
Created on:   2025-08-21 13:23:06 +0800 CST
Labels:       <none>
Annotations:  <none>
Spec:PodSelector:     <none> (Allowing the specific traffic to all pods in this namespace)Allowing ingress traffic:To Port: <any> (traffic allowed to all ports)From:PodSelector: <none>Not affecting egress trafficPolicy Types: Ingress

验证:

        结果显示,只允许通空间的pod进行访问

[root@k8s-master net]# kubectl -n ns-a exec -it netshoot-a-c794d98c8-7rfhd  -- bash -c "curl 10.244.36.86"
nginx-a
[root@k8s-master net]# kubectl -n ns-b exec -it nginx-b-9976779c-27xdd  -- bash -c "curl 10.244.36.86"
^[[A
^Ccommand terminated with exit code 130

2.5跨命名空间出站策略

使用方法也类似,在policyTypes启用出站策略,然后配置规则。

例如允许出站规则netshoot-a工具访问ns-b的nginx-b策略

为了不影响测试,先删除之前的规则

[root@k8s-master net]# kubectl delete networkpolicy namespace-wide-policy -n ns-a
networkpolicy.networking.k8s.io "namespace-wide-policy" deleted

重新配置规则

[root@k8smaster network]# cat netshoot-a-egress.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:name: netshoot-a-egressnamespace: ns-a  # 策略应用在ns-a命名空间
spec:# 目标Pod:ns-a中标签为app: netshoot-a的PodpodSelector:matchLabels:app: netshoot-apolicyTypes:- Egress  # 仅启用出站规则控制egress:- to:# 目标条件1:匹配ns-b命名空间- namespaceSelector:matchLabels:kubernetes.io/metadata.name: ns-b  # 匹配ns-b命名空间# 目标条件2:该命名空间中标签为app: nginx-b的PodpodSelector:matchLabels:app: nginx-b# 限制端口:仅允许访问TCP 80端口ports:- protocol: TCPport: 80
[root@k8s-master net]# kubectl apply -f netshoot-a-egress.yaml 
networkpolicy.networking.k8s.io/netshoot-a-egress created

验证:

        网络策略作用在ns-a空间的pod为 netshoot-a 上

        启用出站规则

[root@k8s-master net]# kubectl get po -n ns-a -o wide --show-labels 
NAME                         READY   STATUS    RESTARTS      AGE    IP             NODE        NOMINATED NODE   READINESS GATES   LABELS
netshoot-a-c794d98c8-7rfhd   1/1     Running   2 (71s ago)   124m   10.244.36.87   k8s-node1   <none>           <none>            app=netshoot-a,pod-template-hash=c794d98c8
nginx-a-69d8458cb5-cthb6     1/1     Running   0             124m   10.244.36.86   k8s-node1   <none>           <none>            app=nginx-a,pod-template-hash=69d8458cb5
[root@k8s-master net]# kubectl get po -n ns-b -o wide --show-labels 
NAME                         READY   STATUS    RESTARTS      AGE    IP               NODE        NOMINATED NODE   READINESS GATES   LABELS
netshoot-b-66d7c4c6c-7ftfn   1/1     Running   2 (70s ago)   124m   10.244.169.177   k8s-node2   <none>           <none>            app=netshoot-b,pod-template-hash=66d7c4c6c
nginx-b-9976779c-27xdd       1/1     Running   0             124m   10.244.169.176   k8s-node2   <none>           <none>            app=nginx-b,pod-template-hash=9976779c
[root@k8s-master net]# kubectl -n ns-a exec -it netshoot-a-c794d98c8-7rfhd -- bash -c "curl 10.244.169.176"
nginx-b
[root@k8s-master net]# kubectl -n ns-a exec -it netshoot-a-c794d98c8-7rfhd -- bash -c "curl 10.244.169.177"
^Ccommand terminated with exit code 130
[root@k8s-master net]# kubectl -n ns-b exec -it netshoot-b-66d7c4c6c-7ftfn -- bash -c "curl 10.244.169.176"
nginx-b

如何证明是正确的呢?

可以试一下访问netshoot-b,这里访问不了,证明是对的

[root@k8s-master net]# kubectl -n ns-a exec -it netshoot-a-c794d98c8-7rfhd -- bash -c "curl 10.244.169.177"
^Ccommand terminated with exit code 130

再试一下netshoot-b访问nginx-b,这里显示能访问,证明规则正常

[root@k8s-master net]# kubectl -n ns-b exec -it netshoot-b-66d7c4c6c-7ftfn -- bash -c "curl 10.244.169.176"
nginx-b

总结

NetworkPolicy使用时要注意调用顺序,NetworkPolicy要应用到某个符合标签的Pod或命名空间上,这样互相匹配后才会绑定生效。

允许哪些pod或者命名空间入站或者出站的设置,关于对端的标签也要核对匹配,出现不相同的情况不会生效。

然后在NetworkPolicy中设置的规则是针对这个Pod或者命名空间的,入站就是允许谁来访问自己,出站就是允许自己来访问谁。

入站和出站可以同时启用,根据实际情况和自己的需求来更改这些配置。
 

http://www.dtcms.com/a/343026.html

相关文章:

  • 打工人项目日报计划
  • 搭建FTP文件共享服务器
  • linux 之 virtio 子系统核心的数据结构
  • DeepSeek R2难产:近期DeepSeek-V3.1 发布更新并开源,成功实现迈向 Agent 时代的第一步
  • 信息收集4----(收集网站指纹信息)
  • CSS 3D动画,围绕旋转动画Demo
  • 常见 Linux 网络命令梳理
  • AGV 技术落地场景解析:从制造业到仓储物流,看自动导引车的行业应用
  • 【Ruoyi解密-02.登录流程:】登录-找密码不抓瞎
  • 封装FTPSClient连接ftps服务器
  • 一个成熟的运维及售后岗位应掌握的知识体系详解
  • Linux动态库制作和使用
  • Manus AI 与多语言手写识别:技术、应用与未来
  • Nginx + Vue/React 前端 + API:防止路径混淆漏洞与跨域问题实战分享
  • [Mysql数据库] Mysql安全知识
  • Oracle ADG 切换方式详解:Switchover 与 Failover 操作指南
  • 〖领码方案〗前端 PageData 完整解决方案 第四版
  • 深度解析Structured Outputs:让AI输出严格遵循JSON Schema的结构化响应
  • 【日常学习】2025-8-21 了解些测试名词
  • 【GPT入门】第52课 openwebui安装与使用
  • Zynq中级开发七项必修课-第三课:S_AXI_GP0 主动访问 PS 地址空间
  • 通信算法之317:基于Xilinx FPGA平台的符号同步算法(接收序列与本地序列互相关-不共轭乘)
  • ODDR实现多bit单边沿采样数据转为多bit双沿采样数据
  • 前端-Vue笔记(核心语法)
  • linux内核 - 内存分配机制介绍
  • MySQL 8.4.6 LTS 安装教程 windows
  • 如何在mac玩windows游戏?3个工具推荐,不用换电脑!
  • MiniGPT-4
  • 在Excel和WPS表格中合并多个单元格这样最快
  • 第14章 结构和其他数据形式