技术分享及探讨
前言
很高兴给大家做一个技术分享及探讨。
下面给大家分享几个工作遇到有趣的例子。
docker
docker 进程
现象
客户的模型导入到BML平台发布预测服务后,模型本身是用django提供的支持。按照本地docker的方式进行调试,kill掉django的进程修改代码后重启进程服务,发现服务会重启。前提,客户是有一定的容器使用经验的。
原脚本如下:
#!/bin/bash
Nohup nginx start > /dev/null
Nohup python mange.py runserver 127.0.0.1:8080 > /dev/null
原因
对linux系统来说1号进程为init进程,是由0号进程(内核进程)通过调用系统init函数创建的第一个用户进程1进程,主要做用户态进程的管理,垃圾回收等动作。
对docker来讲1号进程大多数情况下都是服务进程,或者是用户自己开发的服务daemon进程,这也是瘦容器的理论,那服务进程作为1号进程有什么区别呢?
docker进程管理的基础是LINUX内核中的PID命名空间技术,在不同PID名空间中,进程ID是独立的;即在两个不同名空间下的进程可以有相同的PID。这句话的意思就是docker通过空间技术进行了容器间的进程隔离。
当创建一个Docker容器的时候,就会新建一个PID名空间。容器启动进程在该名空间内PID为1。
当PID1进程结束之后,Docker会销毁对应的PID名空间,并向容器内所有其它的子进程发送SIGKILL。
容器的设计本身是“单进程”模型,容器=应用=进程。
方案:
加上一个前台进程也是pid=1的进程。
tail -f /etc/hosts
相关文档
BML模型纳管与模型调试
docker overlay 文件系统
背景
光大较为谨慎,采用的是双线加负载方式。所以生产环境部署BML4.3需要上线2套环境,需要在周末俩天之内部署完成,部署时间还是比较紧张。
由于4.3部署采用的是镜像load的方式镜像,load镜像时间极长。并且是把镜像load到一个docker的挂载卷上。
分析
docker提供了两种 OverlayFS,一个是原本的 overlay文件系统,另一个是更新、更稳定的 overlay2。在日常使用中,应该更倾向于使用更好更稳定的 overlay2而不是 overlay。
查看/etc/docker/daemon.json文件来查看是用的那种方式。
{"storage-driver": "overlay2"
}
磁盘上的镜像和容器层
这里举拉取乌邦图镜像的例子来说明。
在使用指令docker pull ubuntu下载五层镜像的ubantu后,可以在/var/lib/docker/overlay2看到有六个目录。
$ ls -l /var/lib/docker/overlay2total 24
drwx------ 5 root root 4096 Jun 20 07:36 223c2864175491657d238e2664251df13b63adb8d050924fd1bfcdb278b866f7
drwx------ 3 root root 4096 Jun 20 07:36 3a36935c9df35472229c57f4a27105a136f5e4dbef0f87905b2e506e494e348b
drwx------ 5 root root 4096 Jun 20 07:36 4e9fa83caff3e8f4cc83693fa407a4a9fac9573deaf481506c102d484dd1e6a1
drwx------ 5 root root 4096 Jun 20 07:36 e8876a226237217ec61c4baf238a32992291d059fdac95ed6303bdff3f59cff5
drwx------ 5 root root 4096 Jun 20 07:36 eca1e4e1694283e001f200a667bb3cb40853cf2d1b12c29feda7422fed78afed
drwx------ 2 root root 4096 Jun 20 07:36 l
思考与方案
将A集群load好的镜像docker卷打包,在B集群上进行解压,以此完成快速部署的目的。
这个也在事后提出,反馈并合并到后面的标版部署中。
缺点
由于是解压后卷镜像挂载,不是导入的镜像,所以使用docker images 等命令 无法查看到相关的镜像。
整理如下命令,供参考
相应的参考命令:
#查询镜像
curl <仓库地址>/v2/_catalog#查询镜像tag(版本)
curl <仓库地址>/v2/<镜像名>/tags/list#查询镜像 digest_hash
curl --header "Accept:application/vnd.docker.distribution.manifest.v2+json" -I -XGET <仓库地址>/v2/<镜像名>/manifests/<tag>#删除镜像API
curl -I -X DELETE "<仓库地址>/v2/<镜像名>/manifests/<镜像digest_hash>"
#查询镜像
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NWsgcerW-1680159294012)(null)]
#查询镜像tag(版本)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3oEWYuwt-1680159294359)(null)]
docker 常见问题排查
场景一、生产集群磁盘爆满
根据目录查找所在的容器名称,找到对应的容器名称,根据对应的容器名称找到BMl 上对应的POD。
根据docker overylay2 目录下的文件夹名称 查找容器
docker ps -q | xargs docker inspect --format '{{.State.Pid}}, {{.Id}}, {{.Name}}, {{.GraphDriver.Data.WorkDir}}' | grep "文件夹名称"
最后发现是一个用户起的notebook,上传东西到容器内,将磁盘撑爆了。
场景二、物理机上某个线程占用GPU、CPU 高
方法一
根据pid 查找容器名称
[root@gzbh-intel016 ~]# cd /proc/74841
[root@gzbh-intel016 74841]# pwd
/proc/74841
[root@gzbh-intel016 74841]# ps -ef | grep 74841
root 74841 74840 1 Dec18 ? 03:49:46 bin/signature_handwriting
root 89107 20906 0 17:48 pts/2 00:00:00 grep --color=auto 74841
[root@gzbh-intel016 74841]# ps -ef | grep 74840
root 74840 74327 0 Dec18 ? 00:00:00 bin/supervise.signature_handwriting -p status/signature_handwriting -f bin/signature_handwriting
root 74841 74840 1 Dec18 ? 03:49:47 bin/signature_handwriting
root 89663 20906 0 17:48 pts/2 00:00:00 grep --color=auto 74840
[root@gzbh-intel016 74841]# ps -ef | grep 74327
root 74327 74308 0 Dec18 ? 00:00:00 sh /home/work/app/console/all_start.sh 0 4g
root 74385 74327 0 Dec18 ? 00:00:00 sh java_start.sh
root 74389 74327 0 Dec18 ? 00:00:00 tail -f /etc/hosts
root 74840 74327 0 Dec18 ? 00:00:00 bin/supervise.signature_handwriting -p status/signature_handwriting -f bin/signature_handwriting
root 91492 20906 0 17:48 pts/2 00:00:00 grep --color=auto 74327
[root@gzbh-intel016 74841]#
[root@gzbh-intel016 74841]# ps -ef | grep 74308
root 74308 13670 0 Dec18 ? 00:01:05 docker-containerd-shim -namespace moby -workdir /data/lib/docker/containerd/daemon/io.containerd.runtime.v1.linux/moby/0000936684d05d4c98c67fa8606d89f367a7985a0d05449bbef812422897b1b2 -address /var/run/docker/containerd/docker-containerd.sock -containerd-binary /usr/bin/docker-containerd -runtime-root /var/run/docker/runtime-nvidia
root 74327 74308 0 Dec18 ? 00:00:00 sh /home/work/app/console/all_start.sh 0 4g
root 93870 20906 0 17:48 pts/2 00:00:00 grep --color=auto 74308
最重发现 物理机 路径为 /data/lib/docker/containerd/daemon/io.containerd.runtime.v1.linux/moby/0000936684
查找容器名称
[root@gzbh-intel016 0000936684d05d4c98c67fa8606d89f367a7985a0d05449bbef812422897b1b2]# pwd
/data/lib/docker/containerd/daemon/io.containerd.runtime.v1.linux/moby/0000936684d05d4c98c67fa8606d89f367a7985a0d05449bbef812422897b1b2
[root@gzbh-intel016 0000936684d05d4c98c67fa8606d89f367a7985a0d05449bbef812422897b1b2]# ll
total 0
[root@gzbh-intel016 0000936684d05d4c98c67fa8606d89f367a7985a0d05449bbef812422897b1b2]# docker ps -a | grep 0000936684
0000936684d0 244aea358579 "/bin/bash -ce 'sh /…" 11 days ago Up 11 days k8s_guangda-cursive_guangda-cursive-86d55fcf65-7dpsw_default_d0b3091b-5fc3-11ec-9318-bc97e1b8d4ae_0
可知容器名称为
k8s_guangda-cursive_guangda-cursive-86d55fcf65-7dpsw_default_d0b3091b-5fc3-11ec-9318-bc97e1b
方法二
根据进程号获取容器名称docker ps -q | xargs docker inspect -f '{{.State.Pid}} {{.Config.Hostname}}' | grep 2811再通过docker ps | grep 0bbea2sd3ds15
便可获取到容器名称
场景三、GPU服务器上 启动docker容器识别不到GPU
概念
为了让docker支持nvidia显卡,英伟达公司开发了nvidia-docker。该软件是对docker的包装,使得容器能够看到并使用宿主机的nvidia显卡。
正常机器的对比
GPU服务器的docker 与daemon.json
[root@instance-q2pzfrcc ~]# rpm -qa | grep docker
docker-ce-18.09.7-3.el7.x86_64
docker-ce-cli-18.09.7-3.el7.x86_64
nvidia-container-runtime-2.0.0-3.docker18.09.7.x86_64
nvidia-docker2-2.0.3-3.docker18.09.7.ce.noarch[root@gzbh-intel003 ~]# cat /etc/docker/daemon.json
{"hosts": ["tcp://10.36.245.149:8137", "unix:///var/run/docker.sock"],"default-runtime": "nvidia","runtimes": {"nvidia": {"path": "/usr/bin/nvidia-container-runtime","runtimeArgs": []}}
}
CPU服务器的docker 与daemon.json
[root@instance-asdsadsadcds ~]# rpm -qa | grep docker
docker-ce-18.09.7-3.el7.x86_64
docker-ce-cli-18.09.7-3.el7.x86_64[root@gzbh-intelmbx001 images]# cat /etc/docker/daemon.json
{"hosts": ["tcp://10.36.252.167:8137", "unix:///var/run/docker.sock"],"init": true,"init-path": "/usr/bin/docker-init","storage-opts": ["overlay2.override_kernel_check=true"]
}
原理
nvidia-docker是一个可以使用GPU的docker,nvidia-docker是在docker上做了一层封装,通过nvidia-docker-plugin,然后调用到docker上,其最终实现的还是在docker的启动命令上携带一些必要的参数。因此在安装nvidia-docker之前,还是需要安装docker的。
Nvidia-dockerNvidia提供Nvidia-docker项目,它是通过修改Docker的Runtime为nvidia runtime工作,当我们执行 nvidia-docker create 或者 nvidia-docker run时,它会默认加上 --runtime=nvidia 参数。将runtime指定为nvidia。当然,为了方便使用,可以直接修改Docker daemon 的启动参数,修改默认的 Runtime为 nvidia-container-runtime
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tHfdELOp-1680159294138)(null)]
注意
在docker19以前都需要单独下载nvidia-docker1或nvidia-docker2来启动容器,自从升级了docker19后跑需要gpu的docker只需要加个参数–gpus all 即可
docker run -d -it -p 1518:1518 --name="centos" --gpus all nvidia/cuda:9.1-cudnn7-runtime-centos7 /bin/bash
其他场景问题
1、镜像八小时问题。
2、root 与 普通用户切换问题。
3、docker 迁移存储目录
4、添加信任仓库。
5、容器启动不使用网桥默认网段。
参考文档:docker原理及运维
推荐工具
一、docker-compose
举例:
使用命令docker-compose -f *.yaml up -d 启动mysql
类似于k8s的yaml 编排。
是单机管理,编排容器,可以同时管理多个 container ,将多个相关的容器⼀次性启动,⽐如运⾏⼀个jar需要依赖jdk、mysql、mq、redis等,这些容器只需要 docker-composer up 就可以全部启动,不需要⼀个个单独启动。
version: '2'
services:mysql-db:container_name: mysqlrestart: alwaysimage: mysql:5.7ports:- 3306:3306environment:TZ: Asia/ShanghaiMYSQL_ROOT_PASSWORD: 123456command:--character-set-server=utf8mb4--collation-server=utf8mb4_general_ci--explicit_defaults_for_timestamp=true--lower_case_table_names=1--max_allowed_packet=128M--sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION,NO_ZERO_DATE,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO"volumes:- /Users/wangjinlong05/app/data/mysqldockerdata/data:/var/lib/mysql
二、portainer
适合客户侧容器小白使用
开启2375 docker远程管理端口
vim /usr/lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd -H unix://var/run/docker.sock -H tcp://0.0.0.0:2375
systemctl daemon-reload && systemctl restart docker拉取镜像
docker pull portainer/portainer 启动容器
docker run -d -p 9000:9000 \
-v /var/run/docker.sock:/var/run/docker.sock \
--restart=always \
portainer/portainer如果已经启动可以更新
docker run -d -p 9000:9000\
-v /var/run/docker.sock:/var/run/docker.sock \
update --restart=always \
portainer/portainer
k8s
场景一:集群数据库迁移
背景
客户测试环境部署4.3交付。
原部署计划是由客户提供mysql集群,由我们部署对接,由于客户测试环境的mysql环境没提前准备好,所以我们集群自建mysql环境搭建。运行一个月后,客户要求BML的mysql 迁移对接到他们的mysql行内集群。
难点
由于bml 部署配置繁杂,mysql 初始化地方极多,稍有不慎就会导致集群出现故障。迁移mysql 改造对接成本较高。
概念
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SF48FwhD-1680159294081)(null)]
具体的四表
- filter表——涉及FORWARD、INPUT、OUTPUT三条链,多用于本地和转发过程中数据过滤;(负责过滤工程,防火墙 )
- Nat表——涉及PREROUTING、OUTPUT、POSTROUTTING三条链,多用于源地址/端口转换和目标地址/端口的转换;(网络地址转换功能 network address translate )
- Mangle表——涉及整条链,可实现拆解报文、修改报文、重新封装,可常见于IPVS的PPC下多端口会话保持。
- (拆解报文,做出修改,并重新封装 )
- Raw表——涉及PREROUTING和OUTPUT链,决定数据包是否被状态跟踪机制处理,需关闭nat表上的连接追踪机制。
- (关闭nat表上启用的连接追踪机制)
具体的五链
- INPUT——进来的数据包应用此规则链中的策略
- OUTPUT——外出的数据包应用此规则链中的策略
- FORWARD——转发数据包时应用此规则链路中的策略
- PREROUTING——对数据包作路由选择前应用此链中的规则(所有的数据包进来的时候都先由这个链处理)
- POSTROUTING——对数据包作路由选择后应用此链中的规则(所有的数据包出来的时候都先由这个链处理)
链表关系
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hgyLFrkx-1680159294199)(null)]
iptables处理动作
iptables处理动作除了 ACCEPT、REJECT、DROP、REDIRECT 、MASQUERADE 以外,还多出 LOG、ULOG、DNAT、RETURN、TOS、SNAT、MIRROR、QUEUE、TTL、MARK等。我们只说明其中最常用的动作:
REJECT 拦阻该数据包,并返回数据包通知对方,可以返回的数据包有几个选择:ICMP port-unreachable、ICMP echo-reply 或是tcp-reset(这个数据包包会要求对方关闭联机),进行完此处理动作后,将不再比对其它规则,直接中断过滤程序。 范例如下:
iptables -A INPUT -p TCP --dport 22 -j REJECT --reject-with ICMP echo-reply
DROP 丢弃数据包不予处理,进行完此处理动作后,将不再比对其它规则,直接中断过滤程序。
REDIRECT 将封包重新导向到另一个端口(PNAT),进行完此处理动作后,将会继续比对其它规则。这个功能可以用来实作透明代理 或用来保护web 服务器。例如:
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT–to-ports 8081
MASQUERADE 改写封包来源IP为防火墙的IP,可以指定port 对应的范围,进行完此处理动作后,直接跳往下一个规则链(mangle:postrouting)。这个功能与 SNAT 略有不同,当进行IP 伪装时,不需指定要伪装成哪个 IP,IP 会从网卡直接读取,当使用拨接连线时,IP 通常是由 ISP 公司的 DHCP服务器指派的,这个时候 MASQUERADE 特别有用。范例如下:
iptables -t nat -A POSTROUTING -p TCP -j MASQUERADE --to-ports 21000-31000
LOG 将数据包相关信息纪录在 /var/log 中,详细位置请查阅 /etc/syslog.conf 配置文件,进行完此处理动作后,将会继续比对其它规则。例如:
iptables -A INPUT -p tcp -j LOG --log-prefix “input packet”
SNAT 改写封包来源 IP 为某特定 IP 或 IP 范围,可以指定 port 对应的范围,进行完此处理动作后,将直接跳往下一个规则炼(mangle:postrouting)。范例如下:
iptables -t nat -A POSTROUTING -p tcp -o eth0 -j SNAT --to-source 192.168.10.15-192.168.10.160:2100-3200
DNAT 改写数据包包目的地 IP 为某特定 IP 或 IP 范围,可以指定 port 对应的范围,进行完此处理动作后,将会直接跳往下一个规则链(filter:input 或 filter:forward)。范例如下:
iptables -t nat -A PREROUTING -p tcp -d 15.45.23.67 --dport 80 -j DNAT --to-destination 192.168.10.1-192.168.10.10:80-100
MIRROR 镜像数据包,也就是将来源 IP与目的地IP对调后,将数据包返回,进行完此处理动作后,将会中断过滤程序。
QUEUE 中断过滤程序,将封包放入队列,交给其它程序处理。透过自行开发的处理程序,可以进行其它应用,例如:计算联机费用…等。
RETURN 结束在目前规则链中的过滤程序,返回主规则链继续过滤,如果把自订规则炼看成是一个子程序,那么这个动作,就相当于提早结束子程序并返回到主程序中。
MARK 将封包标上某个代号,以便提供作为后续过滤的条件判断依据,进行完此处理动作后,将会继续比对其它规则。
方案
在不改变原集群任何的组件及配置的基础上进行使用iptables进行转发。
分为两部分:请求出去的时候转发,请求回来的时候处理转发。
将mysql请求发送出去,不再由本机处理。
将请求到原地址36.6的3308转发到 3309
iptables -t nat -A PREROUTING -d 10.200.36.6 -p tcp -m tcp --dport 3308 -j DNAT --to-destination mysqlIP:3309说明: 修改nat表 在规则链的末尾加入新规则 PREROUTING链匹配来自36.6 端口3308的请求-j 进行DNAT 操作 目的地为 mysqlIP:3309
将对方请求接收后,转发回给微服务。
比如bml-dataset 请求原地址的mysql ip端口,再由这个ip端口进行回应。
只要是从mysqlip 3309 过来的的通讯 POSTROUTING 到 36.6的3308上出去
iptables -t nat -A POSTROUTING -d mysqlIP -p tcp -m tcp --dport 3309 -j SNAT --to-source 10.200.36.6:3308
优缺点
优点; 对接改造成本比较低,执行两个规则即可。
缺点:所有的mysql请求都在一个节点上,做不到mysql的高可用(可接受)
综述:利大于弊。
场景二: 预测服务转发无效
背景
用户在集群上发布了俩个预测服务A和B,但是外面访问不到A服务,但是可以访问到B服务。
kubect 查看pod 正常,无日志输出。
概念
kube-proxy通过观察Kubernetes中service和endpoint对象的变化,当有servcie创建时,kube-proxy在iptables中追加新的规则。对于service的每一个endpoint,会在iptables中追加一条规则,设定动作为DNAT,将目的地址设置成真正提供服务的pod地址;再为servcie追加规则,设定动作为跳转到对应的endpoint的规则上,
默认情况下,kube-proxy随机选择一个后端的服务,可以通过iptables中的 -m recent 模块实现session affinity功能,通过 -m statistic 模块实现负载均衡时的权重功能
排查过程
在Node节点上实现Pod网络代理,维护网络规则和四层负载均衡工作。实现让Pod节点(一个或者多个容器)对外提供服务
service在逻辑上代表了后端的多个Pod,外借通过service访问Pod。service接收到请求就需要kube-proxy完成转发到Pod的。每个Node都会运行kube-proxy服务,负责将访问的service的TCP/UDP数据流转发到后端的容器。
第一步 初步怀疑kube-porxy
感觉问题出在kube-proxy上,之前有过类似问题排查结果。初步怀疑是转发规则创建问题。
kubectl delete pod kube-porxy ,
等待kube-porxy重启
。。。。。。。
没起作用。
第二步 重建规则
清空规则,重建规则
iptables -F
kubectl delete pod kube-porxy
等待kube-porxy重启
。。。。。。。
没起作用。
第三步 排查创建的规则并且抓包
[root@nf52801602]# iptables -t nat -nvL
Chain PREROUTING (policy ACCEPT 84 packets, 5040 bytes)pkts bytes target prot opt in out source destination
5216M 752G KUBE-SERVICES all -- * * 0.0.0.0/0 0.0.0.0/0 /* kubernetes service portals */37M 2240M CNI-HOSTPORT-DNAT all -- * * 0.0.0.0/0 0.0.0.0/0 ADDRTYPE match dst-type LOCAL
查看svc的链 iptables -t nat -nvL KUBE-SERVICES
[root@nf52801602]# iptables -t nat -nvL KUBE-SERVICES
Chain KUBE-SERVICES (2 references)pkts bytes target prot opt in out source destination 0 0 KUBE-MARK-MASQ tcp -- * * !10.233.64.0/18 10.233.0.55 /* default/redis-cluster-proxy:proxy cluster IP */ tcp dpt:77770 0 KUBE-SVC-3FNBBYIZCXANEL3B tcp -- * * 0.0.0.0/0 10.233.0.55 /* default/redis-cluster-proxy:proxy cluster IP */ tcp dpt:7777
10.233.0.55 为svice ip
查看 KUBE-SVC-3FNBBYIZCXANEL3B链
[root@nf52801602]# iptables -t nat -nvL KUBE-SVC-3FNBBYIZCXANEL3B
Chain KUBE-SVC-3FNBBYIZCXANEL3B (2 references)pkts bytes target prot opt in out source destination 0 0 KUBE-SEP-E3VN2RK7BFTPB2QU all -- * * 0.0.0.0/0 0.0.0.0/0 statistic mode random probability 0.500000000000 0 KUBE-SEP-QWICKHRY75ZBMBDW all -- * * 0.0.0.0/0 0.0.0.0/0
发现2个pod是随机0.5概率
查看 KUBE-SEP-E3VN2RK7BFTPB2QU自定义链
[root@nf52801602]# iptables -t nat -nvL KUBE-SEP-E3VN2RK7BFTPB2QU
Chain KUBE-SEP-E3VN2RK7BFTPB2QU (1 references)pkts bytes target prot opt in out source destination 0 0 KUBE-MARK-MASQ all -- * * 10.233.64.160 0.0.0.0/0 0 0 DNAT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp to:10.233.64.160:7777
发现DNAT转发到10.233.64.160:7777 正是上面的 pod ip
SNAT
[root@nf52801602]# iptables -t nat -nvL KUBE-POSTROUTING
Chain KUBE-POSTROUTING (1 references)pkts bytes target prot opt in out source destination 0 0 MASQUERADE all -- * * 0.0.0.0/0 0.0.0.0/0 /* kubernetes service traffic requiring SNAT */ mark match 0x4000/0x4000
[root@yq01-aip-aikefu08 ~]#
ok 没有问题。
抓包 tcpdump,使用wireshark分析,抓到了业务方请求。。
请求确实已经到达了我方。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-99If7b73-1680159294305)(null)]
对pod中的veth 设备对抓包发现没有请求。
#!/bin/bash
for container in $(docker ps -q); do iflink=`docker exec -it $container bash -c 'cat /sys/class/net/eth0/iflink'` iflink=`echo $iflink|tr -d '\r'` veth=`grep -l $iflink /sys/class/net/veth*/ifindex` veth=`echo $veth|sed -e 's;^.*net/\(.*\)/ifindex$;\1;'` echo $container:$veth
done
那就抓flannel.1网桥
tcpdump -i flannel.1 -nn icmp
分析一波,也有业务方请求。。
继续下一波
抓去cni,发现cni没有收到请求。
比较诡异,重启flannel.1 与cni后正常。
其他场景
1、k8s集群证书过期k8s证书相关
2、api-server宕掉。
3、单节点容器数量上限。
4、ipvs替换iptables.
5、k8s集群服务访问集群外服务coredns映射。
结尾
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Rgbz5d1w-1680159294252)(null)]
今天我的分享就到这里,谢谢大家!
相关文章:

