L B T

记 录 过 去 的 经 验

环境信息

  • Centos 7 kernel 5.4
  • Mysql Server 5.7

Mysql Server 安装步骤

yum 方式安装

安装 MySQL 5.7 的 yum 源

yum localinstall -y http://dev.mysql.com/get/mysql57-community-release-el7-8.noarch.rpm

如果因为源冲突,类似如下错误

Processing Conflict: mysql80-community-release-el7-2.noarch conflicts mysql57-community-release

可以卸载旧的 yum 源安装包,重新安装

$ rpm -qa | grep mysql
mysql80-community-release-el7-2.noarch

$ yum remove mysql80-community-release-el7-2

$ yum localinstall -y http://dev.mysql.com/get/mysql57-community-release-el7-8.noarch.rpm

检查 yum 源中的 mysql-community-server 信息

$ yum info mysql-community-server
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
* base: download.cf.centos.org
* elrepo: reflector.westga.edu
* epel: coresite.mm.fcix.net
* extras: download.cf.centos.org
* updates: download.cf.centos.org
Available Packages
Name : mysql-community-server
Arch : x86_64
Version : 5.7.40
Release : 1.el7
Size : 178 M
Repo : mysql57-community/x86_64
Summary : A very fast and reliable SQL database server

阅读全文 »

环境信息

  • Centos 7
  • docker-ce-19.03.15
  • harbor v2.6.1

安装步骤

官网安装参考链接

下载安装包

wget https://github.com/goharbor/harbor/releases/download/v2.6.1/harbor-offline-installer-v2.6.1.tgz
tar -xf harbor-offline-installer-v2.6.1.tgz
cd harbor

准备证书

将申请好的证书上传到服务器,将 harbor.crt 转换为 harbor.cert

openssl x509 -inform PEM -in harbor.crt -out harbor.cert 

将转换好的证书和私钥拷贝到 Docker 的证书目录 /etc/docker/certs.d/yourdomain.com/

cp yourdomain.com.cert /etc/docker/certs.d/yourdomain.com/
cp yourdomain.com.key /etc/docker/certs.d/yourdomain.com/
cp ca.crt /etc/docker/certs.d/yourdomain.com/

重启 Docker

systemctl restart docker

配置 Harbor 安装配置文件

执行 install.sh 命令安装 Harbor 时,会使用配置文件 harbor.yml(需要拷贝安装包中的 harbor.yml.tmplharbor.yml)。

修改配置中的 hostname 选项,配置访问 Harbor 的域名。此为必须修改的参数

修改配置中的 https.certificatehttps.private_key,配置证书(harbor.crt)和私钥的路径,使用 HTTPS 时必须配置

修改配置中的 data_volume,指定持久化数据卷的路径。默认为 data_volume: /data

阅读全文 »

环境信息

  • Jenkins jenkinsci/blueocean:2.346.3
  • GitLab Community Edition 13.9.6
  • Docker 19.03.15

本文档记录 GitLab 上面的代码更新时,使用 Jenkins 自动构建 Docker 镜像的过程。

配置过程

使用 docker 启动 Jenkins 容器

docker run -d -p 8080:8080 --name jenkins \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /data/JenkinsData_blueocean/:/var/jenkins_home/ \
-u root \
jenkinsci/blueocean

Jenkins 配置

以下分别记录使用 freestylePipeline 类型的构建镜像的配置过程

创建 freestyle 类型的 Item 构建镜像

源码管理(Source Code Management) 中配置 git 地址,并配置认证

默认情况下,在构建时,Jenkins 会先从配置的 Git 地址拉取代码到 Jenkins 目录: /var/jenkins_home/workspace/${PROJECT_NAME}

构建(Build)Add build step ,选择构建类型为 Execute shell,此处构建的示例项目代码结构如下,其中 Dockerfile 路径为 k8s/server/Dockerfile

.:
index.html k8s

./k8s:
server

./k8s/server:
Dockerfile

使用如下 shell 脚本

#!/bin/sh

DATA=`date +%Y%m%d%H%M`

DIR='.'

