安装目录示分区大小而定,不可盲目复制命令进行安装!

安装 Docker 容器服务

CentOS 安装

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# 1. 卸载旧的版本
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine

# 2. 安装yum-utils包(提供 yum-config-manager 程序)
sudo yum install -y yum-utils

# 3. 设置镜像的仓库
yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo # 默认是国外的,十分慢!
# 建议使用阿里云的镜像地址
yum-config-manager \
--add-repo \
https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

# 更新yum软件包索引
yum makecache fast

# 4. 安装docker相关的 docker-ce docker-compose (默认为最新版)
sudo yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin -y

# 5. 安装指定版本
sudo yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io docker-compose-plugin -y
sudo yum install docker-ce-20.10.13 docker-ce-cli-20.10.13 containerd.io docker-compose-plugin -y

# 6. 启动docker
systemctl start docker
systemctl enable docker

# 7. 使用docker version查看是否安装成功
docker version

Ubuntu 安装

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
# 1. 卸载旧的版本
sudo apt-get remove docker docker-engine docker.io containerd runc

# 2. 更新软件包索引并安装软件包,以允许通过 HTTPS 使用存储库:aptapt
sudo apt-get update

sudo apt-get install \
apt-transport-https \
ca-certificates \
curl \
gnupg-agent

# 3. 添加 Docker 的官方 GPG 密钥:
sudo curl -fsSL http://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
# 4. 设置存储库
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] http://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# 如果您使用 Ubuntu 衍生发行版,例如 Linux Mint,则可能需要使用 UBUNTU_CODENAME 而不是 VERSION_CODENAME

# 5. 更新包索引,并安装最新版本的 Docker 引擎、容器和 Docker Compose
sudo apt-get update

sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin

# 安装指定版本
sudo apt-get install docker-ce=<VERSION_STRING> docker-ce-cli=<VERSION_STRING> containerd.io docker-compose-plugin

# 先列出存储库中的可用版本
apt-cache madison docker-ce
docker-ce | 5:20.10.18~3-0~ubuntu-focal | https://download.docker.com/linux/ubuntu focal/stable amd64 Packages
docker-ce | 5:20.10.17~3-0~ubuntu-focal | https://download.docker.com/linux/ubuntu focal/stable amd64 Packages
docker-ce | 5:20.10.16~3-0~ubuntu-focal | https://download.docker.com/linux/ubuntu focal/stable amd64 Packages

# 取出其中的版本号,例如:5:20.10.17~3-0~ubuntu-focal
sudo apt-get install docker-ce=5:20.10.17~3-0~ubuntu-focal docker-ce-cli=5:20.10.17~3-0~ubuntu-focal containerd.io docker-compose-plugin


# 6. 启动docker
systemctl start docker
systemctl enable docker

# 7. 使用docker version查看是否安装成功

DockerHub 国内网络无法访问,如何下载镜像文件,离线导入

使用 Github Action 构建 docker 镜像

安装 MiniKube 单机 K8S 服务

安装环境:CentOS 8

安装 kubectl

安装工具 | Kubernetes

安装 MiniKube

minikube start | minikube 中文

常用命令:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# 启动 minikube
minikube start --driver='docker' --cache-images=true --kubernetes-version='v1.31.0' --registry-mirror='https://hub.geekery.cn' --base-image='registry.cn-hangzhou.aliyuncs.com/google_containers/kicbase:v0.0.45' --listen-address=0.0.0.0 --force

# 开启 dashboard
minikube dashboard
# 启动端口转发,提供 dashboard 供外部访问
kubectl port-forward -n kubernetes-dashboard svc/kubernetes-dashboard 8080:80 --address 0.0.0.0

# 开启 nginx ingress controller 插件
# 1.手动加载国内镜像
minikube image load registry.cn-hangzhou.aliyuncs.com/google_containers/nginx-ingress-controller:v1.12.0-beta.0
minikube image load registry.cn-hangzhou.aliyuncs.com/google_containers/kube-webhook-certgen:v1.4.4
# 2.开启插件
minikube addons enable ingress --images="KubeWebhookCertgenCreate=registry.cn-hangzhou.aliyuncs.com/google_containers/kube-webhook-certgen:v1.4.4,KubeWebhookCertgenPatch=registry.cn-hangzhou.aliyuncs.com/google_containers/kube-webhook-certgen:v1.4.4,IngressController=google_containers/nginx-ingress-controller:v1.12.0-beta.0" --registries="IngressController=registry.cn-hangzhou.aliyuncs.com"

# 发布应用
# 前提
# 创建 nfs 共享文件夹,供 pod 内的容器访问
# 后端
# 1.导入打包好的后端应用 docker 镜像
# 设置 Minikube 的 Docker 环境
eval $(minikube -p minikube docker-env)
# 导入镜像到 Minikube
docker load -i vxtcip-boot-v1.0.0.tar
# 2.编写 deployment 配置文件(yaml)
# 略...
# 3.部署 deployment
kubectl apply -f *-deployment.yaml
# 重启 deployment
kubectl rollout restart -n ${namespace-name} deployment ${deployment-name}
# 删除 deployment
kubectl delete -n ${namespace-name} deployment ${deployment-name}

安装 Kubernetes 集群和 KubeSphere

官方文档: 在 Linux 上安装 Kubernetes 和 KubeSphere

参考博客:33 张高清大图,带你玩转 KubeSphere 4.1.2 部署与扩展组件安装

前置条件

安装 Ansible 自动化运维工具(用于批量执行脚本/命令)

参考本文《Ansible 安装与配置》

操作系统基础配置

可使用 Ansible 批量在集群机器上执行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 配置主机名(每台机器都需要配置,按照不同的 hostname 执行)
hostnamectl set-hostname k8s-control-1
# 配置DNS(已配置则忽略)
ansible k8s -m shell -a 'echo "nameserver 114.114.114.114" > /etc/resolv.conf'
# 配置服务器时区
ansible k8s -m shell -a 'timedatectl set-timezone Asia/Shanghai'
# 配置时间同步
# - 安装 chrony 作为时间同步软件
ansible k8s -m shell -a 'yum install chrony -y'
# - 编辑配置文件 /etc/chrony.conf,修改 ntp 服务器配置
ansible k8s -m shell -a "sed -i 's/^pool pool.*/pool cn.pool.ntp.org iburst/g' /etc/chrony.conf"
# - 重启并设置 chrony 服务开机自启动
ansible k8s -m shell -a 'systemctl enable chronyd --now'
# - 验证 chrony 同步状态
ansible k8s -m shell -a 'chronyc sourcestats -v'
# 关闭系统防火墙
ansible k8s -m shell -a 'systemctl stop firewalld && systemctl disable firewalld'
# 禁用 SELinux
ansible k8s -m shell -a "sed -i 's/^SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config"
# 安装必须依赖
ansible k8s -m shell -a 'yum install curl socat conntrack ebtables ipset ipvsadm -y'

磁盘配置

每台服务器新增一块数据盘 /dev/sdb,用于 ContainerdKubernetes Pod 的持久化存储

为了满足用户在上线后数据盘容量不足时,可以实现动态扩容的需求。本文采用了 LVM 的方式配置磁盘

使用 LVM 配置硬盘,并挂载到数据目录
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 创建 PV
pvcreate /dev/sdb
# 创建 VG
vgcreate data /dev/sdb
# 创建 LV(使用所有空间,VG 名字为 data,LV 名字为 lvdata)
lvcreate -l 100%VG data -n lvdata、
# 格式化磁盘
mkfs.xfs /dev/mapper/data-lvdata
# 手工挂载
mkdir /u01
mount /dev/mapper/data-lvdata /u01/
# 开机自动挂载
tail -1 /etc/mtab >> /etc/fstab
# 创建 OpenEBS 本地数据根目录
mkdir -p /u01/openebs/local
# 创建 Containerd 数据目录
mkdir -p /u01/containerd
# 创建 Containerd 数据目录软连接
ln -s /u01/containerd /var/lib/containerd

部署 Kubernetes 集群

使用 KubeSphere 出品的 KubeKey 工具,可以根据配置文件一键部署 K8S 高可用集群

选择一台 control 节点作为部署节点,执行下面的操作