技术分享及探讨
前言 很高兴给大家做一个技术分享及探讨。 下面给大家分享几个工作遇到有趣的例子。 docker docker 进程 现象 客户的模型导入到BML平台发布预测服务后,模型本身是用django提供的支持。按照本地docker的方式进行调试,kill掉django的进程修改代码…...

人工智能AI
AI 模型。它使用深度神经网络,从数十亿或数万亿个单词中学习,能够生成任何主题或领域的文本。它可以执行各种自然语言任务,如分类、总结、翻译、生成和对话。 大语言模型开发建立在4个核心思想上: 模型 – Models 提示词 - Prompt…...
2022天梯赛补题
题目详情 - L2-041 插松枝 (pintia.cn) 思路:模拟 背包就是个栈,开个stack解决流程思路是,每次取推进器前,尽可能拿背包的,背包拿到不可以时,跳出拿推进器时判断: 如果背包装得下,…...

字节跳动测试岗面试挂在2面,复盘后,我总结了失败原因,决定再战一次...
先说下我基本情况,本科不是计算机专业,现在是学通信,然后做图像处理,可能面试官看我不是科班出身没有问太多计算机相关的问题,因为第一次找工作,字节的游戏专场又是最早开始的,就投递了…...

Nodejs实现通用的加密和哈希算法(MD5、SHA1、Hmac、AES、Diffie-Hellman、RSA),crypto模块详解
crypto crypto模块的目的是为了提供通用的加密和哈希算法(hash)。用纯JavaScript代码实现这些功能不是不可能,但速度会非常慢。Nodejs用C/C++实现这些算法后,通过cypto这个模块暴露为JavaScript接口,这样用起来方便,运行速度也快。 MD5和SHA1 MD5是一种常用的哈希算法,…...

