2017-09-19 14:09:33    12    0    0

升级系统内核

安装最新版本内核:
导入public key

  1. [root@master ~]# rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org

安装elrepo源

  1. [root@master ~]# yum install -y http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm

yum安装latest版本的内核

  1. [root@master ~]# yum --enablerepo=elrepo-kernel install kernel-ml-devel kernel-ml -y

设置开启使用的内核版本

  1. [root@master ~]# grub2-set-default 0
  2. [root@master ~]# reboot

编译安装指定版本内核:
准备编译环境

  1. [root@master ~]# yum install -y bc gcc gcc-g++
  2. [root@master ~]# curl -O -L https://cdn.kernel.org/pub/linux/kernel/v3.x/linux-3.18.71.tar.gz
  3. [root@master ~]# tar -xvzf linux-3.18.71.tar.gz -C /usr/src/
  4. [root@master ~]# cd /usr/src/linux-3.18.71/

Linux内核裁剪有以下几个命令:

make config:使用命令行一行一行的配置

make menuconfig:使用menuconfig菜单

make xconfig:在2.4.X以及以前版本中xconfig菜单是基于TCL/TK图形库

所有内核配置菜单都是通过Config.in经由不同脚本解释器产生.config。我们不需要手动裁剪内核,使用当前系统自带的config文件。

  1. [root@master ~]# cp /boot/config-3.10.0-229.el7.x86_64 .config

编译

2016-10-30 23:18:08    35    0    0

一、Device Mapper: loop-lvm

CentOS7 下 Docker Device Mapper 默认使用 loopback 设备,后端为自动生成的稀疏文件,如下:

[root@master ~]# ls -lsh /var/lib/docker/devicemapper/devicemapper/
总用量 510M
508M -rw-------. 1 root root 100G 08月 20 00:00 data
1.9M -rw-------. 1 root root 2.0G 08月 20 00:00 metadata

data [存放数据] 和 metadata [存放元数据] 的大小从输出可以看出初始化默认为 100G 和 2G 大小。

Docker 在初始化的过程中,创建 data 和 metadata 这两个稀疏文件,并分别附加到回环设备/dev/loop0 和 /dev/loop1 上,然后基于回环设备创建 thin pool

[root@master ~]# docker info
Containers: 2
Images: 13
Storage Driver: devicemapper
 Pool Name: docker-253:1-100673362-pool
 Pool Blocksize: 65.54 kB
 Backing Filesystem: xfs
 Data file: /dev/loop0
 Metadata file: /dev/loop1
 Data Space Used: 533.5 MB
 Data Space Total: 107.4 GB
 Data Space Available: 40.75 GB
 Metadata Space Used: 1.221 MB
 Metadata Space Total: 2.147 GB
 Metadata Space Available: 2.146 GB
 Udev Sync Supported: trueData loop file: /var/lib/docker/devicemapper/devicemapper/data
 Metadata loop file: /var/lib/docker/devicemapper/devicemapper/meta
2017-09-12 11:02:02    7    0    0

Docker 0.7版本中引入了storage driver,目前Docker支持AUFS、Btrfs、Device mapper、OverlayFS、ZFS五种存储驱动。没有适合所有应用场景的单一驱动,要根据应用场景选择合适的存储驱动,才能有效的提高Docker的性能。

原理说明

写时复制(CoW)

写时复制(copy-on-write):所有驱动都用到的技术,表示只在需要写时才去复制,这个是针对已有文件的修改场景。比如基于一个image启动多个Container,如果为每个Container都去分配一个image一样的文件系统,那么将会占用大量的磁盘空间。而CoW技术可以让所有的容器共享image的文件系统,所有数据都从image中读取,只有当要对文件进行写操作时,才从image里把要写的文件复制到自己的文件系统进行修改。所以无论有多少个容器共享同一个image,所做的写操作都是对从image中复制到自己的文件系统中的复本上进行,并不会修改image的源文件,且多个容器操作同一个文件,会在每个容器的文件系统里生成一个复本,每个容器修改的都是自己的复本,相互隔离,相互不影响。使用CoW可以有效的提高磁盘的利用率。

