k8s(五)—容器间的网络通信

2023-05-16

1、同一节点不同pod之间的通信原理

[root@server2 ~]# kubectl get pod -o wide    查看pod 的ip
NAME                            READY   STATUS    RESTARTS        AGE   IP            NODE      NOMINATED NODE   READINESS GATES
deployment-2-77cd76f9c5-2zrkd   1/1     Running   1 (7h40m ago)   25h   10.244.2.68   server4   <none>           <none>
deployment-2-77cd76f9c5-96cwp   1/1     Running   1 (7h40m ago)   25h   10.244.2.69   server4   <none>           <none>
deployment-2-77cd76f9c5-stppk   1/1     Running   1 (7h40m ago)   25h   10.244.1.77   server3   <none>           <none>
deployment-678fcbc488-2lf22     1/1     Running   1 (7h40m ago)   30h   10.244.1.80   server3   <none>           <none>
deployment-678fcbc488-5ms5s     1/1     Running   1 (7h40m ago)   30h   10.244.2.70   server4   <none>           <none>
deployment-678fcbc488-sgcd6     1/1     Running   1               30h   10.244.1.79   server3   <none>           <none>
[root@server2 ~]# kubectl exec -it deployment-2-77cd76f9c5-stppk  -- sh   进入其中一个pod
/ # route -n    查看容器的网关
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         10.244.1.1      0.0.0.0         UG    0      0        0 eth0
10.244.0.0      10.244.1.1      255.255.0.0     UG    0      0        0 eth0
10.244.1.0      0.0.0.0         255.255.255.0   U     0      0        0 eth0
/ # ping 10.244.1.80    可以看出同一节点server3上不同pod可以通信,原理是数据包通过默认网关连接网桥cni0通信,然后网桥连接另一个pod
PING 10.244.1.80 (10.244.1.80): 56 data bytes
64 bytes from 10.244.1.80: seq=0 ttl=64 time=0.212 ms
64 bytes from 10.244.1.80: seq=1 ttl=64 time=0.071 ms

2、不同节点不同pod之间的通信原理

flannel网络原理图:
在这里插入图片描述
在这里插入图片描述

[root@server2 ~]# kubectl exec -it deployment-2-77cd76f9c5-stppk  -- sh
/ # ping 10.244.2.70   此节点地址在server4上,
PING 10.244.2.70 (10.244.2.70): 56 data bytes
64 bytes from 10.244.2.70: seq=0 ttl=62 time=1.059 ms
64 bytes from 10.244.2.70: seq=1 ttl=62 time=0.445 ms
节点上的pod的ip地址是由是由subnet划分的,如下
[root@server3 ~]# cd /var/run/flannel
[root@server3 flannel]# cat subnet.env 
FLANNEL_NETWORK=10.244.0.0/16
FLANNEL_SUBNET=10.244.1.1/24   
FLANNEL_MTU=1450
FLANNEL_IPMASQ=true

封装信息如何得知?
知道原地址10.244.1.77和目标地址10.244.2.70,现在需要知道原mac地址和目标mac地址,原mac地址好找
[root@server3 flannel]# ip addr show flannel.1   可以查看原mac地址

在这里插入图片描述
但是server3是如何知道server4上的mac地址

[root@server3 flannel]# route -n   可以看出0网段和2网段的都要走隧道模式到flannel.1

在这里插入图片描述

[root@server3 flannel]# arp -an

在这里插入图片描述

后端mac地址的获取是由后台程序 flanneld运行在后端,他在分配子网段后,他还会获取整个集群节点的内部信息,他还会把每个设备的mac地址缓存到本地
[root@server3 flannel]# ps ax | grep flanneld     
 6163 ?        Ssl    0:38 /opt/bin/flanneld --ip-masq --kube-subnet-mgr
17409 pts/0    S+     0:00 grep --color=auto flannel

知道原地址和mac地址,目标地址和mac地址,然后通过vxlan进行1此封装,现在还需要知道对端flannel.1连接的eth0 ip地址和mac地址,需要查询转发数据库
[root@server3 flannel]# bridge fdb 查询,可以查出目标eth0的设备地址为172.25.50.4
在这里插入图片描述
然后再通过[root@server3 flannel]# arp -an 查寻172.25.50.4的mac地址
在这里插入图片描述
知道eth0这些地址后进行一个正常的udp封装,内部数据帧承载着正常的udp数据包传到对端eth0上,然后对端开始解包,匹配到内部数据帧是flannel.1d的然后由对端flannel.1 vtep进行解包,拿到原地址和目标地址
[root@server4 ~]# route -n 可以看到目标地址走的是2网段所以开始走cni0,这样就可以通信了

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

