1.正式环境使用的话启动时需要指定使用正式的配置文件,这个要咋处理?

解决办法

文章地址:https://www.cnblogs.com/sanduzxcvbnm/p/13262411.html

分析步骤

Dockerfile文件内容如下:

# tag:0.3
FROM idocker.io/jre:1.8.251
VOLUME /tmp
ADD target/hkd-gateway-1.0.jar hkd-gateway-1.0.jar
RUN sh -c 'touch /hkd-gateway-1.0.jar'
ENV JAVA_OPTS=""
ENTRYPOINT [ "sh", "-c", "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /hkd-gateway-1.0.jar" ]

可以在启动容器的时候把要使用的配置文件给传递给JAVA_OPTS,这样就能解决启动时采用哪个配置文件的问题了

spring.profiles.active=dev|test|prod

原shell启动脚本内容:

#!/bin/bash
java -jar -Xms256m -Xmx256m -XX:+UseParNewGC -XX:ParallelGCThreads=4 -XX:MaxTenuringThreshold=9 -XX:+UseConcMarkSweepGC \
-XX:CMSInitiatingOccupancyFraction=75 -XX:+UseCMSInitiatingOccupancyOnly -XX:+PrintGCDateStamps -XX:+CMSClassUnloadingEnabled -XX:SoftRefLRUPolicyMSPerMB=0 \
-XX:+PrintGCDetails -XX:+ExplicitGCInvokesConcurrentAndUnloadsClasses -XX:+PrintHeapAtGC -XX:+HeapDumpOnOutOfMemoryError -XX:-OmitStackTraceInFastThrow \
-Xloggc:/opt/hkd-cloud/hkd-gateway/logs/heap_trace.txt -XX:HeapDumpPath=/opt/hkd-cloud/hkd-gateway/logs/HeapDumpOnOutOfMemoryError/ /opt/hkd-cloud/hkd-gateway/hkd-gateway-1.0.jar \
--spring.profiles.active=dev >> /opt/hkd-cloud/hkd-gateway/logs/hkd-gateway.out 2>&1

本地测试环境使用



正式环境使用



可以把这个配置给写入到ConfigMap 中,然后引用这个就可以了

shell脚本中附加的运行参数处理:





2.日志现在是直接查看的,没有存储到文件中,以后查看日志要咋处理?

解决办法

文章地址:https://www.cnblogs.com/sanduzxcvbnm/p/13259957.html

注:文章中使用logstash了,可以扩展使用redis使用

分析步骤

进一步延申一下问题,容器运行在pod中,容器中的程序日志是输出到pod的控制台中的。所以可以换种说法,如何收集pod的控制台日志?

通过咨询了解到,pod的控制台日志是默认存放在宿主机上,也就是存放在宿主机中的/var/log/pods目录下,这就好办多了,直接使用filebeat读取整个目录下的所有子目录以及日志文件等,具体看下图

当删除该pod或者pod数调整为0的时候,对应的目录和日志文件也就自动没有了

查看上图可以知道。每创建一个新pod,就会在该目录下新建一个文件夹,一个pod有多个副本,则每个副本也都会创建一个文件夹,每个文件夹下是一个以容器名称命名的子文件夹,在这个子文件夹有一个以log结尾的链接文件,实际指向docker中的路径/var/lib/docker/containers

参考文章:k8s 容器控制台日志收集

优点: 如果业务里面把日志全部往控制台输出,对于日志管理是非常的方便的。当删除容器了,日志文件也就没有了,所有不需要额外再写脚本全定时管理日志

缺点: 如果业务中有多种日志需要收集,当然也就可以通过logstash来做,只不过比较麻烦。还需要业务协调

重要:再次参考文章:https://www.cnblogs.com/sanduzxcvbnm/p/13259957.html

这里采用单独的filebeat来收集日志,传输给redis,logstash从redis中拉取数据,在logstash中根据目录名称创建es索引

filebeat配置文件

filebeat.inputs:
- type: log
enabled: true
paths:
- /var/log/pods/*/*/*.log # paths中的正则会匹配k8s中所有的pod控制台日志
symlinks: true # 日志文件是软连接形式到docker目录中去的 所以这个开关需要开启 #json.overwrite_keys: true # #对于同名的key,覆盖原有key值
#json.add_error_key: true # #将解析错误的消息记录储存在error.message字段中
#json.keys_under_root: true # #keys_under_root可以让字段位于根节点,默认为false
#json.message_key: log # #message_key是用来合并多行json日志使用的,如果配置该项还需要配置multiline的设置
#tail_files: true # 如果设置为true,Filebeat从文件尾开始监控文件新增内容,把新增的每一行文件作为一个事件依次发送,而不是从文件开始处重新发送所有内容 #multiline.pattern: '^[0-9]{4}-[0-9]{2}-[0-9]{2}'
#multiline.negate: true
#multiline.match: after
#multiline.timeout: 10s output.redis:
hosts: ["192.168.75.21:6379"]
key: pods_log
db: 0
timeout: 5