用时分配(allocate-on-demand)

而用时分配是用在原本没有这个文件的场景,只有在要新写入一个文件时才分配空间,这样可以提高存储资源的利用率。比如启动一个容器,并不会为这个容器预分配一些磁盘空间,而是当有新文件写入时才按需分配新空间。

AUFS

AUFS(AnotherUnionFS)是一种Union FS,是文件级的存储驱动。AUFS能透明覆盖一或多个现有文件系统的层状文件系统,把多层合并成文件系统的单层表示。简单来说就是支持将不同目录挂载到同一个虚拟文件系统下的文件系统。这种文件系统可以一层一层地叠加修改文件。无论底下有多少层都是只读的,只有最上层的文件系统是可写的。当需要修改一个文件时,AUFS创建该文件的一个副本,使用CoW将文件从只读层复制到可写层进行修改,结果也保存在可写层。在Docker中,底下的只读层就是image,可写层就是Container。结构如下图所示:
title

Overlay

O

blue    2016-10-31 15:53:18    129    0    0

openshift origin 3.6.0安装logging

  1. [root@master1.ipaas.seanzhau.com ~]# oc project logging
  2. #卸载
  3. [root@master1.ipaas.seanzhau.com ~]# ansible-playbook ~/openshift-ansible/playbooks/byo/openshift-cluster/openshift-logging.yml -e openshift_logging_install_logging=False
  4. #安装
  5. [root@master1.ipaas.seanzhau.com ~]# ansible-playbook ~/openshift-ansible/playbooks/byo/openshift-cluster/openshift-logging.yml -e openshift_logging_install_logging=True -e openshift_logging_image_version=v3.6.0 -e openshift_logging_kibana_hostname=logging.origin.seanzhau.com

基础篇-无pvc

给所有主机打label

  1. [root@master1.ipaas.seanzhau.com ~]# oc label node node1.ipaas.seanzhau.com label=log
  2. ...
  3. [root@master1.ipaas.seanzhau.com ~]# oc label node master1.ipaas.seanzhau.com label=log
  4. ...
  5. [root@master1.ipaas.seanzhau.com ~]# oc get node -L label
  6. NAME STATUS AGE LABEL
  7. master1.ipaas.seanzhau.com Ready,SchedulingDisabled 23d lo
red    2016-10-31 16:56:10    116    1    1

安装registry

请参考 openshift安装配置registry
自定义域名: registry.ipaas.seanzhau.com

查看registry svc信息

  1. [root@master1.ipaas.seanzhau.com ~]# oc get svc docker-registry -n default
  2. NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
  3. docker-registry 172.30.0.3 <none> 5000/TCP 1d

重新配置证书

  1. #默认证书只根据主机名认证,当使用ip或自定义域名时,会报x509之类认证不通过的错误,而且主机名只能通过内部访问,因此需要使用固定的ip和域名重新生成证书。
  2. [root@master1.ipaas.seanzhau.com ~]# oc adm ca create-server-cert \
  3. --signer-cert=/etc/origin/master/ca.crt \
  4. --signer-key=/etc/origin/master/ca.key \
  5. --signer-serial=/etc/origin/master/ca.serial.txt \
  6. --hostnames='docker-registry.default.svc.cluster.local,172.30.0.3,registry.ipaas.seanzhau.com' \
  7. --cert=/etc/secrets/registry.crt \
  8. --key=/etc/secrets/registry.key

生成secret

  1. [root@master1.ipaas.seanzhau.com ~]# oc secrets new registry-secret \
  2. /etc/secrets/registry.crt \
  3. /etc/secrets/registry.ke
red    2016-11-30 16:51:59    201    0    0

Docker自己的网络方案比较简单,就是每个宿主机上会跑一个二层的Linux Bridge,只能做一些简单的学习和转发。出网桥的流量会走IPTABLES,做NAT的地址转换,然后靠路由转发做一个宿主之间的通信。但是当真正用它的网络模型部署一个比较复杂的业务时,会存在很多问题。比如容器重启之后IP就变了;或者是同一个容器迁到不同宿主机时,它的IP可能会发生变化;NAT的存在会造成两端在通讯时看到对方的RealIP,并且NAT本身也是有性能损耗等。这些问题都对使用Docker自己的网络方案造成了障碍。