LOG=${DIR}/docker_build_result.log

DOCKER_REGISTRY='harbor.a.com'

DOCKER_REGISTRY_PROJECT='test'

PROJECT='test_project'
ENV='uat'

docker build -t ${PROJECT}-${ENV}-${Branch}:${DATA} -f k8s/server/Dockerfile ${DIR} | tee ${LOG}

docker tag ${PROJECT}-${ENV}-${Branch}:${DATA} ${DOCKER_REGISTRY}/${DOCKER_REGISTRY_PROJECT}/${PROJECT}-${ENV}-${Branch}:${DATA}

docker login -u admin -p Harbor12345 ${DOCKER_REGISTRY}

docker push ${DOCKER_REGISTRY}/${DOCKER_REGISTRY_PROJECT}/${PROJECT}-${ENV}-${Branch}:${DATA}

RESULT=`cat ${LOG} | tail -n 1`

grep "Successfully tagged " ${LOG}

exit $?

其中的 ${Branch} 来自 参数化的构建

阅读全文 »

环境信息

  • Centos7
  • Kubernetes 1.21
  • flannel 0.20

为观察 Kubernetes 集群中跨主机 POD 之间的网络通信数据流,本文通过 tcpdump 抓包,对数据流向进行记录观察。

本示例中的 Kubernetes 集群由以下节点组成:

节点主机名 节点角色 节点 IP 节点上测试 POD IP
master master eth0: 10.150.0.21 10.244.0.2
worker1 worker eth0: 10.150.0.19 10.244.1.38
worker2 worker eth0: 10.150.0.20 10.244.2.27

Flannel 简介

Kubernetes 系统上 POD 网络的实现依赖于第三方插件,Kubernetes 只负责提供了 CNI(容器网络接口),只要符合 CNI 规则的第三方插件都可以用于为 POD 提供网络实现。而 Flannel 是由 CoreOS 主推的目前比较主流的容器网络解决方案。

Flannel 支持三种不同后端实现,分别是:

  • UDP
  • VXLAN
  • host-gw

UDP 是 Flannel 项目最早支持的一种方式,是性能最差的方式,目前已被废弃。

用的最多的是 VXLAN 和 host-gw 模式的部署。

阅读全文 »

tcpdump 命令格式说明

  • option - 可选选项(参数)
  • proto - 协议类过滤器:根据协议进行过滤,可识别的关键词有: tcp, udp, icmp, ip, ip6, arp, rarp,ether,wlan, fddi, tr, decnet
  • direction - 数据流向类过滤器:根据数据流向进行过滤,可识别的关键字有:src, dst,同时你可以使用逻辑运算符进行组合,比如 src or dst
  • type 类过滤器:可识别的关键词有:host, net, port, portrange,这些词后边需要再接参数。

常用选项

选项 说明 示例
-i 目标网卡
-n
-nn
不对 IP/DOMAIN 进行解析
不对 IP/DOMAIN 及 PORT 进行解析
-w 将结果写入文件 tcpdump icmp -w icmp.pcap
阅读全文 »

常见的 SSL 证书格式主要有:

  • .DER .CER - 文件是二进制格式,只保存证书,不保存私钥。
  • .PEM - 一般是文本格式,可保存证书,可保存私钥。
  • .CRT - 可以是二进制格式,可以是文本格式,一般均为文本格式,与 .DER 格式相同,不保存私钥。
  • .PFX .P12 - 二进制格式,同时包含证书和私钥,一般有密码保护。
  • .JK - 二进制格式,同时包含证书和私钥,一般有密码保护。

证书格式说明

DER 和 CER

该格式是二进制文件内容,Java 和 Windows 服务器偏向于使用这种编码格式。只含有证书信息,不包含私钥

OpenSSL 查看

openssl x509 -in certificate.der -inform der -text -noout

转换为 PEM:

openssl x509 -in cert.crt -inform der -outform pem -out cert.pem

PEM