处于同一网关,可以使用host-gw模式,主机网关模式

[root@server2 ~]# kubectl -n kube-system get cm 查看配置文件
在这里插入图片描述

[root@server2 ~]# kubectl -n kube-system edit cm kube-flannel-cfg   编辑flannel配置文件

在这里插入图片描述

[root@server2 ~]# kubectl -n kube-system get pod | grep flannel | awk '{system("kubectl -n kube-system delete pod "$1"")}' 删除之前pod
pod "kube-flannel-ds-gss9t" deleted
pod "kube-flannel-ds-ltggs" deleted
pod "kube-flannel-ds-z4sbd" deleted
[root@server2 ~]# kubectl exec -it deployment-2-77cd76f9c5-stppk -- sh
/ # ping 10.244.2.72     访问2网段也可以ping通
PING 10.244.2.72 (10.244.2.72): 56 data bytes
64 bytes from 10.244.2.72: seq=0 ttl=62 time=0.708 ms
64 bytes from 10.244.2.72: seq=1 ttl=62 time=0.450 ms
[root@server3 ~]# route -n      可以发现访问10.224.2.0网段时直接访问172.25.50.4

在这里插入图片描述

[root@server4 ~]# route -n   可以发现访问10.224.0.0网段时直接访问172.25.50.2;可以发现访问10.224.1.0网段时直接访问172.25.50.3,直接跨过flannel.1

在这里插入图片描述
在这里插入图片描述
注意:在一个网段可以用host-gw,不在同一个网段用vxlan模式,如果集群里即有同一网段,也有不同网段则将vxlan和直接路由同时打开,让集群自主选者,如下设置:
在这里插入图片描述

3、 calico网络插件

flannel只负责通信但是没有网络策略,比如不可以定义那些网段的pod可以访问,那些网段的pod不可以访问,做策勒比较好的插件calico
在这里插入图片描述
calico官网

calico安装
[root@server2 ~]# mkdir calico
[root@server2 ~]# cd calico/
[root@server2 calico]# wget https://docs.projectcalico.org/manifests/calico.yaml
[root@server2 calico]# ls
calico.yaml    

单纯使用calico不使用flannel:
[root@server2 ~]# kubectl delete -f kube-flannel.yml   删除flannel
[root@server2 cni]# cd /etc/cni/net.d/
[root@server2 net.d]# ls
10-flannel.conflist
[root@server2 net.d]# mv 10-flannel.conflist /mnt/   为避免和calico冲突,将各个节点flannel网络插件配置文件移走
[root@server3 ~]# cd /etc/cni/net.d/
[root@server3 net.d]# ls
10-flannel.conflist
[root@server3 net.d]# mv 10-flannel.conflist /mnt/  为避免和calico冲突,将各个节点flannel网络插件配置文件移走
[root@server4 net.d]# mv 10-flannel.conflist /mnt/  为避免和calico冲突,将各个节点flannel网络插件配置文件移走

calico部署文档
当前部署50个节点以下的

[root@server2 calico]# vim calico.yaml   修改yaml文件

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

拉取所需镜像:
[root@server1 harbor]# docker pull calico/kube-controllers:v3.22.1   拉取所需镜像
[root@server1 harbor]# docker pull calico/typha:v3.22.1   拉取所需镜像
[root@server1 harbor]# docker pull calico/cni:v3.22.1  拉取所需镜像
[root@server1 harbor]# docker pull calico/pod2daemon-flexvol:v3.22.1 拉取所需镜像
[root@server1 harbor]# docker pull calico/node:v3.22.1  拉取所需镜像

在habor仓库新建项目
在这里插入图片描述
改标签:

[root@server1 ~]# docker tag calico/kube-controllers:v3.22.1  reg.westos.org/calico/kube-controllers:v3.22.1
[root@server1 ~]# docker tag calico/typha:v3.22.1 reg.westos.org/calico/typha:v3.22.1
[root@server1 ~]# docker tag calico/cni:v3.22.1 reg.westos.org/calico/cni:v3.22.1
[root@server1 ~]# docker tag calico/pod2daemon-flexvol:v3.22.1 reg.westos.org/calico/pod2daemon-flexvol:v3.22.1
[root@server1 ~]# docker tag calico/node:v3.22.1  reg.westos.org/calico/node:v3.22.1

