promethues

#gitlab集成的promethues配置文件
---
global:
  scrape_interval: 15s
  scrape_timeout: 15s
scrape_configs:
- job_name: prometheus
  static_configs:
  - targets:
    - localhost:9090
- job_name: redis
  static_configs:
  - targets:
    - localhost:9121
- job_name: postgres
  static_configs:
  - targets:
    - localhost:9187
- job_name: node
  static_configs:
  - targets:
    - localhost:9100
- job_name: gitlab-unicorn
  metrics_path: "/-/metrics"
  static_configs:
  - targets:
    - 127.0.0.1:8080
- job_name: gitlab_monitor_database
  metrics_path: "/database"
  static_configs:
  - targets:
    - localhost:9168
- job_name: gitlab_monitor_sidekiq
  metrics_path: "/sidekiq"
  static_configs:
  - targets:
    - localhost:9168
- job_name: gitlab_monitor_process
  metrics_path: "/process"
  static_configs:
  - targets:
    - localhost:9168
- job_name: kubernetes-nodes
  scheme: https
  tls_config:
    ca_file: "/var/run/secrets/kubernetes.io/serviceaccount/ca.crt"
    insecure_skip_verify: true
  bearer_token_file: "/var/run/secrets/kubernetes.io/serviceaccount/token"
  kubernetes_sd_configs:
  - role: node
    api_server: https://kubernetes.default.svc:443
    tls_config:
      ca_file: "/var/run/secrets/kubernetes.io/serviceaccount/ca.crt"
    bearer_token_file: "/var/run/secrets/kubernetes.io/serviceaccount/token"
  relabel_configs:
  - action: labelmap
    regex: __meta_kubernetes_node_label_(.+)
  - target_label: __address__
    replacement: kubernetes.default.svc:443
  - source_labels:
    - __meta_kubernetes_node_name
    regex: "(.+)"
    target_label: __metrics_path__
    replacement: "/api/v1/nodes/${1}/proxy/metrics"
  metric_relabel_configs:
  - source_labels:
    - pod_name
    target_label: environment
    regex: "(.+)-.+-.+"
- job_name: kubernetes-pods
  tls_config:
    ca_file: "/var/run/secrets/kubernetes.io/serviceaccount/ca.crt"
    insecure_skip_verify: true
  bearer_token_file: "/var/run/secrets/kubernetes.io/serviceaccount/token"
  kubernetes_sd_configs:
  - role: pod
    api_server: https://kubernetes.default.svc:443
    tls_config:
      ca_file: "/var/run/secrets/kubernetes.io/serviceaccount/ca.crt"
    bearer_token_file: "/var/run/secrets/kubernetes.io/serviceaccount/token"
  relabel_configs:
  - source_labels:
    - __meta_kubernetes_pod_annotation_prometheus_io_scrape
    action: keep
    regex: 'true'
  - source_labels:
    - __meta_kubernetes_pod_annotation_prometheus_io_path
    action: replace
    target_label: __metrics_path__
    regex: "(.+)"
  - source_labels:
    - __address__
    - __meta_kubernetes_pod_annotation_prometheus_io_port
    action: replace
    regex: "([^:]+)(?::[0-9]+)?;([0-9]+)"
    replacement: "$1:$2"
    target_label: __address__
  - action: labelmap
    regex: __meta_kubernetes_pod_label_(.+)
  - source_labels:
    - __meta_kubernetes_namespace
    action: replace
    target_label: kubernetes_namespace
  - source_labels:
    - __meta_kubernetes_pod_name
    action: replace
    target_label: kubernetes_pod_name

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
##依次启动
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安全协议之上的一种变种协议