Rootop 服务器运维与web架构

2019-04-10
发表者 Venus
fluentd收集docker日志已关闭评论

fluentd收集docker日志

1、安装fluentd docker版:

docker run \
-dit \
--name fluentd \
--hostname fluentd \
-p 24224:24224/udp \
-p 24224:24224 \
-v /fluentd/log:/fluentd/log \
docker.io/fluent/fluentd

这样fluentd日志就挂载到宿主机的/fluentd/log目录下。

2、创建服务,指定fluentd信息

docker service create \
--replicas 6 \
-dt \
--name ping \
--network onet \
--log-driver=fluentd \
--log-opt=fluentd-address=192.168.10.80:24224 \
--log-opt=tag=TagOfPingService \
--log-opt=fluentd-async-connect \
--with-registry-auth \
hub.xxx.com/test/java8:0402 \
ping www.baidu.com

注意事项:
1、docker service create 创建服务,指定镜像为私库路径,提示 没有这个镜像。 解决方法如下:

一)、管理节点及工作节点需要登录私库 docker login -u xxx -p xxx repoAddr 认证信息保存在 cat /root/.docker/config.json 中
二)、docker service create 添加参数 –with-registry-auth 进行私库验证
以上两步就可以拉取私库镜像了。

2、如果fluentd服务挂掉,新建的服务容器无法启动。
会提示starting container failed: failed to initialize logging driver: dial tcp 192.168.10.80:24224: connect: connection refused错误。
如果是容器已启动,fluentd挂掉会继续运行。

2019-04-10
发表者 Venus
docker版fluentd修改时区已关闭评论

docker版fluentd修改时区

发现docker容器发过来的日志记录文件中时区是错误的,差八个小时,可以确定是时区的问题。
进入容器验证时区设置

[root@localhost log]# docker exec -it fluentd /bin/sh
/ # date
Wed Apr 10 05:06:07 UTC 2019
/ # cd /usr/share/lo^C
/ # cp /usr/share/  # 发现没有zoneinfo目录
apk/              ca-certificates/  man/              misc/             terminfo/

# 查看系统版本

~ # cat /etc/issue 
Welcome to Alpine Linux 3.8
Kernel \r on an \m (\l)

系统为Alpine linux,这里需要用apk这个包管理器安装tzdata这个包

~ # apk add -U tzdata
fetch http://dl-cdn.alpinelinux.org/alpine/v3.8/main/x86_64/APKINDEX.tar.gz
fetch http://dl-cdn.alpinelinux.org/alpine/v3.8/community/x86_64/APKINDEX.tar.gz
(1/1) Installing tzdata (2018f-r0)
Executing busybox-1.28.4-r2.trigger
OK: 29 MiB in 28 packages
~ # cp /usr/share/zoneinfo/
Africa/       Atlantic/     Canada/       EST5EDT       Factory       GMT-0         Iceland       Japan         MST7MDT       PRC           ROC           US/           Zulu          zone1970.tab
America/      Australia/    Chile/        Egypt         GB            GMT0          Indian/       Kwajalein     Mexico/       PST8PDT       ROK           UTC           iso3166.tab
Antarctica/   Brazil/       Cuba          Eire          GB-Eire       Greenwich     Iran          Libya         NZ            Pacific/      Singapore     Universal     posixrules
Arctic/       CET           EET           Etc/          GMT           HST           Israel        MET           NZ-CHAT       Poland        Turkey        W-SU          right/
Asia/         CST6CDT       EST           Europe/       GMT+0         Hongkong      Jamaica       MST           Navajo        Portugal      UCT           WET           zone.tab
~ # cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime 
~ # date
Wed Apr 10 13:13:57 CST 2019

重启fluentd容器解决。

2019-04-02
发表者 Venus
docker私库harbor配置已关闭评论

docker私库harbor配置

harbor介绍(复制来的):

Harbor是VMware公司开源了企业级Registry项目, 其的目标是帮助用户迅速搭建一个企业级的Docker registry服务。它以Docker公司开源的registry为基础,额外提供了如下功能:
基于角色的访问控制(Role Based Access Control)
基于策略的镜像复制(Policy based image replication)
镜像的漏洞扫描(Vulnerability Scanning)
AD/LDAP集成(LDAP/AD support)
镜像的删除和空间清理(Image deletion & garbage collection)
友好的管理UI(Graphical user portal)
审计日志(Audit logging)
RESTful API
部署简单(Easy deployment)

项目地址:https://github.com/goharbor/harbor
从release里下载Harbor online installer在线安装版。
目前最新版下载地址为:https://storage.googleapis.com/harbor-releases/release-1.7.0/harbor-online-installer-v1.7.4.tgz