Privacy Enhanced Mail,一般为文本格式,以 -----BEGIN... 开头,以 -----END... 结尾。中间的内容是 BASE64 编码。这种格式可以保存证书和私钥,有时我们也把 PEM 格式的私钥的后缀改为 .key 以区别证书与私钥。

这种格式常用于 Apache 和 Nginx 服务器。

OpenSSL 查看:

openssl x509 -in certificate.pem -text -noout

转换为 DER:

openssl x509 -in cert.crt -outform der -out cert.der

CRT

Certificate 的简称,有可能是 PEM 编码格式,也有可能是 DER 编码格式。如何查看请参考前两种格式。

PFX

Predecessor of PKCS#12,这种格式是二进制格式,且证书和私钥存在一个 PFX 文件中。一般用于 Windows 上的 IIS 服务器。该格式的文件一般会有一个密码用于保证私钥的安全。

OpenSSL 查看:

openssl pkcs12 -in for-iis.pfx

转换为 PEM:

openssl pkcs12 -in for-iis.pfx -out for-iis.pem -nodes

JKS

Java Key Storage,很容易知道这是 JAVA 的专属格式,利用 JAVA 的一个叫 keytool 的工具可以进行格式转换。一般用于 Tomcat 服务器。

可以到这里进行 格式转换

阅读全文 »

更新索引

$ apk update