下载 KubeKey

  • 下载最新版的 KubeKey(v3.1.7

    1
    2
    3
    4
    5
    6
    7
    mkdir /u01/kubekey

    cd /u01/kubekey

    # 选择中文区下载(访问 GitHub 受限时使用)
    export KKZONE=cn
    curl -sfL https://get-kk.kubesphere.io | sh -
  • 查看 KubeKey 支持的 Kubernetes 版本列表

    1
    ./kk version --show-supported-k8s

    选择稳定且兼容性高的较新版本,本文选择的是 v1.28.15

创建 Kubernetes 集群部署配置

  1. 创建集群配置文件

    1
    ./kk create config -f ksp-k8s-v12815.yaml --with-kubernetes v1.28.15
  2. 修改配置文件

本文采用 3 个节点同时作为 control-plane、etcd 和 worker 节点

请使用编辑器,编辑配置文件 ksp-k8s-v12815.yaml,修改 kind: Cluster 小节中 hosts 和 roleGroups 等信息,修改说明如下:

  • hosts:指定节点的 IP、ssh 用户、ssh 密码
  • roleGroups:指定 3 个 etcd、control-plane 节点,并复用为 worker 节点
  • internalLoadbalancer: 启用内置的 HAProxy 负载均衡器
  • domain:自定义域名 lb.opsxlab.cn,没特殊需求可使用默认值 lb.kubesphere.local
  • clusterName:自定义 opsxlab.cn,没特殊需求可使用默认值 cluster.local
  • autoRenewCerts:该参数可以实现证书到期自动续期,默认为 true
  • containerManager:容器运行时使用 containerd
  • storage.openebs.basePath:默认没有,新增配置,指定 openebs 默认存储路径为 /data/openebs/local
  • registry.privateRegistry:可选配置, 解决 Docker 官方镜像不可用的问题
  • registry.namespaceOverride: 可选配置, 解决 Docker 官方镜像不可用的问题

修改后的完整示例如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
apiVersion: kubekey.kubesphere.io/v1alpha2
kind: Cluster
metadata:
name: vansys
spec:
hosts:
- {name: k8s-control-1, address: 192.168.99.101, internalAddress: 192.168.99.101, user: root, password: "xxx"}
- {name: k8s-control-2, address: 192.168.99.102, internalAddress: 192.168.99.102, user: root, password: "xxx"}
- {name: k8s-control-3, address: 192.168.99.103, internalAddress: 192.168.99.103, user: root, password: "xxx"}
roleGroups:
etcd:
- k8s-control-1
- k8s-control-2
- k8s-control-3
control-plane:
- k8s-control-1
- k8s-control-2
- k8s-control-3
worker:
- k8s-control-1
- k8s-control-2
- k8s-control-3
controlPlaneEndpoint:
domain: lb.kubesphere.local
address: ""
port: 6443
kubernetes:
version: v1.28.15
clusterName: cluster.local
autoRenewCerts: true
containerManager: containerd
etcd:
type: kubekey
network:
plugin: calico
kubePodsCIDR: 10.233.64.0/18
kubeServiceCIDR: 10.233.0.0/18
enableMultusCNI: false
storage:
openebs:
basePath: /u01/openebs/local
registry:
# 使用 KubeSphere 在阿里云的镜像仓库,避免国内拉不下镜像的问题
privateRegistry: "registry.cn-beijing.aliyuncs.com"
namespaceOverride: "kubesphereio"
registryMirrors: []
insecureRegistries: []
addons: []

部署 Kubernetes 集群

使用上面创建的配置文件,执行下面的命令,创建 K8S 集群

1
2
export KKZONE=cn
./kk create cluster -f ksp-k8s-v12815.yaml

命令执行后,首先 Kubekey 会检查部署 K8S 的依赖及其他详细要求。通过检查后,系统将提示您确认安装。输入 yes 并按 ENTER 继续部署

部署完成需要大约 10-20 分钟左右,具体需要看网速跟机器配置,若部署成功,会在终端显示如下信息:

1
2
3
4
5
6
20:10:23 CST Pipeline[CreateClusterPipeline] execute successfully
Installation is complete.

Please check the result using the command:

kubectl get pod -A

验证 Kubernetes 集群状态

在 control-1 控制节点使用 kubectl 命令验证

1
2
3
4
5
6
# 查看集群节点信息
kubectl get nodes -o wide
# 查看 Pod 信息
kubectl get pods -A -o wide
# 查看 Image 列表
crictl images ls

问题记录

安装 Kubernetes 时出现如下日志,且 kubeadm 初始化集群超时

1
detected that the sandbox image "registry.k8s.io/pause:3.8" of the container runtime is inconsistent with that used by kubeadm. It is recommended that using "registry.cn-beijing.aliyuncs.com/kubesphereio/pause:3.9" as the CRI sandbox image

问题原因:containerd 配置的 sandbox image 跟 kubeadm 配置的不一致

解决办法:将 /etc/containerd/config.toml 配置文件中的 sandbox_image 修改为 KubeKey 创建集群的配置文件中 privateRegistry 仓库的镜像,保持跟 kubeadm 的一致

1
2
[plugins."io.containerd.grpc.v1.cri"]
sandbox_image = "registry.cn-beijing.aliyuncs.com/kubesphereio/pause:3.9"

Redis 缓存服务安装部署

这里下载的是 redis-5.0.8.tar.gz 安装包,并将其直接放在了 opt ⽬ 录下

解压安装包

1、在 /usr/local/ 下创建 redis ⽂ 件夹并进 ⼊

1
2
3
cd /usr/local/
mkdir redis
cd redis

2、将 Redis 安装包解压到 /usr/local/redis 中即可

1
tar zxvf /opt/redis-5.0.8.tar.gz -C ./

解压完之后, /usr/local/redis ⽬ 录中会出现 ⼀ 个 redis-5.0.8.tar.gz 的 ⽬ 录

编译并安装

1
2
cd redis-5.0.8/
make && make install

将 Redis 安装为系统服务并后台启动

进入 utils 目录,并执行如下脚本即可:

1
2
cd utils/
./install_server.sh

此处我全部选择默认配置,有需要可以按需选择

image-20220401194430903

查看 Redis 服务启动情况

直接执行如下命令来查看 Redis 的启动结果:

1
2
3
4
5
6
systemctl status redis_6379.service

# 扩展
启动:systemctl start redis_6379.service
停止:systemctl stop redis_6379.service
重启:systemctl restart redis_6379.service

image-20220401194604551

启动 Redis 客户端并测试

启动自带的 redis-cli 客户端,测试通过:

image-20220401194833905

但是此时只能在本地访问,无法远程连接,因此还需要做部分设置

运行远程连接

编辑 redis 配置文件

1
vim /etc/redis/6379.conf

bind 127.0.0.1 修改为 0.0.0.0

image-20220401195240594

保存然后重启 Redis 服务即可:

1
systemctl restart redis_6379.service

设置访问密码

编辑 redis 配置文件

1
vim /etc/redis/6379.conf

找到如下内容:

1
#requirepass foobared

去掉注释,将 foobared 修改为自己想要的密码,保存即可。

1
requirepass 123456

保存然后重启 Redis 服务即可:

1
systemctl restart redis_6379.service

这样后续的访问需要先输入密码认证通过:

image-20220401195615345

WEB 服务器 Nginx 安装部署

这 ⾥ 下载的是 nginx-1.17.10.tar.gz 安装包,并将其直接放在了 opt ⽬ 录下

解压安装包

1、在 /usr/local/ 下创建 nginx ⽂ 件夹并进 ⼊

1
2
3
cd /usr/local/
mkdir nginx
cd nginx

2、将 Nginx 安装包解压到 /usr/local/nginx 中即可

1
tar zxvf /opt/nginx-1.17.10.tar.gz -C ./

解压完之后, /usr/local/nginx ⽬ 录中会出现 ⼀ 个 nginx-1.17.10 的 ⽬ 录

预先安装额外的依赖

1
yum -y install pcre-devel openssl openssl-devel gcc gcc-c++ autoconf automake make

编译安装 Nginx

1
2
3
4
cd nginx-1.17.10
# 使用 --prefix= 可以指定目录安装
./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module
make && make install

安装完成后,Nginx 的可执 ⾏⽂ 件位置位于

1
/usr/local/nginx/sbin/nginx

启动 Nginx

直接执 ⾏ 如下命令即可:

1
/usr/local/nginx/sbin/nginx

如果想停 ⽌ Nginx 服务,可执 ⾏:

1
/usr/local/nginx/sbin/nginx -s stop

如果修改了配置 ⽂ 件后想重新加载 Nginx,可执 ⾏:

1
/usr/local/nginx/sbin/nginx -s reload

注意其配置 ⽂ 件位于:

1
/usr/local/nginx/conf/nginx.conf

Centos6.9 注册为系统服务,并开机自启

首先,在 linux 系统的/etc/init.d/目录下创建 nginx 文件,使用如下命令:

vi /etc/init.d/nginx

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
#!/bin/sh
#
# nginx - this script starts and stops the nginx daemon
#
# chkconfig: - 85 15
# description: NGINX is an HTTP(S) server, HTTP(S) reverse \
# proxy and IMAP/POP3 proxy server
# processname: nginx
# config: /etc/nginx/nginx.conf
# config: /etc/sysconfig/nginx
# pidfile: /var/run/nginx.pid
# Source function library.
. /etc/rc.d/init.d/functions
# Source networking configuration.
. /etc/sysconfig/network
# Check that networking is up.
[ "$NETWORKING" = "no" ] && exit 0
# 这里根据实际安装位置修改
nginx="/usr/local/nginx/sbin/nginx"
prog=$(basename $nginx)
# 这里根据实际配置文件位置修改
NGINX_CONF_FILE="/usr/local/nginx/conf"
[ -f /etc/sysconfig/nginx ] && . /etc/sysconfig/nginx
lockfile=/var/lock/subsys/nginx
make_dirs() {
# make required directories
user=`$nginx -V 2>&1 | grep "configure arguments:" | sed 's/[^*]*--user=\([^ ]*\).*/\1/g' -`
if [ -z "`grep $user /etc/passwd`" ]; then
useradd -M -s /bin/nologin $user
fi
options=`$nginx -V 2>&1 | grep 'configure arguments:'`
for opt in $options; do
if [ `echo $opt | grep '.*-temp-path'` ]; then
value=`echo $opt | cut -d "=" -f 2`
if [ ! -d "$value" ]; then
# echo "creating" $value
mkdir -p $value && chown -R $user $value
fi
fi
done
}
start() {
[ -x $nginx ] || exit 5
[ -f $NGINX_CONF_FILE ] || exit 6
make_dirs
echo -n $"Starting $prog: "
daemon $nginx -c $NGINX_CONF_FILE
retval=$?
echo
[ $retval -eq 0 ] && touch $lockfile
return $retval
}
stop() {
echo -n $"Stopping $prog: "
killproc $prog -QUIT
retval=$?
echo
[ $retval -eq 0 ] && rm -f $lockfile
return $retval
}
restart() {
configtest || return $?
stop
sleep 1
start
}
reload() {
configtest || return $?
echo -n $"Reloading $prog: "
killproc $nginx -HUP
RETVAL=$?
echo
}
force_reload() {
restart
}
configtest() {
$nginx -t -c $NGINX_CONF_FILE
}
rh_status() {
status $prog
}
rh_status_q() {
rh_status >/dev/null 2>&1
}
case "$1" in
start)
rh_status_q && exit 0
$1
;;
stop)
rh_status_q || exit 0
$1
;;
restart|configtest)
$1
;;
reload)
rh_status_q || exit 7
$1
;;
force-reload)
force_reload
;;
status)
rh_status
;;
condrestart|try-restart)
rh_status_q || exit 0
;;
*)
echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}"
exit 2
esac

保存脚本文件,并修改权限:

1
2
3
4
5
6
7
8
9
# 修改文件权限
chmod a+x /etc/init.d/nginx
# 添加为系统服务
chkconfig --add /etc/init.d/nginx
# 服务启动/停止命令
service nginx start
service nginx stop
# 设置终端模式开机启动
chkconfig nginx on

CentOS7 注册为系统服务,并开机自启

在系统中创建服务脚本,命令如下:

vi /usr/lib/systemd/system/nginx.service

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[Unit]
Description=nginx - web server
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf
ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s stop
ExecQuit=/usr/local/nginx/sbin/nginx -s quit
PrivateTmp=true
[Install]
WantedBy=multi-user.target

重新加载系统服务,并设置开机自启

1
2
3
4
5
6
# 重新加载系统服务
systemctl daemon-reload
# 启动服务
systemctl start nginx.service
# 开机自启
systemctl enable nginx.service

JDK(Java 环境)安装

注意:这 ⾥ 安装的是 Oracle JDK

准备 JDK 安装包

我这里下载的是 jdk-8u251-linux-x64.tar.gz 安装包,并将其放在了 /opt 目录下

卸载已有的 OPENJDK(如果有)

如果系统 ⾃ 带有 OpenJDK,可以按照如下步骤提前卸载之。

1
rpm -qa | grep java

image-20220308132559705

接下来可以将 java 开头的安装包均卸载即可:

1
2
3
yum -y remove java-1.7.0-openjdk-1.7.0.141-2.6.10.5.el7.x86_64
yum -y remove java-1.8.0-openjdk-1.8.0.131-11.b12.el7.x86_64
... 省略 ...

创建目录并解压

1、在 /usr/local/ 下创建 java 文件夹并进入

1
2
3
cd /usr/local/
mkdir java
cd java

2、将上 ⾯ 准备好的 JDK 安装包解压到 /usr/local/java 中即可

1
tar -zxvf /opt/jdk-8u251-linux-x64.tar.gz -C ./

解压完之后, /usr/local/java ⽬ 录中会出现 ⼀ 个 jdk1.8.0_251 的 ⽬ 录

配置 JDK 环境变量

编辑 /etc/profile 文件,在文件尾部加入如下 JDK 环境配置即可

1
2
3
4
JAVA_HOME=/usr/local/java/jdk1.8.0_251
CLASSPATH=$JAVA_HOME/lib/
PATH=$PATH:$JAVA_HOME/bin
export PATH JAVA_HOME CLASSPATH

然后执 ⾏ 如下命令让环境变量 ⽣ 效

1
source /etc/profile

验证 JDK 安装结果

输入如下命令即可检查安装结果:

1
2
3
java -version

javac

image-20220308153602981

Maven 项目构建和管理工具安装

准备 MAVEN 安装包并解压

这 ⾥ 下载的是 apache-maven-3.6.3-bin.tar.gz 安装包,并将其放置于提前创建好的 /usr/local/maven ⽬ 录下。

执 ⾏ 命令解压之:

1
tar -zxvf /opt/apache-maven-3.6.3-bin.tar.gz -C ./

即可在当前 ⽬ 录得到 /usr/local/maven/apache-maven-3.6.3 ⽬ 录

配置 MAVEN 加速镜像源

这 ⾥ 配置的是阿 ⾥ 云的 maven 镜像源。

