gitlab

部署

官网文档:https://about.gitlab.com/install/?test=capabilities#centos-8

以下为centos 8平台安装步骤:

#安装依赖,一般服务器openssh-server都已经安装并且启动
sudo dnf install -y curl policycoreutils openssh-server perl
##防火墙开启 80,443端口
firewall-cmd --permanent --add-service=http
firewall-cmd --permanent --add-service=https
systemctl reload firewalld

# 添加gitlab repo
curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ee/script.rpm.sh | sudo bash
##如果有外网地址解析,添加变量
EXTERNAL_URL="https://gitlab.example.com"

# 安装
dnf install -y gitlab-ee

##基础信息
配置文件 /etc/gitlab/gitlab.rb
安装目录/opt/gitlab   /var/opt/gitlab

备份还原

官方参考https://docs.gitlab.com/ee/raketasks/backup_restore.html

备份

gitlab-rake gitlab:backup:create #备份,默认位置/var/opt/gitlab/backups
gitlab-backup create ##GitLab 12.2 起使用这个命令

##备份配置文件
/etc/gitlab/gitlab-secrets.json
/etc/gitlab/gitlab.rb
##可以运行如下命令备份配置文件,
##配置文件会保存在/etc/gitlab/config_backup/,
gitlab-ctl backup-etc

还原

还原前

sudo gitlab-ctl stop unicorn
sudo gitlab-ctl stop puma
sudo gitlab-ctl stop sidekiq
# Verify
sudo gitlab-ctl status

gitlab-rake gitlab:backup:restore #还原,恢复的gitlab要和备份的版本完全相同

以上是12.1以前的版本。之后的是gitlab-backup create ;gitlab-backup restore

恢复后

sudo gitlab-ctl reconfigure
sudo gitlab-ctl restart
sudo gitlab-rake gitlab:check SANITIZE=true

重置root 密码

gitlab-ctl start 保证gitlab处于启动状态,&保证redis处于启动状态

gitlab-ctl start            #保证gitlab处于启动状态,&保证redis处于启动状态
gitlab-rails console production
irb(main):001:0>user = User.where(id: 1).first   #定位到gitlab 数据库中Users表中的一个用户,通常就是管理员用户admin@local.host
irb(main):002:0> user.password=12345678          #重置管理员密码为12345678
irb(main):003:0> user.password_confirmation=12345678   #确认管理员密码为12345678
irb(main):004:0> user.save!    #保存更改信息

用户权限

Guest:可以创建issue、发表评论,不能读写版本库

Reporter:可以克隆代码,不能提交,可以赋予测试、产品经理此权限

Developer:可以克隆代码、开发、提交、push,可以赋予开发人员此权限

MainMaster:可以创建项目、添加tag、保护分支、添加项目成员、编辑项目,一般GitLab管理员或者CTO才有此权限

helm

介绍

Helm 是一个 Kubernetes 的包管理工具,类似 Linux 的包管理器,如RedHat系的yum、Debian的apt,可以很方便的将之前打包好的 yaml 文件部署到 Kubernetes 上。Helm主要解决以下问题:1、把yaml作为一个整体管理。2、实现yaml的高效复用。3、实现应用级别的版本管理。

当前 Helm 已经升级到V3版本,相比于V2版本主要变化如下:

1、 最明显的变化是删除了 Tiller 。
2、 Release 名称可以在不同命名空间重用。
3、 支持将 Chart 推送至 Docker 镜像仓库中。
4、 使用 JSONSchema 验证 chart values。

Helm 有3个重要概念:
    1、helm: 一个命令行客户端工具,主要用于 Kubernetes 应用 chart 的创建、 打包、 发布和管理。
    2、Chart:应用描述,一系列用于描述 k8s 资源相关文件的集合。
    3、Release:基于 Chart 的部署实体,一个 chart 被 Helm 运行后将会生成对应的一个release;release是在 k8s 中创建出真实运行的资源对象。

下图是 Helm V2 与 Helm V3 的架构图对比:

V2版本的架构中,Tiller在Kubernetes集群中,Helm Client发请求给Tiller需要经过RBAC认证。而V3版本是Helm通过kubeconfig连接kube-apiserver,避免了使用者去配置RBAC权限。

安装

可以直接下载二进制文件 https://github.com/helm/helm/releases linux amd64

解压后 把helm 复制到bin目录 mv linux-amd64/helm /usr/local/bin/helm

如同yum、apt拥有仓库一样,Helm也有仓库,使用Helm默认仓库下载Chart比较慢,可以增加微软、阿里的仓库。

