1、POD设计,netshoot:latest作为sidecar,用于调试网络。
sdfp2-net.yaml设计
指定IP
annotations:
cni.projectcalico.org/ipAddrs: "[\"172.16.135.135\"]"
指定主机名称
hostname: sdfp2
containers:
- image: mi:v1
......
- image: nicolaka/netshoot:latest
# k apply -f sdfp2-net.yaml
[root@sdfp2 ~]# k get pod
NAME READY STATUS RESTARTS AGE
sdfp2-netshoot-dp-84f4d7b99d-5pvhm 2/2 Running 0 35m
进入sdfp2容器运行服务进程
# k exec -ti sdfp2-netshoot-dp-84f4d7b99d-5pvhm -c sdfp2 -- bash
拷贝license.ini,mid.xml——>/home/cdatc/AirNet/config/gconf/mid/;network.xml——>/home/cdatc/AirNet/config/(也需更新mid.xml,否则提示授权问题)
# /usr/local/redis/bin/redis-server /usr/local/redis/conf/redis.conf 1>/dev/null 2>&1
# /usr/local/redis/bin/redis-server /usr/local/redis/conf/redis_6378.conf 1>/dev/null 2>&1
# setsid bash -c /home/cdatc/AirNet/bin/mnt >/dev/null 2>&1 &
top查看mnt\mid\afp\rfp正常运行
进入sidecar容器查看组播172.16.135.135.50849 > 225.1.0.1.40002
# k exec -ti sdfp2-netshoot-dp-84f4d7b99d-5pvhm -c netshoot -- bash
bash-5.1# tcpdump -i eth0 -n
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), snapshot length 262144 bytes
10:53:34.922499 IP 172.16.135.135.58814 > 225.1.0.1.40003: UDP, length 36
10:53:34.922766 IP 172.16.135.135.48636 > 225.1.0.1.40003: UDP, length 340
10:53:34.939140 IP 172.16.135.135.50849 > 225.1.0.1.40002: UDP, length 1399
k8s集群环境,但是组播在宿主机上和集群中别的node上抓不到,组播只局限在POD内部。
——部署另一个POD,两个POD之间彼此tcpdump看不到对方的组播包。
——添加Service,type: NodePort/ClusterIP测试也看不到对方的组播包。
2、*实际系统上SDFP1将eth1/eth2网线拔掉,eth0的IP改为192.168.15.50,相应修改license.ini和network.xml,抓包组播ok,SDFP1主态,SDD有航迹显示。
#tcpdump -n -i eth0 |grep 192.168.15.50
...IP 192.168.15.50.21136 > 255.1.0.2.40200: UDP,length 442
3、使用sidecar容器修改宿主机的主机名,容器执行命令hostname报错,添加IP地址也报错!Operation not permitted。
——sidecar方式实现容器迁移(修改调度到的宿主机的主机名/IP),不可行!
# hostname fdp2
hostname: sethostname: Operation not permitted
# ifconfig p1p1 168.192.33.33 netmask 255.255.255.0
ifconfig: SIOCSIFADDR: Operation not permitted
——换个思路:(需要测试)需要在容器里面执行 SSH 需要干的一些事情,可以写脚本、一些前置的条件,其实都可以通过像 Init Container 或者另外像 Sidecar 的方式去解决。
4、SMC监控通信及端口(命令的端口46006)
SMC上Stop服务器FDP2的某个进程,日志如下,SMC程序去连FDP2服务器mnt进程监听的46006端口。
[root@SMC1 ~]# tailf /home/cdatc/AirNet/bin/log/SMC1_libmid_smc_0_20220317.log |grep 192.168.5.59
2022-03-17 06:51:50 debug send host cmd[ProStop],host[FDP2],LocalIp[192.168.5.31],remoteip[192.168.5.59],endpoint[tcp://192.168.5.59:46006],respondport[49002],seria[31_smc_41]
[root@FDP2 ~]# netstat -antp |grep mnt
tcp 0 0 0.0.0.0:46006 0.0.0.0:* LISTEN 31409/mnt
tcp 0 0 0.0.0.0:46008 0.0.0.0:* LISTEN 31409/mnt
tcp 0 0 0.0.0.0:46011 0.0.0.0:* LISTEN 31409/mnt
服务器FDP2上mnt进程通过去连接SMC进程的49002/3端口反馈操作结果状态。
[root@SMC1 ~]# netstat -antp |grep smc
tcp 0 0 0.0.0.0:49001 0.0.0.0:* LISTEN 1772/smc
tcp 0 0 0.0.0.0:49002 0.0.0.0:* LISTEN 1772/smc
tcp 0 0 0.0.0.0:49003 0.0.0.0:* LISTEN 1772/smc
假如FDP1(5.58)主态,会通过本机端口46010回复FDP2(5.59):master life。
# tcpdump -Xn -i ens192 port 46010
07:11:17.732704 IP 192.168.5.58.46010 > 192.168.5.59.58700: Flags [P.], seq 420:462, ack 1, win 115, length 42
0x0000: 4500 0052 a303 4000 4006 0bdd c0a8 053a E..R..@.@......:
0x0010: c0a8 053b b3ba e54c 425a 1330 1c55 956a ...;...LBZ.0.U.j
0x0020: 5018 0073 8c0a 0000 0028 6d61 7374 6572 P..s.....(master
0x0030: 6c69 6665 0000 0900 0000 0000 0000 4143 life..........AC
0x0040: 4300 0000 0000 0000 0000 0000 0000 0000 C...............
0x0050: 0000
相应地,FDP2(5.59)为主态,FDP2通过自身端口46011端口回复FDP2(5.58)消息:master life
——即FDP1/2分别使用端口46011和端口46010回复信息:master life
[root@FDP1 log]# tcpdump -Xn -i ens192 port 46011
07:17:00.112806 IP 192.168.5.59.46011 > 192.168.5.58.20213: Flags [P.], seq 210:252, ack 1, win 229, length 42
0x0000: 4500 0052 4e57 4000 4006 6089 c0a8 053b E..RNW@.@.`....;
0x0010: c0a8 053a b3bb 4ef5 f40d 791b 866a 66bc ...:..N...y..jf.
0x0020: 5018 00e5 1e74 0000 0028 6d61 7374 6572 P....t...(master
0x0030: 6c69 6665 0000 0a00 0000 0000 0000 4143 life..........AC
0x0040: 4300 0000 0000 0000 0000 0000 0000 0000 C...............
0x0050: 0000 ..
5、pod、deploy升级、回滚等版本控制命令:
# k set image pod/busybox busybox=busybox:1.28.4
6、docker run 同时使用--network host参数和-h "sdfp3"参数,容器里看到的是-h "mytest"参数生效的主机名,但是容器里/etc/hosts是宿主机的hosts文件,在容器里使用命令hostname设置主机名被禁止“Operation not permitted”;宿主机还是原来的主机名。
# hostname //宿主机的主机名
sdfp2
# docker run -itd -h "mytest" --network host busybox sh
# docker exec -ti 5f7dc87ad7e5cae092 sh //容器内的主机名
# hostname
mytest
# hostname test2
hostname: sethostname: Operation not permitted
7、二所使用的软件sshpass-1.06-2.el7.x86_64.rpm,使用前提:对于未连接过的主机。而又不输入yes进行确认,需要进行sshd服务的优化。
使用容器ictu/sshpass
# sshpass -p 123456 ssh root@192.168.31.201 "hostname mytest"
# sshpass -p 123456 ssh root@192.168.31.201 "hostname"
mytest
以下非交互方式ssh到192.168.31.201主机修改hostname为“ChtoFDP2”
# docker run --rm -it ictu/sshpass -p 123456 ssh -o StrictHostKeyChecking=no root@192.168.31.201 "hostname ChtoFDP2"
8、服务器容器调度到不同主机时,初始化容器先修改该主机的主机名,并添加对应IP,这样业务容器就能正常运行,即实现Pod的自由调度,由于Pod调度到的Node是不固定的,所以需要通过环境变量( MY_NODE_IP)把Node的IP地址信息呈现给Pod中运行的容器。Pod 如何使用环境变量把自己的信息呈现给 Pod 中运行的容器。 环境变量可以呈现 Pod 的字段和容器字段。参见链接:
https://kubernetes.io/zh/docs/tasks/inject-data-application/environment-variable-expose-pod-information/
env
字段是一个 EnvVars. 对象的数组。 数组中第一个元素指定 MY_NODE_NAME
这个环境变量从 Pod 的 spec.nodeName
字段获取变量值。 同样,其它环境变量也是从 Pod 的字段获取它们的变量值。
command: ["/bin/sh","-c","--"]
args:
- |
sshpass -p 123456 ssh -o StrictHostKeyChecking=no root@$MY_NODE_IP "ip addr add 192.168.5.51/32 dev ens4 ; hostname sdfp2"
env:
- name: MY_NODE_IP
valueFrom:
fieldRef:
fieldPath: status.hostIP
9、要实现多节点自由调度,需去掉hostname方式的nodeSelector。
nodeSelector:
kubernetes.io/hostname: k8s-node03
但是由于被调度的节点ip addr增加IP对网卡名有要求(ens4),需要给集群中的节点添加标签。Pod 将被调度到有nicname: ens4标签的节点。
kubectl label nodes <your-node-name> nicname=ens4
containers:
nodeSelector:
nicname: ens4
或者使用强制节点亲和性配置 pod 只会被调度到具有nicname: ens4标签的节点上。
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: nicname
operator: In
values:
- ens4
不同的自动化服务器Pod不能调度到同一个节点,反亲和性“如果 X 节点上已经运行了一个或多个 满足规则 Y 的 Pod, 则这个 Pod 应该(或者在反亲和性的情况下不应该)运行在 X 节点”
10、关于组播问题:SDFP2的Pod使用网卡ens4的第一个IP(192.168.31.10)输出组播,MSDP1、FDP1使用物理服务器,SDD上单雷达和多雷达显示正常(雷达目标明显少,约30%),相关正常。
# tcpdump -i eth0 port 40202 |grep 31.10
11:16:21.310068 IP 192.168.31.10.44931 > 225.1.0.2.40202: UDP, length 472
11:16:21.410585 IP 192.168.31.10.37151 > 225.1.0.2.40202: UDP, length 36
删掉SDFP2的Pod宿主机的IP:192.168.5.51后,雷达显示同上。说明组播输出对源IP没有要求,只要mid进程能将数据从约定的组播地址和端口(225.1.0.2.40202)送出即可。
# ip addr delete 192.168.5.51/32 dev ens4
11、Pod不能Mount运行进程:
containers:
volumeMounts:
- name: bin
mountPath: /home/cdatc/AirNet/bin
volumes:
- name: bin
hostPath:
path: /home/AirNetBin
否则运行时报错提示:libudisks2.so.0
# bash -c ./mnt
./mnt: error while loading shared libraries: libudisks2.so.0: cannot open shared object file: No such file or directory
12、问题:在SMC上开关容器服务进程操作失败,OperationTips! operate failed!容器里的mnt/mid进程没有日志文件。
——可能是mnt收到进程开关信息,开关本机进程的命令容器里没有。
——看日志里面写系统信号量加锁失败,处理里面使用系统信号量锁返回失败,提示权限不对,容器系统可能缺少什么东西。
——物理机和容器服务器之间主备切换操作OK。
kill杀进程,setsid启程序,ssh上去手动启动mnt的话,如果./mnt这样,ssh退出,mnt就停止了。正常情况下,mnt应该有两个进程号,pgrep mnt得返回两个进程号(一般是 setsid ./mnt &)
——测试:cd /home/cdatc/AirNet/bin/ 然后执行setsid ./mnt & ,问题依旧。
containers:
- name: fdp
image: fdp:v1
workingDir: /home/cdatc/AirNet/bin/
command: ["/bin/sh", "-c", "setsid ./mnt &"]
setsid ./mnt &
容器中运行命令,异常退出。
# bash -c setsid ./mnt >/dev/null 2>&1 &
容器中以下命令运行OK:有setsid时不能加bash -c !!!
#setsid ./mnt >/dev/null 2>&1 &
*:SDFP1虚拟机可以:“sudo QML2_IMPORT_PATH=/usr/AirNet/lib/Qt5/qml QT_PLUGIN_PATH=/usr/AirNet/lib/Qt5/plugins PGM_TIMER=CLOCK_GETTIME setsid bash -c ./mnt”
# pstree
systemd─┬─NetworkManager───2*[{NetworkManager}]
├─sudo───mnt─┬─mnt
│ ├─ping
│ └─28*[{mnt}]
# ps -aux |grep mnt
root 2842 0.0 0.0 218552 4088 ? S 12月08 0:00 sudo QML2_IMPORT_PATH=/usr/AirNet/lib/Qt5/qml QT_PLUGIN_PATH=/usr/AirNet/lib/Qt5/plugins PGM_TIMER=CLOCK_GETTIME setsid bash -c ./mnt
root 2852 6.0 0.4 2215404 34144 ? Ssl 12月08 360:18 ./mnt
root 3231 0.2 0.0 281260 2956 ? S 12月08 14:39 ./mnt