测试行业3年经验,从大厂裸辞后,面试阿里、字节全都一面挂,被面试官说我的水平还不如应届生
测试员可以先在大厂镀金,以后去中小厂毫无压力,基本不会被卡,事实果真如此吗?但是在我身上却是给了我很大一巴掌... 所谓大厂镀金只是不卡简历而已,如果面试答得稀烂,人家根本不会要你。况且要不是大厂出来…...

安卓悬浮窗口, 丝滑双指缩放视频窗口
最重要的事情说前面: demo源码:https://github.com/5800LDW/ProjectFloatingWindow前言:1.跨应用的浮动窗口在网上很多资料, 就不细说了。2.双指缩放View 也很多资料, 可参考:https://blog.csdn.net/zxq614/article/details/88873729正文下面进入正题, 如何把上述结合起来, 下面…...

300左右哪款蓝牙耳机适合学生用?四款便宜质量好的蓝牙耳机推荐
近年来,随着蓝牙耳机的发展,不管是音质、外观、佩戴还是降噪都有了很大的提升。但是我们在入手蓝牙耳机时,最好还是根据预算和需求入手。在此,我来给预算在三百内的朋友推荐几款便宜质量好的蓝牙耳机,可以当个参考。 …...

桥梁设计模式
介绍 Java桥梁模式(也称桥接模式)(Bridge Pattern)是一种设计模式,它将抽象和实现分离,使它们可以独立地变化.它通过一个大类或者一系列紧密关联的类拆分成两个独立的层次结构来实现这种分离,其中一个层次结构包含抽象类或接口,另一个层次结构包含实现类.桥梁模式使得抽象类和…...