添加微软Chart仓库

helm repo add stable http://mirror.azure.cn/kubernetes/charts

使用

##查看 可用chart
$ helm search repo stable
##安装mysql
$ helm repo update              # Make sure we get the latest list of charts
$ helm install stable/mysql --generate-name  ##generate-name就是本地mysql的名字
                                             随机生成,
Released smiling-penguin
$ helm install wujy_mysql stable/mysql           #也可以自己定义名字

##查看已安装的released
$ helm ls
NAME             VERSION   UPDATED                   STATUS    CHART
smiling-penguin  1         Wed Sep 28 12:59:46 2016  DEPLOYED  mysql-0.1.0
##卸载一个release
$ helm uninstall smiling-penguin
Removed smiling-penguin

常用命令

查找 helm search <hub/repo> CHARTNAME
安装 helm install --name mem1 stable/memcached
获取状态信息 helm status mem1
列出 helm list [-a]
下载 helm get stable/redis
创建 helm create CHARTNAME
语法检测 helm lint CHARTNAME
打包 helm package CHARTNAME
显示状态 helm status NAME

linux swap分区

首先划分一个分区做swap

fdisk /dev/vdb

分区类型按”t“修改为82 Linux swap,保存

格式化分区 mkswap /dev/vdb2

启动swap分区 swapon /dev/vdb2

查看swap分区UUID blkid

/etc/fstab永久挂载 UUID=04820cf8-90b3-4bf9-8402-071352674b73 swap swap defaults 0 0

查看 free -h swapon -s

NFS subdir external provisioner

这个provisioner支持用已有的nfs动态的创建PV,下面记录下部署过程。

前提已经有一个k8s集群,一台nfs服务器。我的环境是1master ,2worker的k8s,用work2搭建了nfs

步骤如下:

1. 准备好nfs服务器的信息

确保你的k8s可以正常访问nfs服务器,服务器IP (192.168.157.130) , 共享目录(/public)

2. 下载 provisioner 文件


git clone https://github.com/kubernetes-sigs/nfs-subdir-external-provisioner.git
#切换到nfs-subdir-external-provisioner目录下

3. 安装RBAC授权相关的账号、角色、绑定

#编辑 deploy/rbac.yaml  deployment.yaml
#我把provisioner安装在kube-system命名空间,这个可以自己定义修改
$ NAMESPACE="kube-system"
$ sed -i'' "s/namespace:.*/namespace: $NAMESPACE/g" ./deploy/rbac.yaml ./deploy/deployment.yaml
$ kubectl create -f deploy/rbac.yaml -f deploy/deployment.yaml

4.配置provisioner

编辑deploy/deployment.yaml文件,修改image 为国内镜像,不然下载不下来(比如我的:registry.cn-hangzhou.aliyuncs.com/jimywu/nfs-subdir-external-provisioner:v4.0.0);

修改<YOUR NFS SERVER HOSTNAME> 和 <YOUR PATH>,我的分别为192.168.157.130,/public

其他的都保持默认,kubectl create -f deploy/deployment.yaml 安装

kind: Deployment
apiVersion: apps/v1
metadata:
  name: nfs-client-provisioner
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nfs-client-provisioner
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: nfs-client-provisioner
    spec:
      serviceAccountName: nfs-client-provisioner
      containers:
        - name: nfs-client-provisioner
          image: gcr.io/k8s-staging-sig-storage/nfs-subdir-external-provisioner:v4.0.0
          volumeMounts:
            - name: nfs-client-root
              mountPath: /persistentvolumes
          env:
            - name: PROVISIONER_NAME
              value: k8s-sigs.io/nfs-subdir-external-provisioner
            - name: NFS_SERVER
              value: <YOUR NFS SERVER HOSTNAME>
            - name: NFS_PATH
              value: <YOUR PATH>
      volumes:
        - name: nfs-client-root
          nfs:
            server: <YOUR NFS SERVER HOSTNAME>
            path: <YOUR PATH>

5.部署 storage class

编辑 deploy/class.yaml 文件,增加5,6两行,把此storageclass设置为系统默认,这样创建PV时不用指明SC的名字。

  1 apiVersion: storage.k8s.io/v1
  2 kind: StorageClass
  3 metadata:
  4   name: managed-nfs-storage
  5   annotations:
  6     "storageclass.kubernetes.io/is-default-class": "true"
  7 provisioner: k8s-sigs.io/nfs-subdir-external-provisioner # or choose another name, must match deployment's env PROVISIONER_NAME'
  8 parameters:
  9   archiveOnDelete: "false"

