分类 Linux 下的文章

从centos7迁移到ubuntu,记录一下

sudo apt update
sudo apt upgrade
#这里是安装跟之前一样版本的数据库,按自己的来
sudo apt install mysql-server
systemctl statu mysql
systemctl status mysql
sudo apt install php7.4
#安装依赖
sudo apt install php-mysql
php -m | grep mysqli
php -m | grep pdo
sudo apt install nginx
#装完发现nginx起不来,php自带了apache2,端口冲突了,停了apache2换成nginx
sudo systemctl stop apache2
sudo systemctl disable apache2
sudo systemctl start nginx
sudo systemctl status nginx
#安装nginx的依赖
sudo apt install php-fpm
vi /etc/nginx/sites-available/default
#修改nginx的配置,如果配置了伪静态要改成我这样
#其他拦截规则、日志等配置请按需配置
#nginx默认14天切一次日志,如果要改去logrotate里面nginx配置文件修改
location / {
    try_files $uri $uri/ /index.php$is_args$args;
}


# 处理 PHP 文件
location ~ \.php$ {
    include snippets/fastcgi-php.conf;
    fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;  # 根据你的 PHP 版本修改路径
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
}

location ~ /\.ht {
    deny all;
}

sudo nginx -t
sudo systemctl reload nginx
sudo systemctl enable nginx

#可以在/var/www/html下创建个info.php来看下有没有正常提供服务,不过看完记得删
#成功切换应该看到$_SERVER['SERVER_SOFTWARE']    nginx/xxx
#从原服务器备份数据库,在新服务器创建完成创建数据库、创建用户、权限分配、导入
mysql -u root -p
CREATE DATABASE 库;
CREATE USER '用户'@'localhost' IDENTIFIED BY 'your_password';
GRANT ALL PRIVILEGES ON 库.* TO '用户'@'localhost';
FLUSH PRIVILEGES;

sudo apt install php-mbstring
sudo systemctl restart php7.4-fpm  # 其他版本根据实际情况修改
sudo systemctl restart nginx
#下载解压typecho https://docs.typecho.org/install
#因为是迁移,要注意目录和原来保持一致,修改nginx root
#如果nginx工作进程是以www-data启动的,要修改目录属主
sudo chown -R www-data:www-data /目录/uploads
#访问ip/install.php,进行安装
#安装完成后访问ip,如果能够正常显示博客内容则表示成功迁移了
#迁移原来的图片,放在相同目录下

#现在来配置https,用的let's encrypt
#在签名之前请先修改dns解析记录,不然会签名失败
sudo apt install certbot python3-certbot-nginx
sudo certbot --nginx -d xxx.site -d www.xxx.site
#在申请过程中可以直接选择要不要强制跳转https,选了会自动改nginx,如果没选得手动改
#配置完成后certbot可以自动续签证书
#查看签名信息
sudo certbot certificates
#certbot日志
sudo less /var/log/letsencrypt/letsencrypt.log
#查看证书
sudo openssl x509 -in /etc/letsencrypt/live/xxx/fullchain.pem -text -noout

关闭所有文章评论区的方法:

UPDATE `xxx_contents` 
SET `allowComment` = '0' 
WHERE `type` = 'post';

linux

三次握手

1.jpg

Client调用connect(),向server发送syn,如果出现丢包现象,client会重传syn,具体重传次数由tcp_syn_retries决定。同理还有控制syn+ack包重传次数的tcp_synack_retries

cat /proc/sys/net/ipv4/tcp_syn_retries
6

cat /proc/sys/net/ipv4/tcp_synack_retries
5

要注意的是,每一次重传所等待的时间都是上一次的两倍,tcp_syn_retries默认值为6,假设第一次等待1s,这代表要等待1+2+4+8+16+32+64=127秒后才会Timeout,这会导致大量的堵塞,建议调小

服务器收到SYN但还没回复SYN+ACK时,会去创建一个半连接,放在syn queue中,如果服务器的半连接数已经达到上限,新的半连接会被丢弃,所以服务器不回应也可能和此有关,可以适当调大
半连接上限控制的参数为