fetch https://dl-cdn.alpinelinux.org/alpine/v3.14/main/x86_64/APKINDEX.tar.gz
fetch https://dl-cdn.alpinelinux.org/alpine/v3.14/community/x86_64/APKINDEX.tar.gz
fetch http://nl.alpinelinux.org/alpine/edge/main/x86_64/APKINDEX.tar.gz
fetch http://nl.alpinelinux.org/alpine/edge/testing/x86_64/APKINDEX.tar.gz
fetch http://nl.alpinelinux.org/alpine/edge/community/x86_64/APKINDEX.tar.gz
v3.14.8-65-g0f3285f2cf [https://dl-cdn.alpinelinux.org/alpine/v3.14/main]
v3.14.8-66-ge9853dea68 [https://dl-cdn.alpinelinux.org/alpine/v3.14/community]
v20220809-6223-gb7f2956912 [http://nl.alpinelinux.org/alpine/edge/main]
v20220809-6223-gb7f2956912 [http://nl.alpinelinux.org/alpine/edge/testing]
v20220809-6223-gb7f2956912 [http://nl.alpinelinux.org/alpine/edge/community]
OK: 38705 distinct packages available

从远程镜像源中更新本地镜像源索引,update 命令会从各个镜像源列表下载 APKINDEX.tar.gz 并存储到本地缓存,一般在 /var/cache/apk/ (Alpine 在该目录下)

阅读全文 »

环境信息

  • Centos7 3.10.0-1160.76.1
  • Docker Engine - Community 19.03.15

安装步骤

创建自定义网络

为了使容器互联,新版本建议将容器加入自定义的 Docker 网络 来连接多个容器,而不是使用 --link 参数。

从 Docker 1.10 版本开始,docker daemon 实现了一个内嵌的 DNS server,使容器可以直接通过容器名称通信。方法很简单,只要在创建容器时使用 --name 为容器命名即可。但是使用 Docker DNS 有个限制:只能在 user-defined 网络中使用。也就是说,默认的 bridge 网络是无法使用 DNS 的,所以我们就需要自定义网络。

docker network create -d bridge docker-network-for-openldap

之后为 LDAP 创建的相关容器,都连接到此网络。

启动 openldap 容器

为 openldap 容器创建本地持久化数据目录,容器启动时将此目录以数据卷的形式挂载使用

mkdir /data/OpenLDAPData

启动容器,挂载数据卷,使用自定义网络

docker run -d -p 389:389 -p 636:636 \
-v /data/OpenLDAPData:/usr/local/ldap \
--name openldap \
--network docker-network-for-openldap \
osixia/openldap:1.3.0
阅读全文 »

本文主要记录使用 docker compose 配置 Django + Mysql 的 web 站点的过程。

环境信息

  • Centos7
  • Docker version 20.10.17

目录结构及说明

项目目录结构及简要说明如下:

.
├── compose
│ └── mysql
│ └── my.cnf
├── django_project
│ ├── db.sqlite3
│ ├── django_app
│ │ ├── admin.py
│ │ ├── apps.py
│ │ ├── __init__.py
│ │ ├── migrations
│ │ ├── models.py
│ │ ├── tests.py
│ │ └── views.py
│ ├── django_project
│ │ ├── asgi.py
│ │ ├── __init__.py
│ │ ├── __pycache__
│ │ ├── settings.py
│ │ ├── urls.py
│ │ └── wsgi.py
│ ├── Dockerfile
│ ├── manage.py
│ └── requirements.txt
├── docker-compose.yml

  • compose : 存放应用配置文件,如 mysql 配置文件 compose/mysql/my.cnf
  • django_project : Django project 项目目录, django-admin startproject django_project 生成
  • django_project/django_app : Django project 项目下的 app 目录,django-admin startapp django_app 生成
  • docker-compose.yml : 项目的 compose 文件
阅读全文 »

gzip

解压缩

$ file test.gz 
test.gz: gzip compressed data, from FAT filesystem (MS-DOS, OS/2, NT)

gzip -d test.gz

压缩

gzip test.txt

压缩后默认生成压缩文件 test.txt.gz

环境信息

  • Python3.10
  • Django 4.0

接收 post 中的 json 数据

示例通过 curl 命令模拟 post 请求,命令如下:

curl -v -H "Accept: application/json" -H "Content-type: application/json" -X POST \
-d '{"id" : "yTP7PSsRxz53tJ56VVG", "type" : 5}' 127.0.0.1:8000/csapi

Django 处理程序示例:

views.py
from django.http import HttpResponse


def csapi(request):
post_body = request.body
print(f'****** POST body: {post_body}, type : {type(post_body)}')

#
data = eval(post_body)

print(f'****** data : {data} , type : {type(data)}')

return HttpResponse('ok')

Console 输出结果:

****** POST body: b'{"id" : "yTP7PSsRxz53tJ56VVG", "type" : 5}', type : <class 'bytes'>
****** data : {'id': 'yTP7PSsRxz53tJ56VVG', 'type': 5} , type : <class 'dict'>

以上输出可以看到,request.body 中的类型为 bytes

使用 eval 转换后类型变为 dict

使用 json.loadsrequest.body 转换为 dict 时,可能会报以下错误:

json.decoder.JSONDecodeError: Expecting property name enclosed in double quotes: line 1 column 2 (char 1)

可能原因 参考

Centos 7 内核版本由 3.10 升级到 5.4.212-1

环境息息

  • Centos7 3.10.0-1062.9.1.el7.x86_64

升级步骤

安装 elrepo 源

rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
rpm -Uvh https://www.elrepo.org/elrepo-release-7.el7.elrepo.noarch.rpm
yum --disablerepo="*" --enablerepo="elrepo-kernel" repolist
阅读全文 »

命令格式

rsync [OPTION]... SRC DEST
rsync [OPTION]... SRC [USER@]host:DEST
rsync [OPTION]... [USER@]HOST:SRC DEST
rsync [OPTION]... [USER@]HOST::SRC DEST
rsync [OPTION]... SRC [USER@]HOST::DEST
rsync [OPTION]... rsync://[USER@]HOST[:PORT]/SRC [DEST]

: ssh 方式进行备份,ssh 非默认端口使用选项 -e 指定端口, -e 'ssh -p 30000'

:: socket 方式进行备份,rsync 以服务方式监听,SRC/DEST 为配置中定义的模块 []

  • rsync 命令使用中,如果源参数的末尾有斜线,只会复制指定目录的内容,而不复制目录本身,没有斜线,则会复制目录本身,包括目录
  • 客户端免密登录时,需要在客户端建立密码文件: /etc/rsync.passwd,文件中只保存密码,权限为600,用选项 --password-file 指明存放密码的文件位置
阅读全文 »

对于 Compose 来说,大部分命令的对象既可以是项目本身,也可以指定为项目中的服务或者容器。如果没有特别的说明,命令对象将是项目,这意味着项目中所有的服务都会受到命令影响。

执行 docker compose [COMMAND] --help 可以查看具体某个命令的使用格式。

docker compose 命令的基本的使用格式是

docker compose [-f=<arg>...] [options] [COMMAND] [ARGS...]

常用选项

  • -f, --file FILE 指定使用的 Compose 模板文件,默认为 docker-compose.yml,可以多次指定。
  • -p, --project-name NAME 指定项目名称,默认将使用所在目录名称作为项目名。
阅读全文 »

环境信息

  • Centos 7

vim 配置

vim 启动时会读取 /etc/vimrc(全局配置) 和 ~/.vimrc (用户配置)

常用配置如下,使用 " 注释

/etc/vimrc
" 自动缩进 
set ai
set autoindent

" 保存历史命令数量
set history=50

" 右下角显示当前鼠标位置(行列数)
set ruler

" 鼠标位置所在行显示下划线
set cursorline

" 开启语法高亮
syntax on

" 高亮搜索结果
set hlsearch

" 搜索时不区分大小写
set ignorecase

" 将 tab 转换为空格
set expandtab

" tab 转换为4个空格
set tabstop=4

" 删除时,可以一次删除4个空格
set softtabstop=4

" 显示行数
set nu
阅读全文 »

环境信息

  • Centos 7
  • iptables

Fail2ban 是 Linux 上的一个著名的入侵保护的开源框架。它通过监视相应服务的日志记录文件,匹配日志记录中的错误信息(正则式匹配),然后与系统的 iptables 联动执行相应的屏蔽动作(一般情况下是调用防火墙屏蔽),比如:当有人在试探你的 HTTPSSHSMTPFTP 密码,只要达到你预设的次数,Fail2ban 就会调用防火墙屏蔽这个 IP,并且可以发送 e-mail 通知系统管理员。

由于 Fail2ban 需要与系统的 iptablesfirewalld 等联动来达到封禁 IP 的目的, iptables 使用与 firewalld 有少许不同。

本文以 iptables 为例

安装

yum install epel-release
yum install -y fail2ban
systemctl enable fail2ban
阅读全文 »

Confluence 是一个专业的企业知识管理与协同软件,也可以用于构建企业 wiki。通过它可以实现团队成员之间的协作和知识共享。在这里,团队成员齐心协力,各擅其能,协同地编写文档和管理项目。从此打破不同团队、不同部门以及个人之间信息孤岛的僵局,Confluence 真正实现了组织资源共享。Confluence 使用简单,但它强大的编辑和站点管理特征能够帮助团队成员之间共享信息、文档协作、集体讨论。

阅读全文 »

环境信息

  • Centos 7

logrotate 程序是一个日志文件管理工具。用于分割日志文件,压缩转存、删除旧的日志文件,并创建新的日志文件

logrotate 是基于 crond 来运行的,其脚本是 /etc/cron.daily/logrotate,日志轮转是系统自动完成的。
实际运行时,logrotate 会调用配置文件 /etc/logrotate.conf
/etc/cron.daily/logrotate 文件内容如下:

/etc/cron.daily/logrotate
#!/bin/sh

/usr/sbin/logrotate -s /var/lib/logrotate/logrotate.status /etc/logrotate.conf
EXITVALUE=$?
if [ $EXITVALUE != 0 ]; then
/usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]"
fi
exit 0

可以执行以下命令手动执行日志切割:

logrotate -f /etc/logrotate.conf

以下命令可以检测配置文件是否正确:

logrotate -d /etc/logrotate.conf
阅读全文 »

环境信息

  • Centos 7

系统默认的日志托管服务,部分系统服务(如 crond, 邮件系统,安全审计等)会将日志发送给 rsyslog 服务来进行日志管理。

rsyslog 服务是依赖其配置文件 /etc/rsyslog.conf 来确定哪个服务的什么等级的日志信息会被记录在哪个位置的。也就是说,日志服务的配置文件中主要定义了服务的名称、日志等级和日志记录位置。

阅读全文 »