编辑修改 /usr/local/maven/apache-maven-3.6.3/conf/settings.xml ⽂ 件,在 <mirrors></mirrors> 标签对 ⾥ 添加如下内容即可:

1
2
3
4
5
6
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>

image-20220308154746010

配置环境变量

因为下载的是 ⼆ 进制版安装包,所以解压完,配置好环境变量即可使用了。

编辑修改 /etc/profile ⽂ 件,在 ⽂ 件尾部添加如下内容,配置 maven 的安装路径

1
2
export MAVEN_HOME=/usr/local/maven/apache-maven-3.6.3
export PATH=$MAVEN_HOME/bin:$PATH

接下来执行 source /etc/profile 来刷新环境变量,让 maven 环境的路径配置生效

检验安装结果

执 ⾏ mvn –v ,能打印出 maven 版本信息说明安装、配置成功:

image-20220308155428868

Jenkins 安装与配置

安装 Jenkins Master

Jenkins 官方安装文档

Docker 安装 Jenkins(推荐)

  • 使用 Docker 安装 Jenkins

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    # 使用命令直接安装(包含构建工具)
    docker run -d --name jenkins --restart always \
    --user root -p 8080:8080 -p 50000:50000 \
    -v /var/jenkins_home:/var/jenkins_home \
    -v /usr/local/maven/apache-maven-3.6.3:/usr/local/maven/apache-maven-3.6.3 \
    -v /usr/local/java/jdk1.8.0_251:/usr/local/java/jdk1.8.0_251 \
    -v /usr/local/sonar-scanner/sonar-scanner-4.6.0.2311-linux:/usr/local/sonar-scanner/sonar-scanner-4.6.0.2311-linux \
    -v /var/run/docker.sock:/var/run/docker.sock \
    jenkinsci/blueocean

    # 简易安装
    docker run -d --name jenkins --restart always \
    --user root -p 8080:8080 -p 50000:50000 \
    -v /u01/jenkins_home:/var/jenkins_home \
    -v /var/run/docker.sock:/var/run/docker.sock \
    jenkinsci/blueocean

War 安装 Jenkins

  • 获取 Jenkins 安装包

下载页面:https://jenkins.io/zh/download/

安装文件:jenkins.war

1
2
3
4
5
6
7
8
9
1、将最新的稳定Jenkins WAR包 下载到您计算机上的相应目录。

2、在下载的目录内打开一个终端/命令提示符窗口到。

3、运行命令java -jar jenkins.war

4、浏览http://localhost:8080并等到*Unlock Jenkins*页面出现。

5、继续使用Post-installation setup wizard后面步骤设置向导。

解锁 Jenkins

image-20220309174609417

获取并输入 admin 账户密码(我这里是 docker 安装的,目录是映射到指定位置的,密码实际存放路径以提示为主)

cat /var/jenkins_home/secrets/initialAdminPassword

跳过插件安装

因为 Jenkins 插件需要连接默认官网下载,速度非常慢,而且容易安装失败,所以我们暂时先跳过插件安装。

image-20220309174531892

image-20220309174831016

添加一个管理员账户,并进入 Jenkins 后台

image-20220309174953956

保存并完成

image-20220309175748708

开始使用 Jenkins

image-20220309175816074

image-20220309175908276

安装 Jenkins Slave

系统设置 > 节点管理 > 新建节点

image-20220315112454277

image-20220315112942218

下载 agent.jar

image-20220315112649284
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
## 创建agent目录

mkdir -p /dev/jenkinsagent
cd /dev/jenkinsagent
wget http://192.168.88.230:8080/jnlpJars/agent.jar


## 编写启动脚本
#!/bin/bash

echo 0bdf5bac23b7d4e66880934b25bda0f353509529b7f843ebb688614ba389680e > secret-file

nohup java -jar agent.jar -jnlpUrl http://192.168.88.230:8080/computer/build/jenkins-agent.jnlp -secret @secret-file -workDir "/u01/jenkins-agent" 2>&1 &

## 启动agent
sh -x start.sh
ps aux | grep agent

Jenkins 插件管理

Jenkins 本身不提供很多功能,我们可以通过使用插件来满足我们的使用。例如从 Gitlab 拉取代码,使用 Maven 构建项目等功能需要依靠插件完成。接下来演示如何下载插件。

修改 Jenkins 插件下载地址

Jenkins 国外官方插件地址下载速度非常慢,所以可以修改为国内插件地址:

Jenkins -> Manage Jenkins -> Manage Plugins,点击Available

image-20220309180153473

这样做是为了把 Jenkins 官方的插件列表下载到本地,接着修改地址文件,替换为国内插件地址:

1
2
3
4
5
# 进入配置目录 (目录视情况而定,安装的jenkins_home下)
cd /var/jenkins_home/updates

# 执行命令
sed -i 's/http:\/\/updates.jenkinsci.org\/download/https:\/\/mirrors.tuna.tsinghua.edu.cn\/jenkins/g' default.json && sed -i 's/http:\/\/www.google.com/https:\/\/www.baidu.com/g' default.json

最后,Manage Plugins 点击 Advanced,把 Update Site 改为国内插件下载地址

image-20220309180807037

Sumbit 后,在浏览器输入: http://120.78.204.65:8180/restart ,重启 Jenkins。

下载中文汉化插件

Jenkins -> Manage Jenkins -> Manage Plugins,点击Available,搜索"Chinese"

image-20220309181055822

完成后如下图所示:

image-20220309181122066

重启 Jenkins 之后,就看到 Jenkins 汉化了!(PS:某些菜单可能会汉化失败)

image-20220309181408200

Jenkins 用户权限管理

我们可以利用 Role-based Authorization Strategy 插件来管理 Jenkins 用户权限

安装 Role-based Authorization Strategy 插件

image-20220309181600238

开启权限全局安全配置

image-20220309181914873

授权策略切换为 “Role-Based Strategy”,保存

image-20220309181940124

创建角色

在系统管理页面进入 Manage and Assign Roles

image-20220309182209559

点击 “Manage Roles”

image-20220309182301430

image-20220309182435102

Global roles(全局角色):管理员等高级用户可以创建基于全局的角色

Item roles(项目角色): 针对某个或者某些项目的角色

Node roles(节点角色):节点相关的权限

我们添加以下三个角色:

  • baseRole:该角色为全局角色。这个角色需要绑定 Overall 下面的 Read 权限,是为了给所有用户绑定最基本的 Jenkins 访问权限。注意:如果不给后续用户绑定这个角色,会报错误:用户名 is missing the Overall/Read permission
  • role1:该角色为项目角色。使用正则表达式绑定 .vx-chx.\*,意思是只能操作 vx-chx 开头的项目。
  • role2:该角色为项目角色。使用正则表达式绑定 .vx-phm.\*,意思是只能操作 vx-phm 开头的项目。

image-20220309182812353

保存

创建用户

在系统管理页面进入 Manage Users

image-20220309182917026

image-20220309183107565

分别创建两个用户:vxchx 和 vxphm

image-20220309183223041

给用户分配角色

系统管理页面进入 Manage and Assign Roles,点击 Assign Roles

绑定规则如下:

  • vxchx 用户分别绑定 baseRole 和 role1 角色

  • vxphm 用户分别绑定 baseRole 和 role2 角色

    image-20220309183455591

保存

创建项目测试权限

以 admin 管理员账户创建两个项目,分别为 vx-chx-test 和 vx-phm-test

结果为: vxchx 用户登录,只能看到 vx-chx-test 项目 vxphm 用户登录,只能看到 vx-phm-test 项目

Jenkins 凭证管理

凭据可以用来存储需要密文保护的数据库密码、Gitlab 密码信息、Docker 私有仓库密码等,以便 Jenkins 可以和这些第三方的应用进行交互。

安装 Credentials Binding 插件

要在 Jenkins 使用凭证管理功能,需要安装 Credentials Binding 插件

注:新版本已经默认安装了此插件,这里无需另外再安装了

系统管理中选择 Manage Credentials

image-20220309184117479

可以添加的凭证有 5 种:

image-20220309184218399

  • Username with password:用户名和密码
  • SSH Username with private key: 使用 SSH 用户和密钥
  • Secret file:需要保密的文本文件,使用时 Jenkins 会将文件复制到一个临时目录中,再将文件路径 设置到一个变量中,等构建结束后,所复制的 Secret file 就会被删除。
  • GitHub App:GitHub 的 API 令牌
  • Secret text:需要保存的一个加密的文本串,如钉钉机器人或 Github 的 api token
  • Certificate:通过上传证书文件的方式

常用的凭证类型有:Username with password(用户密码)SSH Username with private key(SSH 密钥)

接下来以使用 Git 工具到 Gitlab 拉取项目源码为例,演示 Jenkins 的如何管理 Gitlab 的凭证。

安装 Git 插件和 Git 工具

为了让 Jenkins 支持从 Gitlab 拉取源码,需要安装 Git 插件以及在服务器上安装 Git 工具。

Git 插件安装:

image-20220310094712046

服务器上安装 Git 工具(以 CentOS7 为例):

1
2
3
4
# 安装
yum install git -y
# 安装后查看版本
git --version

用户密码类型

1)创建凭据

Jenkins -> 凭证 -> 系统 -> 全局凭据 -> 添加凭据

image-20220310095750604

选择 “Username with password”,输入 Gitlab 的用户名和密码,点击 “确定”。

image-20220310100359012

SSH 密钥类型

SSH 免密登录示意图

image-20220310100539140

1)使用 root 用户生成公钥和私钥

ssh-keygen -t rsa

在/root/.ssh/目录保存了公钥和使用

image-20220310101013313

id_rsa:私钥文件

id_rsa.pub:公钥文件

2)把生成的公钥放在 Gitlab 中

登录gitlab -> 点击头像 -> Settings -> SSH Keys

复制刚才 id_rsa.pub 文件的内容到这里,点击 “Add Key”

image-20220310101538008

3)在 Jenkins 中添加凭证,配置私钥

在 Jenkins 添加一个新的凭证,类型为 “SSH Username with private key”,把刚才生成私有文件内容复制过来

image-20220310102203814

image-20220310102427213

Jenkins 关联 JDK 和 Maven

关联 JDK

Jenkins -> 系统管理 -> 全局工具配置 -> JDK -> 新增JDK,配置如下:

image-20220310102744563

关联 Maven

Jenkins -> 系统管理 -> 全局工具配置 -> Maven -> 新增Maven,配置如下:

image-20220310102835922

Jenkins 关闭跨站请求伪造保护

  • Docker 容器运行
1
2
3
4
5
6
7
8
9
10
11
# 1、进入运行的容器
docker exec -u root -it 你的Jenkins容器名称或者容器id bash

# 2、输入命令,编辑jenkins启动配置文件
vi /usr/local/bin/jenkins.sh

# 3、在图中标记处,加入以下配置
-Dhudson.security.csrf.GlobalCrumbIssuerConfiguration.DISABLE_CSRF_PROTECTION=true

# 4、重启容器
docker restart jenkins

image-20220312001020531

添加 Jenkins 全局变量

Jenkins -> 系统管理 -> 全局属性 -> 添加三个环境变量,配置如下:

image-20220310103241974

Jenkins 数据迁移和备份

将安装 Jenkins 的机器上的 jenkins_home 目录下的 config.xml 文件,jobs 文件夹,users 文件夹和 plugins 文件夹打包

  • config.xml 是存放配置信息的
  • jobs 是存放创建的工程项目的
  • users 是存放用户账信息的
  • plugins 是存放插件的

Jenkins 删除构建历史