上传镜像到仓库:

[root@server1 ~]# docker push reg.westos.org/calico/kube-controllers:v3.22.1
[root@server1 ~]# docker push reg.westos.org/calico/typha:v3.22.1
[root@server1 ~]# docker push reg.westos.org/calico/cni:v3.22.1
[root@server1 ~]# docker push reg.westos.org/calico/pod2daemon-flexvol:v3.22.1
[root@server1 ~]# docker push reg.westos.org/calico/node:v3.22.1

将镜像地址改为仓库地址

在这里插入图片描述

[root@server2 calico]# kubectl apply -f calico.yaml  运行		
[root@server2 calico]# kubectl -n kube-system get pod    查看pod节点
NAME                                       READY   STATUS    RESTARTS       AGE
calico-kube-controllers-56b559bc95-chqb4   1/1     Running   0              5m57s    运行成功
calico-node-9l6bn                          1/1     Running   0              5m58s       运行成功
calico-node-jmvsx                          1/1     Running   0              5m58s     运行成功
calico-node-z2gxs                          1/1     Running   0              5m58s      运行成功
calico-typha-84bffd4667-vkr2s              1/1     Running   0              4m17s    运行成功
coredns-7b56f6bc55-hlts6                   1/1     Running   21 (61m ago)   12d
coredns-7b56f6bc55-k6dzz                   1/1     Running   21             12d
etcd-server2                               1/1     Running   25 (61m ago)   12d
kube-apiserver-server2                     1/1     Running   25 (61m ago)   12d
kube-controller-manager-server2            1/1     Running   46 (61m ago)   12d
kube-proxy-2vsgk                           1/1     Running   3 (61m ago)    3d12h
kube-proxy-cjppk                           1/1     Running   3 (61m ago)    3d12h
kube-proxy-khgfn                           1/1     Running   4 (61m ago)    3d12h
kube-scheduler-server2                     1/1     Running   32 (61m ago)   12d
[root@server2 ~]# kubectl delete pod --all   删除之前pod,更新一下pod
pod "deployment-2-77cd76f9c5-2zrkd" deleted
pod "deployment-2-77cd76f9c5-96cwp" deleted
pod "deployment-2-77cd76f9c5-stppk" deleted
pod "deployment-678fcbc488-2lf22" deleted
pod "deployment-678fcbc488-5ms5s" deleted
pod "deployment-678fcbc488-sgcd6" deleted
[root@server2 ~]# kubectl get pod -o wide   查看pod的ip,各节点pod已经分到ip

在这里插入图片描述

[root@server3 ~]# route -n  各个节点直接添加网关

在这里插入图片描述

[root@foundation50 network-scripts]# curl www2.westos.org   访问,可以访问访问成功
Hello MyApp | Version: v2 | <a href="hostname.html">Pod Name</a>
[root@foundation50 network-scripts]# curl www2.westos.org/hostname.html
deployment-2-77cd76f9c5-clp52
[root@foundation50 network-scripts]# curl www2.westos.org/hostname.html
deployment-2-77cd76f9c5-6hlkk

在这里插入图片描述
在这里插入图片描述
一般情况我们是将flannel和calico结合使用,flannel负责网络通信,calico负责网络策略
网络策略文档

例1:限制访问指定服务

[root@server2 ~]# cd calico/
[root@server2 calico]# vim deny-nginx.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: deny-nginx
spec:
  podSelector:
    matchLabels:
      app: nginx
[root@server2 ~]# kubectl apply -f deny-nginx.yaml   运行
networkpolicy.networking.k8s.io/deny-nginx created
[root@server2 ~]# kubectl get networkpolicies  查看策略,策略已经添加
NAME         POD-SELECTOR   AGE
deny-nginx   app=nginx      83s