Flannel

Flannel是CoreOS团队针对Kubernetes设计的一个Overlay 网络。Flannel并没有实现隔离,并且它也是按照网段做IP分配,即一个容器从一台主机迁到另外一台主机的时候,它的地址一定会变化。
title

控制平面如下图所示
title

每个机器上面的Flannel进程会监听ETCD,向ETCD申请每个节点可用的IP地址段,并且从ETCD拿到其他所有宿主机的网段信息,这样它就可以做一些路由。它在Docker进来的网桥基础之上,又创建了一个新的叫VXLAN的设备,VXLAN是一个隧道的方案,它可以把一个二层的包,前面加一个包头,然后再把整个包作为物理网络的一个包,去物理网络里面去路由流转。为什么会要有这个东西呢?因为通常虚拟网络的IP和MAC在物理的网络其实是不认识的。因为识别IP需要物理网络支持,这个其实是个隧道的方案。
title title

Calico

它把每个操作系统的协议栈认为是一个路由器,然后把所有的容器认为是连在这个路由器上的网络终端,在路由器之间跑标准的路由协议——BGP的协议,然后让它们自己去学习这个网络拓扑该如何转发。所以Calico方案其实是一个纯三层的方案,也就是说让每台机器的协议栈的三层去确保两个容器,跨主机容器之间的三层连通性。
title

对于控制平面,它每个节点上会运行两个主要的程序:

  • felix:它会监听ECTD中心的存储获取事件。比如说用户在这台机器上加了一个IP或者是分配了一个容器等,接着会在这台机器上创建出一个容器,并将其网卡、IP、MAC都设置好,然后在内核的路由表里面写一条,注明这个IP应该
2017-08-29 09:47:10    5    0    0

在一些规模稍大的应用中,Java虚拟机(JVM)的内存设置尤为重要,想在项目中取得好的效率,GC(垃圾回收)的设置是第一步。

PermGen space:全称是Permanent Generation space.就是说是永久保存的区域,用于存放Class和Meta信息,Class在被Load的时候被放入该区域Heap space:存放Instance。

GC(Garbage Collection)应该不会对PermGen space进行清理,所以如果你的APP会LOAD很多CLASS的话,就很可能出现PermGen space错误

Java Heap分为3个区

  1. Young
  2. Old
  3. Permanent

Young保存刚实例化的对象,当该区被填满时,GC会将对象移到Old区。Permanent区则负责保存反射对象。

JVM的Heap使用-X设定参数

  1. -Xms 初始Heap大小
  2. -Xmx java heap最大值
  3. -Xmn young generationheap

GC线程

第一个线程负责回收Heap的Young区
第二个线程在Heap不足时遍历Heap,将Young 区升级为Older区

Older区的大小等于-Xmx减去-Xmn,不能将-Xms的值设的过大,因为第二个线程被迫运行会降低JVM的性能。

为什么一些程序频繁发生GC?有如下原因:

  1. 程序内调用了System.gc()或Runtime.gc()。
  2. 一些中间件软件调用自己的GC方法,此时需要设置参数禁止这些GC。
  3. Java的Heap太小,一般默认的Heap值都很小。
  4. 频繁实例化对象Release对象,此时尽量保存并重用对象,例如使用StringBuffer()和String()。

如果你发现每次GC后,Heap的剩余空间会是总空间的50%,这表示你的Heap处于健康状态,许多Server端的Java程序每次GC后最好能有65%的剩余空间

经验之谈:

  1. Server端JVM最好将-Xms和-Xmx设为相同值。为了优化GC,最好让-Xmn值约等于-Xmx的1/3。
  2. 一个GUI程序最好是每10到20秒间运行一次GC,每次在半秒之内完成。

注意:

  1. 增加
2017-07-13 15:31:05    16    0    0

简介