1
2
3
4
5
6
7
8
9
10
//项目名称
def jobName = "xxx"
//删除小于等于maxNumber的构建历史
def maxNumber = xxx

Jenkins.instance.getItemByFullName(jobName).builds.findAll {
it.number <= maxNumber
}.each {
it.delete()
}

Jenkins 构建 Maven 项目

构建方式均采用 Jar 包方式,War 方式参考 WAR 部署方案 · JeecgBoot 开发文档

Jenkins 项目构建类型

Jenkins 中自动构建项目的类型有很多,常用的有以下三种:

  • 自由风格软件项目(FreeStyle Project)
  • Maven 项目(Maven Project)
  • 流水线项目(Pipeline Project)

每种类型的构建其实都可以完成一样的构建过程与结果,只是在操作方式、灵活度等方面有所区别,在实际开发中可以根据自己的需求和习惯来选择。(PS:个人推荐使用流水线类型,因为灵活度非常高)

自由风格项目构建

下面演示创建一个自由风格项目来完成项目的集成过程:

拉取代码 -> 编译 -> 打包 -> 部署

拉取代码

1)创建项目

image-20220310112707895

2)源码管理,从 Gitlab 拉取代码

image-20220310112815147

编译打包

构建 -> 添加构建步骤 -> 执行shell

1
2
3
echo "开始编译和打包"
mvn clean package
echo "编译和打包结束"

image-20220310112952936

部署

把项目部署到远程的服务器上,并启动

1)安装 Publish Over SSH 插件

Jenkins 本身无法实现远程部署到服务器上的功能,需要安装 Publish Over SSH 插件实现

image-20220310113332137

2)配置 Publish over SSH,添加 SSH 服务器

打开系统管理 -> 系统配置 -> 拉到底部,选择Publish over SSH区域选择新增

image-20220310114012322

点击高级 -> 填写服务器密码(也可选择 ssh 验证,在 Jenkins 中配置本机私钥,将公钥发送到目标机器,即可完成无密码登录)

发送命令:ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.xxx.xxx

image-20220310114702171

  • Passphrase: 密码(目标机器的密码)
  • Path to key:key 文件(私钥)的路径
  • SSH Server Name: 标识的名字(随便你取什么)
  • Hostname: 需要连接 ssh 的主机名或 ip 地址,此处填写应用服务器 IP(建议 ip)
  • Username: 用户名
  • Remote Directory: 远程目录(要发布的目录, 比如/usr/local/tomcat/webapps/)

3)添加构建步骤

image-20220310115055853

image-20220310115245384

1
2
3
4
5
6
7
# 脚本参考
source /etc/profile

cd /apps
ps -ef|grep jeecg-boot-module-system-3.1.0.jar|grep -v grep|awk '{print $2}'|xargs kill -s 9
BUILD_ID=dontKillMe
nohup java -jar jeecg-boot-module-system-3.1.0.jar > jeecg-boot-module-system-3.1.0.log 2>&1 &

4)点击 “立即构建”,开始构建过程

image-20220310115628609

5)构建成功,并自动化部署,访问测试!

Maven 项目构建

1)安装 Maven Integration Plugin(高版本的 Jenkins 已预装了此插件)

image-20220310135008339

2)创建 Maven 项目

image-20220310135103444

3)配置项目

拉取代码和远程部署的过程和自由风格项目一样,只是 “构建” 部分不同

image-20220310135300799

Pipeline 流水线项目构建(*)

Pipeline 简介

1)概念

Pipeline,简单来说,就是一套运行在 Jenkins 上的工作流框架,将原来独立运行于单个或者多个节点的任务连接起来,实现单个任务难以完成的复杂流程编排和可视化的工作。

2)使用 Pipeline 有以下好处(来自翻译自官方文档):

代码:Pipeline 以代码的形式实现,通常被检入源代码控制,使团队能够编辑,审查和迭代其传送流 程。持久:无论是计划内的还是计划外的服务器重启。Pipeline 都是可恢复的。可停止:Pipeline 可接 收交互式输入,以确定是否继续执行 Pipeline。多功能:Pipeline 支持现实世界中复杂的持续交付要求。它支持 fork/join、循环执行,并行执行任务的功能。可扩展:Pipeline 插件支持其 DSL 的自定义扩展,以及与其他插件集成的多个选项。

3)如何创建 Jenkins Pipeline 呢?

  • Pipeline 脚本是由 Groovy 语言实现的,但是我们没必要单独去学习 Groovy
  • Pipeline 支持两种语法:Declarative(声明式)和 Scripted Pipeline(脚本式)语法
  • Pipeline 也有两种创建方法:可以直接在 Jenkins 的 Web UI 界面中输入脚本;也可以通过创建一个 Jenkinsfile 脚本文件放入项目源码库中(一般我们都推荐在 Jenkins 中直接从源代码控制(SCM)中直接载入 Jenkinsfile Pipeline 这种方法)。

Pipeline 语法快速入门

1)Declarative 声明式-Pipeline

创建一个流水线项目

image-20220310154144897

流水线 -> 选择HelloWorld模板

image-20220310154618000

生成的内容如下:

1
2
3
4
5
6
7
8
9
10
11
pipeline {
agent any

stages {
stage('Hello') {
steps {
echo 'Hello World'
}
}
}
}
  • stages: 代表整个流水线的所有执行阶段。通常 stages 只有 1 个,里面包含多个 stage

  • stage: 代表流水线中的某个阶段,可能出现 n 个。一般分为拉取代码,编译构建,部署等阶段。

  • steps: 代表一个阶段内需要执行的逻辑。steps 里面是 shell 脚本,git 拉取代码,ssh 远程发布等任意内容。

编写一个简单声明式的 Pipeline:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
pipeline {
agent any
stages {
stage('拉取代码') {
steps {
echo '拉取代码'
}
}
stage('编译构建') {
steps {
echo '编译构建'
}
}
stage('项目部署') {
steps {
echo '项目部署'
}
}
}
}

点击构建,进入 Blue Ocean 可以看到整个构建过程

image-20220310155756052

2)Scripted Pipeline 脚本式-Pipeline

创建项目

image-20220310155938728

选择 Scripted Pipeline"

image-20220310160044398

1
2
3
4
5
6
7
8
9
10
11
12
node {
def mvnHome
stage('Preparation') { // for display purposes

}
stage('Build') {

}
stage('Results') {

}
}
  • Node:节点,一个 Node 就是一个 Jenkins 节点,Master 或者 Agent,是执行 Step 的具体运行环境,后续讲到 Jenkins 的 Master-Slave 架构的时候用到。
  • Stage:阶段,一个 Pipeline 可以划分为若干个 Stage,每个 Stage 代表一组操作,比如: Build、Test、Deploy,Stage 是一个逻辑分组的概念。
  • Step:步骤,Step 是最基本的操作单元,可以是打印一句话,也可以是构建一个 Docker 镜像, 由各类 Jenkins 插件提供,比如命令:sh ‘make’,就相当于我们平时 shell 终端中执行 make 命令 一样。

编写一个简单的脚本式 Pipeline

1
2
3
4
5
6
7
8
9
10
11
12
node {
def mvnHome
stage('拉取代码') { // for display purposes
echo '拉取代码'
}
stage('编译构建') {
echo '编译构建'
}
stage('项目部署') {
echo '项目部署'
}
}

构建结果和声明式一样!

Pipeline Script from SCM

刚才我们都是直接在 Jenkins 的 UI 界面编写 Pipeline 代码,这样不方便脚本维护,建议把 Pipeline 脚本放在项目中(一起进行版本控制)

1)在项目根目录建立 Jenkinsfile 文件,把内容复制到该文件中

image-20220310163924603

把 Jenkinsfile 上传到 Gitlab

2)在项目中引用该文件

image-20220310164207097

image-20220310164225747

Jenkinsfile

Jenkinsfile 环境变量

环境变量 说明
BRANCH_NAME 在 multibranch 项目中,BRANCH_NAME 用于标明构建分支的名称。
CHANGE_ID 在 multibranch 的项目中,相较于特定的变更请求,用于标明变更 ID,比如 Pull Request
CHANGE_URL 在 multibranch 的项目中,相较于特定的变更请求,用于标明变更的 URL
CHANGE_TITLE 在 multibranch 的项目中,相较于特定的变更请求,用于标明变更的标题
CHANGE_AUTHOR 在 multibranch 的项目中,相较于特定的变更请求,用于标明提交变更的人员的名称
CHANGE_AUTHOR_DISPLAY_NAME 在 multibranch 的项目中,相较于特定的变更请求,用于标明提交变更的人员的显示名称
CHANGE_AUTHOR_EMAIL 在 multibranch 的项目中,相较于特定的变更请求,用于标明提交变更的人员的邮件地址
CHANGE_TARGET 在 multibranch 的项目中,相较于特定的变更请求,用于合并后的分支信息等
BUILD_NUMBER 当前的构建编号
BUILD_ID 在 1.597 版本后引进,表示当前构建 ID
BUILD_DISPLAY_NAME 当前构建的显示信息
JOB_NAME 构建 Job 的全称,包含项目信息
JOB_BASE_NAME 除去项目信息的 Job 名称
BUILD_TAG 构建标签
EXECUTOR_NUMBER 执行器编号,用于标识构建器的不同编号
NODE_NAME 构建节点的名称
NODE_LABELS 节点标签
WORKSPACE 构建时使用的工作空间的绝对路径
JENKINS_HOME JENKINS 根目录的绝对路径
JENKINS_URL Jenkins 的 URL 信息
BUILD_URL 构建的 URL 信息
JOB_URL 构建 Job 的 URL 信息
GIT_COMMIT git 提交的 hash 码
GIT_PREVIOUS_COMMIT 当前分支上次提交的 hash 码
GIT_PREVIOUS_SUCCESSFUL_COMMIT 当前分支上次成功构建时提交的 hash 码
GIT_BRANCH 远程分支名称
GIT_LOCAL_BRANCH 本地分支名称
GIT_URL 远程 URL 地址
GIT_COMMITTER_NAME Git 提交者的名称
GIT_AUTHOR_NAME Git Author 的名称
GIT_COMMITTER_EMAIL Git 提交者的 email 地址
GIT_AUTHOR_EMAIL Git Author 的 email 地址
MERCURIAL_REVISION Mercurial 的版本 ID 信息
MERCURIAL_REVISION_SHORT Mercurial 的版本 ID 缩写
MERCURIAL_REVISION_NUMBER Mercurial 的版本号信息
MERCURIAL_REVISION_BRANCH 分支版本信息
MERCURIAL_REPOSITORY_URL 仓库 URL 信息
SVN_REVISION Subversion 的当前版本信息
SVN_URL 当前工作空间中被 checkout 的 Subversion 工程的 URL 地址信息

常用的构建触发器

Jenkins 内置 4 种构建触发器:

  • 触发远程构建
  • 其他工程构建后触发(Build after other projects are build)
  • 定时构建(Build periodically)
  • 轮询 SCM(Poll SCM)
  • GitHub 钩子触发的 GIT SCM 轮询(GitHub hook trigger for GITScm polling)

触发远程构建

image-20220310164928630

触发构建 url:http://192.168.88.86:8180/job/vx-phm/build?token = abcabc

其他工程构建后触发

1)创建 pre_job 流水线工程

image-20220310170454942

2)配置需要触发的工程

image-20220310170935519

定时构建

image-20220310171234011

定时字符串从左往右分别为: 分 时 日 月 周

一些定时表达式的例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
每30分钟构建一次:H代表形参 H/30 * * * * 10:02 10:32

每2个小时构建一次: H H/2 * * *

每天的8点,12点,22点,一天构建3次: (多个时间点中间用逗号隔开) 0 8,12,22 * * *

