Linux
sar
- 查看所有cpu使用率
[root@node1 ~]# sar -P ALL 1
Linux 3.10.0-957.12.2.el7.x86_64 (node1) 11/02/2022 _x86_64_ (56 CPU)
12:29:50 PM CPU %user %nice %system %iowait %steal %idle
12:29:51 PM all 15.05 0.00 5.44 0.31 0.00 79.20
12:29:51 PM 0 16.49 0.00 6.19 0.00 0.00 77.32
12:29:51 PM 1 14.29 0.00 10.20 1.02 0.00 74.49
12:29:51 PM 2 13.13 0.00 4.04 1.01 0.00 81.82
12:29:51 PM 3 13.27 0.00 4.08 2.04 0.00 80.61
12:29:51 PM 4 13.27 0.00 6.12 1.02 0.00 79.59
12:29:51 PM 5 15.62 0.00 7.29 0.00 0.00 77.08
12:29:51 PM 6 15.62 0.00 8.33 0.00 0.00 76.04
mpstat -P ALL也可以实现以上效果
top
- 可通过‘y’和‘b’加粗正在运行的进程,‘x’对排序的列高亮显示,‘z’对显示的颜色(颜色/黑白)进行切换,四个键可配合使用实现以下效果:
- 在是按"%CPU"进行排序的,可以按”shift+>”或者”shift+<”左右改变排序序列
- 在top基本视图中,敲击”f”进入另一个视图,在这里可以编辑基本视图中的显示字段
- top -o 【filed】可以按指定列进行排序,如top -o S根据运行状态排序,可以通过x + R快速查看到R状态的进程
- top + 3可以选择显示哪颗node上的cpu使用率,+2可以分别显示每个node上的cpu使用率,
- 可以通过以下按键改变列的排序:
N - 以 PID 的大小的顺序排列表示进程列表
P - 以 CPU 占用率大小的顺序排列进程列表
M - 以内存占用率大小的顺序排列进程列表
T - 以cpu的使用时间排序
如,通过排序可以查找出最大内存占用的进程 - 其他:
n - 设置在进程列表所显示进程的数量
s - 改变画面更新周期
R - 可以将当前的排序倒转
L - 查找指定字符串的进程
V - 树状显示进程
c - 显示完整命令行进程名称
top -O 输出支持列名称
pvmove
当我们要替换掉lvm中的一块磁盘时,要保证里面没有数据,需要使用pvmove进行数据迁移
[root@k8master ~]# pvmove /dev/vdb
/dev/vdb: Moved: 0.01%
/dev/vdb: Moved: 2.21%
/dev/vdb: Moved: 6.18%
cfdisk
fdisk有时候会分区失败,可尝试使用cfdisk
[root@k8master ~]# cfdisk /dev/vda
cfdisk (util-linux 2.23.2)
Disk Drive: /dev/vda
Size: 128849018880 bytes, 128.8 GB
Heads: 16 Sectors per Track: 63 Cylinders: 249660
timedatectl
timedatectl命令对于RHEL / CentOS 7和基于Fedora 21+的分布式系统来说,是一个新工具,它作为systemd系统和服务管理器的一部分,代替旧的传统的用在基于Linux分布式系统的sysvinit守护进程的date命令。
timedatectl命令可以查询和更改系统时钟和设置,你可以使用此命令来设置或更改当前的日期,时间和时区,或实现与远程NTP服务器的自动系统时钟同步。
可以通过使用来自于终端使用timedatectl命令的NTP,设置date、time、timezone和synchronize time来管理时间。让你的Linux服务器或系统保持正确的时间是一个很好的实践,它有以下优点:
1)维护及时操作的系统任务,因为在Linux中的大多数任务都是由时间来控制的。
2)记录事件和系统上其它信息等的正确时间。
- 要显示系统的当前时间和日期,使用命令行中的timedatectl命令,如下:
[root@develop ~]# timedatectl status
Local time: Wed 2018-10-31 14:05:51 CST
Universal time: Wed 2018-10-31 06:05:51 UTC
RTC time: Wed 2018-10-31 06:05:53
Time zone: Asia/Shanghai (CST, +0800)
NTP enabled: n/a
NTP synchronized: no
RTC in local TZ: no
DST active: n/a
[root@develop ~]#
RTC time(real-time clock)是指硬件时钟时间
Time zone:时区
- 查看系统所有可用的时区
[root@develop ~]# timedatectl list-timezones
Africa/Abidjan
Africa/Accra
Africa/Addis_Ababa
Africa/Algiers
Africa/Asmara
Africa/Bamako
Africa/Bangui
Africa/Banjul
- 设置系统时区
[root@develop ~]# timedatectl set-timezone Asia/Shanghai
[root@develop ~]#
- 设置Linux中的时间。只设置时间的话,我们可以使用set-time开关以及HH:MM:SS(小时,分,秒)的时间格式。
[root@develop ~]# timedatectl set-time 14:17:01
[root@develop ~]#
- 将硬件时钟设置为本地时区
timedatectl set-local-rtc 1
- 将硬件时钟设置为协调世界时(UTC)
timedatectl set-local-rtc 0
- 将Linux系统时钟同步到远程NTP服务器
NTP即Network Time Protocol(网络时间协议),是一个互联网协议,用于同步计算机之间的系统时钟。timedatectl实用程序可以自动同步你的Linux系统时钟到使用NTP的远程服务器。
注意,你必须在系统上安装NTP以实现与NTP服务器的自动时间同步。
要开始自动时间同步或禁止同步远程NTP服务器时间,在终端键入以下命令。
# timedatectl set-ntp true
# timedatectl set-ntp false
arping
arp在获取目标ip的mac后,会缓存一段时间,所以当目标IP的mac变更后需要通知其他设备 更新arp缓存,此时就可以通过以下命令完成
arping -U
compgen
可用来返回系统所有的用户
compgen -u
arptable
设置arp规则表,如禁止virtual_ip的arp请求
arptables -A IN -d <virtual_ip> -j DROP
arptables -A OUT -s <virtual_ip> -j mangle --mangle-ip-s <real_ip>
openstack
placement管理
openstack --os-placement-api-version 1.6 trait list --sort-column name
openstack --os-placement-api-version 1.2 resource class list --sort-column name
加载meta信息
加载后可在flavor中查看这些元数据
glance-manage db_load_metadefs
打开路由的外部网络snat功能,使得无浮动ip的vm依然可以访问公网,命令如下:
[root@vs-controller1 ~(VisionStack)]$ openstack router set --external-gateway 8dc253e4-cb7c-4ce4-9db7-ce501c070caf --enable-s
nat e762fefa-ddc8-4d03-9f31-9f1c613d85a3
原理解析
1)当enable-snat为True时,会对VM的固定ip进行snat转换,转换成外部网络的地址,该过程是在snat命名空间中由iptables完成,如下所示:
Chain neutron-l3-agent-snat (1 references)
target prot opt source destination
neutron-l3-agent-float-snat all -- 0.0.0.0/0 0.0.0.0/0
SNAT all -- 0.0.0.0/0 0.0.0.0/0 to:124.160.117.108 (该规则将源ip转换为124.160.117.108)
SNAT all -- 0.0.0.0/0 0.0.0.0/0 mark match ! 0x2/0xffff ctstate DNAT to:124.160.117.108
通过抓包可以确认vm源IP已变为124.160.117.108
17:40:37.507285 IP 124.160.117.108 > 114.114.114.114: ICMP echo request, id 1311, seq 4, length 64
17:40:37.526980 IP 114.114.114.114 > 124.160.117.108: ICMP echo reply, id 1311, seq 4, length 64
2)当enable-snat为False时,不会对vm的固定ip进行snat(源地址替换)转换,由于vm的固定ip为云内网络,无法完成云外网络的访问,iptables规则如下:
neutron-l3-agent-float-snat all -- 0.0.0.0/0 0.0.0.0/0
SNAT all -- 0.0.0.0/0 0.0.0.0/0 mark match ! 0x2/0xffff ctstate DNAT to:124.160.117.108
注意:无论是否开启snat,snat中的qg口都会存在snat ip(124.160.117.108)
更新浮动IP池
neutron subnet-update 52ae4db1-b8aa-4f4f-aee8-9818b7ff3ae5 --allocation-pools type=dict list=true start=60.191.72.103,end=60.191.72.109 start=60.191.72.100,end=60.191.72.100
更新子网DNS
neutron subnet-update 2997b922-c62b-4280-8121-79dbd36fc253 --dns_nameservers list=true 223.5.5.5 114.114.114.114 223.6.6.6
docker
docker ps
列出所以容器实例
-a:包含已终止的容器
-l:列出最后一次运行的容器
-q:只返回id
[root@docker-test-18d031cc merged]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
999ae928e834 ubuntu "/bin/bash" 17 minutes ago Exited (0) 4 seconds ago zealous_jennings
说明:STATUS为容器状态,上面示例中为容器已退出,状态码为0
docker run
启动一个容器
-d:后台运行
-t:创建一个tty终端
-i:交互式模式
-p:映射容器内端口至宿主机,如 -p 80(将)
[root@docker-test-18d031cc ~]# docker run --name daemon_test -d ubuntu /bin/sh -c "while true;do echo hello world;sleep 1;done"
fd032195ed02833f4ba59f65aa548316802559d73eb29c606d9baa203ea81059
docker start
重新启动一个已经停止的容器,会沿用docker run命令时指定的参数
[root@docker-test-18d031cc ~]# docker start 999ae928e834
docker attach
重新附着到容器的会话上
[root@docker-test-18d031cc ~]# docker attach 999ae928e834
root@999ae928e834:/# ls
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
docker logs
获取容器日志
-f:跟踪日志,与tail -f相似
–tail 10:打印最后10行
-t:日志加上时间戳
[root@docker-test-18d031cc log]# docker logs --tail 10 -t daemon_test
2019-10-14T03:36:25.897660000Z hello world
2019-10-14T03:36:26.898865000Z hello world
2019-10-14T03:36:27.900556000Z hello world
docker top
查看容器内部运行的进程
[root@docker-test-18d031cc log]# docker top daemon_test
UID PID PPID C STIME TTY TIME CMD
root 17616 17597 0 11:20 ? 00:00:00 /bin/sh -c while true;do echo hello world;sleep 1;done
root 19427 17616 0 11:39 ? 00:00:00 sleep 1
docker exec
在容器内部运行进程
[root@docker-test-18d031cc log]# docker exec -d daemon_test touch /etc/hjtest
[root@docker-test-18d031cc log]# docker exec -i -t daemon_test /bin/bash
docker stop
停止容器内的守护进程
[root@docker-test-18d031cc log]# docker stop daemon_test
daemon_test
[root@docker-test-18d031cc log]# docker ps -n 1
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
fd032195ed02 ubuntu "/bin/sh -c 'while..." 29 minutes ago Exited (137) 33 seconds ago daemon_test
docker restart
自动重启容器
–restart=always:无论容器退出码是什么都会一直重启
–restart=on-failure:5 退出码为非0时重启5次
[root@docker-test-18d031cc log]# docker run --restart=on-failure:2 --name daemon_test -d ubuntu /bin/sh -c "while true;do echo
hello world;sleep 1;done"
bb3d632be42bc55f08d563b1e416c310f79320669bad4801f1b6f085cdd01646
docker inspect
查看容器详细信息
–format:格式化输出,可自定义查看内容
[root@docker-test-18d031cc log]# docker inspect daemon_test
[
{
"Id": "03d2b20d10a1257430cca615f569c074c600b6a80177c6121fcf0d4325dfb464",
"Created": "2019-10-14T03:56:38.802914484Z",
"Path": "/bin/sh",
"Args": [
"-c",
"while true;do echo hello world;sleep 1;done"
],
[root@docker-test-18d031cc log]# docker inspect --format '{{.Name}}' daemon_test
docker rm
删除容器,只能删除已停止运行的容器
[root@docker-test-18d031cc log]# docker rm `docker ps -a -q`
docker images
列出容器镜像
[root@docker-test-18d031cc log]# docker images
docker pull
拉取镜像
[root@docker-test-18d031cc log]# docker pull ubuntu
docker search
查找镜像,在Docker Hub上
[root@docker-test-18d031cc overlay2]# docker search puppet
docker commit
创建新镜像(不推荐,建议使用Dockerfile文件和docker build命令)
[root@docker-test-18d031cc overlay2]# docker commit a3b2cccf4b94 zhj/test
sha256:afd7cf487aa1a46ac3a10fb44efc5f82f6167902ee82eae02ec76ce7ad8729c7
docker build
创建新镜像,通过Dockerfile
–no-cache:忽略Dockerfile的构建缓存
[root@docker-test-18d031cc static_web]# vim Dockerfile
# Version: 0.0.1
FROM ubuntu:14.04
MAINTAINER Zhj "zhj@tairanchina.com"
RUN apt-get update
RUN apt-get install -y nginx
RUN echo 'Hi, I am in your container' > /usr/share/nginx/html/index.html
EXPOSE 80
[root@docker-test-18d031cc static_web]# docker build -t="zhj/static_web" .
docker history
查看镜像的创建过程
[root@docker-test-18d031cc ~]# docker history zhj/test
IMAGE CREATED CREATED BY SIZE COMMENT
8930f03b4b66 43 minutes ago /bin/bash 1.75 MB
0f3e07c0138f 12 days ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0 B
<missing> 12 days ago /bin/sh -c #(nop) LABEL org.label-schema.... 0 B
<missing> 12 days ago /bin/sh -c #(nop) ADD file:d6fdacc1972df52... 220 MB
docker port
查看容器端口映射信息
[root@docker-test-18d031cc static_web]# docker port 97cc68a8a2d7
80/tcp -> 0.0.0.0:32770
[root@docker-test-18d031cc static_web]# docker port 97cc68a8a2d7 80
0.0.0.0:32770
docker push
上传镜像至镜像仓库
docker rmi
删除镜像
修改docker仓库
[root@master k8s]# cat /etc/docker/daemon.json
{"registry-mirrors": ["http://hub-mirror.c.163.com"]}
Dockerfile 指令
CMD
指定一个容器启动时要运行的命令
如Dockerfile中配置为:CMD [ “/bin/bash” ],通过该Dockerfile构建的镜像启动容器时不需要在命令行指定/bin/bash
注意:docker run时命令行指定的命令优先级大于Dockerfile中CMD指定的命令
[root@docker-test-18d031cc static_web]# cat Dockerfile
# Version: 0.0.1
FROM nginx
MAINTAINER Zhj "zhj@tairanchina.com"
CMD [ "/bin/bash" ]
[root@docker-test-18d031cc static_web]# docker run -i -t zhj/static_web
ENTRYPOINT
通过数组的方式为命令指定相应的参数,命令行指定的参数会传递给ENTRYPOINT
WORKDIR
指定容器内的工作目录,ENTRYPOINT和CMD中的指令会在该目录下执行
-w:docker run该参数可以覆盖WORKDIR
WORKDIR /opt/webapp/db
RUN bundle install
WORKDIR /opt/webapp
ENTRYPOINT [ "rackup" ]
ENV
镜像制作过程中设置环境变量,也可以使用docker run -e覆盖
USER
指定以哪个用户执行命令,也可以在docker run中通过-u选项覆盖,默认用户为root
VOLUME
用来向基于镜像创建的容器添加卷
ADD
向镜像中拷贝文件,源类型支持url、文件、目录,并会自动解压压缩文件
COPY
向镜像中拷贝文件,不会解压源文件
ONBUILD
构建镜像时触发的动作,只能继承给子镜像
K8s
kubectl delete nodes
删除k8s集群中node节点
[root@k8master kansible]# kubectl delete nodes node1
node "node1" deleted
kubectl get/create/delete namespaces
命名空间管理
[root@k8master kansible]# kubectl create namespace hjtest2
[root@k8master kansible]# kubectl get namespaces
NAME STATUS AGE
default Active 10d
hjtest Active 10d
hjtest2 Active 3s
kube-public Active 10d
kube-system Active 10d
[root@k8master kansible]# kubectl delete namespaces hjtest2
kubectl api-versions
获取k8s api版本
[root@hjdevelop ~]# kubectl api-versions
apps/v1beta1
authentication.k8s.io/v1beta1
authorization.k8s.io/v1beta1
autoscaling/v1
batch/v1
certificates.k8s.io/v1alpha1
extensions/v1beta1
policy/v1beta1
rbac.authorization.k8s.io/v1alpha1
storage.k8s.io/v1beta1
v1
[root@hjdevelop ~]#
kubeadm token create --print-join-command
打印加入集群token信息
[root@master k8s]# kubeadm token create --print-join-command
kubeadm join apiserver.demo:6443 --token ea093t.mmn0ia2np3ck4jdg --discovery-token-ca-cert-hash sha256:1392000d39e3d79e28aa75ecf10d011b06fe90fab3792ba93a5adcb5d6e4724f
批量删除pods
kubectl get pods|grep MatchNodeSelector|awk '{print $1}'|xargs kubectl delete pods
kubectl attach -it nginxname -c shell1
attach到一个容器中,前提是该容器设置了tty和stdin
[root@master shareProcessNamespace]# kubectl attach -it nginxname -c shell1
If you don't see a command prompt, try pressing enter.
/ # top
K8S yaml
ImagePullPolicy
镜像拉群策略。
IfNotPresent:只在宿主机上不存在这个镜像时才拉取
Never:永远不会主动拉取这个镜像
Always:每次创建 Pod 都重新拉取一次镜像