测试:
[root@foundation50 ~]# curl www2.westos.org   此时外部访问www2就已经无法访问了
[root@server2 ~]# kubectl describe svc nginx-svc   详细查看nginx-svc服务
Name:              nginx-svc
Namespace:         default
Labels:            <none>
Annotations:       <none>
Selector:          app=nginx
Type:              ClusterIP
IP Family Policy:  SingleStack
IP Families:       IPv4
IP:                10.110.63.4
IPs:               10.110.63.4
Port:              <unset>  80/TCP
TargetPort:        80/TCP
Endpoints:         10.244.141.202:80,10.244.141.203:80,10.244.22.8:80    后端pod ip
[root@server2 ~]# curl 10.244.141.202   访问集群内部后端pod ip也不能访问
[root@server2 ~]# kubectl describe svc myservice   查看myservice后端服务
Name:              myservice
Namespace:         default
Labels:            <none>
Annotations:       <none>
Selector:          app=myapp
Type:              ClusterIP
IP Family Policy:  SingleStack
IP Families:       IPv4
IP:                10.100.178.184
IPs:               10.100.178.184
Port:              <unset>  80/TCP
TargetPort:        80/TCP
Endpoints:         10.244.141.204:80,10.244.22.10:80,10.244.22.9:80     后端pod ip
[root@server2 ~]# curl 10.244.141.204   可以访问
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>

例2:允许指定访问的pod服务

[root@server2 ~]# kubectl run demo -it --image=busyboxplus -l app=demo  现运行带有app=demo标签的pod
/ #curl 10.244.141.202   访问带有nginx标签的pod,访问不了
[root@server2 calico]# vim deny-nginx.yaml 
---    添加
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
  name: acces-nginx
spec:
  podSelector:
    matchLabels:
      app: nginx
  ingress:
  - from:
      - podSelector:              表示如果数据包从 app: demo 这样的pod出来,可以访问
          matchLabels: 
            app: demo     
[root@server2 calico]# kubectl apply -f deny-nginx.yaml  运行
networkpolicy.networking.k8s.io/deny-nginx unchanged
networkpolicy.networking.k8s.io/acces-nginx created
[root@server2 calico]# kubectl attach demo -it  进入demo
If you don't see a command prompt, try pressing enter.
/ # curl 10.244.141.202   数据包从带有demo标签的pod里,访问带有nginx标签的pod
Hello MyApp | Version: v2 | <a href="hostname.html">Pod Name</a>   可以访问
[root@server2 calico]# curl 10.244.141.202  直接访问,访问不了

例3:禁止同一namespace中所有pod之间的pod相互访问

[root@server2 calico]# kubectl create namespace test  创建一个test空间
namespace/test created
[root@server2 calico]# kubectl run test1 -it --image=busyboxplus -n test   运行pod
[root@server2 calico]# kubectl run test2 -it --image=busyboxplus -n test   再运行一个pod
If you don't see a command prompt, try pressing enter.
/ # ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
3: eth0@if15: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue 
    link/ether 32:b9:86:f4:26:b4 brd ff:ff:ff:ff:ff:ff
    inet 10.244.141.206/32 scope global eth0     分到的ip为10.244.141.206
       valid_lft forever preferred_lft forever
[root@server2 calico]# kubectl -n test get pod --show-labels   创建了两个pod
NAME    READY   STATUS    RESTARTS       AGE     LABELS
test1   1/1     Running   1              4m40s   run=test1
test2   1/1     Running   1 (112s ago)   2m55s   run=test2
[root@server2 calico]# kubectl -n test get pod --show-labels -o wide   查看ip,不在一个结点上,同在一个namespace空间
NAME    READY   STATUS    RESTARTS        AGE     IP               NODE      NOMINATED NODE   READINESS GATES   LABELS
test1   1/1     Running   1               5m40s   10.244.22.11     server4   <none>           <none>            run=test1
test2   1/1     Running   1 (2m52s ago)   3m55s   10.244.141.206   server3   <none>           <none>            run=test2
[root@server2 calico]# kubectl attach test2 -it -n test   进入test2的pod里
If you don't see a command prompt, try pressing enter.
/ # ping 10.244.22.11   ping test1的pod,可以ping通
PING 10.244.22.11 (10.244.22.11): 56 data bytes
64 bytes from 10.244.22.11: seq=0 ttl=62 time=0.784 ms
64 bytes from 10.244.22.11: seq=1 ttl=62 time=0.364 ms
[root@server2 calico]# vim deny-nginx.yaml  编辑
---     添加 ,禁止namespace中所有pod之间的pod相互访问
kind: NetworkPolicy 
apiVersion: networking.k8s.io/v1
metadata:
  name: default-deny
  namespace: test  