1、先安装docker及docker-compose(harbor部署脚本通过服务编排实现),过程略。
# 解压 harbor

[root@localhost ~]# tar zxvf harbor-online-installer-v1.7.4.tgz

# 编辑 harbor.cfg 只修改下面几行即可

[root@localhost harbor]# vi harbor.cfg
hostname = hub.xxx.com  # 绑定自己的域名,便于docker pull \ push的时候输入地址。
ui_url_protocol = https # 启用https协议,否则docker在pull的时候会提示http不安全需要https(要么每个docker机器手动加入信任,嫌弃麻烦)。
ssl_cert = /data/cert/214290856400784.pem  # ssl公钥,这里直接用阿里云颁发的免费域名证书(原先配置文件里是crt文件,pem也可以)
ssl_cert_key = /data/cert/214290856400784.key # ssl私钥,这俩证书服务编排的时候会加载到容器的nginx中。
secretkey_path = /data  # 秘钥路径
harbor_admin_password = 111111  # web界面登陆admin用户的密码

# 创建秘钥目录,把阿里云的证书文件放进去

[root@localhost harbor]# mkdir -p /data/cert
[root@localhost harbor]# ll /data/cert/
total 8
-rw-r--r-- 1 root root 1678 Apr  2 09:53 214290856400784.key
-rw-r--r-- 1 root root 3662 Apr  2 09:53 214290856400784.pem

# 开始服务编排

[root@localhost harbor]# sh install.sh
成功后会显示
----Harbor has been installed and started successfully.----

Now you should be able to visit the admin portal at https://hub.xxx.com. 
For more details, please visit https://github.com/goharbor/harbor .

访问 https://hub.xxx.com 默认用户名 admin,密码上面设置的。

左上侧有个项目菜单,新建项目 可以用来区分不同的项目所用到的镜像,便于分类管理。
我这里新建了一个test项目(注意不要公开,否则任何人知道地址后都可以拉取了),测试上传镜像。

# 给本地镜像打标签并push到私库

[root@localhost ~]# docker tag 45d8d2f74278 hub.xxx.com/test/java8:0402 # 这个地方注意加上test(等于项目是一个目录) 0402是标记TAG,今天的日期便于区分
[root@localhost ~]# docker images
REPOSITORY                                  TAG                 IMAGE ID            CREATED             SIZE
docker.io/registry                          latest              f32a97de94e1        3 weeks ago         25.8 MB
docker.io/goharbor/redis-photon             v1.7.4              611d1ead0a28        4 weeks ago         99.7 MB
docker.io/goharbor/harbor-registryctl       v1.7.4              723aed7bbf8d        4 weeks ago         102 MB
docker.io/goharbor/registry-photon          v2.6.2-v1.7.4       f4743bd7b0d9        4 weeks ago         86.7 MB
docker.io/goharbor/nginx-photon             v1.7.4              dda34e6afafe        4 weeks ago         35.9 MB
docker.io/goharbor/harbor-log               v1.7.4              bf4916eef530        4 weeks ago         81.4 MB
docker.io/goharbor/harbor-jobservice        v1.7.4              1b6a0445ae9c        4 weeks ago         84.1 MB
docker.io/goharbor/harbor-core              v1.7.4              e603b8750d26        4 weeks ago         95.6 MB
docker.io/goharbor/harbor-portal            v1.7.4              2ca1d845cafa        4 weeks ago         40.6 MB
docker.io/goharbor/harbor-adminserver       v1.7.4              5706c65d65dc        4 weeks ago         72.3 MB
docker.io/goharbor/harbor-db                v1.7.4              08d163f732f3        4 weeks ago         136 MB
hub.xxx.com/java8                           0402                45d8d2f74278        5 months ago        1.21 GB
hub.xxx.com/java8                           latest              45d8d2f74278        5 months ago        1.21 GB
hub.xxx.com/test/java8                      0402                45d8d2f74278        5 months ago        1.21 GB

# 登陆私库测试推送

[root@localhost harbor]# docker login -u admin -p 111111 hub.xxx.com
Login Succeeded
[root@localhost ~]# docker push hub.xxx.com/test/java8:0402
The push refers to a repository [hub.xxx.com/test/java8]
5f70bf18a086: Pushed 
bba5ae3ca8bd: Pushed 
28a4db706758: Pushed 
8215ed96e346: Pushed 
6831dc86bfcf: Pushed 
4cdc463b402d: Pushed 
0402: digest: sha256:318cce2a9d4dfccf96c74ac1f6a146406950d961dd96da6b5cc187e034ca29c4 size: 3641

刚开始还挺纠结这个作者名字从哪里来的,后来一想是当时用dockerfile构建镜像时配置文件里MAINTAINER这个参数控制的。这个镜像还是2018年在docker1.7.1版本下做的。