每天中午12点定时构建一次 H 12 * * *

每天下午18点定时构建一次 H 18 * * *

在每个小时的前半个小时内的每10分钟 H(0-29)/10 * * * *

每两小时一次,每个工作日上午9点到下午5点(也许是上午10:38,下午12:38,下午2:38,下午
4:38) H H(9-16)/2 * * 1-5

轮询 SCM

轮询 SCM,是指定时扫描本地代码仓库的代码是否有变更,如果代码有变更就触发项目构建。

image-20220310171348558

注意:此构建触发器,Jenkins 会定时扫描本地整个项目的代码,增大系统的开销,不建议使用。

Git Hook 自动触发构建(*)

刚才我们看到在 Jenkins 的内置构建触发器中,轮询 SCM 可以实现 Gitlab 代码更新,项目自动构建,但是该方案的性能不佳。那有没有更好的方案呢?有的。就是利用 Gitlab 的 webhook 实现代码 push 到仓库,立即触发项目自动构建。

安装 Gitlab Hook 插件

需要安装两个插件:

Gitlab Hook 和 Gitlab

image-20220310172047813

Jenkins 设置自动构建

image-20220310172445870

等会需要把生成的 webhook URL 配置到 Gitlab 中。

Gitlab 配置 webhook

1)开启 webhook 功能

使用root账户登录到后台,点击Admin Area -> Settings -> Network

勾选"Allow requests to the local network from web hooks and services"

image-20220310172805087

2)在项目中添加 webhook

点击项目 -> Settings -> Webhooks

image-20220310173325550

注意:以下设置必须完成,否则会报错!

系统管理 -> 系统配置

image-20220310173704682

SonarQube 平台安装与配置

认识 SonarQube

SonarQube 是一款用于代码质量管理的开源工具,是静态代码检查工具,采用 B/S 架构它主要用于管理源代码的质量,可以支持众多计算机语言,比如 php,java, C#, go,C/C++, Cobol, JavaScrip, Groovy 等。sonar 可以通过 PMD,CheckStyle,Findbugs 等等代码规则检测工具来检测你的代码,帮助你发现代码的漏洞,Bug,异味等信息。

架构

  • 一台 SonarQube Server 启动 3 个主要过程:
    • Web 服务器,供开发人员,管理人员浏览高质量的快照并配置 SonarQube 实例
    • 基于 Elasticsearch 的 Search Server 从 UI 进行后退搜索
    • Compute Engine 服务器,负责处理代码分析报告并将其保存在 SonarQube 数据库中
  • 一个 SonarQube 数据库要存储:
    • SonarQube 实例的配置(安全性,插件设置等)
    • 项目,视图等的质量快照。
  • 服务器上安装了多个 SonarQube 插件,可能包括语言,SCM,集成,身份验证和管理插件
  • 在构建/持续集成服务器上运行一个或多个 SonarScanner,以分析项目

image-20220314135314928

工作原理

开发人员在 IDE 开发代码,可以安装 SonarLint 插件进行提交前代码扫描 当开发人员提交代码到版本控制系统中,自动触发 jenkins 进行代码扫描

image-20220314135418834

版本

开源社区版、开发版、企业版、数据中心版

image-20220314135630641

Docker 安装 SonarQube

这里采用 docker 容器进行安装,简单快捷

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
## 创建数据目录
mkdir -p /u01/sonarqube/{data,extensions,logs}
chmod 777 -R /u01/cicd/sonarqube/

## 调整
sysctl -w vm.max_map_count=262144

## 运行
docker run -d -p 9000:9000 -p 9092:9092 --name sonarqube \
-v /u01/sonarqube/data:/opt/sonarqube/data \
-v /u01/sonarqube/extensions:/opt/sonarqube/extensions \
-v /u01/sonarqube/logs:/opt/sonarqube/logs \
-e SONAR_JDBC_USERNAME=sonar \
-e SONAR_JDBC_PASSWORD=sonar \
-e SONAR_JDBC_URL="jdbc:postgresql://192.168.88.236:5432/sonar " \
--restart = always \
--privileged = true \
sonarqube: 8.9.9-community

## 验证
docker logs -f sonarqube

访问:http://192.168.88.235:9000/

image-20220314134752470

默认账号:admin/admin

image-20220314134841587

配置 Scanner

安装

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 获取安装包
wget https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-4.6.0.2311-linux.zip

# 解压到指定目录
unzip -o -d /usr/local/sonar-scanner /opt/sonar-scanner-cli-4.6.0.2311-linux.zip

# 编辑环境变量
vim /etc/profile
export SCANNER_HOME =/usr/local/sonar-scanner/sonar-scanner-4.6.0.2311-linux
export PATH = $PATH:$ SCANNER_HOME/bin

# 使环境变量生效
source /etc/profile

# 查看版本
sonar-scanner -v
INFO: Scanner configuration file: /usr/local/sonar-scanner-4.6.0.2311-linux/conf/sonar-scanner.properties
INFO: Project root configuration file: NONE
INFO: SonarScanner 4.6.0.2311
INFO: Java 11.0.3 AdoptOpenJDK (64-bit)
INFO: Linux 4.18.0-80.el8.x86_64 amd64

# 修改使用的 jdk
vim /usr/local/sonar-scanner/sonar-scanner-4.6.0.2311-linux/bin/sonar-scanner

SonarQube 平台配置管理

安装中文插件

在线安装:操作如下图

image-20220314140021697

配置强制登录

默认所有的项目都可以公开的查看,在企业内肯定要配置成私有的。只有登录后才能查看

image-20220314140634628

Jenkins 配置 SonarScanner

创建 SonarQube 账户 token

image-20220314143339207

将 token 保存到 Jenkins 凭据中

image-20220314143433728

在 Jenkins 中安装SonarQube Scanner插件

image-20220314143552551

系统管理 -> 系统配置 -> 往下翻找到SonarQube servers -> Add SonarQube -> 添加服务器,选择凭据

image-20220314143936259

IDEA 配置 SonarLint 插件

Token:a3268ff16b2d08b4582ff6a97342cc9d11b4e456

Nexus 制品库安装与配置

Docker 安装部署 Nexus 制品库

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
## 拉取镜像
docker pull sonatype/nexus3:3.30.0

## 创建数据目录
mkdir -p /u01/cicd/nexus3/data
chmod 777 -R /u01/cicd/nexus3/

## 启动容器
docker run -itd \
--privileged = true --name = nexus3 \
-p 8081:8081 \
-v /u01/cicd/nexus3/data:/nexus-data \
sonatype/nexus3:3.30.0

## 验证
docker logs nexus3 -f

## 日志中出现 “Started Sonatype Nexus OSS 3.30.0-01” 为启动成功
## http://your-ip-addr: 8081 访问测试

安装完成后,默认的 admin 密码存储在了数据目录,获取初始化密码

docker exec -i nexus3 cat /nexus-data/admin.password

image-20220314144935748

登录后更新密码

image-20220314145010632

Nexus 制品库搭建

搭建 Maven 私服(代理仓库)

默认安装 nexus 后会自动创建的

img

私服:将外网仓库代理到企业内部本地仓库中。图中的地址可以自定义修改

img

搭建制品库(本地仓库)

新建 raw 类型的仓库

img

设置仓库的信息

img

上传制品

在 nexus 中新建一个maven-hostd仓库,同时在 maven 的配置文件settings.xml中配置 maven-hostd 认证。具体配置如下:

1
2
3
4
5
<server>
<id> maven-hosted </id>
<username> admin </username>
<password> wx123!@#</password>
</server>

注意使用mvn deploy发布时,server.id=repository.id

1
2
3
4
5
6
7
8
mvn deploy: deploy-file
-DgroupId = xxxxxx pom 中的 groupId
-DartifactId = xxxxxx pom 中的 artifactId
-Dversion = xxxxxx pom 中的版本号 version
-Dpackaging = xxxxxx pom 中打包方式
-Dfile = xxxxxx 本地文件
-Durl = xxxxxx 仓库 url
-DrepositoryId = xxxxxx 对应的是 setting.xml(认证)

直接读取 pom 文件(方便)

1
2
3
4
5
6
mvn deploy: deploy-file \
-DgeneratePom = false \
-DrepositoryId = maven-hosted \
-Durl = http://192.168.1.200:8081/repository/maven-hosted/ \
-DpomFile = pom.xml \
-Dfile = target/demo-0.0.1-SNAPSHOT.jar

自定义 pom 信息(灵活)

1
2
3
4
5
6
7
8
mvn deploy: deploy-file -Dmaven.test.skip = true  \
-Dfile = target/demo-0.0.1-SNAPSHOT.jar \
-DgroupId = com.example \
-DartifactId = demo \
-Dversion = 1.1.1 \
-Dpackaging = jar \
-DrepositoryId = maven-hosted \
-Durl = http://192.168.1.200:8081/repository/maven-hosted/

img

img

Jenkins 安装 Nexus 插件

安装Nexus Artifact Upload插件,使用片段生成器生成 DSL

img

发布制品

安装Maven Artifact ChoiceListProvider (Nexus)插件

images

用户选择制品,在应用服务器通过 salt、ansible 下载制品并部署

img

Ansible 安装与配置

安装

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# CentOS7.6 使用 YUM 安装
yum install ansible -y
ansible --version

# Anolis OS 8.9 使用 PIP3 安装
# 升级 Python 到 3.9.x
# 下载安装包并解压
wget https://www.python.org/ftp/python/3.9.5/Python-3.9.5.tgz
tar zxvf Python-3.9.5.tgz
cd Python-3.9.5/
# 安装所需的依赖
dnf -y install gcc zlib* libffi-devel
# 编译并安装
./configure --prefix=/usr/local/python3 --enable-optimizations
make && make install
# 删除老的 python3 ,并链接新版本
rm -rf /usr/bin/python3
ln -s /usr/local/python3/bin/python3 /usr/bin/python3
rm -rf /usr/bin/pip3
ln -s /usr/local/python3/bin/pip3 /usr/bin/pip3
# 查看是否正确安装 python3
python3 --version
pip3 --version
# pip3 安装 ansible
python3 -m pip install --user ansible
# 同样进行链接
ln -sf /root/.local/bin/ansible /usr/bin/ansible
ln -sf /root/.local/bin/ansible-config /usr/bin/ansible-config
# 查看已安装的软件包
python3 -m pip show ansible
# 检查 ansible 是否被正确安装
ansible --version

添加 Ansible 主机列表

基于密钥连接

1
2
3
4
# 生成私钥和公钥(已有则忽略)
cd ~/.ssh && ssh-keygen -t rsa
# 批量发送到管理机器
for i in {1,2,3,6}; do ssh-copy-id -i 192.168.1.3$i ; done

配置 /etc/ansible/hosts 文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@ansible ~]# vim /etc/ansible/hosts
# 方法一 主机+端口+密钥
[webserver]
192.168.1.31:22
192.168.1.32
192.168.1.33
192.168.1.36

# 方法二 别名主机+端口+密钥
[webserver]
node1 ansible_ssh_host=192.168.1.31 ansible_ssh_port=22
node2 ansible_ssh_host=192.168.1.32 ansible_ssh_port=22
node3 ansible_ssh_host=192.168.1.33 ansible_ssh_port=22
node6 ansible_ssh_host=192.168.1.36 ansible_ssh_port=22

测试连通性

1
ansible webserver -m ping -o

安装 NPM 包管理器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 下载 node 安装包
wget https://nodejs.org/dist/v14.16.1/node-v14.16.1-linux-x64.tar.xz
mkdir -p /usr/local/node
tar xf node-v14.16.1-linux-x64.tar.xz -C /usr/local/node/