logstash

使用logstash从redis中拉取数据,处理收集的文件的目录 根据目录名字输出到不同的索引

input {
redis {
host => "192.168.75.21"
port => 6379
data_type => "list"
key => "pods_log"
db => 0
}
} output { #stdout {
# codec => rubydebug
#} elasticsearch {
hosts => ["192.168.75.21:9200"]
index => "%{[container][id]}-%{+yyyy.MM.dd}"
user => "elastic"
password => "IjGj8QwWYeXY7rVoLLQ6"
}
}

第二天再次启动k8s主机后,这个pod也随之启动了,相对应的日志文件新生成一份。

若是pod一直运行下去,是不是日志文件始终就只有一个?有待进一步验证

3.发布更新的话需要先把服务从注册中心给down下来,然后才能更新模块,这个要咋处理?

解决办法

文章地址:https://www.cnblogs.com/sanduzxcvbnm/p/13268486.html

注:直接看文章最后的内容

分析步骤

使用k8s的postStart和preStop功能,pod的生命周期管理

  • postStart 容器启动时,Kubernetes 立刻发送 postStart 事件,但不确保对应的 handler 是否能在容器的 EntryPoint 之前执行
  • preStop 容器停止前,Kubernetes 发送 preStop 事件

参考之前的相关功能:

curl -v -X PUT http://localhost:8761/eureka/apps/HKD-GATEWAY/hkd-cluster1:hkd-gateway:5000/status?value=DOWN
curl -v -X PUT http://localhost:8761/eureka/apps/HKD-GATEWAY/hkd-cluster1:hkd-gateway:5000/status?value=UP

需要在容器中使用到curl命令,但是tag:0.3镜像中并不包含此命令,所以重构了一个含有curl命令的docker基础镜像,参考文章:https://www.cnblogs.com/sanduzxcvbnm/p/13220054.html

这里以config模块为例

结合现有的信息,改造使用的curl命令等,结果如下:

curl -v -X PUT http://cloud-eureka-0.cloud-eureka.hkd.svc.cluster.local:8761/eureka/apps/HKD-CONFIG/cloud-config-0.cloud-config.hkd.svc.cluster.local:hkd-config:8888/status?value=DOWN
curl -v -X PUT http://cloud-eureka-0.cloud-eureka.hkd.svc.cluster.local:8761/eureka/apps/HKD-CONFIG/cloud-config-0.cloud-config.hkd.svc.cluster.local:hkd-config:8888/status?value=UP

说明:

修改config模块的Dockerfile文件,具体如下:

# tag:0.3
#FROM idocker.io/jre:1.8.251
#VOLUME /tmp
#ADD target/hkd-config-1.0.jar hkd-config-1.0.jar
#RUN sh -c 'touch /hkd-config-1.0.jar'
#ENV JAVA_OPTS=""
#ENTRYPOINT [ "sh", "-c", "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /hkd-config-1.0.jar" ] # tag:0.4
FROM idocker.io/jre:1.8.0_212
VOLUME /tmp
ADD target/hkd-config-1.0.jar hkd-config-1.0.jar
RUN sh -c 'touch /hkd-config-1.0.jar'
ENV JAVA_OPTS=""
ENTRYPOINT [ "sh", "-c", "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /hkd-config-1.0.jar" ]

然后使用提交到gitlab,使用jenkins打包,编译,制作docker镜像提交到nexus仓库,接下来是在kuboard界面上操作

postStart上使用UP

preStop使用Down

kuboard界面上显示

日志显示;

关键分析:日志显示中的区别

使用命令down后,关闭这行pod,启用一个新pod,这中间间隔的时间太短了,会有问题,还有待改善

暂定改善方法:在preStop中增加等待时间

直接加命令后添加sleep等待时间报错:





1.这个日志表述的含义是在关闭pod之前执行preStop中的down命令,eureka注册中心仍会显示这个服务,但是状态是DOWN

2020-07-01 17:31:28.369 INFO 1 --- [nio-8761-exec-1] c.n.e.r.InstanceResource : Status updated: HKD-CONFIG - cloud-config-0.cloud-config.hkd.svc.cluster.local:hkd-config:8888 - DOWN

2.这个日志表述的含义是pod关闭导致这个服务停止了,eureka注册中心不显示这个服务