spec:
  podSelector: {}     不指定标签就是匹配所有pod
[root@server2 calico]# kubectl apply -f deny-nginx.yaml   运行
networkpolicy.networking.k8s.io/deny-nginx unchanged
networkpolicy.networking.k8s.io/acces-nginx unchanged
networkpolicy.networking.k8s.io/default-deny created
[root@server2 calico]# kubectl attach test2 -it -n test 
If you don't see a command prompt, try pressing enter.
/ # ping 10.244.22.18    ping不通

例4:禁止其他namespace访问服务

[root@server2 calico]# kubectl attach test2 -it -n test
If you don't see a command prompt, try pressing enter.
/ # ping 10.244.141.213   同一namespace不能访问,但是不通namespace可以访问
PING 10.244.141.213 (10.244.141.213): 56 data bytes
64 bytes from 10.244.141.213: seq=0 ttl=63 time=0.193 ms
64 bytes from 10.244.141.213: seq=1 ttl=63 time=0.087 ms
[root@server2 calico]# vim deny-nginx.yaml
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
  name: deny-namespace
spec:
  podSelector: 
    matchLabels:
  ingress:
  - from:
    - podSelector: {}
[root@server2 calico]# kubectl apply -f deny-nginx.yaml   运行
networkpolicy.networking.k8s.io/deny-nginx unchanged
networkpolicy.networking.k8s.io/acces-nginx unchanged
networkpolicy.networking.k8s.io/default-deny unchanged
networkpolicy.networking.k8s.io/deny-namespace created
[root@server2 calico]# kubectl attach test2 -it -n test  进入
If you don't see a command prompt, try pressing enter.
/ # ping 10.244.141.213    彼此namespace被隔离不能访问
PING 10.244.141.213 (10.244.141.213): 56 data bytes

例5:只允许指定namespace访问服务

[root@server2 calico]# kubectl label  namespaces test  role=prod   修改namespaces标签为role=prod 
namespace/test labeled
[root@server2 calico]# kubectl get ns --show-labels  查看ns标签,标签已经添加成功

在这里插入图片描述

[root@server2 calico]# vim deny-nginx.yaml 
---
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
  name: access-namespace
spec:
  podSelector:
    matchLabels:
      app: myapp
  ingress:
  - from:
    - namespaceSelector:           表示数据包从带有 role: prod 标签的namespace,访问带有app:myapp的pod,可以访问
        matchLabels:
          role: prod
[root@server2 calico]# kubectl apply -f deny-nginx.yaml    运行
networkpolicy.networking.k8s.io/deny-nginx unchanged
networkpolicy.networking.k8s.io/acces-nginx unchanged
networkpolicy.networking.k8s.io/default-deny unchanged
networkpolicy.networking.k8s.io/deny-namespace configured
networkpolicy.networking.k8s.io/access-namespace created
[root@server2 calico]# kubectl get pod -o wide --show-labels   查看标签为myapp的ip

在这里插入图片描述

[root@server2 calico]# kubectl attach test2 -it -n test   进入pod
If you don't see a command prompt, try pressing enter.
/ # ping 10.244.22.16    
PING 10.244.22.16 (10.244.22.16): 56 data bytes
64 bytes from 10.244.22.16: seq=0 ttl=62 time=0.610 ms
64 bytes from 10.244.22.16: seq=1 ttl=62 time=0.361 ms
64 bytes from 10.244.22.16: seq=2 ttl=62 time=0.431 ms

例6:允许外网访问服务

---   添加 
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
  name: web-allow-external 
spec:
  podSelector:
    matchLabels:
      app: myapp
  ingress:
  - ports:
    - port: 80    暴露内部端口为80
    from: []
[root@server2 calico]# kubectl apply -f deny-nginx.yaml   运行
networkpolicy.networking.k8s.io/deny-nginx unchanged
networkpolicy.networking.k8s.io/acces-nginx unchanged
networkpolicy.networking.k8s.io/default-deny unchanged
networkpolicy.networking.k8s.io/deny-namespace configured
networkpolicy.networking.k8s.io/access-namespace unchanged
networkpolicy.networking.k8s.io/web-allow-external created 

在这里插入图片描述
在这里插入图片描述
注意:写多个策略时,加不加“-”有很大区别,加上“-”表示或者,满足一个条件即可;不加“-”表示并且,所有条件必须同时满足。
在这里插入图片描述
策略文档

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

