Kubernetes day1
云原生的定义
云原生一些概念十二因素应用
基准代码: 一份基准代码,多次部署(用同一个代码库进行版本控制)
依赖: 显式的声明和隔离相互之间的依赖
配置: 在环境中存储配置(配置中心,携程的apollo)
后端服务: 后端服务作为一个附加的资源,数据库,中间件等等
构建,发布,运行: 对程序执行构建或者打包,严格分离构建和运行,打镜像编译等等,构建和运行严格的分离
进程: 使用一个或者多个无状态进程运行应用
端口绑定: 通过端口绑定提供服务
并发: 通过进程模型进行扩展
易处理: 快速的启动,优雅的终止,最大程度的保持健壮性。
开发环境与线上环境等价: 尽可能保持Dev,Prelive,Live环境的一致性
日志: 将所有运行中的进程和后台服务的输出流按照的时间顺序统一收集存储和展示(ELK,Fluend,Logstash,Filebeat等等)
管理进程: 一次性管理类型的进程(Onetime Job)应该和正常的常驻进程使用同样的运行环境
Master - APIserverAPIserver提供了Kubernetes各类资源对象的CRUD以及Watch等等的HTTP REST接口,对象包括Pods,Services, ReplicationsControllers等等, 为RESTful操作提供服务,并且为集群状态提供前端,所有的组件都通过前端进行交互。
特点: RESTful风格
APIserver的请求最后会同步到Etcd。
请求APIserver在权限的鉴定完成之后, 可以查看大部分的信息。
端口默认是 6443 可通过启动参数(–secure-port)来进行调整
绑定的IP地址可以通过 –bind-address 在启动的时候指定
端口用于接受客户端,dashboard的外部HTTPBase的请求
Token 以及证书的HTTPbase的校验
基于指定策略的授权
功能:
身份认证
验证权限
验证指令
执行操作
返回结果
Master - Kube-scheduler负责将Pod指定到节点上。
取出Pod需要分配的信息, 先排除不可调度的Node,在可用的Node列表之中选择一个合适的Node,将信息写入etcd。等待Node上面的kubelet进行生成Pod。
Node的Kubelet通过APIserver监听到Pod的相关信息,然后获取Pod的清单,下载镜像,启动Pod, Kubelet每秒Watch-APIserver的信息。
三个默认策略:
LeastRequestedPriority - CPU+MEM直接评分,选择资源目前较低
CalculateNodeLanelPriority - 先匹配标签,在进行评分
BalancedResourceAllocation - 优先分配各项资源的使用率最均衡的节点
队列: PodQueue , NodeList
Master - Kuber-Controller-Manager提供不同的控制器,例如: 集群内的Node, Pod ReplicaCounts, EndPoint, Namespace, ServiceAccount, ResourceQuota等等资源的控制内容,如果发现异常的时候提供自动化的修复流程。确保所有的服务是在预期的状态下运行。
5s检查一次Node的状态
包括多种不同的控制器
检查所有的控制器 和 Node是否符合预期
如果Node 不可达之后 40s会将节点标记为无法访问
标记为无法访问5min之后, 将删除这个节点,同时在其他的节点重建需要的Pod。
Pod的高可用机制: 1. NodeMonitorPeriod: 监视周期 2. NodeMonitorGracePerios: 节点监视观察期 3. PodEvictionTimeout: 超时驱逐的区间
Kube-ProxyKubernetes网络代理,反映了Node上面的Kubernetes中的服务对象的变化,通过管理IPVS或者IPTABLES的规则来进行网络层的实现。
可以通过配置文件来指定IPVS的调度算法, 一般默认是RR, ipvsadm -ln
直接指定kubelet的配置文件选项ipvs:
scheduler: sh
Kubelet
汇报节点的状态
监听API server 上面的pod信息变化,并调用Docker 和 Containerd 创建容器
准备Pod所需要的数据卷
返回Pod的运行状态
在Node节点上进行容器的健康检查
Docker基础知识二周目
Docker Container 基础 。 again …..
Docker使用的六个名称空间
MNT Namespace - 提供文件的挂载和文件系统的隔离
IPC Namespace - 提供进程间通信
UTS Namespace - 提供主机名隔离
PID Namespace - 提供进程以及进程号隔离
Net Namespace - 提供网络隔离
User Namespace - 提供用户以及用户id的隔离
容器的进程ID关系Host -------------------------------- | container ------------------------|
systemd -- containerd -- container-shim -- | nginx-master -- nginx-worker
` -- container-shim -- | nginx-master -- nginx-worker
` -- container-shim -- | mysql-master -- mysql-worker
dockerd -- docker-proxy -- | docker-proxy
` -- docker-proxy -- | docker-proxy
` -- docker-proxy -- | docker-proxy
containerd负责控制容器的进程,主机,用户,挂载的隔离。dockerd 启动的docker-proxy用来管理iptables进行网络的隔离。docker.service 里面指定了调用Containerd的socket生成容器的过程钟,API调用过程使用的是grpc。无论dockerd还是containerd最终使用的都是runc(container runtime) ,一个基于Go语言的容器创建工具, 根据OCI标准来创建容器。
docker-daemon 限制可以限制生成日志的大小
限制日志的大小使用的是 docker的daemon config, 针对的日志的范围,是docker Container 里面的标准输入输出的日志, 这部分日志的存储是在机器的硬盘上, 位置是(/opt/docker-storage/containers , 也就是/var/lib/docker/containers/[CONTAINER_ID]/*.json),
cpu 大约可以分配 1:4 , mem不建议超过物理内存的分配
压测镜像: lorel/docker-stress-ng
Docker的网络结构使用的是宿主机的docker0桥,同时在Host上面生成虚拟网卡veth多个接口 , 在容器中生成eth0的虚拟网卡对, 虚拟机中的两个容器之间使用的是物理地址进行寻址访问,所以这个部分可以通过arp命令来进行验证。
Docker容器的资源限制 - Cgroup可以限制 CPU,MEM,DISKIO,NETIO, PRI,PAUSE/RESUME。 对于Kubernetes可以对集群的Namespace来进行限制资源的规划。
查看内核可以支持的cgroup Flag.
┌─[hayden@HaydenArchDesktop] - [~] - [Sun Sep 05, 00:14]
└─[$] <> zcat /proc/config.gz | grep CGROUP
CONFIG_CGROUPS=y
CONFIG_BLK_CGROUP=y
CONFIG_CGROUP_WRITEBACK=y
CONFIG_CGROUP_SCHED=y
CONFIG_CGROUP_PIDS=y
CONFIG_CGROUP_RDMA=y
CONFIG_CGROUP_FREEZER=y
CONFIG_CGROUP_HUGETLB=y
CONFIG_CGROUP_DEVICE=y
CONFIG_CGROUP_CPUACCT=y
CONFIG_CGROUP_PERF=y
CONFIG_CGROUP_BPF=y
CONFIG_CGROUP_MISC=y
# CONFIG_CGROUP_DEBUG is not set
CONFIG_SOCK_CGROUP_DATA=y
CONFIG_BLK_CGROUP_RWSTAT=y
CONFIG_BLK_CGROUP_IOLATENCY=y
CONFIG_BLK_CGROUP_IOCOST=y
# CONFIG_BFQ_CGROUP_DEBUG is not set
CONFIG_NETFILTER_XT_MATCH_CGROUP=m
CONFIG_NET_CLS_CGROUP=m
CONFIG_CGROUP_NET_PRIO=y
CONFIG_CGROUP_NET_CLASSID=y
┌─[hayden@HaydenArchDesktop] - [~] - [Sun Sep 05, 00:14]
└─[$] <> zcat /proc/config.gz | grep MEM | grep CG
CONFIG_MEMCG=y
CONFIG_MEMCG_SWAP=y
CONFIG_MEMCG_KMEM=y
CPUKubernetes 限制是1/1000Core ,Docker是1/10Core, 只需要通过 –cpus 选项指定容器可以使用的 CPU 个数就可以了,并且还可以指定如 1.5 之类的小数。
CPU OverCommit 1:8
MEMMEM的限制单位是M; 同时可以限制Swap的使用,但是限制Swap的使用需要内核的支持,大部分时候还是会关闭掉SWAP, 虽然避免了OOM,但是会影响服务的质量。
MEM 不建议OverCommit
一般情况下 : 分配0.5/1个CPU,mem 2G/4G; 根据业务的不同, 一般会是高可用的部署,两个一起对外提供服务;所以会启动两个容器,不需要提供太高的硬件,符合要求即可。
关于OOM的问题和可以调整的参数(/proc/[PID]/):
oom_adj 取值范围 -17 to +15 , 为了兼容旧程序保留的方式
oom_score 一般是自动计算出来的结果,综合计算的结果, 参考 : CPU时间,存活时间,oom_adj计算之后的结果。
oom_score_adj OOM分数的偏移量,-1000 to +1000, 可以设置-1000表示永远不会被Kill
DISKIODisk OverCommit : 1:1.2
PAUSE\RESUME
Ceph Cluster 04 - CRUSH算法
ceph笔记04
修改CRUSH算法的分配方式基础概念:五种运行图: MON服务维护
Monitor Map - 监控的运行图 MON的状态
OSD Map - OSD的状态, 每隔六秒钟汇报一次状态
PG Map - PG的运行图, PG的状态和映射关系
CRUSH Map - 一致性hash算法,和数据块和osd的分配关系, 动态更新,当客户端请求一个文件的时候,会通过CRUSH算法会根据osd的map创建PG组合的来对文件的存储进行负载和分配。假如有20个osd,创建32重组合分配对应的pg和osd的对应关系,选主从,选分布方式和节点的同步关系,叫做CRUSH Map。
MDS Map - Metadata Map ,元数据和数据文件的映射关系。
5种算法对节点的选择方式
Uniform
List
Tree
Straw - 早期的版本,分布不是特别的均衡,抽签算法
Straw2 - 目前已经发展中的版本, 抽签算法 (Default)
对PG的动态调整默认情况下是动态调整的,但是可以手动调整为给予权重,设置PG分配的倾向,例如1T权重是1,等等等等
查看状态以及调整方式ceph osd df需要关注的值有两个:
weight - 根据磁盘的空间进行的调整,默认自动计算, 可调。
reweight - 磁盘的所有权重相加之后, 单个osd所占用的比例,由于默认的分配是相对概率的平衡,所以分配可能还是会有一些不均衡,通过这个可以进行再次的平衡。
调整的效果就是希望立刻重新平衡PG的数量(需要注意在业务负载低的时候执行) 数据均衡分配。迫使算法动态的更新PG的位置。
调整WEIGHT的值ceph osd crush reweight osd.10 {WEIGHT} # 调整weight值, 越大权重越高,分配的PG数量越大。
调整REWEIGHTceph osd crush reweight {OSD_ID} {REWEIGHT} # 范围是 0 - 1, 也是越大权重越高。
对运行图进行操作
创建一个保存运行图的目录mkdir /cephmap/ceph -pceph osd getcrushmap -o /cephmap/ceph/crushmap # 同时可以做备份使用,将运行图导出到文件中,当需要的时候可以通过这个文件还原。
转换map的二进制格式为文本,Ubuntu 需要安装 crushbase 包。crushtool -d /cephmap/ceph > /cephmap/ceph/crushmap.txt
编辑这个文件主要编辑type部分, 按照不同的调度需求,按照不同的osd,不同主机调度,不同的机架,不同的机柜,不同的PDU,不同的房间,不同的数据中心, 不同的区域城市, 顶层。下面是主机的配置部分。每个主机的算法,osd的分配情况,权重。Rules 副本池的规则里面定义了step take default 基于default配置端里面的规则来进行osd的分配。step chooseleaf firstn 0(按照顺序选择,先选到的就是) type host(按照什么类别进行选择高可用的类型)max_size 副本池配置文件之中可以定义副本数
转换成二进制文件crushtool -c /cephmap/ceph/crushmap.txt -o /cephmap/ceph/crushmap_new
导入查看是否生效ceph osd setcrushmap -i /cephmap/ceph/crushmap_new
查看是否生效ceph osd crush rule dump
创建一个存储池ceph osd pool create magedu-ssdpool 32 32 magedu_ssd_ruleceph pg ls-by-pool magedu-ssdpool | awk ‘{print $1,$2,$15}’
Linux_Ranger_Usage
ranger 备忘
g/ Go root
gh Go home
gg Go to top
G Go bottom
# 文件操作 复制、剪切、删除、粘贴 (针对当前文件或则选择的内容)
yy 复制
dd 剪切
pp 粘贴
F5 复制
F5 剪贴
F8 删除
Delete 删除
# 书签
mX 把当前目录做一个书签 (X 表示任何字符)
'X 跳到X书签代表的目录
# 标签 不同标签可以复制、粘贴、移动
gn 新建一个标签
Alt+N 跳转到N号标签 (代表一个数字)
gt,gT 跳转到前个标签,后个标签
# 排序 对文件和目录列表进行排序,以便查看。
ot 根据后缀名进行排序 (Type)
oa 根据访问时间进行排序 (Access Time 访问文件自身数据的时间)
oc 根据改变时间进行排序 (Change Time 文件的权限组别和文件自身数据被修改的时间)
om 根据修改进行排序 (Modify time 文件自身内容被修改的时间)
ob 根据文件名进行排序 (basename)
on 这个好像和basename差不多(natural)
os 根据文件大小进行排序(Size)
# 重命名 修改文件名有两种模式:当前文件和批量改名
cw 新文件名 -- 修改当前文件名
A -- 在当前文件名后追加文字
I -- 在当前文件名前追加文字
:bulkrename --针对mark过的文件批量改名
# 执行shell命令
! -- 进入命令模式执行shell命令
s -- 同上
# -- 同!,但结果输出到一个pager。相当于 cmd | less
@ -- 同!,但会把选择的文件作为参数放在最后。
S -- 进入一个新的shell。exit后回到当前的ranger
Ceph Cluster 03 - CephFS
ceph笔记03
Cephfs的使用Cephfs的使用条件
当我们需要多个服务来挂载和实时的同步的时候, 使用到CEPHFS,可以实现文件系统的共享。内核里面现在这个时间已经内置cephfs的挂载模块, 可以直接挂载不需要安装。
cephfs运行需要MDS服务,用来存储缓存的文件信息。总体需要创建两个存储池,单独创建一个存储MDS信息的存储池, 同时需要创建一个数据池来提供存储空间。
启用mds的服务 ceph orch mds 2
创建ceph的存储池ceph mds stat
# 创建一个cephfs的metadata池
ceph osd pool create metadata 32 32
# 创建一个cephfs的data池
ceph osd pool create cephfsdata 64 64
# 创建ceph的状态
ceph osd pool ls
ceph -s
# 创建cephfs的文件系统
ceph fs new defaultfs metadata cephfsdata
# 新的版本里面已经不需要手动创建mds和两个对应的存储池了, 只是需要一条命令就可以自动创建。
[ceph: root@ceph01 /]# ceph fs volume create test
[ceph: root@ceph01 /]# ceph fs volume ls
[ceph: root@ceph01 /]# ceph mds stat
# 需要提前获取挂载的Token:
[root@HaydenArchDesktop ceph]# sudo scp root@ceph01:/etc/ceph/ceph.client.admin.keyring /etc/ceph/
[root@HaydenArchDesktop ceph]# mount -t ceph :/ /mnt -o name=admin
[root@HaydenArchDesktop mnt]# mount | grep ceph
192.168.31.11:6789,192.168.31.12:6789,192.168.31.13:6789:/ on /mnt type ceph (rw,relatime,name=admin,secret=<hidden>,acl)
#
# journalctl -f > /mnt/journal.log
# 查看cephfs的写入文件的动作过程。
# 同时使用 tail -f 在另一个窗口中查看文件的内容。 测试写入和查看内容的差距。
用户权限MDS可以启动多个实例,多个实例会自动来负载不同资源的文件元数据的缓存。客户端通过MON节点进行授权 和 获取MDS的的位置。MDS现在最新的版本默认已经是一主一备, 自动会生成高可用的模式。(之前的手动部署多个MDS服务器, 然后指定MDS的角色)
创建一个普通用户来进行身份的验证# 创建一个测试的用户
ceph auth add client.testuser mon 'allow r' mds 'allow rw' osd 'allow rwx pool=cephfsdata'
# 测试所建立的用户的权限,获取认证的keyring
ceph auth get client.testuser
# 导出用户的Keyring, 用来做集群的校验
ceph auth get client.testuser -o ceph.client.testuser.keyring
# 导出用户的key , Kubernetes的挂载会使用到
ceph auth print-key client.testuser > testuser.key
# 验证用户是否可以获取到集群的状态
ceph --user testuser -s
# 将挂载点添加到fstab自动开机挂载
MON01:6789,MON02:6789,.........:/ /mnt ceph defaults,name=testuser,secretfile=/etc/ceph/testuser.key,_netdev 0 0
Dashboard权限# 启用或者禁用账户
[ceph: root@ceph01 /]# ceph dashboard ac-user-enable admin
# 重置Dashboard用户的密码
# Old Version
[ceph: root@ceph01 /]# ceph dashboard set-login-credentials admin -i /etc/ceph/dashboard_password
# New version command.
[ceph: root@ceph01 /]# ceph dashboard -h | grep ac-user
dashboard ac-user-add-roles <username> [<roles>...] Add roles to user
dashboard ac-user-create <username> [<rolename>] [<name>] Create a user. Password read from -i <file>
dashboard ac-user-del-roles <username> [<roles>...] Delete roles from user
dashboard ac-user-delete [<username>] Delete user
dashboard ac-user-disable [<username>] Disable a user
dashboard ac-user-enable [<username>] Enable a user
dashboard ac-user-set-info <username> <name> [<email>] Set user info
dashboard ac-user-set-password <username> [--force- Set user password from -i <file>
dashboard ac-user-set-password-hash <username> Set user password bcrypt hash from -i <file>
dashboard ac-user-set-roles <username> [<roles>...] Set user roles
dashboard ac-user-show [<username>] Show user info
MDS 高可用# 提升默认的主节点的数量, 来提高MDS服务的吞吐量
ceph fs set defaultfs max_mds 2
ceph fs get defaultfs
# 变成两主两备, (设置Rank)
# 参数: mds_standby_replay true
mds_standby_for_name: MDS_NAME
mds_standby_for_rank: 备份指定级别的mds
mds_standby_for_fscid: 指定文件系统ID,会联合rank配置生效,如果指定了rank就是指定文件系统的rank会进行主备,如果未指定就是指定文件系统的所有Rank。
如果是一对一的高可用 , 需要对每个mds进行独立的配置。配置样例: # 配置的结果是mds1主, mds2 备; mds3 主, mds4 备.
[mds.ceph-mds1]
mds_standby_replay = true
mds_standby_for_name = ceph-mds2
mds_standby_for_fscid = defaultfs
[mds.ceph-mds3]
mds_standby_replay = true
mds_standby_for_name = ceph-mds4
Ceph Cluster 02 - OSD/RBD
Ceph的使用笔记。
创建存储池
# 创建一个PG为64 ,PGP为64的存储池。
[ceph: root@ceph01 /]# ceph osd pool create test-64 64 64
pool 'test-64' created
# 创建一个自动识别的大小的存储池。
[ceph: root@ceph01 /]# ceph osd pool create test
pool 'test' created
# 查看已经存在的存储池。
[ceph: root@ceph01 /]# ceph osd pool ls
device_health_metrics
test
test-64
# 查看存储池的PG 和 PGP 的信息和关系。
[ceph: root@ceph01 /]# ceph pg ls-by-pool test
# 查看OSD的状态。
[ceph: root@ceph01 /]# ceph osd tree
ID CLASS WEIGHT TYPE NAME STATUS REWEIGHT PRI-AFF
-1 0.58557 root default
-5 0.14639 host ceph01
2 hdd 0.04880 osd.2 up 1.00000 1.00000
7 hdd 0.04880 osd.7 up 1.00000 1.00000
11 hdd 0.04880 osd.11 up 1.00000 1.00000
-7 0.14639 host ceph02
3 hdd 0.04880 osd.3 up 1.00000 1.00000
6 hdd 0.04880 osd.6 up 1.00000 1.00000
10 hdd 0.04880 osd.10 up 1.00000 1.00000
-9 0.14639 host ceph03
1 hdd 0.04880 osd.1 up 1.00000 1.00000
5 hdd 0.04880 osd.5 up 1.00000 1.00000
9 hdd 0.04880 osd.9 up 1.00000 1.00000
-3 0.14639 host ceph04
0 hdd 0.04880 osd.0 up 1.00000 1.00000
4 hdd 0.04880 osd.4 up 1.00000 1.00000
8 hdd 0.04880 osd.8 up 1.00000 1.00000
# 测试上传一个文件并且查看文件的状态和信息。
[ceph: root@ceph01 rpm]# pwd
/var/lib/rpm
[ceph: root@ceph01 rpm]# ls -lh ./Packages
-rw-r--r-- 1 root root 20M Jul 8 17:56 ./Packages
[ceph: root@ceph01 rpm]# rados put msg1 ./Packages --pool=test
[ceph: root@ceph01 rpm]# rados put msg1 ./Packages --pool=test-64
[ceph: root@ceph01 rpm]# rados ls --pool=test
msg1
[ceph: root@ceph01 rpm]# ceph osd map test msg1
osdmap e68 pool 'test' (2) object 'msg1' -> pg 2.c833d430 (2.10) -> up ([9,3,0], p9) acting ([9,3,0], p9)
[ceph: root@ceph01 rpm]# ceph osd map test-64 msg1
osdmap e68 pool 'test-64' (3) object 'msg1' -> pg 3.c833d430 (3.30) -> up ([2,0,3], p2) acting ([2,0,3], p2)
# 删除上传的文件
[ceph: root@ceph01 rpm]# rados rm msg1 --pool=test
[ceph: root@ceph01 rpm]# rados rm msg1 --pool=test-64
[ceph: root@ceph01 rpm]# rados ls --pool=test
[ceph: root@ceph01 rpm]# rados ls --pool=test-64
# 删除刚刚添加的存储池。(临时的解决方案是使用如下的命令, 永久生效的配置写入 /etc/ceph/ceph.conf)
[ceph: root@ceph01 ~]# ceph tell mon.* injectargs '--mon-allow-pool-delete=true'
mon.ceph01: {}
mon.ceph01: mon_allow_pool_delete = 'true'
mon.ceph02: {}
mon.ceph02: mon_allow_pool_delete = 'true'
mon.ceph03: {}
mon.ceph03: mon_allow_pool_delete = 'true'
# 执行删除命令就不会报错了。
[ceph: root@ceph01 ~]# ceph osd pool rm test test --yes-i-really-really-mean-it
pool 'test' removed
[ceph: root@ceph01 ~]# ceph osd pool rm test-64 test-64 --yes-i-really-really-mean-it
pool 'test-64' removed
# 创建一个KVM的块设备池。
[ceph: root@ceph01 ~]# ceph osd pool create kvm 256 256
pool 'kvm' created
# 设置Application enable flag
[ceph: root@ceph01 ~]# ceph osd pool application enable kvm rbd
enabled application 'rbd' on pool 'kvm'
# 初始化池。
[ceph: root@ceph01 ~]# rbd pool init -p kvm
# 创建一个可挂载的镜像。
[ceph: root@ceph01 ~]# rbd create disk01 --size 5G --pool kvm
# 查看镜像的相关信息
[ceph: root@ceph01 ~]# rbd ls --pool kvm
disk01
size 5 GiB in 1280 objects
order 22 (4 MiB objects)
snapshot_count: 0
id: 1703d21a8f2ba
block_name_prefix: rbd_data.1703d21a8f2ba
format: 2
features: layering, exclusive-lock, object-map, fast-diff, deep-flatten
op_features:
flags:
create_timestamp: Mon Aug 23 09:13:58 2021
access_timestamp: Mon Aug 23 09:13:58 2021
modify_timestamp: Mon Aug 23 09:13:58 2021
# 安装Ceph的客户端以及rbd命令。
[root@HaydenArchDesktop hayden]# sudo pacman -S ceph
[root@HaydenArchDesktop hayden]# rbd -p kvm map disk01
/dev/rbd0
[root@HaydenArchDesktop hayden]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
rbd0 254:0 0 5G 0 disk
# 格式化文件系统。
[root@HaydenArchDesktop test]# mkfs.xfs /dev/rbd0
# 挂载。
[root@HaydenArchDesktop test]# mount /dev/rbd0 /opt/test/
# 移除挂载
[root@HaydenArchDesktop test]# umount /opt/test
# 取消这个映射关系。
[root@HaydenArchDesktop test]# rbd unmap /dev/rbd0
Ceph Cluster 01 - Installation
Ceph 的学习笔记和记录。
开始部署信息OS Version: Fedora 34 ServerCEPH Version: v15.2.0 (Octopus) +DOCKER Version: 20.10.8
配置实例的 Hostname 和网络vim /etc/hosts
192.168.122.121 ceph01 ceph01.liarlee.site
192.168.122.122 ceph02 ceph02.liarlee.site
192.168.122.123 ceph03 ceph03.liarlee.site
192.168.122.124 ceph04 ceph04.liarlee.site
[root@ceph01 ~]$ ssh 192.168.122.121 echo "ceph01.liarlee.site" > /etc/hostname
[root@ceph01 ~]$ ssh 192.168.122.122 echo "ceph02.liarlee.site" > /etc/hostname
[root@ceph01 ~]$ ssh 192.168.122.123 echo "ceph03.liarlee.site" > /etc/hostname
[root@ceph01 ~]$ ssh 192.168.122.124 echo "ceph04.liarlee.site" > /etc/hostname
[root@ceph01 ~]$ nmcli conn mod enp1s0 ipv4.address 192.168.122.121/24
[root@ceph01 ~]$ nmcli conn mod enp1s0 ipv4.address 192.168.122.122/24
[root@ceph01 ~]$ nmcli conn mod enp1s0 ipv4.address 192.168.122.123/24
[root@ceph01 ~]$ nmcli conn mod enp1s0 ipv4.address 192.168.122.124/24
[root@ceph01 ~]$ nmcli conn mod enp1s0 ipv4.gateway 192.168.122.1
[root@ceph01 ~]$ nmcli conn mod enp1s0 ipv4.dns 192.168.122.1
[root@ceph01 ~]$ nmcli conn mod enp1s0 ipv4.method manual
[root@ceph01 ~]$ nmcli conn up enp1s0
[root@ceph01 ~]$ sudo systemctl stop firewalld && sudo systemctl disable firewalld
[root@ceph01 ~]$ vim /etc/config/selinux # change it to disabled
CONFIG Dnf Repo# config docker
[root@ceph01 ~]$ wget -O /etc/yum.repos.d/docker-ce.repo https://download.docker.com/linux/fedora/docker-ce.repo
[root@ceph01 ~]$ sudo sed -i 's+download.docker.com+mirrors.tuna.tsinghua.edu.cn/docker-ce+' /etc/yum.repos.d/docker-ce.repo
# Add GPG Key.
[root@ceph01 ~]$ sudo rpm --import 'https://mirrors.tuna.tsinghua.edu.cn/ceph/keys/release.asc'
# update cache and install cephadm.
[root@ceph01 ~]$ dnf makecache -y && dnf install curl wget htop -y
[root@ceph01 ~]$ dnf install cephadm -y
INSTALL Docker[root@ceph01 ~]$ sudo dnf remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-selinux \
docker-engine-selinux \
docker-engine
[root@ceph01 ~]$ sudo dnf install docker-ce docker-ce-cli containerd.io -y
[root@ceph01 ~]$ sudo systemctl start docker containerd
[root@ceph01 ~]$ sudo systemctl enable docker containerd
# Config proxy for docker daemon.
[root@ceph01 ~]$ mkdir /etc/systemd/system/docker.service.d/
[root@ceph01 docker.service.d]$ cat http-proxy.conf
[Service]
Environment="HTTP_PROXY=http://192.168.31.199:7890/"
Environment="HTTPS_PROXY=http://192.168.31.199:7890/"
INSTALL CEPHCephadm tools were default in Fedora Repo, No need to change the repo to tsinghua or aliyun. Just install. WOW ~ Fedora YYDS.
启动一个ceph集群[root@ceph01 ~]$ cephadm bootstrap --mon-ip 192.168.122.121 --allow-fqdn-hostname
Please notice the output, context include username and password and dashboard address.
Ceph Dashboard is now available at:
URL: https://localhost.localdomain:8443/
User: admin
Password: 20jrekw4ko
Enabling client.admin keyring and conf on hosts with "admin" label
You can access the Ceph CLI with:
sudo /usr/sbin/cephadm shell --fsid e8997974-029f-11ec-a59a-525400c06f36 -c /etc/ceph/ceph.conf -k /etc/ceph/ceph.client.admin.keyring
使用 Ceph Shell 命令来管理集群节点# temprary use
[root@ceph01 ~]$ cephadm shell -- ceph -s
# start a interactive shell
[root@ceph01 ~]$ cephadm shell
# check the ceph status
[ceph: root@ceph01 /]$ ceph -s
# list ceph hosts
[ceph: root@ceph01 ceph]$ ceph orch host ls --format yaml
# general a new ssh key for cephadm
[ceph: root@ceph01 ceph]$ cephadm get-pub-key > /etc/ceph/ceph.pub
# copy new key to hosts
[ceph: root@ceph01 ceph]$ ssh-copy-id -f -i /etc/ceph/ceph.pub root@192.168.122.122
[ceph: root@ceph01 ceph]$ ssh-copy-id -f -i /etc/ceph/ceph.pub root@192.168.122.123
[ceph: root@ceph01 ceph]$ ssh-copy-id -f -i /etc/ceph/ceph.pub root@192.168.122.124
维护集群ADD Hosts[ceph: root@ceph01 ceph]$ ceph orch host add ceph02.liarlee.site 192.168.122.122
[ceph: root@ceph01 ceph]$ ceph orch host add ceph03.liarlee.site 192.168.122.123
[ceph: root@ceph01 ceph]$ ceph orch host add ceph04.liarlee.site 192.168.122.124
# set mon sub-network
[ceph: root@ceph01 /]$ ceph config set mon public_network 192.168.122.0/24
ADD Osd# auto-detect available devices (need time to sync the status 1 by 1)
# NOTE: Strangely enough, the command automatically recognizes all devices, including the ZRAM! QAQ.....
[ceph: root@ceph01 /]$ ceph orch apply osd --all-available-devices
# list devices
[ceph: root@ceph01 /]$ ceph orch device ls
Hostname Path Type Serial Size Health Ident Fault Available
ceph01.liarlee.site /dev/vdb hdd 21.4G Unknown N/A N/A Yes
ceph01.liarlee.site /dev/vdc hdd 21.4G Unknown N/A N/A Yes
ceph01.liarlee.site /dev/vdd hdd 21.4G Unk ...
Ubuntu 18.04 内核编译初试
Ubuntu 18.04 上编译内核,生成deb安装包的过程和遇到的问题。使用工具: Linux-tkg系统版本: Ubuntu18.04内核版本: 5.12-muqss-6ms-skylake
背景说明看到B站大佬的教学视频, 使用Linuxtkg进行内核的编译打包和添加muqssCPU调度器, 想自己尝试一下, 同时熟悉一下Ubuntu常见的工具链,所以就开始做了这个事情。
首先是需要对系统进行初始化, 需要一些底层的工具包。 在Ubuntu上面还是有些问题的, 这个坑自己踩了。
]$ sudo apt install zstd git wget sudo bc rsync kmod cpio libelf-dev build-essential fakeroot libncurse5-dev libssl-dev ccache bison flex qtbase5-dev kernel-package
NOTE: 这里面我遇到少了pkg但是没有明确报错的是:zstd & kernel-package ,这两个如果没有正确的安装报错是比较模糊的, 完全不能定向到问题是缺少了这两个包。 (而官方的手册中也没有写需要安装kernel-package就比较坑爹
之后就是下载Linux-tkg ,建议直接从Github下载, Linux-tkg official address
]$ git clone https://github.com/Frogging-Family/linux-tkg.git
在clone完成之后, 执行下面的./install.sh config, 按照提示回答相关的问题。
或者可以直接编辑其中的customization.cfg来设置默认的参数。(这个文件中都是有说明的,还算是比较详细, 一般可以直接看懂。
回答完成问题之后会生成对应的config文件。
执行./install.sh install, 之后会有几个不同的发行版的选择, 只需要选择自己需要的即可, 如果是Deb系的会自动启动编译命令 make -j32 deb-pkg ,自动生成的软件包在./DEBS/*.deb.直接安装即可。如果是rpm也会生成RPMS。
如果中途报错 , 我也不知道具体的处理方式。目前发现的问题如下:
不同版本的ubuntu 表现是不同的, 震惊! 同样的设置参数 ,同样的内核代码和补丁,在Ubuntu 18.04 和 20.04 , 20.04 会成功。
不同环境的结果是不同的, 在一台服务器上面 起Docker容器进行初始化之后编译 会成功的。 在笔记本上不一定会成功。
目前没有总结出任何的相关规律, 太任性了只能说。
如果是不打包成deb,目前的成功率是100%(包括直接将文件释放到系统中, 和打成rpm)。
现在能想到的差不多这些吧 , 反正编译出错就是dpkg-package ERROR 2 , 我现在满脑子都是ERROR 2了, 告辞。
Java连接数据库报错No subject alternative names present
配置监控的时候需要配置和获取MongoDB的信息,使用华为云的MongoDBPaaS服务,如果开启了SSL就无法正常连接。
报错如下:
Timed out after 30000 ms while waiting to connect. Client view of cluster state is {type=UNKNOWN, servers=[{address=192.168.1.1:8635, type=UNKNOWN, state=CONNECTING, exception={com.mongodb.MongoSocketWriteException: Exception sending message}, caused by {javax.net.ssl.SSLHandshakeException: java.security.cert.CertificateException: No subject alternative names present}, caused by {java.security.cert.CertificateException: No subject alternative names present}}]
网上搜索到的结果基本上都是从开发的角度解决这个错误, 如果是从运维的方向上 , 没有什么有效的方法可以解决这个问题么?比如通过一些参数或者设置。
有的 :
在连接串里加上sslinvalidhostnameallowed=true即可, 设置是直接允许无效的hostname证书, 算是不解决证书问题一个解决方案吧。
所以 最后的连接参数变成:
mongodb://192.168.1.1:8635/test?authSource=admin&ssl=true&sslinvalidhostnameallowed=true
Linux性能调优笔记
应该是一个性能调优的书的笔记, 记不清了, 存货了属于是。
Linux的性能调优CPU性能释放Process生命周期
建立一个新的进程, 表示为父进程, 父进程进入Wait状态。
父进程Fork()系统调用出来的一个子进程。
子进程调用exec()对操作进行执行。
子进程执行结束退出exit()。
子进程变为Zombie进程。
等待父进程回收,更新父进程的运行状态。
进程与线程线程是可以在同一个进程下并发执行的执行单位,他们共享相同的地址,数据和运行空间。线程也叫做(LWP) - 轻量的进程。两者的区别在于,进程在同一个CPU上不能并发执行,且两个进程间不是共享资源的方式进行数据处理的。其他的地方, 进程和线程并无太大的区别,Linux的内核将使用一直的Manner对进程和线程进行调度和处理。
There are several thread implementations avaliable in linux operation system.
Linux threads
传统的Linux进程
Native POSIX thread library
内核 2.6 以后由红帽开发的进程模型。
Next Generation POSIX Thread
IBM开发的新的进程模型。
Note:Linux系统中的环境变量 LD_ASSUME_KERNEL 。
进程优先级
优先级(控制调度的先后顺序): 优先级的范围是: 0 - 139。
Nice值(控制运行时间的长短): 每个进程的nice值,19 到 -20 ,nice值越大 分配的时间越长。19最低 , -20最高。默认的nice值是0。
进程上下文切换每一个进程有独立的数据存储,当多个进程在同一颗CPU切换时,内核会对进程需要的数据空间进行重定向,这个行为叫做上下文切换。Context Swtiching,负责进程的上下文切换以及调度。在多个进程切换的过程中, 每次切换都会触发一次上下文的切换,是导致性能下降的主要原因。
中断CPU的终端控制通常由 硬中断 和 软中断为主, 硬中断通常见于硬件设备,鼠标键盘网卡硬盘设备。软中断常见于TCP/IP协议操作,SCSI协议操作。
Note: 中断的信息显示在: /proc/interrepts。
Note:在多个CPU的系统中,可以将中断集中绑定在某一颗物理的CPU上,可以有效的改善系统的性能。
进程的状态
RUNNING(正常的进程)
STOPPED(已经停止的进程)
UNINTERREPTIBLE(Disk I/O)
INTERREPTIBLE(Keyboard I/O)
ZOMBIE(只能通过结束或重启父进程来回收僵尸进程)
进程的内存空间进程的内存地址空间:(由顶至低顺序为)Text Segment, Data Segment,Heap Segment, Stack Segment
Text Segment : 存储进程可执行代码的部分,只读模式。
Data Segment: 包括三个部分
Data: 数据片段, 初始数据的存储,例如静态变量。
BSS:填零数据的存储。数据初始化为0。
Heap(堆内存): malloc()按需分配的动态内存,堆内存向更高的地址发展。
Stack Segment: 栈内存。存储本地变量, 方法参数,方法返回地址。栈内存向更低的地址发展。
NOTE:可以使用命令pmap查看一个用户空间进程的地址分配情况。可以使用ps命令查看总的内存分配情况。
CPU的NUMA Node
一颗物理CPU 8逻辑核,两个NUMA节点。
4CPU为一组, 在同一个NUMA节点中。
HT技术提供了一个物理两个逻辑CPU。
在 1 情况下,一般不触发跨越NUMA节点的负载均衡,除非子节点过载。
在 2 情况下,提供了调度器tick的 时间调度 和 时间片 调度。
在 3 情况下, 提供调度器tick时间的负载均衡调度。
内存性能Linux内存的结构
物理内存物理的内存的分配分别有32位和64位的不同,
32位系统中只能Linux内核可以直接管理的内存空间只有第一个 1 GB(扣除预留的部分只有896M) , 剩下的空间需要映射到前面的1GB空间中。这种映射会使性能下降,但是对于应用程序来说是透明且无感的。
64位系统中将ZONE-NORMAL的区域扩展到了64GB - 128GB, 就不需要这种映射操作了。
虚拟内存虚拟内存的地址布局
32位架构中,一个进程可以使用的虚拟内存的空间最大只能有4GB。内存被分为了 3GB的用户空间和1GB的内核空间。
64位架构中完全没有这种限制,每个进程都可以使用全部的内存空间。
虚拟内存的管理物理内存通常对于应用或者用户是不可见的,Linux内核会将任何内存自动映射到虚拟内存。
应用不直接使用物理内存而是向内核申请一个确切空间的虚拟内存映射,并在虚拟内存中接收并处理内存的映射关系。
并且,虚拟内存不是必须映射到物理内存,还可以映射到在硬盘子系统中的Swap文件。
应用通常也不直接写入硬盘子系统,而是写入数据到Cache/Buffer中。pdflush内核线程在合适的时间负责将Cache和Buffer中的数据刷写到硬盘。
Linux虚拟内存管理器分配全部的未使用虚拟内存作为磁盘的cache,其他的操作系统只使用内存中的一部分。
同样的,交换的空间的管理同样也是如此,事实上交换空间占用程度并不代表系统的瓶颈所在,相反证明了linux系统资源调度上的高效。
页帧的分配 - 内存分页
Page - 页是在物理内存(Page Frame) 或者 虚拟内存中的连续线性地址空间。
Linux通过控制页单元来控制内存的分配,一页的大小是 4Kb。
内核了解那些分页是可用的,以及他们的确切位置。
Buddy SystemLinux使用这种机制来进行空闲页的管理和维护,并对申请进行分配,始终试图保持内存分页的连续性。当内存的分配失败的时候,会内存的页帧回收。
Page Frame Reclaiming当所有的页已经处于不可用的状态(unavalible),会触发内存的回收机制,将暂时不在使用中的,或者在使用中但是优先级低的内存重新分配,这种机制叫做内存回收。内核线程pswapd和内核函数try_to_free_page()负责执行这个动作。
文件系统Linux可以支持多种多样的文件系统,这得益于内核的VFS技术,VFS是介于用户进程和文件系统之间的抽象层。由于VFS的存在,那么用户进程无需知道文件系统的类型,就可以直接进行文件系统的使用。
用户进程调用文件系统的流程:
User Process –> System Call –> VFS –> Variety of supported file system
日志:
Ext2简单的文件系统,无日志记录
Ext2 文件系统(BlockGroup)结构:
SuperBlock: 存储信息,在每一个BlockGroup的前面都有一个SuperBlock。
BlockGroupDesciptor: 存储BlockGroup的信息。
Data Block Bitmaps: 空闲的数据块管理。
i-node Bitmap: 空闲的Inode管理
i-node Tables: inode的table存储位置。记录了文件的基本信息,例如: uid,gid, atime, ctime, mtime, dtime,指向数据块的位置。
Data blocks: 实际用户数据的存储位置。
文件系统查找文件的过程: 先在/下查看inode信息,查看所找文件的信息,按照路径持续查找,直到找到了文件的inode信息,通过inode提供的信息去数据块读取数据。
Ext3ext3文件系统是ext2 的升级版,主要的变更是支持了文件系统的日志,
ext3支持的日志模式有三种:
journal - 全量记录,数据也元数据都通过日志记录。
Ordered - 只有元数据会记录日志。
Writeback - 记录了元数据的操作,无法保证数据的一致性,突然终止会导致旧数据的出现。
Xfsxfs是新一代的日志文件系统,性能和稳定性都不错。其他资料待补全。
IO子系统进程是如何使用IO子系统进行数据交换的?
进程通过write()系统调用,请求一个文件的写入。
内核更新Pagecache映射到文件。
pdflush内核线程处理pagecache到硬盘。
文件系统层将每个Blockbuffer组成一个Bio结构,提交和写入到块设备层。
块设备层得到上层的请求,执行IO电梯算法操作将数据推入写入队列。
存储驱动接管并执行写入。
硬盘硬件设备执行写入到盘片。
关于缓存(cache)?
由于CPU和硬盘的速度差距太大,因此需要缓存来进行临时的数据存储。
速度递减的结构是:
CPU –> cache –> RAM –> Disk
块层 Block Layer关键的数据结构就是bio结构,bio结构是一种接口,存在于 文件系统层 和 块层之间。
bio就是将相邻的block buffer块整合到一起,发送bio到块层。
块大小直接影响服务器性能的设置。如果需要存储的文件尺寸比较大,那么设置大的blocksize性能更好。
IO电梯算法
Anticipatory
CFQ
BFQ
Deadline
MQ-deadline
NOOP
NONE
存储驱动
SCSI
RAID
网络子系统netstat -n | awk '/^tcp/ {++S[$NF]} END {for (a in S) print a, S[a]}'
# 查看所有的连接状态
当一个应用需要发送网络数据流程:
应用打包自己的数据。
应用通过套接字接口写入数据。
socket buffer用于处理需要被发送的数据。缓冲区引用了数据,并贯穿所有的层。
在每个层中,执行相应的操作,例如数据的封包,添加数据的报文首部。
从网卡的物理接口发出。
以太网帧抵达对端的网卡接口。
如果MAC地址匹配对端网卡的地址,数据帧移动到物理网卡的Buffer。
移动数据包到socket buffer中,同时发出一次CPU硬中断。
数据包逐层解包,直到抵达可以解释的应用层。
通过/proc/sys/net目录可以进行网络子系统的调优。
/proc/sys/net/core/rmem_max /proc/sys/net/core/rmem_default /proc/sys/net/core/wmem_max /proc/sys/net/core/wmem_default /proc/sys/net/ipv4/tcp_mem /proc/sys/net/ipv4/tcp_rmem /proc/sys/net/ipv4/tcp_wmem
Network API(NAPI)NAPI是一种新的网络处理方式,每次对数据包的操作都会触发系统中断,新的方式使用的是poll的方式。
NAPI 是 Linux 上采用的一种提高网络处理效率的技术,它的核心概念就是不采用中断的方式读取数据,而代之以首先采用中断唤醒数据接收的服务程序,然后 POLL 的方法来轮询数据,
https://www.ibm.com/developerworks/cn/lin ...