# 编辑环境变量
vim /etc/profile
export NODE_HOME =/usr/local/node/node-v14.16.1-linux-x64
export PATH = $NODE_HOME/bin:$ PATH
# 生效
source /etc/profile
# 查看是否安装成功
node -v
npm -v

# 设置镜像
npm config set registry https://registry.npm.taobao.org --global
npm config set disturl https://npm.taobao.org/dist --global

# 设置软链接
unlink /usr/bin/node
whereis node
ln -s /usr/local/node/node-v14.16.1-linux-x64/bin/node /usr/bin/node

Centos6 配置 YUM

1
2
3
4
5
6
# centos6 配置 yum
sed -i “s|enabled = 1|enabled = 0|g” /etc/yum/pluginconf.d/fastestmirror.conf
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
curl -o /etc/yum.repos.d/CentOS-Base.repo https://www.xmpan.com/Centos-6-Vault-Aliyun.repo
yum clean all
yum makecache

Minio 文件服务安装与配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 二进制安装
wget https://dl.min.io/server/minio/release/linux-amd64/minio
chmod +x minio
MINIO_ROOT_USER = admin MINIO_ROOT_PASSWORD = password ./minio server /mnt/data --console-address ": 9001"

# 后台启动
MINIO_ROOT_USER = admin MINIO_ROOT_PASSWORD ='wx123!@#' nohup /u01/minio-server/minio server /u01/minio-server/data --console-address ": 9001" > /u01/minio-server/minio.log 2 >&1 &

# docker 安装
mkdir -p /u01/minio/data

docker run -d \
-p 9000:9000 \
-p 9001:9001 \
--name minio \
-v /u01/minio/data:/data \
-v /u01/minio/config:/root/.minio \
-e "MINIO_ROOT_USER = q5H0EO1pbv" \
-e "MINIO_ROOT_PASSWORD = Wyk1dkn4Xp" \
-e MINIO_SERVER_URL = http://192.168.88.200:9000 \
-e MINIO_BROWSER_REDIRECT_URL = http://192.168.88.200:9001 \
quay.io/minio/minio server /data \
--address ": 9000" --console-address ": 9001"

GitStats 代码统计工具安装与配置

安装 Ruby 环境

GitStats 需要 ruby-2.5 以上环境

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# 下载:
wget https://cache.ruby-lang.org/pub/ruby/2.5/ruby-2.5.0.tar.gz
# 解压:
tar -zxvf ruby-2.5.0.tar.gz
# 进入目录:
cd ruby-2.5.0
# 创建安装目录:
mkdir -p /usr/local/ruby
# 安装必备依赖
yum -y install gcc openssl-devel make
# 配置并制定安装位置:
./configure --prefix =/usr/local/ruby
# 编译安装
make && make install

安装完成输入 ruby -v 提示/usr/bin/ruby: No such file or directory

解决问题之前,先确认一个情况,输入命令 /usr/local/ruby/bin/ruby --version

如果有版本信息,那说明 ruby 被装到了该目录下,而非系统认为的 /usr/bin/ruby

解决方法是在系统默认运行 ruby 的位置 [/usr/bin/ruby] 创建一个 symlink(相当于 win 下的快捷方式),指向 ruby 的实际位置 [/usr/local/ruby/bin/ruby]

建立软链接
命令是 ln -s /usr/local/ruby/bin/ruby /usr/bin/ruby
再输入 ruby -v OK 完成


附赠:要是安装 gem 也出现这种情况 [-bash: /usr/bin/gem: No such file or directory] 也是同理

ln -s /usr/local/ruby/bin/gem /usr/bin/gem

#查看当前仓库地址
gem sources -l
#配置阿里云仓库源
gem sources -a http://mirrors.aliyun.com/rubygems/ --remove https://rubygems.org/

安装 GitStats

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# 安装 git_stats
gem install git_stats
# 安装 locate
yum install mlocate -y
updatedb
# find 命令查找 git_stats 目录
find / -name 'git_stats'
# 进入到配置目录
cd /usr/local/ruby/lib/ruby/gems/2.5.0/gems/git_stats-1.0.17/config/locales/
cp zh_tw_default.yml zh_default.yml
#修改以下 2 个 yml, 将最上边的 zh_tw 调整为 zh_cn,其余不变
vim zh_default.yml
vim zh.yml


# 若报以下错误
ERROR: Error installing git_stats:
The last version of nokogiri (~> 1.6) to support your Ruby & RubyGems was 1.12.5. Try installing it with `gem install nokogiri -v 1.12.5` and then running the current command again

# 运行
gem install nokogiri -v 1.12.5

# 配置环境变量,放到末尾
vim /etc/profile
PATH =/usr/local/ruby/bin:$PATH
export PATH

# 使之生效
source /etc/profile

使用 GitStats 生成报告

1
2
3
4
5
6
7
8
9
# 创建一个项目文件夹
mkdir -p /u01/git-project
# 创建一个报告生成文件夹
mkdir -p /var/www/git-report

# 使用 git 将项目 clone 到项目文件夹中
git clone xxx.git
# 切换到项目根目录,使用 git_stats 生成报告
git_stats generate -o /var/www/git-report/xxx --language zh_cn

配置 nginx 访问

1
2
3
4
5
6
7
8
9
server {
listen 8098;
server_name 192.168.88.235;

location /vansysboot {
alias /var/www/git-report/vansysboot;
index index.html index.htm;
}
}

安装 Prometheus + Grafana 监控平台

官网:https://prometheus.io/

下载地址:https://prometheus.io/download/

安装 Prometheus Server

Prometheus 基于 Golang 编写,编译后的软件包,不依赖于任何的第三方依赖。只需要下载对应平台的二进制包,解压并且添加基本的配置即可正常启动 Prometheus Server

上传安装包

上传 prometheus-2.29.1.linux-amd64.tar.gz 到虚拟机的 /opt 目录

解压安装包

  1. 解压到 /u01/module 目录下
1
tar -zxvf prometheus-2.37.0.linux-amd64.tar.gz -C /u01/module
  1. 修改目录名
1
2
cd /u01/module
mv prometheus-2.37.0.linux-amd64.tar.gz prometheus-2.37.0

修改配置文件 prometheus.yml

1
2
cd prometheus-2.37.0
vim prometheus.yml

在 scrape_configs 配置项下添加配置:

1
2
3
4
5
6
7
8
9
10
11
# 添加 PushGateway 监控配置
- job_name: 'pushgateway'
static_configs:
- targets: ['192.168.88.231:9091']
labels:
instance: pushgateway

# 添加 Node Exporter 监控配置
- job_name: 'node exporter'
static_configs:
- targets: ['192.168.88.230:9100', '192.168.88.231:9100', '192.168.88.232:9100']

配置说明:

  1. global 配置块:控制 Prometheus 服务器的全局配置

    • scrape_interval:配置拉取数据的时间间隔,默认为 1 分钟。
    • evaluation_interval:规则验证(生成 alert)的时间间隔,默认为 1 分钟。
  2. rule_files 配置块:规则配置文件

  3. scrape_configs 配置块:配置采集目标相关, prometheus 监视的目标。Prometheus自身的运行信息可以通过 HTTP 访问,所以 Prometheus 可以监控自己的运行数据。

    • job_name:监控作业的名称

    • static_configs:表示静态目标配置,就是固定从某个 target 拉取数据

    • targets : 指 定 监 控 的 目 标 , 其 实 就 是 从 哪 儿 拉 取 数 据 。 Prometheus 会从 http://ip:9090/metrics 上拉取数据。

Prometheus 是可以在运行时自动加载配置的。启动时需要添加:–web.enable-lifecycle

重载配置命令:curl -X POST http://127.0.0.1:9090/-/reload

安装 Node Exporter

Prometheus 的架构设计中,Prometheus Server 主要负责数据的收集,存储并且对外提供数据查询支持,而实际的监控样本数据的收集则是由 Exporter 完成。因此为了能够监控到某些东西,如主机的 CPU 使用率,我们需要使用到 ExporterPrometheus 周期性的从 Exporter 暴露的 HTTP 服务地址(通常是 /metrics )拉取监控样本数据。

Exporter 可以是一个相对开放的概念,其可以是一个独立运行的程序独立于监控目标以外,也可以是直接内置在监控目标中。只要能够向 Prometheus 提供标准格式的监控样本数据即可。

为了能够采集到主机的运行指标如 CPU, 内存,磁盘等信息。我们可以使用 Node ExporterNode Exporter 同样采用 Golang 编写,并且不存在任何的第三方依赖,只需要下载,解压即可运行。

上传安装包

上传 node_exporter-1.4.0-rc.0.linux-amd64.tar.gz 到虚拟机的 /opt 目录

解压安装包

  1. 解压到 /u01/module 目录下
1
tar -zxvf node_exporter-1.4.0-rc.0.linux-amd64.tar.gz -C /u01/module
  1. 修改目录名
1
2
cd /u01/module
mv node_exporter-1.4.0-rc.0.linux-amd64.tar.gz node_exporter-1.4.0-rc
  1. 启动并访问端点查看是否成功
1
2
# 执行启动命令
./node_exporter

浏览器输入:http://ip:9100/metrics,可以看到当前 node exporter 获取到的当前主机的所有监控数据。

节点分发

将解压的目录分发到要监控的节点

1
xsync node_exporter-1.4.0-rc

添加文件分发脚本

创建脚本文件:

1
vim /usr/bin/xsync

脚本内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#!/bin/bash
# 判断参数是否足够
if [ $# -lt 1 ]
then
echo Not Enounh Arguement!
exit;
fi

# 遍历所有的机器
for host in 192.168.88.230 192.168.88.231 192.168.88.232
do
echo ==== ==== ==== $host ============
for file in $@
do
# 判断文件是否存在
if [ -e $file ]
then
# 获取父目录
pdir = $(cd -P $(dirname $file); pwd)

# 获取当前目录的名称
fname = $(basename $ file)
ssh $host "mkdir -p $ pdir "
rsync -av $pdir/$ fname $host:$ pdir
else
echo $file does not exists!
fi
done
done

若报错 bash: rsync: command not found,请在目标机器上安装

1
2
# Centos
yum install rsync -y

赋予执行权限

1
chmod +x /usr/bin/xsync

运行条件

使用 ssh 密钥验证登录,这样在传输文件时就不需要进行二次验证

1
2
3
4
5
6
7
8
9
# 生成 ssh 私钥(若有这忽略)
ssh-keygen -f ~/.ssh/id_rsa -N ''
# 循环把公钥传递到服务器上,免密登录
for i in 192.168.88.230 192.168.88.231 192.168.88.232
do
ssh-copy-id $i
done

# 根据提示输入密码

设置开机自启

centos6
  1. 创建自启动脚本
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
vim /etc/init.d/node_exporter
#!/bin/bash
# /etc/rc.d/init.d/node_exporter
# chkconfig: 2345 80 80
#
# config: /etc/prometheus/node_exporter.conf
# pidfile: /var/run/prometheus/node_exporter.pid

# Source function library.
. /etc/init.d/functions


RETVAL = 0
PROG = "node_exporter"
DAEMON_SYSCONFIG =/etc/sysconfig/${PROG}
DAEMON =/usr/bin/${PROG} #要把安装目录下/u01/module/node_exporter/node_exporter 可执行文件拷贝到/usr/bin 目录下
PID_FILE =/var/run/prometheus/${PROG}.pid
LOCK_FILE =/var/lock/subsys/${PROG}
LOG_FILE =/var/log/prometheus/node_exporter.log
DAEMON_USER = "prometheus"
FQDN =$(hostname)
GOMAXPROCS =$(grep -c ^processor /proc/cpuinfo)

. ${DAEMON_SYSCONFIG}

start() {
if check_status > /dev/null; then
echo "node_exporter is already running"
exit 0
fi

echo -n $" Starting node_exporter: "
daemonize -u ${DAEMON_USER} -p ${PID_FILE} -l ${LOCK_FILE} -a -e ${LOG_FILE} -o ${LOG_FILE} ${DAEMON} ${ARGS}
RETVAL =$?
echo ""
return $RETVAL
}

stop() {
echo -n $" Stopping node_exporter: "
killproc -p ${PID_FILE} -d 10 ${DAEMON}
RETVAL =$?
echo
[ $RETVAL = 0 ] && rm -f ${LOCK_FILE} ${PID_FILE}
return $RETVAL
}

check_status() {
status -p ${PID_FILE} ${DAEMON}
RETVAL =$?
return $RETVAL
}

case "$1 " in
start)
start
;;
stop)
stop
;;
status)
check_status
;;
reload|force-reload)
reload
;;
restart)
stop
start
;;
*)
N =/etc/init.d/${NAME}
echo " Usage: $N {start|stop|status|restart|force-reload}" >&2
RETVAL = 2
;;
esac