# 退出登陆,测试未登录状态下能否拉取私库镜像

[root@localhost harbor]# docker logout hub.xxx.com
Removing login credentials for hub.xxx.com
[root@localhost harbor]# docker pull hub.xxx.com/test/java8:0402
Trying to pull repository hub.xxx.com/test/java8 ... 
repository hub.xxx.com/test/java8 not found: does not exist or no pull access

提示镜像不存在或没有拉取权限。

系统管理 里面的功能暂未研究。

2019-03-29
发表者 Venus
什么是2MSL已关闭评论

什么是2MSL

原文:https://blog.csdn.net/xiaofei0859/article/details/6044694

MSL是Maximum Segment Lifetime英文的缩写,中文可以译为“报文最大生存时间”。
他是任何报文在网络上存在的最长时间,超过这个时间报文将被丢弃。
因为tcp报文(segment)是ip数据报(datagram)的数据部分,具体称谓请参见《数据在网络各层中的称呼》一文,而ip头中有一个TTL域,TTL是time to live的缩写,中文可以译为“生存时间”,这个生存时间是由源主机设置初始值但不是存的具体时间,而是存储了一个ip数据报可以经过的最大路由数,每经过一个处理他的路由器此值就减1,当此值为0则数据报将被丢弃,同时发送ICMP报文通知源主机。RFC 793中规定MSL为2分钟,实际应用中常用的是30秒,1分钟和2分钟等。

2MSL即两倍的MSL,TCP的TIME_WAIT状态也称为2MSL等待状态,当TCP的一端发起主动关闭,在发出最后一个ACK包后,即第3次握手完成后发送了第四次握手的ACK包后就进入了TIME_WAIT状态,必须在此状态上停留两倍的MSL时间,等待2MSL时间主要目的是怕最后一个ACK包对方没收到,那么对方在超时后将重发第三次握手的FIN包,主动关闭端接到重发的FIN包后可以再发一个ACK应答包。在TIME_WAIT状态时两端的端口不能使用,要等到2MSL时间结束才可继续使用。当连接处于2MSL等待阶段时任何迟到的报文段都将被丢弃。不过在实际应用中可以通过设置SO_REUSEADDR选项达到不必等待2MSL时间结束再使用此端口。

TTL与MSL是有关系的但不是简单的相等的关系,MSL要大于等于TTL。

centos7下默认是60秒

[root@localhost ~]# cat /proc/sys/net/ipv4/tcp_fin_timeout
60

另外可以参考知乎的回答:https://www.zhihu.com/question/67013338

2019-03-19
发表者 Venus
awk的几个常用用法已关闭评论

awk的几个常用用法

以passwd文件中的2行测试:
[root@rootop ~]# cat passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin

# 默认awk以空格或制表符做为分隔符,通过-F可以指定分隔符
格式:
awk -F '分隔符' # 单引号、双引号都可以

[root@rootop ~]# cat passwd  | awk -F ":" '{print $1}' # 通过stdin标准输入做为要处理的数据
root
bin

[root@rootop ~]# awk -F ":" '{print $1}' passwd # 通过指定文件做为要处理的数据
root
bin

$1为打印分隔后的第几列

# 通过打印 NF 变量可以看到有几列
[root@rootop ~]# awk -F ":" '{print NF}' passwd 
7
7

# 通过打印 NF 列可以打印最后一列
[root@rootop ~]# awk -F ":" '{print $NF}' passwd 
/bin/bash
/sbin/nologin

# 打印倒数第二列
[root@rootop ~]# awk -F ":" '{print $(NF-1)}' passwd 
/root
/bin

# 打印第一列并打印倒数第二列组成一行
[root@rootop ~]# awk -F ":" '{print $1$(NF-1)}' passwd 
root/root
bin/bin

# 如果中间想加个字符串可能会想到这么做
[root@rootop ~]# awk -F ":" '{print $1 "string" $(NF-1)}' passwd 
rootstring/root
binstring/bin

可以看到是连接在一起,没有分隔(第一列、字符串、第二列之间没有空格)

# 正确方法用逗号隔开,逗号表示添加空格
[root@rootop ~]# awk -F ":" '{print $1,"string",$(NF-1)}' passwd 
root string /root
bin string /bin

# 计算长度
[root@rootop ~]# awk -F ":" '{print length($1)}' passwd 
4
3

# 过滤结果 通过{}花括号外的 /条件/ 实现过滤
[root@rootop ~]# awk -F ":" '/ro/ {print $1}' passwd 
root

类似于用grep过滤结果
[root@rootop ~]# awk -F ":" '{print $1}' passwd | grep ro
root