Rootop 服务器运维与web架构

2020-04-28
发表者 Venus
zabbix报警磁盘使用率高 lsof deleted已关闭评论

zabbix报警磁盘使用率高 lsof deleted

zabbix报警磁盘使用率高 lsof deleted

zabbix提示磁盘使用率达到80%了,但是去看对应的分区,统计大小发现不对。

[root@localhost ~]# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/xvda3       17G  4.2G   13G  25% /
devtmpfs        7.8G     0  7.8G   0% /dev
tmpfs           7.7G     0  7.7G   0% /dev/shm
tmpfs           7.7G  537M  7.2G   7% /run
tmpfs           7.7G     0  7.7G   0% /sys/fs/cgroup
/dev/xvdb1       99G   79G   15G  85% /home
/dev/xvda1     1014M  131M  884M  13% /boot
tmpfs           1.6G     0  1.6G   0% /run/user/0
overlay          17G  4.2G   13G  25% /var/lib/docker/overlay2/26d1ef95672fa668f982e5d65a45d76172017d915d34cc29e1192feb1fe24724/merged
overlay          17G  4.2G   13G  25% /var/lib/docker/overlay2/1a7ac2aa8da4ccb74632f1e19ba58989b4ef90341577e95225c5ea568582a3db/merged
overlay          17G  4.2G   13G  25% /var/lib/docker/overlay2/3525382a68d07254d42c9f9c2767391785dda8bf04f8dd1f780a373cdd34ccca/merged

# 去查home大小

[root@localhost ~]# du -sh /home
9.7G	/home

实际发现才不到10G,很有可能是删除了日志文件,而不是清空文件内容。

# 通过lsof查找标记为删除状态的文件

[root@localhost tmp]# lsof | grep deleted
java        557   560              root    6w      REG              202,3       9248   17719072 /tmp/spring.log.7 (deleted)
.
.
.
省略部分

第二列是进程号

# 查出来有很多重复的,这里直接截取第10列,并根据此列去重

[root@localhost tmp]# lsof | grep deleted | awk '{print $10}' | sort -u
(deleted)
/home/jar/basic/logs/basic-service-2020-04-20.error.log
/home/jar/config/log.log
/home/jar/pay/log.log
/home/jar/product/log.log
/home/jar/product/logs/product-service1-2020-02-11.error.log
/home/jar/sign/log.log
/home/jar/sign/logs/sign-2020-02-11.error.log
/home/jar/zuul/log.log
/home/web/tomcat-ald/logs/catalina.out
/home/web/tomcat-ald/logs/host-manager.2020-02-12.log
/home/web/tomcat-ald/logs/manager.2020-02-12.log
/home/web/tomcat-report/logs/catalina.out
/home/web/tomcat-report/logs/host-manager.2020-02-18.log
/home/web/tomcat-report/logs/manager.2020-02-18.log
/tmp/spring.log.7
/var/log/rabbitmq/log/crash.log.3

这里每个日志都在对应的项目目录下,这样就能查到哪些文件被打开但标记是删除。也可以通过进程号找到对应进程。
挨个去重启相应的服务就会释放打开的文件。

2020-04-27
发表者 Venus
k8s设置secrets自动拉取私库镜像已关闭评论

k8s设置secrets自动拉取私库镜像

# 查看现有secrets

[root@node1 shop-api]# kubectl get secrets
NAME                  TYPE                                  DATA   AGE
default-token-v4cld   kubernetes.io/service-account-token   3      4h5m

# 创建一个私库secrets

[root@node1 shop-api]# kubectl create secret docker-registry harbor --docker-server=reg.xxx.com --docker-username=admin --docker-password=123 --docker-email=admin@xxx.com
secret/harbor created

# 查看创建

[root@node1 shop-api]# kubectl get secrets
NAME                  TYPE                                  DATA   AGE
default-token-v4cld   kubernetes.io/service-account-token   3      4h6m
harbor                kubernetes.io/dockerconfigjson        1      2s

# yaml中添加私库认证信息,截取部分。

spec:
  containers:
  - image: reg.xxx.com/prod/shop-api:0426
	name: java
	ports:
	- containerPort: 8080
	resources:
	  #limits:
	   #cpu: 1
	   #memory: 1024G
	  #requests:
	   #cpu: 1
	   #memory: 1024G
	command: ["java"]
	args: ["-jar","shop-api-0.0.1-SNAPSHOT.jar","--spring.profiles.active=test","--server.port=8080"]
	workingDir: /mnt
   
  # 私库认证
  imagePullSecrets:
  - name: harbor