【华为OD机试 2023最新 】 新员工座位(C++)
文章目录 题目描述输入描述输出描述用例题目解析C++题目描述 工位由序列F1,F2…Fn组成,Fi值为0、1或2。其中0代表空置,1代表有人,2代表障碍物。 1、某一空位的友好度为左右连续老员工数之和, 2、为方便新员工学习求助,优先安排友好度高的空位, 给出工位序列,求所有空…...

蓝桥杯刷题第二十二天
第一题:受伤的皇后题目描述有一个 nn 的国际象棋棋盘(n 行 n 列的方格图),请在棋盘中摆放 n 个受伤的国际象棋皇后,要求:任何两个皇后不在同一行。任何两个皇后不在同一列。如果两个皇后在同一条 45 度角的…...

CentOS从gcc 4.8.5 升级到gcc 8.3.1
gcc -v查看当前gcc版本。 sudo yum install centos-release-scl-rh安装centos-release-scl-rh。 sudo yum install devtoolset-8-build安装devtoolset-8-build。 显示“Complete!”表示安装成功。 sudo yum install devtoolset-8-gdb安装devtoolset-8-gdb。 显示“Comple…...

【人人都能读标准】12. 原始类型的编码形式
本文为《人人都能读标准》—— ECMAScript篇的第12篇。我在这个仓库中系统地介绍了标准的阅读规则以及使用方式,并深入剖析了标准对JavaScript核心原理的描述。 ECMAScript有7种原始类型,分别是Undefined、Null、Boolean、String、Number、BigInt、Symbo…...