2020-07-01 17:31:28.796 INFO 1 --- [io-8761-exec-10] c.n.e.r.AbstractInstanceRegistry : Registered instance HKD-CONFIG/cloud-config-0.cloud-config.hkd.svc.cluster.local:hkd-config:8888 with status DOWN (replication=false)

3.这个日志表述的含义是启动pod时,preStart中的up命令,eureka中状态改成up

2020-07-01 17:31:46.688 INFO 1 --- [nio-8761-exec-7] c.n.e.r.InstanceResource : Status updated: HKD-CONFIG - cloud-config-0.cloud-config.hkd.svc.cluster.local:hkd-config:8888 - UP

4.这个日志表述的是含义是启动pod,config服务往eureka上注册,也就是显示出来

2020-07-01 17:32:04.033 INFO 1 --- [nio-8761-exec-1] c.n.e.r.AbstractInstanceRegistry : Registered instance HKD-CONFIG/cloud-config-0.cloud-config.hkd.svc.cluster.local:hkd-config:8888 with status UP (replication=false)

如下是单独使用命令操作的日志显示

down

执行的命令

eureka日志查看

eureka界面查看

up

执行的命令

eureka日志查看

eureka界面查看

关于上面所说的间隔时间太短的问题处理

可以使用如下方法进行:

# postStart命令
curl -X PUT http://cloud-eureka-0.cloud-eureka.test.svc.cluster.local:8761/eureka/apps/HKD-CONFIG/cloud-config-0.cloud-config.test.svc.cluster.local:hkd-config:8888/status?value=UP;sleep 300 # preStop命令
curl -v -X PUT http://cloud-eureka-0.cloud-eureka.test.svc.cluster.local:8761/eureka/apps/HKD-CONFIG/cloud-config-0.cloud-config.test.svc.cluster.local:hkd-config:8888/status?value=DOWN;sleep 300

yaml文件:

          lifecycle:
postStart:
exec:
command:
- /bin/sh
- '-c'
- >-
curl -X PUT
http://cloud-eureka-0.cloud-eureka.test.svc.cluster.local:8761/eureka/apps/HKD-CONFIG/cloud-config-0.cloud-config.test.svc.cluster.local:hkd-config:8888/status?value=UP;sleep
300
preStop:
exec:
command:
- /bin/sh
- '-c'
- >-
curl -v -X PUT
http://cloud-eureka-0.cloud-eureka.test.svc.cluster.local:8761/eureka/apps/HKD-CONFIG/cloud-config-0.cloud-config.test.svc.cluster.local:hkd-config:8888/status?value=DOWN;sleep
300

或者换成如下这俩命令,功能都是一样的,只不过显示有些区别

          lifecycle:
postStart:
exec:
command: ["/bin/sh","-c","curl -v -X PUT http://cloud-eureka-0.cloud-eureka.test.svc.cluster.local:8761/eureka/apps/HKD-CONFIG/cloud-config-0.cloud-config.test.svc.cluster.local:hkd-config:8888/status?value=UP;sleep 300"]
preStop:
exec:
command: ["/bin/sh","-c","curl -v -X PUT http://cloud-eureka-0.cloud-eureka.test.svc.cluster.local:8761/eureka/apps/HKD-CONFIG/cloud-config-0.cloud-config.test.svc.cluster.local:hkd-config:8888/status?value=DOWN;sleep 300"]

pod开始启动时,先执行postStart中的命令,此时,服务是先注册到eureka中,状态是up,但是服务还没有启动,需要等待300秒后才开始启动

pod删除时,先执行preStop中的命令,把服务从eureka中摘除,然后等待300面后删除pod,但是有个很严重的问题:把服务从eureka中摘除,若是有副本pod,这俩pod都会从eureka中摘除,但是只会删除一个pod,另一个pod虽在运行,但是没有注册到eureka中

参考文章:

这篇文章是使用纯命令的形式

https://www.cnblogs.com/sunsky303/p/11571545.html

这篇文章是使用命令执行脚本的形式

https://gitee.com/sunshanpeng/blog/blob/master/在k8s中使用eureka的几种姿势.md