注意imagePullSecrets和containers配置同级。
这样就会从私库自动认证并拉取镜像。

2020-04-26
发表者 Venus
docker push到harbor私库中报unknown blob错误已关闭评论

docker push到harbor私库中报unknown blob错误

本地构建好镜像推送到私库。
执行docker push到harbor私库中时报unknown blob错误

[root@node1 ~]# docker push reg.xxx.com/prod/filebeat-java:0426
The push refers to repository [reg.xxx.com/prod/filebeat-java]
e52576dc1f49: Pushing [==================================================>]  3.584kB
ffdb94571df7: Pushing [==================================================>]  372.7kB
47fc804728ff: Pushing [>                                                  ]  545.3kB/80.14MB
dab4e68f20a2: Pushing [==================================================>]  6.144kB
6435966ee18f: Pushing [==================================================>]  4.096kB
b1c057a951b8: Waiting 
df654d36e69e: Waiting 
77b174a6a187: Waiting 
unknown blob

网上搜索后说屏蔽掉nginx反向代理中添加的请求头解决
#proxy_set_header Host $host;
具体原因也没查为什么。
PS:我这里用的harbor修改过端口号,用nginx反向代理了harbor。

2020-04-26
发表者 Venus
harbor修改默认的80端口已关闭评论

harbor修改默认的80端口

之前做私库的时候会在harbor中直接加入https证书,但是会占用80和443,如果再添加其它的虚拟主机比较麻烦,这里直接改为其它端口。
再通过物理机上的nginx去反向代理harbor(https)。

harbor修改步骤:
1、配置文件

[root@node1 harbor]# vim harbor.cfg 
ui_url_protocol = http 这里只用http,不像之前改为https

2、服务编排文件修改

[root@node1 harbor]# vim docker-compose.yml 
  proxy:
    image: goharbor/nginx-photon:v1.7.4
    container_name: nginx
    restart: always
    cap_drop:
      - ALL
    cap_add:
      - CHOWN
      - SETGID
      - SETUID
      - NET_BIND_SERVICE
    volumes:
      - ./common/config/nginx:/etc/nginx:z
    networks:
      - harbor
    dns_search: .
    ports:
      - 7080:80  # 80改掉
      - 3443:443 # 443改掉
      - 4443:4443

3、私库模板配置文件

[root@node1 harbor]# vim common/templates/registry/config.yml 
auth:
  token:
    issuer: harbor-token-issuer
    realm: $public_url:7080/service/token
    rootcertbundle: /etc/registry/root.crt
    service: harbor-registry

把 realm: $public_url/service/token 改为 realm: $public_url:7080/service/token
这个地方不改的话,会报错:
Error response from daemon: Get https://reg.xxx.com/v2/: unauthorized: authentication required

# 创建harbor

[root@node1 harbor]# sh install.sh 

#物理机配置nginx反向代理7080端口,加上https。
location / {
	proxy_pass http://127.0.0.1:7080;
}

再docker login即可。

2020-04-17
发表者 Venus
nginx $upstream_response_time 里有2个值已关闭评论

nginx $upstream_response_time 里有2个值

在python分析nginx日志时会把upstream_response_time字符串转换为float数据类型,但报错:could not convert string to float: ‘0.000, 0.148’,发现出来2个值。日志中也是2个值。

{略过部分日志字段…,”upstream_response_time”:”0.000, 0.148″}
发现nginx日志中字段 $upstream_response_time 里有2个值,中间由逗号和空格分隔。正常情况下应该只有一个时间。像下面这样:
{略过部分日志字段…,”upstream_response_time”:”0.131″}

查nginx文档:http://nginx.org/en/docs/http/ngx_http_upstream_module.html#var_upstream_response_time

$upstream_response_time
keeps time spent on receiving the response from the upstream server;
the time is kept in seconds with millisecond resolution.
Times of several responses are separated by commas and colons like addresses in the $upstream_addr variable.
最后一句说多个响应时间由逗号和冒号分隔(但实际上是由逗号和空格分隔,可能此处文档有错误)和 $upstream_addr 变量的多个值类似
通过 $upstream_addr 变量查到描述说请求期间如果连接了多个服务器,就会出现2个值。
出现此问题的可能性一般是在upstream中定义了多个server,第一次分配的server无法响应,第二次分配处理成功,则此处就会出现2个值。
可以通过 proxy_next_upstream off; 关闭使用下一个upstream,但是客户端可能会响应为502错误。