cat /proc/sys/net/ipv4/tcp_max_syn_backlog
4096

同理还有全连接上限的控制

cat /proc/sys/net/core/somaxconn
4096

半连接积压过多,也可能和遭受SYN Flood攻击导致,可以开启SYN Cookie机制,在收到SYN的时候不分配资源,根据SYN包计算出一个Cookie随着SYN+ACK一起返回回去,等收到ACK包而且Cookie没问题才分配资源创建链接
net.ipv4.tcp_syncookies = 1

全连接满了后,linux会丢弃新建的全连接,丢弃可以选择是否要通知对方reset,默认是不通知,也建议不通知,这样可以让对方进行重试

cat /proc/sys/net/ipv4/tcp_abort_on_overflow
0

使用这条指令可以看当前所有连接统计数据
netstat -an | awk '/^tcp/ {++s[$NF]} END {for(a in s) print a, s[a]}'
查看半连接、全连接数、当前的全连接队列

netstat -natp | grep SYN_RECV | wc -l
netstat -natp | grep ESTABLISHED | wc -l
ss -lnt |grep port

3.png

四次挥手

2.png
一方发起FIN包,另一方收到后,如果数据已经处理完了,会回复ACK+FIN包,如果没处理完,会先ACK,等完成了再FIN,这时发起方回复ACK,自己断开。而在收到对方ACK但还没收到FIN包这期间,也就是FIN_WAIT_2,如果过长时间没收到对方的消息也会自动断开,这个时间也由参数控制,默认60s,可以改短避免浪费资源

cat /proc/sys/net/ipv4/tcp_fin_timeout
60

同理还有Time_wait,默认也为60s,这个要通过sysctl去修改

sudo vim /etc/sysctl.conf
net.ipv4.tcp_fin_timeout = 5

sudo sysctl -p

https://andyx.net/modifying_linux_kernel_parameters_to_reduce_time-wait_connection/

处于time_wait状态的连接可以被复用,这样就不用浪费资源再开一个连接了,也在一定程度上解决端口有限问题,对客户端一方有效。注意还有个recycle的参数,那个不建议开,会引起NAT丢包

cat /proc/sys/net/ipv4/tcp_tw_reuse
2

+ 0 - disable
+ 1 - global enable
+ 2 - enable for loopback traffic only

容器网络ns

容器使用Network namespace来进行网络资源的隔离,具体隔离的有以下几种资源:

  1. 网络设备,如lo,eth0,可通过ip link查看
  2. TCP和UDP的协议栈
  3. 路由表,可用ip route查看
  4. 防火墙规则,iptables
  5. 网络状态信息,一般在/proc/net和/sys/class/net

使用lsns -t net可以查看当前设备上的网络ns,使用nsenter进入
因为ns的缘故,直接去修改宿主机的部分内核参数,是无法在容器里起作用的。而容器中这些参数是只读的,无法修改,如果要修改必须通过docker或者k8s来去修改runC的接口,docker是docker –sysctl,k8s是allowed-unsafe-sysctls

docker run -d --name net_para --sysctl net.ipv4.tcp_keepalive_time=600 centos:8.1.1911 sleep 3600
7efed88a44d64400ff5a6d38fdcc73f2a74a7bdc3dbc7161060f2f7d0be170d1
docker exec net_para cat /proc/sys/net/ipv4/tcp_keepalive_time
600

实操技巧

进入容器网络ns

kubectl get pods xxx -o wide获取node名
登录node
获取容器进程id:
docker:
docker ps| grep $pod
docker inspect -f {{.State.Pid}} 容器id
containerd:
crictl ps | grep podname
crictl inspect 容器id | jq '.info.pid'
进入容器的网络命名空间
nsenter --target pid -n

筛选抓取

netstat -ant查看当前开放的端口
https://www.baeldung.com/linux/tcpdump-capture-ssl-handshake