exit ${RETVAL}
  1. 编辑etc/sysconfig/node_exporter
1
2
3
vim /etc/sysconfig/node_exporter  
##添加如下内容
ARGS = ""
  1. 创建启动脚本中对应文件和目录
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
##开机脚本赋权
chmod 777 /etc/init.d/node_exporter

##拷贝可执行文件到/usr/bin/
cp /u01/node_exporter-1.4.0-rc/node_exporter /usr/bin/node_exporter

## 添加用户组
groupadd -r prometheus

## 创建目录
mkdir -p /usr/hostonnet/prometheus/
useradd -r -g prometheus -s /sbin/nologin -d /usr/hostonnet/prometheus/ -c "prometheus Daemons" prometheus

## 家目录修改属主
chown -R prometheus: prometheus /usr/hostonnet/prometheus/

## 创建运行目录
mkdir -p /var/run/prometheus/
chmod 777 /var/run/prometheus/

## 创建 pid 文件,并赋权
touch /var/run/prometheus/node_exporter.pid
chmod 777 /var/run/prometheus/node_exporter.pid

## 创建日志目录,并创建日志文件,赋权,修改属主
mkdir -p /var/log/prometheus/
touch /var/log/prometheus/node_exporter.log
chmod 777 /var/log/prometheus
chmod 777 /var/log/prometheus/node_exporter.log
chown prometheus: prometheus /var/log/prometheus/node_exporter.log

# 批量执行语句
chmod 777 /etc/init.d/node_exporter && cp /u01/node_exporter-1.4.0-rc/node_exporter /usr/bin/node_exporter && groupadd -r prometheus && mkdir -p /usr/hostonnet/prometheus/ && useradd -r -g prometheus -s /sbin/nologin -d /usr/hostonnet/prometheus/ -c "prometheus Daemons" prometheus && chown -R prometheus: prometheus /usr/hostonnet/prometheus/ && mkdir -p /var/run/prometheus/ && chmod 777 /var/run/prometheus/ && touch /var/run/prometheus/node_exporter.pid && chmod 777 /var/run/prometheus/node_exporter.pid && mkdir -p /var/log/prometheus/ && touch /var/log/prometheus/node_exporter.log && chmod 777 /var/log/prometheus && chmod 777 /var/log/prometheus/node_exporter.log && chown prometheus: prometheus /var/log/prometheus/node_exporter.log
  1. 安装daemonize
1
rpm -ivh daemonize-1.6.0-1.el6.rf.x86_64.rpm
  1. 运行node_exporter
1
2
#启动 node_exporter 并设置开机自启动
cd /etc/init.d/ && ./node_exporter start && chkconfig node_exporter on
centos7
  1. 创建 service 文件
1
sudo vim /usr/lib/systemd/system/node_exporter.service

文件内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
[Unit]
Description = node_export
Documentation = https://github.com/prometheus/node_exporter
After = network.target

[Service]
Type = simple
User = root
ExecStart = /u01/node_exporter-1.4.0-rc/node_exporter
Restart = on-failure

[Install]
WantedBy = multi-user.target
  1. 分发文件
1
xsync /usr/lib/systemd/system/node_exporter.service
  1. 设置开机自启并启动(所有机器都执行)
1
2
3
4
5
# 开机自启
sudo systemctl enable node_exporter.service

# 启动服务
sudo systemctl start node_exporter.service

安装 Alertmanager

上传安装包

上传 alertmanager-0.24.0.linux-amd64.tar.gz 到虚拟机的 /opt 目录

解压安装包

  1. 解压到 /u01/module 目录下
1
tar -zxvf alertmanager-0.24.0.linux-amd64.tar.gz -C /u01/module
  1. 修改目录名
1
2
cd /u01/module
mv alertmanager-0.24.0.linux-amd64.tar.gz alertmanager-0.24.0

启动 Prometheus Server 和 Alertmanager

在 Prometheus Server 目录下执行启动命令

1
nohup ./prometheus --config.file = prometheus.yml --web.enable-lifecycle > ./prometheus.log 2 >&1 &

在 Alertmanager 目录下启动

1
nohup ./alertmanager --config.file = alertmanager.yml > ./alertmanager.log 2 >&1 &

安装 Grafana 数据展示

grafana 是一款采用 Go 语言编写的开源应用,主要用于大规模指标数据的可视化展现,是网络架构和应用分析中最流行的时序数据展示工具,目前已经支持绝大部分常用的时序数据库。

下载地址:https://grafana.com/grafana/download

上传安装包

grafana-enterprise-9.0.6.linux-amd64.tar.gz 上传至 /opt 目录下

解压安装包

  1. 解压到 /u01/module 目录下
1
tar -zxvf grafana-enterprise-9.0.6.linux-amd64.tar.gz -C /u01/module
  1. 修改目录名
1
2
cd /u01/module
mv grafana-enterprise-9.0.6.linux-amd64.tar.gz grafana-enterprise-9.0.6
  1. 启动 grafana 服务
1
nohup ./bin/grafana-server web > ./grafana.log 2 >&1 &
  1. 打开浏览器,访问:http://ip:3000,默认用户名/密码:admin

Grafana 与 Prometheus 数据对接

添加 Prometheus 数据源

  1. 配置 -> 数据源 -> 添加数据源

image-20220804165739264

  1. 选择 Prometheus 数据源

image-20220804165940226

  1. 配置 Prometheus Server 地址

image-20220804170315289

  1. 点击下方的 Save&Test

image-20220804170439669

  1. 点击 Back 返回即可,可以看到 Data Sources 页面,出现了添加的 Prometheus:

image-20220804171224982

添加仪表盘 Dashboard

手动一个个添加 Dashboard 比较繁琐,Grafana 社区鼓励用户分享 Dashboard,通过 https://grafana.com/grafana/dashboards 网站,可以找到大量可直接使用的 Dashboard 模板。

Grafana 中所有的 Dashboard 通过 JSON 进行共享,下载并且导入这些 JSON 文件,就可以直接使用这些已经定义好的 Dashboard。

  1. 选择一款中文版本的 Node Exporter 仪表板

image-20220804173336648

  1. 下载模板 json 文件

image-20220804173609120

  1. 在 Grafana 中导入模板

image-20220804173822051

  1. 导入之后选择 Prometheus 数据源即可

image-20220804174153940

  1. 导入成功之后就能看到炫酷的仪表板

image-20220804174503814

安装 OracleDB Exporter 监控 Oracle 数据库

GitHub 仓库:iamseth/oracledb_exporter: Prometheus Oracle database exporter. (github.com)

Grafana 面板:Oracledb监控-性能与表空间 | Grafana Labs

以下步骤是采用 Docker 进行安装

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 1、拉取最新版本镜像
docker pull ghcr.io/iamseth/oracledb_exporter: 0.5.0
# 2、使用 docker run 命令启动
# 注意:1、--link 连接 oracle 数据库容器,这样在 oracledb_exporter 容器中可以直接使用容器名字代替 IP 地址进行通信
# 2、若密码中含有 !@#$ 等特殊字符,可以使用 URLEncode 进行转义
docker run -d --name oracledb_exporter --link = oracle11g -p 9161:9161 -e 'DATA_SOURCE_NAME = oracle://sys: 123456@oracle11g: 1521/orcl' ghcr.io/iamseth/oracledb_exporter: 0.5.0
# 3、使用 culr 访问指标情况
curl -l http://127.0.0.1:9161/metric
# 4、接入 Prometheus
在 prometheus.yml 中添加一段配置:
- job_name: oracledb_exporter
metrics_path: /metrics
static_configs:
- targets: ['chxdb21.vansys.com: 15090']

使用 Docker 安装服务

Docker 安装 ClickHouse 数据库