VUE进行前后端交互
目录 一、 跨域 1. 什么是跨域? 2. 什么是本域? 3. 浏览器请求的三种报错 二、SpringBoot解决跨域问题其他前后端跨域请求解决方案 1. SpringBoot上直接添加CrossOrigin 2. 处理跨域请求的Configuration 3. 采用过滤器的方式 3.1 方式一 3.2 方式…...

ThingsBoard Gateway:物联网设备数据采集与集成的强大解决方案
文章目录ThingsBoard Gateway:物联网设备数据采集与集成的强大解决方案1\. ThingsBoard Gateway:概述2\. 主要特点与优势3\. 应用场景4\. 如何使用ThingsBoard Gateway:物联网设备数据采集与集成的强大解决方案 随着物联网(IoT&a…...

什么是镜像/raid
镜像(Mirroring)是一种文件存储形式,是冗余的一种类型,一个磁盘上的数据在另一个磁盘上存在一个完全相同的副本即为镜像。可以把许多文件做成一个镜像文件,与GHOST等程序放在一个盘里用GHOST等软件打开后,又…...

【Python】如何有效比较两个时间序列在图形上的相似度?
文章目录前言一、1.准备二、实操1.使用Matplotlib可视化比较两个时间序列2.计算两个时间序列的相关系数:3.使用Python实现动态时间规整算法(DTW):总结前言 比较两个时间序列在图形上是否相似,可以通过以下方法&#x…...

JavaEE-常见的锁策略和synchronized的锁机制
目录常见的锁策略乐观锁和悲观锁轻量级锁和重量级锁自旋锁和挂起等待锁普通互斥锁和读写锁公平锁和非公平锁可重入锁和不可重入锁synchronized的锁机制synchronized特性锁升级/锁膨胀锁消除锁粗化常见的锁策略 乐观锁和悲观锁 乐观锁和悲观锁主要是看主要是锁竞争的激烈程度.…...

信息化,数字化,智能化是三种不同的概念吗?
前两年流行“信息化”,网上铺天盖地都是关于“信息化”的文章,这两年开始流行起“数字化”,于是铺天盖地都是“数字化”的文章。(这一点从数字化和信息化这两个关键词热度趋势就可以看出来)。 但点开那些文章仔细看看…...

【华为OD机试 2023最新 】 匿名信(C++ 100%)
题目描述 电视剧《分界线》里面有一个片段,男主为了向警察透露案件细节,且不暴露自己,于是将报刊上的字减下来,剪拼成匿名信。 现在又一名举报人,希望借鉴这种手段,使用英文报刊完成举报操作。 但为了增加文章的混淆度,只需满足每个单词中字母数量一致即可,不关注每个…...

硬件语言Verilog HDL牛客刷题day05 时序逻辑部分
1.VL29 信号发生器 1.题目: 题目描述: 请编写一个信号发生器模块,根据波形选择信号wave_choise发出相应的波形:wave_choice0时,发出方波信号;wave_choice1时,发出锯齿波信号;wave…...

Ajax 入门
前端技术:在浏览器中执行的程序都是前端技术。如 html、css、js 等 后端技术:在服务器中执行的长须,使用 Java 等语言开发的后端程序。servlet,jsp,jdbc,mysql,tomacat 等 全局刷新 使用表单…...

半导体器件基础06:发光二极管
说在开头:关于玻尔原子模型(1) 卢瑟福的模型面临着与经典电磁波理论的矛盾,按照经典电磁波理论,卢瑟福的原子不可能稳定存在超过1秒钟。玻尔面临着选择:要么放弃卢瑟福模型,要么放弃麦克斯韦伟…...

AutoCV第二课:Python基础
目录Python基础前言1.流程控制1.1 条件语句1.2 循环语句1.2.1 while循环语句1.2.2 for循环语句1.3 作业1.4 拓展-try except语法2.函数2.1 函数定义2.2 函数的参数2.2.1 位置参数2.2.2 命名参数2.2.3 默认参数2.2.4 可变参数2.2.5 参数展开2.3 递归函数2.3.1 递归函数定义2.3.2…...

LeetCode算法 打家劫舍 和 打家劫舍II C++
目录题目 打家劫舍参考答案题目 打家劫舍II参考答案题目 打家劫舍 你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯…...

蓝桥杯刷题冲刺 | 倒计时10天
作者:指针不指南吗 专栏:蓝桥杯倒计时冲刺 🐾马上就要蓝桥杯了,最后的这几天尤为重要,不可懈怠哦🐾 文章目录1.有边数限制的最短路2.九进制转十进制1.有边数限制的最短路 题目 链接: 853. 有边数…...

个人练习-Leetcode-剑指 Offer II 109. 开密码锁
题目链接:https://leetcode.cn/problems/zlDJc7/ 题目大意:给出一个四位数字的密码锁,初始状态是0000,目标是targer。每一次转动只能让一个位的轮盘转动一下(0往后转是9)。有一个vector<string> dea…...

四个常见的Linux面试问题
四个常见的Linux面试问题。 刚毕业要找工作了,只要是你找工作就会有面试这个环节,那么在面试环节中,有哪些注意事项值得我的关注呢?特别是专业技术岗位,这样的岗位询问一般都是在职的工程师,如何在面试环节…...

15、接口(C#)
15.1 什么是接口 接口是指定一组函数成员而不实现它们的引用类型。所以只能类和结构实现接口。 15.2 声明接口 接口声明不能包含以下成员 数据成员静态成员 接口声明只能包含以下类型的费静态成员函数声明: 方法事件索引器属性 这些函数成员的声明不能包含任何实…...

C++中常见的容器类使用方法举例(vector、deque、map、set)
cpp中常见的容器类有vector、list、deque、map、set、unordered_map和unordered_set。 下面将举例直接说明各个容器的使用方法。 文章目录综合示例1. vector:动态数组,支持随机访问2. list:双向链表,支持双向遍历和插入删除3. de…...