偶发性问题抓包:循环抓包
指定抓包文件数,按单个文件的大小或者抓取的时长进行切割,超过指定生成的文件数之后循环覆盖旧文件
示例:
-W 个数:生成的循环文件数量,生成到最大数量后,新的报文数据会覆盖写入第一个文件
-C 尺寸:每个文件的大小,单位是 MB
-G 间隔时间:每次新生成文件的间隔时间,单位是分钟
每 100MB 或者 60 分钟就生成一个文件,一共 10 个文件
tcpdump -i eth0 -w file.pcap -W 10 -C 100 -G 60

wireshark筛选:
ip筛选 ip.addr ip.src ip.dst eq xxx
日期筛选 frame.time > "feb 01, 2024" and frame.time < "mar 01, 2024 00:00:00"
标志位筛选 tcp.flags.rst eq 1
长度筛选 tcp.len eq xx
报文模糊筛选 tcp.payload contains xxx

k8s网络

登录到节点,lsns -t net可以查看到当前节点上的网络命名空间,其中有一些看到是pause,这些是容器的sandbox,k8s使用sandbox容器来创建和维持命名空间,他也是进程空间中的pid 1

lsns -t net
        NS TYPE NPROCS     PID USER     NETNSID NSFS                                                COMMAND
4026531992 net     131       1 root  unassigned                                                     /sbin/init
4026532308 net       2    2451 65535          0 /run/netns/cni-d612c07a-e8bf-969a-a2c5-2392a222533e /pause
4026532382 net       4    2622 65535          1 /run/netns/cni-c122169f-f7f0-03b3-1aa0-7ba3a07a3317 /pause
4026532447 net       2    2722 65535          2 /run/netns/cni-723e1b9c-0355-15e1-a4a0-f7926de9c3b2 /pause
4026532515 net       1 2797456 uuidd unassigned                                                     /usr/sbin/uuidd -
4026532575 net       5 2080352 65535          3 /run/netns/cni-6c23adba-e86b-87c1-bd3a-b7be2b18fda9 /pause

获取到pid后也可以直接使用ip来获取和进入对应的命名空间

ip netns identify 2080411
cni-6c23adba-e86b-87c1-bd3a-b7be2b18fda9
ip netns exec cni-6c23adba-e86b-87c1-bd3a-b7be2b18fda9 ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default 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
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0@if9: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UP group default
    link/ether b6:a4:e2:bc:5a:10 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 10.244.0.9/24 brd 10.244.0.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::b4a4:e2ff:febc:5a10/64 scope link
       valid_lft forever preferred_lft forever

同理可以查看其他命名空间,如下例

crictl ps | grep pod-1
8453bb79c5a3f       92b11f67642b6       3 hours ago         Running             nginx                     0                   576ce2a9d00c7       pod-1
crictl inspect 8453bb79c5a3f  | jq '.info.pid'
2080411
lsns -t pid | grep 2080411
4026532639 pid       4 2080411 root  nginx: master process nginx -g daemon off;

从上面的信息我们可以看到,容器的虚拟网卡为eth0,被链接在9号接口上,ip为10.244.0.9
我们来看下这个虚拟网卡连在哪

ip link | grep -A1 ^9
9: vethed920513@if2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue master cni0 state UP mode DEFAULT group default
    link/ether be:99:98:76:2a:42 brd ff:ff:ff:ff:ff:ff link-netns cni-6c23adba-e86b-87c1-bd3a-b7be2b18fda9