前提:请先安装好 Docker 容器服务(安装 Docker 容器服务

  1. 创建目录并更改权限
1
2
3
mkdir -p /u01/clickhouse/{data, config, log}

chmod -R 777 /u01/clickhouse/{data, config, log}
  1. 拉取镜像
1
docker pull yandex/clickhouse-server
  1. 创建临时容器
1
2
3
4
docker run --rm -d --name = clickhouse-server \
--ulimit nofile = 262144:262144 \
-p 8123:8123 -p 9009:9009 -p 9000:9000 \
yandex/clickhouse-server: latest
  1. 复制临时容器内配置文件到宿主机
1
2
3
docker cp clickhouse-server:/etc/clickhouse-server/config.xml /u01/clickhouse/config/config.xml

docker cp clickhouse-server:/etc/clickhouse-server/users.xml /u01/clickhouse/config/users.xml
  1. 停掉临时容器
1
docker rm -f clickhouse-server
  1. default用户配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 生成 sha256sum 密码

# 随机生成密码
PASSWORD = $(base64 < /dev/urandom | head -c8); echo "$ PASSWORD "; echo -n "$PASSWORD " | sha256sum | tr -d '-'

会输出明码和 SHA256 密码(每个人生成的不一样)
jQ+72k17
a70b3173bfef01aff0d2472fd1f86a4be647aed4e0624f1b6c867a69072e1273

# 生成指定密码 wx123456
echo "wx123456"; echo -n "wx123456" | sha256sum | tr -d '-'
wx123456
37acf78e288b1323fae2115749edcf696b6190d8c8ca1cbc66e39b10e22f2a86

# 打开 users.xml 文件 default 用户设置密码为 123456
vim /u01/clickhouse/config/users.xml

# 将文件中 <password> </password> 改为以下内容
<password_sha256_hex> 37acf78e288b1323fae2115749edcf696b6190d8c8ca1cbc66e39b10e22f2a86 </password_sha256_hex>

# 将 default 用户改为只读
# 将 <profile> default </profile> 改为以下内容
<profile> readonly </profile>
  1. 新增root用户
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 生成 root 用户密码 wx123456
echo "wx123456"; echo -n "wx123456" | sha256sum | tr -d '-'
wx123456
37acf78e288b1323fae2115749edcf696b6190d8c8ca1cbc66e39b10e22f2a86

# 打开 users.xml 文件
vim /u01/clickhouse/config/users.xml
# 在 </default> 下一行添加以下内容
<root>
<password_sha256_hex> 37acf78e288b1323fae2115749edcf696b6190d8c8ca1cbc66e39b10e22f2a86 </password_sha256_hex>
<networks incl="networks" replace="replace">
<ip>::/0 </ip>
</networks>
<profile> default </profile>
<quota> default </quota>
</root>
  1. 部署clickhouse-server
1
2
3
4
5
6
7
8
9
10
11
12
docker run -d \
--name clickhouse-server \
--privileged = true --restart = always \
--ulimit nofile = 262144:262144 \
-p 8123:8123 \
-p 9000:9000 \
-p 9009:9009 \
-v /u01/clickhouse/data:/var/lib/clickhouse: rw \
-v /u01/clickhouse/log:/var/log/clickhouse-server: rw \
-v /u01/clickhouse/config/config.xml:/etc/clickhouse-server/config.xml \
-v /u01/clickhouse/config/users.xml:/etc/clickhouse-server/users.xml \
yandex/clickhouse-server: latest

Docker 安装 ElasticSearch 搜索引擎

前提:请先安装好 Docker 容器服务(安装 Docker 容器服务

  1. 创建目录、配置文件并修改权限
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 创建 es 相关挂载目录
mkdir -p /hd/docker/es/{config, data, plugins}
# 创建文件
vi /hd/docker/es/config/elasticsearch.yml
http.host: 0.0.0.0
http.cors.enabled: true
http.cors.allow-origin: "*"
http.cors.allow-headers: Authorization
xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true

# 设置目录权限,否则会报错
chmod +x ./config/elasticsearch.yml
# 设置为目录 777 权限
chmod -R 777 /hd/docker/es
  1. 拉取镜像
1
docker pull elasticsearch: 7.17.4
  1. 启动容器
1
2
3
4
5
6
docker run --name es --restart = always -p 9200:9200 -p 9300:9300 \
-e "ES_JAVA_OPTS =-Xms512m -Xmx1024m" \
-v /hd/docker/es/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \
-v /hd/docker/es/data:/usr/share/elasticsearch/data \
-v /hd/docker/es/plugins:/usr/share/elasticsearch/plugins \
-d elasticsearch: 7.17.4
  1. 配置 es 访问密码
1
2
3
4
5
# 进入容器内部
docker exec -it es /bin/bash

# 配置密码命令
./bin/elasticsearch-setup-passwords interactive
  1. 访问网页 http://localhost:9200(账号密码:elastic/123456

Docker 安装 Nginx Proxy Manager 代理管理平台

前提:请先安装好 Docker 容器服务(安装 Docker 容器服务

  1. 创建 docker-compose.yml

使用 network_mode: host 与宿主机共享网络

1
2
3
4
5
6
7
8
9
version: '3'
services:
app:
image: '2691432189/nginx-proxy-manager-monitor-zh: latest'
restart: always
network_mode: host
volumes:
- ./data:/data
- ./letsencrypt:/etc/letsencrypt
  1. 部署运行
1
docker compose up -d
  1. 登录管理平台

容器运行成功后,使用浏览器访问 81 端口。

http://127.0.0.1:81

默认管理员信息:

1
2
Email:    admin@example.com
Password: changeme

登录之后系统会要求修改详细信息和密码

  1. 快速升级
1
2
3
docker-compose down
docker-compose pull
docker-compose up -d

Docker 安装 Redis 服务

  1. 拉取 Redis 镜像
1
2
3
4
# 拉取最新版本
docker pull redis
# 指定版本号
docker pull redis: 5.0.8
  1. 启动 Redis 容器

建议使用配置文件启动,先从 Redis 官网下载标准配置文件(也可以自己准备一个)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 创建配置文件存放目录
mkdir -p /u01/software/redis/conf
cd /u01/software/redis/conf

# 下载 redis.conf 配置文件
wget http://download.redis.io/redis-stable/redis.conf

# 给配置文件授权
chmod 777 redis.conf

# 修改配置文件
1、注释 bind 127.0.0.1,开启远程访问
2、关闭保护模式 protected-mode no
3、设置密码 requirepass 123456

# 启动 Redis 容器
docker run -p 6379:6379 --name redis --restart = always \
-v /u01/software/redis/conf/redis.conf:/etc/redis/redis.conf \
-v /u01/software/redis/data:/data \
-itd redis redis-server /etc/redis/redis.conf \
--appendonly yes

Linux 下静默安装 Oracle 19c

安装准备

下载安装包

官网下载:下载地址 | 点击跳转

服务器环境

事项 详情
操作系统 Centos 7.9
数据库版本 19.3.0
CPU Intel(R) Xeon(R) Silver 4210R CPU @ 2.40GHz
内存 32GB
Swap 15GB

准备安装环境

服务器环境检查

  1. 检查缺少了那些依赖包
1
rpm --query --queryformat "%{NAME}-%{VERSION}.%{RELEASE} (%{ARCH})\n" bc binutils compat-libcap1 compat-libstdc++-33 gcc gcc-c++ glibc glibc-devel ksh libaio libaio-devel libgcc libstdc++ libstdc++-devel make sysstat elfutils-libelf elfutils-libelf-devel fontconfig-devel libxcb smartmontools libX11 libXau libXtst libXrender libXrender-devel
  1. 使用 yum 安装缺少的依赖
1
yum install -y $NOT_INSTALLED

创建 Oracle 用户组

1
groupadd oinstall && groupadd dba && groupadd asmdba && groupadd backupdba && groupadd dgdba && groupadd kmdba && groupadd racdba && groupadd oper && useradd -g oinstall -G dba, asmdba, backupdba, dgdba, kmdba, racdba, oper -m oracle

配置 hosts 文件

1
vi /etc/hosts

配置系统内核参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 编辑 /etc/sysctl.conf 文件
vi /etc/sysctl.conf
fs.aio-max-nr = 1048576
fs.file-max = 6815744
kernel.shmall = 16451328
kernel.shmmax = 33692319744
kernel.shmmni = 4096
kernel.sem = 250 32000 100 128
net.ipv4.ip_local_port_range = 9000 65500
net.core.rmem_default = 262144
net.core.rmem_max = 4194304
net.core.wmem_default = 262144
net.core.wmem_max = 1048576

# 执行 sysctl -p 使配置生效
/sbin/sysctl -p

关闭 SELINUX 跟防火墙

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 查看 /etc/selinux/config 中 SELINUX 配置是否是 disabled
cat /etc/selinux/config
# This file controls the state of SELinux on the system.
# SELINUX = can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - No SELinux policy is loaded.
SELINUX = disabled
# SELINUXTYPE = can take one of three two values:
# targeted - Targeted processes are protected,
# minimum - Modification of targeted policy. Only selected processes are protected.
# mls - Multi Level Security protection.
SELINUXTYPE = targeted

# 查看防火墙状态
systemctl status firewalld

# 关闭防火墙服务
systemctl stop firewalld
# 停止防火墙服务开机自启
systemctl disable firewalld

配置用户环境

  1. 配置 oracle 用户环境变量
1
2
3
4
5
6
7
8
9
10
11
12
# 切换 oracle 用户
su - oracle
# 编辑 .bash_profile 文件,在文件末尾添加
vi .bash_profile
export ORACLE_BASE =/u01/app/oracle
export ORACLE_HOME =/u01/app/oracle/product/19.3.0
export PATH = $PATH:$ ORACLE_HOME/bin:/usr/local/bin
# 修改为具体的机器名称 /etc/hosts 配置
export ORACLE_HOSTNAME = xxx
export ORACLE_SID = orcl
export LD_LIBRARY_PATH = $ORACLE_HOME/lib:$ ORACLE_HOME/rdbms/lib:$ORACLE_HOME/network/lib:/lib:/usr/lib
export CLASSPATH = $ORACLE_HOME/jlib:$ ORACLE_HOME/rdbms/jlib:$ORACLE_HOME/network/jlib
  1. 修改用户的 shell 限制
1
2
3
4
5
6
# 在 /etc/security/limits.conf  文件末尾添加
vi /etc/security/limits.conf
@oinstall soft nofile 2048
@oinstall hard nofile 65536
@oinstall soft nproc 16384
@oinstall soft stack 10240

开始安装

响应文件模板存放位置:

  • 软件:/u01/app/oracle/product/19.5.0/install/response/db_install.rsp
  • 监听:/u01/app/oracle/product/19.5.0/assistants/netca/netca.rsp
  • 建库:/u01/app/oracle/product/19.5.0/assistants/dbca/dbca.rsp

解压安装包

1
2
3
4
5
6
# 创建 oracle 安装目录(root 用户)
mkdir -p /u01/app/oracle/product/19.3.0
chown -R oracle: oinstall /u01/app
# 切换到 oracle 用户解压
su - oracle
unzip LINUX.X64_193000_db_home.zip -d $ORACLE_HOME

命令行静默安装

配置响应文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 备份 db_install.rsp 文件
cd $ORACLE_HOME/install/response
cp db_install.rsp db_install.rsp.bak

# 编辑 db_install.rsp 文件,修改以下参数
oracle.install.option = INSTALL_DB_SWONLY
UNIX_GROUP_NAME = oinstall
INVENTORY_LOCATION =/u01/app/oraInventory
ORACLE_HOME =/u01/app/oracle/product/19.3.0
ORACLE_BASE =/u01/app/oracle
oracle.install.db.InstallEdition = EE
oracle.install.db.OSDBA_GROUP = dba
oracle.install.db.OSOPER_GROUP = oper
oracle.install.db.OSBACKUPDBA_GROUP = backupdba
oracle.install.db.OSDGDBA_GROUP = dgdba
oracle.install.db.OSKMDBA_GROUP = kmdba
oracle.install.db.OSRACDBA_GROUP = racdba
oracle.install.db.rootconfig.executeRootScript = false

执行安装

1
./runInstaller -silent -responseFile $ORACLE_HOME/install/response/db_install.rsp

若出现安装错误,请根据提示查看日志,分析错误原因

安装成功根据提示使用 root 用户执行脚本

1
2
sh /u01/app/oraInventory/orainstRoot.sh
sh /u01/app/oracle/product/19.3.0/root.sh

查看相关执行日志,若没有错误,表示已经安装完成

创建数据库实例

配置监听

1
2
3
4
# 创建监听
netca /silent /responseFile $ORACLE_HOME/assistants/netca/netca.rsp
# 查看监听状态
lsnrctl status

创建数据库

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 备份 dbca.rsp 响应文件
cd $ORACLE_HOME/assistants/dbca
cp dbca.rsp dbca.rsp.bak
# 配置 dbca.rsp 响应文件
vi dbca.rsp
# 主要修改以下参数
gdbName = orcl
sid = orcl
databaseConfigType = SI
templateName = General_Purpose.dbc
sysPassword = Qwer1234
systemPassword = Qwer1234
emConfiguration = DBEXPRESS
dbsnmpPassword = Qwer1234
datafileDestination =/u01/app/oracle/oradata
characterSet = ZHS16GBK
totalMemory = 8192

执行安装

1
dbca -silent -createDatabase -responseFile $ORACLE_HOME/assistants/dbca/dbca.rsp

检查

1
2
3
4
# 连接 sqlplus
sqlplus / as sysdba
# 查看实例的运行状态
select instance_name, status from v$instance;

完全卸载 Oracle 数据库

停止数据库服务
1
2
3
4
# 连接 sqlplus
sqlplus / as sysdba
# 停止数据库服务
shutdown immediate;
停止数据库监听
1
2
# 停止数据库监听
lsnrctl stop
使用 deinstall 工具进行卸载
1
2
3
4
5
6
# 执行 deinstall 工具,按提示进行操作
/u01/app/oracle/product/19.3.0/deinstall/deinstall
# 执行结束后按提示使用 root 用户执行脚本
rm -rf /etc/oraInst.loc
rm -rf /opt/ORCLfmap
rm -r /etc/oratab