k8s(五)—容器间的网络通信 的相关文章

  • 浅析vscode中vue文件保存时怎么自动格式化

    vscode中vue文件保存时怎么自动格式化 xff1f 下面本篇文章给大家介绍一下vscode保存按照eslint规则自动格式化的方法 xff0c 希望对大家有所帮助 xff01 最近写vue用了vue admin template xf
  • 软件测试 | 测试开发 | Python 自动化测试技术面试真题

    本文为面试某公司测试开发 xff0f 自动化测试工程师时的面试题笔记 全部笔试内容没有全部写全 xff0c 只贴通用性的技术相关的笔试面试题 xff0c 至于测试理论和团队管理的问题 xff0c 都是大同小异 xff0c 也没什么实际的参考
  • VSCode中怎么配置扩展进行Arduino开发

    VSCode中怎么配置扩展进行Arduino开发 xff1f 下面本篇文章给大家介绍一下告别简陋的arduinoIDE xff0c 使用VSCode开发Arduino的方法 xff0c 希望对大家有所帮助 xff01 Arduino官方的I
  • 分享两个VSCode终端中的实用小技巧

    本篇文章给大家分享两个VSCode终端中的实用小技巧 xff0c 希望对大家有所帮助 xff01 使用VS Code终端也很有段时间了 xff0c 今天好奇发现两个小技巧 xff0c 记录一下现在激动的心情 那么这些技巧解决了什么问题呢 x
  • 聊聊Node中的各种I/O模型

    本篇文章带大家聊聊Node中的各种I O模型 xff0c 介绍一下阻塞式I O模型 非阻塞式I O模型和非阻塞异步I O xff0c 希望对大家有所帮助 xff01 我们以网络请求IO为例 xff0c 首先介绍服务端处理一次完整的网络IO请
  • Node.js深入学习之浅析require函数中怎么添加钩子

    如何为 Node 的 require 函数添加钩子 xff1f 下面本篇文章就来带大家了解一下require函数中添加钩子的方法 xff0c 希望对大家有所帮助 xff01 Node js 是一个基于 Chrome V8 引擎的 JavaS
  • 详解Vue3 Suspense:是什么?能干什么?如何用?

    本篇文章带大家深入了解一下Vue3 Suspense xff0c 聊聊Suspense是什么 能干什么 xff0c 以及如何使用它 xff0c 希望对大家有所帮助 xff01 Suspense 不是你想的那样 是的 xff0c 它帮助我们处
  • 2022年vue高频面试题分享(附答案分析)

    本篇文章给大家总结一些值得收藏的2022年精选vue高频面试题 xff08 附答案 xff09 有一定的参考价值 xff0c 有需要的朋友可以参考一下 xff0c 希望对大家有所帮助 Vue router 导航守卫有哪些 全局前置 钩子 x
  • 19个实用vscode开发插件分享

    工欲善其事必先利其器 本篇文章给大家总结分享19个我在开发中使用到的vscode插件 xff0c 希望对大家有所帮助 xff01 1 xff1a Chinese Simplified Language Pack 中文语言插件 适用于 VS
  • 带你使用CSS+jQuery实现一个文字转语音机器人

    本篇文章手把手带大家使用CSS 43 jQuery实现一个文字转语音机器人 xff0c 希望对大家有所帮助 xff01 素材 机器人眼睛 推荐学习 xff1a css视频教程 jQuery视频教程 web前端视频 页面布局 机器人样式参考了
  • 如何上手Angular,先从 8 个开源项目开始!

    多年的学习经验告诉我 xff0c 了解一个概念最快的方式是看他的实践 xff0c 所以我整理出了 8 个在学习 Angular 过程中可以参考的开源项目 xff0c 学习如何怎么使用 Angular 框架 xff5e 相关教程推荐 xff1
  • 如何安装并管理多版本node?方法介绍

    如何安装并管理多版本node xff1f 下面本篇文章给大家介绍一下多版本node的安装与切换详细操作 xff0c 希望对大家有所帮助 xff01 安装多版本node的原因 xff1a 在项目开发过程中 xff0c 不同项目使用的nodej
  • 软件测试 | 普罗米修斯-基本使用

    快速了解普罗米修斯 普罗米修斯是用 go 语言编写的软件并且利用了 go 语言的交叉编译特性编译成了纯二进制文件 xff0c 运行的时候不需要额外安装依赖 直接从官网上下载就可以 下载地址 xff1a Download Prometheus
  • 聊聊Node两种模块规范:CJS 与 ESM,有什么不同点?

    本篇文章给大家带大家了解一下Node的两种模块规范 xff08 难以相容的 CJS 与 ESM xff09 xff0c 介绍一下CJS 和 ESM 的不同点 xff0c 怎么实现 CJS ESM 混写 xff0c 希望对大家有所帮助 xff
  • 手把手教你怎么在vscode中创建maven工程(图文结合)

    怎么在vscode中创建maven工程 xff1f 下面本篇文章就通过图文结合的方式带大家一步步创建maven工程 xff0c 希望对大家有所帮助 xff01 由于 xff0c 鄙人最近正在学习设计模式 xff0c 并且是阅读 重学设计模式
  • VSCode插件分享:一个实时预览Vue/React组件的插件

    在VSCode中开发Vue React组件时 xff0c 怎么实时预览组件 xff1f 本篇文章就给大家分享一个VSCode 中实时预览Vue React组件的插件 xff0c 希望对大家有所帮助 xff01 最近年纪大了喜欢胡思乱想 xf
  • 什么是Mixin?带你了解Vue中的Mixin混入

    什么是Mixin xff1f 本篇文章带大家了解一下Vue中的Mixin混入 xff0c 介绍Mixin和Vuex的区别 xff0c Mixin的使用方法 xff0c 希望对大家有所帮助 xff01 Vue框架现在基本上已经占据了前端的半壁
  • vue中什么是自定义指令?怎么使用?

    本篇文章带大家了解一下vue中的自定义指令 xff0c 介绍一下如何注册自定义指令 自定义指令参数 自定义指令使用场景 xff0c 希望对大家有所帮助 xff01 如今Vue占据了国内前端市场的大壁江山 xff0c 在前端求职过程中 xff
  • Vue.js中如何优化性能?9个小技巧分享

    Vue js中如何优化性能 xff1f 下面本篇文章给大家分享Vue js 性能优化的九个小技巧 xff0c 希望对大家有所帮助 xff01 xff08 学习视频分享 xff1a vuejs教程 xff09 01 Functional co
  • 总结分享一些基于Node.js的前端面试题(附解析)

    本篇文章给大家总结分享一些基于Node js的前端面试题 xff08 附解析 xff09 xff0c 希望对大家有所帮助 xff01 一 Node基础概念 1 1 Node是什么 Node js 是一个开源与跨平台的 JavaScript