可以看到,这块网卡被连在了网桥cni0上面
网桥工作在数据链路层,可以连接多个网段,当有请求进来时,网桥会去所有接口询问是否有认识原始ip的,如果有,发送到那个veth,然后veth发给eth0(容器默认虚拟网卡一般都是eth0)
网卡和veth绑定关系还可以使用brctl来查看(需要安装

brctl show
bridge name     bridge id               STP enabled     interfaces
cni0            8000.e6f9e02baef7       no              veth8d55a711
                                                        veth92b8f630
                                                        vethcbd8b3fe
                                                        vethed920513

关于网络容器接口CNI可以看这篇介绍文章
https://atbug.com/deep-dive-cni-spec/

同node通信:
pod从自己的eth0发出请求,到达veth,veth通过网桥cni0和其他veth相连,cni0问所有接口认不认识ip,如果有认识的,记录映射关系并转发到该veth,veth再把信息发给eth0

跨node通信:
跨node通信的方式取决于使用的网络插件

额外篇:关于创建VPC和集群时需要考虑的网络问题
https://help.aliyun.com/zh/ack/ack-managed-and-ack-dedicated/user-guide/plan-cidr-blocks-for-an-ack-cluster-2#2e587ee4f46oq

flannel

flannel在安装的时候就会指定CIDR以及和后端类型,可以查看某个node具体所属的网段

kubectl get no nodename -o jsonpath={.spec} | jq
{
  "podCIDR": "10.244.0.0/24",
  "podCIDRs": [
    "10.244.0.0/24"
  ]
}

flannel接收cni-conf.json,输出结果并交给bridge

cat /var/lib/cni/flannel/2fc679ceaa17e33115657688a9b859e89a66c8911bcd9134fad2327830519396 | jq
{
  "cniVersion": "0.3.1",
  "hairpinMode": true,
  "ipMasq": false,
  "ipam": {
    "ranges": [
      [
        {
          "subnet": "10.244.0.0/24"
        }
      ]
    ],
    "routes": [
      {
        "dst": "10.244.0.0/16"
      }
    ],
    "type": "host-local"
  },
  "isDefaultGateway": true,
  "isGateway": true,
  "mtu": 1450,
  "name": "cbr0",
  "type": "bridge"
}

bridge 使用上面的输出连同参数一起作为输入,根据配置完成如下操作:

  1. 创建网桥 cni0(节点的根网络命名空间)
  2. 创建容器网络接口 eth0( pod 网络命名空间)
  3. 创建主机上的虚拟网络接口 vethX(节点的根网络命名空间)
  4. 将 vethX 连接到网桥 cni0
  5. 委托 ipam 插件分配 IP 地址、DNS、路由
  6. 将 IP 地址绑定到 pod 网络命名空间的接口 eth0 上
  7. 检查网桥状态
  8. 设置路由
  9. 设置 DNS

    cat /var/lib/cni/results/cbr0-2fc679ceaa17e33115657688a9b859e89a66c8911bcd9134fad2327830519396-eth0 | jq
    {
      "kind": "cniCacheV1",
      "containerId": "2fc679ceaa17e33115657688a9b859e89a66c8911bcd9134fad2327830519396",
      "config": "ewogICJuYW1lIjogImNicjAiLAogICJjbmlWZXJzaW9uIjogIjAuMy4xIiwKICAicGx1Z2lucyI6IFsKICAgIHsKICAgICAgInR5cGUiOiAiZmxhbm5lbCIsCiAgICAgICJkZWxlZ2F0ZSI6IHsKICAgICAgICAiaGFpcnBpbk1vZGUiOiB0cnVlLAogICAgICAgICJpc0RlZmF1bHRHYXRld2F5IjogdHJ1ZQogICAgICB9CiAgICB9LAogICAgewogICAgICAidHlwZSI6ICJwb3J0bWFwIiwKICAgICAgImNhcGFiaWxpdGllcyI6IHsKICAgICAgICAicG9ydE1hcHBpbmdzIjogdHJ1ZQogICAgICB9CiAgICB9CiAgXQp9Cg==",
      "ifName": "eth0",
      "networkName": "cbr0",
      "cniArgs": [
     [
       "K8S_POD_INFRA_CONTAINER_ID",
       "2fc679ceaa17e33115657688a9b859e89a66c8911bcd9134fad2327830519396"
     ],
     [
       "K8S_POD_UID",
       "2ab4ed63-1aff-40fc-9e40-ab95e0709cc1"
     ],
     [
       "IgnoreUnknown",
       "1"
     ],
     [
       "K8S_POD_NAMESPACE",
       "default"
     ],
     [
       "K8S_POD_NAME",
       "my-nginx-7c79c4bf97-s4jjh"
     ]
      ],
      "capabilityArgs": {
     "dns": {
       "Servers": [
         "10.96.0.10"
       ],
       "Searches": [
         "default.svc.cluster.local",
         "svc.cluster.local",
         "cluster.local"
       ],
       "Options": [
         "ndots:5"
       ]
     },
     "io.kubernetes.cri.pod-annotations": {
       "kubernetes.io/config.seen": "2024-03-21T23:40:40.674628231Z",
       "kubernetes.io/config.source": "api"
     }
      },
      "result": {
     "cniVersion": "0.3.1",
     "dns": {},
     "interfaces": [
       {
         "mac": "e6:f9:e0:2b:ae:f7",
         "name": "cni0"
       },
       {
         "mac": "82:c5:fd:ce:10:42",
         "name": "veth8d55a711"
       },
       {
         "mac": "52:d4:10:d4:6b:2c",
         "name": "eth0",
         "sandbox": "/var/run/netns/cni-c122169f-f7f0-03b3-1aa0-7ba3a07a3317"
       }
     ],
     "ips": [
       {
         "address": "10.244.0.7/24",
         "gateway": "10.244.0.1",
         "interface": 2,
         "version": "4"
       }
     ],
     "routes": [
       {
         "dst": "10.244.0.0/16"
       },
       {
         "dst": "0.0.0.0/0",
         "gw": "10.244.0.1"
       }
     ]
      }
    }

flannel会在每台node上面运行一个flannel.1虚拟网桥。不同node之间进行通信的时候,当cni发现无接口响应,便发送给flannel.1,因为集群给不同Node划分了不同的网段(CIDR),所以可以区分出ip属于哪个node,于是用Udp封装数据包,然后发送给对应的node,对应node上的flannel.1监听8472端口,获取到数据包后解包发给cni
路线为
eth0(容器)-->cni-->flannel.1-->eth(宿主机)-->eth(目标宿主机)-->flannel.1-->cni-->eth0(目标容器)
在修改网络配置的时候,也需要注意CIDR和掩码,以防因为集群扩张而无网段可分配
如:--cluster-cidr=10.244.0.0/12和--node-cidr-mask-size=16,最大节点数为16

变量

env/printenv:查看全局变量

查看单个环境变量:printenv name,echo $name

set:查看局部变量

export name 临时把一个局部变量设置为全局变量,在父shell中修改会影响子shell,但是在子shell中设置的对父shell无用
unset name :删除变量

一些特殊的环境变量
PATH:当你需要运行一个第三方命令时,系统就会去这个变量对应的目录下面查找,只支持绝对路径,使用冒号分隔,export PATH=$PATH:

持久化变量
系统变量:在/etc/profile.d/下创建一个.sh结尾的文件,把export aaa=xxx写进去
个人变量:修改~/.bashrc

监控

进程

ps

ps -ef
-e:显示所有进程
-f:显示完整格式
状态表

< 表示高优先级的进程(not nice to other users)

N 低优先级(nice to other users)

+ 属于某个前台组的进程

s 某一个回话的leader进程

l 线程加锁

+ 后台运行进程组
  
D 不可中断睡眠 (通常是在IO操作) 收到信号不唤醒和不可运行, 进程必须等待直到有中断发生

R 正在运行或可运行(在运行队列排队中)

S 可中断睡眠 (休眠中, 受阻, 在等待某个条件的形成或接受到信号)

T 已停止的 进程收到SIGSTOP, SIGSTP, SIGTIN, SIGTOU信号后停止运行

W 正在换页(2.6.内核之前有效)

X 死进程 (未开启)

Z 僵尸进程 进程已终止, 但进程描述符存在, 直到父进程调用wait4()系统调用后释放BSD风格的
[root@master ~]# ps -ef
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 Feb07 ?        00:01:24 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
root         2     0  0 Feb07 ?        00:00:00 [kthreadd]
root         4     2  0 Feb07 ?        00:00:00 [kworker/0:0H]
root         6     2  0 Feb07 ?        00:01:33 [ksoftirqd/0]
启动用户 进程pid 父进程id 生命周期中cpu使用率 启动时的系统时间 启动的终端 运行累计cpu时间 启动命令

ps -aux
a 显示所有用户的进程(show processes for all users) u 显示用户(display the process's user/owner) x 显示无控制终端的进程(also show processes not attached to a terminal)

[root@master ~]# ps -aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.1  43988  4488 ?        Ss   Feb07   1:24 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
root         2  0.0  0.0      0     0 ?        S    Feb07   0:00 [kthreadd]
root         4  0.0  0.0      0     0 ?        S<   Feb07   0:00 [kworker/0:0H]
启动用户 pid  cpu占用率 内存 完全驻存需要内存 实际使用内存 终端 状态 启动时间 总计cpu时间 启动命令

top

top - 10:49:48 up 34 days, 43 min,  1 user,  load average: 0.31, 0.19, 0.16
Tasks: 119 total,   1 running, 118 sleeping,   0 stopped,   0 zombie
%Cpu(s):  2.7 us,  1.3 sy,  0.0 ni, 95.6 id,  0.2 wa,  0.0 hi,  0.2 si,  0.0 st
KiB Mem :  3733344 total,   178572 free,   898816 used,  2655956 buff/cache
KiB Swap:        0 total,        0 free,        0 used.  2543632 avail Mem 

PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                                                               
18778 root      20   0 1039976 256428  46572 S   2.7  6.9   1053:23 kube-apiserver 
pid 用户    优先级 nice 虚拟内存 物理内存 共享内存 状态

kill/pkill

kill 基于进程号

       kill [-s signal|-p] [-q sigval] [-a] [--] pid...
       kill -l [signal]

pkill基于进程名

NAME
       pgrep, pkill - look up or signal processes based on name and other attributes

SYNOPSIS
       pgrep [options] pattern
       pkill [options] pattern

挂载

查看挂载:mount
查看硬盘使用量:df
查看文件占用存储空间:du
监控cpu和磁盘io情况:iostat

监控文件描述符:lsof
-a file:查看文件占用(-a加不加都行

[root@master 8432]# lsof -a /var/lib/docker/volumes/metadata.db
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF    NODE NAME
dockerd 8432 root  mem-W  REG  253,1    32768 1183817 /var/lib/docker/volumes/metadata.db
dockerd 8432 root   10uW  REG  253,1    32768 1183817 /var/lib/docker/volumes/metadata.db
命令  pid  user  r读w写u读写 文件类型REG为常规文件 主从设备号 文件大小 节点号 名字

-n dev:查看磁盘占用
-p pid:查看进程打开的文件
lsof -i:port 获取端口占用
-d:列出占用文件号的进程

文件处理

排序

sort -t ":" -k number -n item
-t:分隔符
-k:选择栏数
-n:把数字按照数值排序
-r:降序

搜索

grep parten file
-v:反向搜索
-v:显示行数
-c:显示匹配的行数
-e:匹配多个字段 grep -e xx -e ff file
-q:静默

匹配到了返回值0,没有返回1

归档

tar -cvf test.tar test1/ test2/
将两个目录下的问价归档为test.tar

tar -xvf test.tar
解压

去重

uniq
-c:统计
-u:去重

文本处理

awk

awk -F":" '{print $1}'

系统交互

子shell

把进程挂到后台执行并输出重定向
这种方式运行的后台程序不会因为shell的退出而退出,单纯&会使得程序随着shell一起结束
nohup xxxx >> /tmp/xxx 2>&1 &

查看后台运行中的进程
jobs -l
加号表示当前运行的程序,-表示下一个将要运行的程序
如果想要恢复一个被暂停的进程,可以用bg或者fg+pid,分别对应后台和前台运行

[root@master ~]# nohup sleep 10 >> /tmp/test.log  2>&1 &
[1] 16671
[root@master ~]# jobs -l
[1]+ 16671 Running                 nohup sleep 10 >> /tmp/test.log 2>&1 &
[root@master ~]# jobs -l
[1]+ 16671 Done                    nohup sleep 10 >> /tmp/test.log 2>&1

查询命令文件

[root@master ~]# which echo
/usr/bin/echo

打印程序所使用的共享库列表:ldd

定时任务 at/crontab

创建随机字符串
openssl rand -base64 n

网络

查看域名解析:nslookup

查看网络连接:netstat
-at :显示所有tcp端口
-lt:显示所有tcp监听中的端口
-st:统计所有tcp连接的情况
-pt:显示tcp及对应的pid
-r:显示核心路由信息

找出程序运行的端口
netstat -ap| grep docker

显示数据包到目标地址之间的跳转:tracerout
如果显示*,那是返回数据被防火墙给过滤了
-n 只显示ip不显示主机名
-m number 跳数限制
-w number 探测包等待响应时间

telnet 测试目标端口连通性

快速查看自己的公网ip
curl ifconfig.me

日志

dmesg:内核日志

journalctl
-k dmesg
-f follow
journalctl --since "2021-01-01" --until "2021-09-16 13:40" 查看指定时间内的日志
-n number 显示尾部几行
journalctl _PID=665 查看指定进程的日志
journalctl UID=33 --since today 查看指定用户
-b 本次启动的日志
如果想查看上次的,需要修改系统设置
https://zhuanlan.zhihu.com/p/410995772
修改/var/log/journal
[Journal]
Storage=persistent
systemctl restart systemd-journald


准备个容器

apiVersion: apps/v1
kind: Deployment
metadata: 
  name: busybox
  labels: 
    app: busybox
spec: 
  replicas: 1
  selector: 
    matchLabels: 
      app: busybox
  template:
    metadata:
      labels:
        app: busybox
    spec:
      containers:
        - name: busybox
          image: centos:latest
          ports:
          - name: http
            containerPort: 8080
            protocol: TCP
          command: ["/bin/sh"]
          args: ["-c","sleep 1000"]

让我们看看他默认状态下访问百度是什么样的

[root@master ~]# kubectl exec -it busybox-54b6dd484b-9pc22 -c busybox -- sh
sh-4.4# ping baidu.com
PING baidu.com (39.156.66.10) 56(84) bytes of data.
64 bytes from 39.156.66.10 (39.156.66.10): icmp_seq=1 ttl=51 time=9.05 ms
64 bytes from 39.156.66.10 (39.156.66.10): icmp_seq=2 ttl=51 time=9.05 ms

好,让我们nslookup一下阿里云的ip,挑选其中一个

nslookup aliyun.com
Server:         100.100.2.136
Address:        100.100.2.136#53

Non-authoritative answer:
Name:   aliyun.com
Address: 106.11.249.99

加上一点小小的魔法

apiVersion: apps/v1
kind: Deployment
metadata: 
  name: busybox
  labels: 
    app: busybox
spec: 
  replicas: 1
  selector: 
    matchLabels: 
      app: busybox
  template:
    metadata:
      labels:
        app: busybox
    spec:
      hostAliases: 
      - ip: "106.11.249.99"
        hostnames: 
        -  "baidu.com"
      containers:
        - name: busybox
          image: centos:latest
          ports:
          - name: http
            containerPort: 8080
            protocol: TCP
          command: ["/bin/sh"]
          args: ["-c","sleep 1000"]

再进去看看,乐

[root@master ~]# kubectl exec -it busybox-7995d79d96-pnm2f -c busybox -- sh
sh-4.4# ping baidu.com
PING baidu.com (106.11.249.99) 56(84) bytes of data.
64 bytes from baidu.com (106.11.249.99): icmp_seq=1 ttl=48 time=26.7 ms
64 bytes from baidu.com (106.11.249.99): icmp_seq=2 ttl=48 time=26.7 ms

当你想要给你的应用配置某个dns,但是又不想直接修改coredns以影响整个集群的时候,你就可以使用这个