最后 kubectl create deploy/class.yaml 部署。以上没有出错,基本已经完成部署。

设置默认storageClass

kubectl patch sc managed-nfs-storage -p ‘{“metadata”: {“annotations”:{“storageclass.kubernetes.io/is-default-class”:”true”}}}’

参考链接:官方git : https://github.com/kubernetes-sigs/nfs-subdir-external-provisioner

nfs 搭建

环境A,B两台centos7,A ip 192.168.1.2 服务端,B ip 192.168.1.3客户端

A服务器端

##安装
yum install -y nfs-utils rpcbind
## ubuntu :服务端nfs-kernel-server ,客户端nfs-common
##依次启动
systemctl start rpcbind
systemctl start nfs-server
#建立共享目录
mkdir /share
chmod 777 /share
##编辑配置文件 /etc/exports
#括号后默认参数 (ro, root_squash)
#root_squash 当NFS客户端以root管理员访问时,映射为NFS服务器的匿名用户
/share  192.168.1.0/24(rw,no_root_squash,async)
##重新读取配置使之生效
systemctl reload nfs-server

B 客户端

##查看
[root@m1 ~]# showmount -e 192.168.1.2
Export list for 192.168.1.2:
/share 192.168.1.0/24
##挂载
[root@m1 ~]# mkdir /mnt/pub
[root@m1 ~]# mount -t nfs 192.168.1.2:/share  /mnt/pub

节气

惊蛰不动土,春风不上山。

清明吃青果,冬至吃白饼。

立夏小满足,大雪兆丰年。

鲤鱼跳龙门,雷公进屋门。

朝霞不出门,晚霞行千里。

—- 人生海海

firewall 的这么多zone的优先级

zone 介绍

firewall的zone有 block dmz docker drop external home internal public trusted work等,除此之外,还有自定义的zone。每个zone就是一套规则集。

多个活动zone下的流量匹配优先级顺序

有那么多zone,对于一个具体的请求来说应该使用哪个zone(哪套规则)来处理呢?这个问题至关重要,如果这点不弄明白其他的都是空中楼阁,即使规则设置的再好,不知道怎样用、在哪里用也不行。

对于一个接受到的请求具体使用哪个zone,firewalld是通过三种方法来判断的:

1、source,也就是源地址

2、interface,接收请求的网卡

3、firewalld.conf中配置的默认zone

4、默认规则,丢弃

这三个的优先级按顺序依次降低,也就是说如果按照source可以找到就不会再按interface去查找,如果前两个都找不到才会使用第三个,也就是在firewalld.conf中配置的默认zone

这里做下特别说明:

假设某个来源IP访问匹配了 某个定义了source的zone,它接着在zone中找service或port是否有匹配的规则设置,如果有则按照zone 中的targe设置来决定是否放行。没有匹配的就找第二个优先级的zone去查找service 或port 规则

target 有(default , accept ,drop ,%%REJECT%%)几种

相关命令说明

#列出本机所有zone
firewall-cmd --get-zones
#列出默认zone
firewall-cmd --get-default-zone
#设置默认zone
firewall-cmd --set-default-zone
#列出活动的zone,可以有多个
firewall-cmd --get-active-zones
#显示默认zone的所有配置信息(Permanent)
firewall-cmd --list-all

fail2ban

最近查看自己搭建的一台邮件服务器的日志,发现不停的有IP在测试登录密码,就想着把这些恶意连接的IP给封了。记得以前了解有个fail2ban的工具,可以不用从头到脚写脚本,直接简单配置即可实现我的需求,于是就来部署试试。

我的centos7上已经安装了epel源,直接yum安装

yum install fail2ban -y 

安装完成后,需要到配置目录(/etc/fail2ban/)做下配置。配置文件功能说明下:

fail2ban.conf   这个是程序运行相关的配置,不用动
jail.conf       这个是系统预装的相关服务检测规则,然后封禁的相关配置,因程序升级会
                覆盖此文件,因此需要在同目录新建 jail.local来做个性化配置
jail.d/         个性化配置也可在此目录下新建文件,效果与jail.local相同
filter.d/       预置的可以jail的服务

配置文件编写规则说明:

1、默认配置文件jail.conf为总[default] ,分[sshd]   [nginx]这种层次
2、个人配置文件jail.local 可以只写具体要jail的服务模块,如[sshd] ,它会自动继承 
   [defualt]中的所有配置,如果sshd中有default相同的命令,会重写(override)default
   中的命令