使用k8s部署springcloud解决三大问题的更多相关文章

  1. Kubernetes(K8s)部署 SpringCloud 服务实战

    1. 概述 老话说的好:有可能性就不要放弃,要敢于尝试. 言归正传,之前我们聊了一下如何在 Kubernetes(K8s)中部署容器,今天我们来聊一下如何将 SpringCloud 的服务部署到 Ku ...

  2. k8s中部署springcloud

    安装和配置数据存储仓库MySQL 1.MySQL简介 2.MySQL特点 3.安装和配置MySQL 4.在MySQL数据库导入数据 5.对MySQL数据库进行授权 1.MySQL简介 MySQL 是一 ...

  3. Python服务Dokcer化并k8s部署实例

    这篇文章记录了我试验将一个基于python的服务docker化并k8s部署的过程. 服务介绍Docker化设计业务代码改造创建docker镜像K8S部署设计yaml文件运行服务介绍这是一个用 pyth ...

  4. Rancher+K8S部署手册

    目前创建K8S集群的安装程序最受欢迎的有Kops,Kubespray,kubeadm,rancher,以及个人提供的脚本集等. Kops和Kubespary在国外用的比较多,没有处理中国的网络问题,没 ...

  5. [转帖]k8s 部署问题解决

    k8s 部署问题解决 https://www.jianshu.com/p/f53650a85131 本文记录一下在部署 k8s 时遇到的一些问题及解决方法,具体部署流程可以参考 ubuntu 安装 k ...

  6. 拥抱云原生,如何将开源项目用k8s部署?

    微信搜索[阿丸笔记],关注Java/MySQL/中间件各系列原创实战笔记,干货满满. k8s以及云原生相关概念近年来一直比较火热,阿丸最近搞了个相关项目,小结一下. 本文将重点分享阿里开源项目otte ...

  7. 生产环境部署springcloud微服务启动慢的问题排查

    今天带来一个真实案例,虽然不是什么故障,但是希望对大家有所帮助. 一.问题现象: 生产环境部署springcloud应用,服务部署之后,有时候需要10几分钟才能启动成功,在开发测试环境则没有这个问题. ...

  8. K8s 部署 Dashboard UI 仪表板 ——让一切可视化

    K8s 部署 Dashboard UI  仪表板   --让一切可视化 Dashboard 介绍 仪表板是基于Web的Kubernetes用户界面.您可以使用仪表板将容器化应用程序部署到Kuberne ...

  9. 微服务从代码到k8s部署应有尽有系列(二、网关)

    我们用一个系列来讲解从需求到上线.从代码到k8s部署.从日志到监控等各个方面的微服务完整实践. 整个项目使用了go-zero开发的微服务,基本包含了go-zero以及相关go-zero作者开发的一些中 ...

随机推荐

  1. 编程技巧│超实用 nginx 中常见的配置合集

    目录 封禁 IP 仅开放内网 负载均衡 列出文件列表 路由转发 开启 gzip 压缩 解决跨域 资源防盗链 Keepalived 提高吞吐量 HTTP 强制跳转 HTTPS 封禁 IP 通过 deny ...

  2. 简单使用 MySQL 索引

    MySQL 索引 1 什么是索引 在数据库表中,对字段建立索引可以大大提高查询速度.通过善用这些索引,可以令 MySQL 的查询和 运行更加高效. 如果合理的设计且使用索引的 MySQL 是一辆兰博基 ...

  3. SQL语句的整合

    基础语法 https://blog.csdn.net/m0_37989980/article/details/103413942 CRUD 提供给数据库管理员的基本操作,CRUD(Create, Re ...

  4. java发送http请求get/post

    1,导入依赖 <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId> ...

  5. HashTable集合和练习题_计算一个字符串中每一个字符出现的次数

    HashTable集合 /** * java.util.Hashtable<K,V>集合 implement Map<K,V>接口 * Hashtable:底层也是一个哈希表, ...

  6. HashSet存储自定义数据类型和LinkedHashSet集合

    HashSet存储自定义数据类型 public class Test{ /** * HashSet存储自定义数据类型 * set集合保证元素唯一:存储的元素(String,Integer,Studen ...

  7. 基于python3.7利用Motor来异步读写Mongodb提高效率

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_111 如果使用Python做大型海量数据批量任务时,并且backend用mongodb做数据储存时,常常面临大量读写数据库的情况. ...

  8. 实践GoF的设计模式:迭代器模式

    摘要:迭代器模式主要用在访问对象集合的场景,能够向客户端隐藏集合的实现细节. 本文分享自华为云社区<[Go实现]实践GoF的23种设计模式:迭代器模式>,作者:元闰子. 简介 有时会遇到这 ...

  9. vue-cli 启动项目时空白页面

    vue-cli 启动项目时空白页面 在启动项目时 npm run serve / npm run dev 启动 vue 项目空白页:且终端及控制台都未报错 通过各种查阅发现在项目根目录中 vue-co ...

  10. 密码学系列之:PEM和PKCS7,PKCS8,PKCS12

    目录 简介 PEM PKCS7 PKCS8 PKCS12 总结 简介 PEM是一种常见的保存key或者证书的格式,PEM格式的文件一般来说后缀是以.pem结尾的.那么PEM到底是什么呢?它和常用的证书 ...