随机推荐

  • 【整理总结】VSCode常用插件和好用配置(小白必看)

    本篇文章给大家总结分享一些VSCode常用插件和好用配置 xff08 超详细 xff09 希望可以给刚入坑前端的小伙伴一些帮助 本文很长 xff0c 如果能认真看完 xff0c 你一定会有所收获 一 VSCode常用插件推荐 工欲善其事 x
  • 2023年最新最全的VScode插件推荐

    这篇文章主要介绍了这么多年来我在使用 VSCode 过程中用到的一些不错的插件 这些VSCode插件 xff0c 帮你打造地表最强IDE xff01 一 主题及图标 GitHub Theme 黑白两款皮肤 Material Theme 集成
  • 聊聊VSCode中Snippet插件的使用(提高编程效率)

    本文介绍的是 VSCode Snippet 插件 xff0c 一种代码片段配置插件 xff0c 可以节省你写样板代码的时间 你可能之前学习过 VSCode Snippet 插件 xff0c 知道它的作用也学习了配置的语法 xff0c 但是你
  • 软件测试 | 普罗米修斯- 初识PromQL

    理解监控数据 之前讲过普罗米修斯自己就是一个时序数据库 xff0c 它从 exporter 拉取的数据都会按时间戳保存到对应的文件里 xff0c 这个时序数据库默认会保存 14 天的数据 而它自己也开发了一套名为 PromQL 的类 SQL
  • 【整理分享】30个让开发效率倍增的实用VSCode 插件

    本篇文章给大家总结分享30个让开发效率倍增的实用VSCode 插件 xff0c 让你的日常开发工作效率倍增 xff0c 希望对大家有所帮助 xff01 1 Image preview 通过此插件 xff0c 当鼠标悬浮在图片的链接上时 xf
  • 10个提高开发效率的Vue3常用插件(快来收藏)

    本篇文章给大家总结分享几个好用的 Vue 插件 xff0c 可以帮助开发者提高开发效率 解决移动端各种滚动场景需求 xff0c 希望对大家有所帮助 xff01 1 vue multiselect next Vue js 的通用选择 多选 标
  • 手把手带你使用Vue实现一个图片水平瀑布流插件

    如何使用Vue实现一个图片水平瀑布流插件 xff1f 这里给大家分享我在网上总结出来的一些知识 xff0c 希望对大家有所帮助 一 需求来源 今天碰到了一个需求 xff0c 需要在页面里 xff0c 用水平瀑布流的方式 xff0c 将一些图
  • vscode插件分享: 6个Vue3开发必备插件

    本篇文章给大家整理分享 6 个 Vue3 开发必备的 VSCode 插件 xff0c 可以直接用过 VSCode 的插件中心直接安装使用 xff0c 希望对大家有所帮助 xff01 1 Volar 下载数 153 万 43 相信使用 VSC
  • 11个裸VSCode必备插件,助你打造一个前端开发IDE

    VSCode 轻量 开源 xff0c 新鲜下载的 VSCode 可谓是身无长物 一穷二白 xff0c 连个项目管理的功能都没有 身轻如燕的 VSCode 对于后端开发说可能有点幼稚 xff0c 但对于前端来说刚刚好 xff0c 毕竟不需要搞
  • Ubuntu unzip 安装

    ubuntu unzip 安装以及命令参数说明 安装命令 xff1a sudo apt get install unzip 解压 zip文件命令 xff1a unzip unzip命令能够将被winzip压缩的文件解压 unzip命令的执行
  • 新建git仓库管理项目并更新代码提交git

    新建git仓库 第一步 xff1a 登录上自己的git后台 xff0c 在我的工作台的左下角 xff0c 点击仓库旁边的 43 号 xff0c 创建一个新的仓库 xff1a 第二步 xff1a 在新建仓库界面完善仓库的信息 xff0c 这里
  • CMake是什么?有什么用

    CMake CMake是一个跨平台的编译 Build 工具 可以用简单的语句来描述所有平台的编译过程 CMake能够输出各种各样的makefile或者project文件 xff0c 能测试编译器所支持的C 43 43 特性 类似UNIX下的
  • PX4系统学习

    PX4系统学习 扑翼飞行器的硬件组成飞控板电调电调的分类 舵机 扑翼飞行器的硬件组成 要了解学会二次开发首先要知道 xff0c 手头的飞行器的硬件结构 以及各个部分的结构是有何种作用的 xff0c 这样才能在根本上了解编程逻辑 xff0c
  • rostopic echo --noarr查看激光雷达数据详细信息(如frame_id)

    用rostopic echo 激光雷达话题名查看激光雷达返回的数据 xff0c 除了数字什么也显示不出来 想要查看激光雷达数据的frame id等信息 xff0c 加上 noarr参数即可 xff0c 排除话题数据中的数组信息 如图二所示
  • Django基本数据访问

    当需要操作数据时 xff0c 不再需要通过SQL语句 xff0c Django自动为这些模型提供了高级的Python API 接下来联系数据库表的操作 xff0c 运行manage py提供的shell语句 guest gt python3
  • SVO2.0 安装编译

    SVO2 OPEN https github com uzh rpg rpg svo pro open git挂梯子 https blog csdn net qq 33349365 article details 101514412 如果各
  • k8s(一)—pod管理、资源清单编写

    1 pod管理 k8s官方文档 root 64 server2 kubectl run nginx image 61 nginx 运行一个容器 xff0c 镜像为nginx pod nginx created root 64 server2
  • k8s(三)—控制器(replicaset、deployment、daemonset、job、cronjob)

    1 控制器简介 2 Replicaset控制器 root 64 server2 vim rs yaml apiVersion apps v1 kind ReplicaSet metadata name replicaset example
  • k8s(四)—service服务(暴露方式:ClusterIP、NodePort、LoadBalancer、ExternalName、ingress)

    1 service简介 2 开启kube proxy的ipvs root 64 server2 kubectl n kube system get pod grep proxy 每个节点都有haproxy kube proxy d6cp2
  • k8s(五)—容器间的网络通信

    1 同一节点不同pod之间的通信原理 root 64 server2 kubectl get pod o wide 查看pod 的ip NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NOD