3、默认所有的jail模块都是未开启的
4、如果要启动sshd 可以只写
  [sshd]
  enabled = true
  所有预置的服务(在filter.d/目录下)都可以只写上面格式的两行就可开启对于服务的监控拦截功能

我安装的是fail2ban-0.11.1-10.el7.noarch版本,预装的配置文件[default]如下

[DEFAULT]
ignorecommand =
bantime  = 10m
findtime  = 10m
maxretry = 5
maxmatches = %(maxretry)s
backend = auto
usedns = warn
logencoding = auto
enabled = false
mode = normal
filter = %(__name__)s[mode=%(mode)s]
destemail = root@localhost
sender = root@
mta = sendmail
protocol = tcp
chain = 
port = 0:65535
fail2ban_agent = Fail2Ban/%(fail2ban_version)s
banaction = iptables-multiport
banaction_allports = iptables-allports
action_ = %(banaction)s[name=%(__name__)s, port="%(port)s", protocol="%(protocol)s", chain="%(chain)s"]
action_mw = %(banaction)s[name=%(__name__)s, port="%(port)s", protocol="%(protocol)s", chain="%(chain)s"]
            %(mta)s-whois[name=%(__name__)s, sender="%(sender)s", dest="%(destemail)s", protocol="%(protocol)s", chain="%(chain)s"]
action_mwl = %(banaction)s[name=%(__name__)s, port="%(port)s", protocol="%(protocol)s", chain="%(chain)s"]
             %(mta)s-whois-lines[name=%(__name__)s, sender="%(sender)s", dest="%(destemail)s", logpath="%(logpath)s", chain="%(chain)s"]
action_xarf = %(banaction)s[name=%(__name__)s, port="%(port)s", protocol="%(protocol)s", chain="%(chain)s"]
             xarf-login-attack[service=%(__name__)s, sender="%(sender)s", logpath="%(logpath)s", port="%(port)s"]
action_cf_mwl = cloudflare[cfuser="%(cfemail)s", cftoken="%(cfapikey)s"]
                %(mta)s-whois-lines[name=%(__name__)s, sender="%(sender)s", dest="%(destemail)s", logpath="%(logpath)s", chain="%(chain)s"]
action_blocklist_de  = blocklist_de[email="%(sender)s", service=%(filter)s, apikey="%(blocklist_de_apikey)s", agent="%(fail2ban_agent)s"]
action_badips = badips.py[category="%(__name__)s", banaction="%(banaction)s", agent="%(fail2ban_agent)s"]
action_badips_report = badips[category="%(__name__)s", agent="%(fail2ban_agent)s"]
action_abuseipdb = abuseipdb
action = %(action_)s

我的配置文件/etc/fail2ban/jail.local

[sshd]
enabled = true
[sendmail-auth]
enabled = true
[dovecot]
enabled = true

接着运行下面相关命令开启fail2ban,查看相关的状态信息

#开启服务
systemctl start fail2ban
#查看配置 
fail2ban-client -d
#重新载入配置
fail2ban-client reload
#查看jail
fail2ban-client status
#查看某个jail状态
fail2ban-client status sshd

更高级些的用法可以添加上面default段的命令来重写,如

[nginx-auth-path]
port = 8080     ;nginx端口为8080
logpath = /usr/local/nginx/logs/errors.log
bantime = 30m   ;ban30分钟
maxretry = 6    ;连续错误6次就会被ban
enabled = ture

邮件服务器的几个端口

最早的几个

25: SMTP(Simple Mail Transfer Protocol,简单邮件传输协议),是用于发送邮件,国内公有云服务器都会关闭云主机25端口出去的流量,也就禁止向外发邮件。

110:POP3(Post Office Protocol Version 3,邮局协议3),是用于接收邮件的。

143:IMAP(INTERNET MESSAGE ACCESS PROTOCOL),是用于接收邮件的。区别与110,它可以只收取邮件头

增加SSL协议后的

465:SMTPS(SMTP-over-SSL),这是SMTP协议基于SSL安全协议之上的一种变种协议

995:POP3S(POP3-over-SSL),这是POP3协议基于SSL安全协议之上的一种变种协议

993:IMAPS(IMAP-over-SSL),这是IMAP协议基于SSL安全协议之上的一种变种协议

logrotate – linux 系统集成的日志转储压缩工具