awk: 是Aho、Weinberger、Kernighan三位发明者名字首字母;一个行文本处理工具,逐行处理文件中的数据。

命令格式

  1. awk'pattern + {action}'
  2. #显示hello.txt中的第3行至第5行
  3. [root@seanzhau.com ~]# awk'NR==3, NR==5{print $0}' hello.txt

说明:
单引号”是为了和shell命令区分开;
大括号{}表示一个命令分组;
pattern是一个过滤器,表示命中pattern的行才进行action处理;
action是处理动作;
使用#作为注释;

常用参数

pattern说明
pattern参数可以是egrep正则中的一个,正则使用/pattern/

  1. #显示hello.txt中,正则匹配hello的行
  2. [root@seanzhau.com ~]# awk'/hello/{print $0}' hello.txt
  3. #说明:
  4. patternaction可以只有其一,但不能两者都没有;
  5. 默认的actionprint
  6. #显示hello.txt中,长度大于100的行号
  7. [root@seanzhau.com ~]# awk'length($0)>80{print NR}' hello.txt

内置变量

FS 分隔符,默认是空格
NR 当前行数,从1开始
NF 当前记录字段个数
0>1~$n 当前记录第n个字段

  1. #显示hello.txt中的第3行至第5行的第一列与最后一列
  2. [root@seanzhau.com ~]# awk'NR==3, NR==5{print $1,$NF}' hello.txt

内置函数

gsub(r,s):在$0中用s代替r
index(s,t):返回s中t的第一个位置
length(s):s的长度
match(s

2017-07-13 15:31:05    15    0    0

命令格式

htop [OPTION]

title

常用参数

-C –no-color      #使用一个单色的配色方案
-d –delay=DELAY    #设置延迟更新时间,单位秒
-h –help       #显示htop 命令帮助信息
-u –user=USERNAME   #只显示一个给定的用户的过程
-p –pid=PID,PID…    #只显示给定的PIDs
-s –sort-key COLUMN  #依此列来排序
-v –version       #显示版本信息

常用命令

  1. [root@seanzhau.com ~]# htop

顶部左边显示CPU、内存、交换区的使用情况,右边显示任务、负载、开机时间。
title

中间是进程实时状况。
title

  • PID:进行的标识号
  • USER:运行此进程的用户
  • PRI:进程的优先级
  • NI:进程的优先级别值,默认的为0,可以进行调整
  • VIRT:进程占用的虚拟内存值
  • RES:进程占用的物理内存值
  • SHR:进程占用的共享内存值
  • S:进程的运行状况,R表示正在运行、S表示休眠,等待唤醒、Z表示僵死状态
  • %CPU:该进程占用的CPU使用率
  • %MEM:该进程占用的物理内存和总内存的百分比
  • TIME+:该进程启动后占用的总的CPU时间
  • Command:进程启动的启动命令名称

底部 F1~F10 的功能和对应的字母快捷键。
title

快捷键 功能键 描 述 功能详情
h, ? F1 Help 查看htop帮助说明
S F2 Setup htop设置
/ F3 Search 进程关键字搜索
\ F4 Filter 增量进程过滤器
t F5 Tree 显示进程树形结构
<, > F6 SortBy 选择排序方式
[ F7 Nice - 减少nice值,提高进程的优先级
] F8 Nice + 增加nice值,降低进程的优先级
k F9 Kill
2017-08-01 14:35:19    22    0    0

PaaS分类

Gartner把它分为两类:
aPaaS:application platform as a service,应用部署和运行平台;
iPaaS:integration as a service,集成服务平台。

title

什么是iPaaS

iPaaS是一个集开发、CICD、测试、部署和服务治理于一体的云开发集成平台,它提供了一种敏捷的业务开发 、生产方式,实现了云平台上从源码到应用的系统集成工作流。

此处我们的iPaaS平台基于Fabric8搭建,底层采用了docker和kubernetes容器方案。Fabric8主要实现了开发过程中s2i的工作流、CICD、容器化蓝绿发布、状态自动监控和应用的版本管理;还实现了容器的弹性管理、运行状态管理、服务治理和配置管理。

title

title