全局配置文件: /etc/logrotate.conf ,单独系统配置文件放置在/etc/logrotate.d/目录下

参数说明

参数            功能说明
compress            通过gzip 压缩转储以后的日志
nocompress          不需要压缩时,用这个参数

copytruncate        用于还在打开中的日志文件,把当前日志备份并截断;是先拷贝再清空
                   ,拷贝和清空之间有一个时间差,可能会丢失部分日志数据。
nocopytruncate      备份日志文件但是不截断

create mode owner group  转储文件,使用指定的文件模式创建新的日志文件。轮转时指定创
                          建新文件的属性,如create 0600 root root
nocreate            不建立新的日志文件

delaycompress       和 compress 一起使用时,转储的日志文件到下一次转储时才压缩
nodelaycompress     覆盖 delaycompress 选项,转储同时压缩

ifempty             即使是空文件也转储,这个是 logrotate 的缺省选项。
notifempty          如果日志文件为空时,不转储

errors address      转储时的错误信息发送到指定的Email 地址
mail address        转储的日志文件发送到指定的E-mail 地址
nomail              转储时不发送日志文件

olddir directory    转储后的日志文件放入指定的目录,必须和当前日志文件在同一文件系统
noolddir            转储后的日志文件和当前日志文件放在同一个目录下

prerotate/endscript 在logrotate转储之前需要执行的指令,例如修改文件的属性等动作;
                     这两个关键字必须单独成行;
postrotate/endscript 在logrotate转储之后需要执行的指令,例如重新启动 (kill -HUP) 
                     某个服务!必须独立成行;

daily              指定转储周期为每天
weekly             指定转储周期为每周
monthly            指定转储周期为每月

rotate count       指定日志文件删除之前转储的个数,0 指没有备份,5 指保留5个备份
tabootext [+] list 让logrotate不转储指定扩展名的文件,缺省的扩展名是:.rpm-orig, 
                   .rpmsave, v, 和 ~

size               size当日志文件到达指定的大小时才转储,Size 可以指定 bytes (缺省)
                   以及KB (sizek)或者MB (sizem).
missingok          如果日志丢失,不报错继续滚动下一个日志
sharedscripts      运行postrotate脚本,作用是在所有日志都轮转后统一执行一次脚本。
                   如果没有配置这个,那么每个日志轮转后都会执行一次脚本

dateext           使用当期日期作为命名格式
dateformat .%s    配合dateext使用,紧跟在下一行出现,定义文件切割后的文件名,必须配
                  合dateext使用,只支持 %Y %m %d %s 这四个参数 自己测试了%H也可以。
                  不过如果需要支持分的话logrotate需要升级到3.9版本 ,

测试配置结果:

#debug测试 -d, --debug   Don't do anything, just test (implies -v)
logrotate -d configfile

示例

1、列出多个文件,统一配置策略

#Please note:
#nocreate and copytruncate in configuration file are mutually exclusive and can't be configured at the same time,otherwise nocreate have no effect
#create and copytruncate in configuration file are mutually exclusive and can't be configured at the same time,otherwisecreate have no effect
/var/log/startup.log
/var/log/boot.log
/var/log/backup_conf.log
/var/log/cloud-init-output.log
/var/log/cloud-init.log
/var/log/daemon.log
/var/log/cron.log
/var/log/kern.log
/var/log/syslog
/var/log/unused.log
/var/log/sysmonitor.log
/var/log/tuned/*.log
/var/log/wtmp
/var/log/btmp
{
	missingok
	compress
	notifempty
	copytruncate
	rotate 10
	size +4000k
}

2、多个同目录下多个log 文件

/var/log/openvswitch/*.log {
	missingok
	notifempty
	size 2048k
	rotate 10
	copytruncate
}

3

# Logrotate file for psacct RPM

/var/account/pacct {
    compress
    delaycompress
    notifempty
    daily
    rotate 31
    create 0600 root root
    postrotate
       if /usr/bin/systemctl --quiet is-active psacct.service ; then
           /usr/sbin/accton /var/account/pacct | /usr/bin/grep -v "Turning on process accounting, file set to '/var/account/pacct'." | /usr/bin/cat
       fi
    endscript
}

4、mariadb

/var/log/mariadb/mariadb.log {
        create 600 mysql mysql
        notifempty
        daily
        rotate 3
        missingok
        compress
    postrotate
	# just if mysqld is really running
        if [ -e /run/mariadb/mariadb.pid ]
        then
           kill -1 $(</run/mariadb/mariadb.pid)
        fi
    endscript
}