K8s部署应用实战

  1. 服务Docker镜像制作

  1. 将编译好的输出包解压到服务端的特定目录
  2. 在步骤一的同级目录上创建一个Dockerfile文件,如:

FROM 172.16.18.111:5000/comba/java8:v1

MAINTAINER sujinxian

ADD ciap-1.0-SNAPSHOT /opt/ciap/

#EXPOSE 8090

CMD /opt/ciap/bin/start.sh

 

其中172.16.18.111:5000/comba/java8:v1为私有仓库中已经存在的私有镜像。

 

  1. 执行docker命令生成镜像,如:

docker build -t comba/ciap:v1 .

  1. Docker镜像提交到私有仓库

  1. 由于docker默认是将镜像提交到Docker Hub的,如果要将镜像提交到私有仓库,则需要修改镜像的标签。示例:

docker tag comba/ciap:v1 172.16.18.111:5000/comba/ciap:v1

  1. 执行docker命令,将镜像提交到私有仓库中。示例:

docker push 172.16.18.111:5000/comba/ciap:v1

  1. K8S部署

  1. 在k8s的Master结点上创建部署脚本,示例:

[root@k8s-node01 sample]# cat ciap.yaml

  1. 执行k8s命令创建pod,示例:

kubectl create -f ciap.yaml

 

  1. 验证pod

  1. 登录k8s的dashboard,查看 pod的状态是否为正在运行.

/172.16.18.191:30000/#!/login

其中登录的token为

eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJhZG1pbi11c2VyLXRva2VuLXM1emI5Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQubmFtZSI6ImFkbWluLXVzZXIiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC51aWQiOiI0NDgxZmIxYS02YTAzLTExZTgtOGQxNS01Y2YzZmNhNTNkMWMiLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6a3ViZS1zeXN0ZW06YWRtaW4tdXNlciJ9.otB4n2RCFsmgU1_u_MbJWCpp89QkdGSkk3X_NUrRflO92MFfDLmJu87d5yUScrJ3-vNRS_Cumv316rj3F3ySwzaYA8oI-yblAFLb5CLfapk-9GHFf6VVjXiBB2QNlxBQAF_IRmPcHoHqOTO1NOvLQIWVX3bfZaOrl6jrUgGc3tFaByY3s7-Fp6rpvENXmJ8xIHKhfuU7s8TPFjp2gOeZw4259Ad2uvKliQ2E8CZICzhpqgtIyOaDaHUnjWK0GsWnAbWS-Yo-ZCDeqX5l61sOeCdIPU_F-A0q9AEGINRClvMpcwJkd3uH3s5N3W7KoA1M1YMPogruuCmT0NaZ0_fXJg

可以用以下的命令来获取到:

kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep admin-user | awk ‘{print $1}’)

 

查看工作负载

  1. 登录pod查看运行日志

点击ciap-vjxgj在点击如下图中的”运行命令”,按钮.即可进入到容器中.进入容器后,到程序相应的目录即可查看相关的日志。

Docker 常用命令和dockerfile 编写

#docker 启动停止

/bin/systemctl restart docker.service

/bin/systemctl stop docker.service

/bin/systemctl start docker.service

 

#docker创建一个容器

docker run -it -v /docker_test:/yufei –name yufei_6 centos

-i:允许我们对容器内的 (STDIN) 进行交互

-t:在新容器内指定一个伪终端或终端

-v:是挂在宿机目录, /docker_test是宿机目录,/yufei是当前docker容器的目录,宿机目录必须是绝对的。

–name:是给容器起一个名字,可省略,省略的话docker会随机产生一个名字

 

#docker启动的容器列表

docker ps

 

#查看docker创建的所有容器

docker ps -a

 

#查看指定容器的日志记录

docker logs -f yufei_01

 

#删除某个容器,若正在运行,需要先停止

docker stop yufei_01

docker rm yufei_01

 

#进入容器

docker exec -it mysql bash

 

#docker file编写

 

FROM 172.16.18.111:5000/comba/java8:v1

VOLUME /tmp

RUN mkdir /app

ADD dmp-assembly /app/dmp

 

RUN cd /app/dmp

RUN bash -c ‘chmod +x bin/*’

WORKDIR /app

 

EXPOSE 8080

CMD /app/dmp/bin/start.sh

 

RUN echo “Asia/Shanghai” > /etc/timezone;

 

 

 

 

spring cloud config 分布式配置中心实现动态更新

spring cloud config

简介

spring cloud config 是Spring cloud框架中的分布式配置中心,它支持配置文件放在在配置服务的内存中,也支持放在远程Git仓库里。引入spring cloud config后,各微服务外部配置文件就可以集中放置在一个git仓库里,所有的服务实例都可以通过config server来获取配置文件。

 

 

Config 服务端

Pom.xml 文件引入 config

<dependency>
<groupId>
org.springframework.cloud</groupId>
<artifactId>
spring-cloud-config-server</artifactId>
</dependency>

 

使用@EnableConfigServer 注解声明一个配置中心服务端

 

并在配置文件中配置git的路径

searchPaths 表示是仓库下面的文件相对搜索路径,可以配置多个,这里配置的是微服务名称

如果是私有库,则需要把账号密码配置加上。

新建名为config-repo的仓库,并在添加dmp文件夹和添加一个dmp-dev.yml文件。

内容如下:server.port=8002

 

这时直接访问219-374-9958,可以看到返回的值

这里的url的意思是,dmp表示服务实例名,dev表示profile,由于默认为master分支,我这里没写,如果是其他分支的则在后面加上分支名称。

 

Config 客户端

添加配置文件bootstrap.yml,设置配置中心,这里是配置服务server-id,也支持配置url

测试的话,新建一个controller 获取一下配置的value就可以了。

 

动态刷新配置

如果是在生产环境,往往是需要修改配置文件的,而这时由于程序不能随意重启,这就需要动态刷新配置。

Spring cloud config 可以利用spring cloud bus(消息总线)来实现这目的。Spring cloud bus 常用的方式有Rabbit MQ,kafka。这里是用kafka作为例子(一把辛酸一把泪)。而String cloud bus 的实现就是Sring cloud stream,具体可以参考另一篇文章

 

服务端和客户端设置

Pom.xml 文件引入

<dependency>
<groupId>
org.springframework.cloud</groupId>
<artifactId>
spring-cloud-starter-bus-kafka</artifactId>
</dependency>

 

配置kafka broker和zookeeper地址

 

另外客户端需要添加actuator依赖,但我现在用的是Edgware版本,不需要添加这个依赖。

并且在引入配置值的地方加上@RefreshScope注解。

 

修改仓库yml的配置文件,然后调用服务端 ninety-one,方式是post。

然后调用客户端查看,这时发现已更新为最新值。

575-347-1411

1,后台传到前台的json字符串还需要在前台再json化一遍

 

2,hibernate使用sql返回值绑定对象需要用到 AliasToBeanResultTransformer

 

2,分布式问题

java.lang.IllegalStateException: It is illegal to call this method if the current request is not in asynchronous mode (i.e. isAsyncStarted() returns false)

Json解析

 

3,tomcat进程无法关闭的问题

基本原理为启动tomcat时记录启动tomcat的进程id(pid),关闭时强制杀死该进程

第一步 :vim修改tomcat下bin/catalina.sh文件,添加点东西,主要是记录tomcat的pid,如下:

在PRGDIR=`dirname “$PRG”`后面加上:

if [ -z “$CATALINA_PID” ]; then

CATALINA_PID=$PRGDIR/CATALINA_PID

fi

 

第二步 vim tomcat的shutdown.sh文件,在最后一行加上-force:

bin/shutdown.sh exec “$PRGDIR”/”$EXECUTABLE” stop -force “$@” #加上 -force

 

2018 7-12

微服务声明式调用feign,不同服务器间调用失败,报超时错误

原因是: 多网卡导致的无法找到对应的ip,

eureka:
instance:
prefer-ip-address: true
ip-address:
10.10.107.221

        

2018 7-23

spring cloud:

微服务上传文件,中文名称乱码

解决方案:在请求的url添加/zuul

后面将前端程序服务器上,忘了nginx设置 /zuul导致404

 

 

7-26

大坑:前端登录一直失败,网关返回服务无返回,但查询服务是正常返回了对象

问题:对象的手机号码应该是string,但网关的是int,导致了报错,但网关没有把错误具体描述出来

 

8-1

大坑:启动程序一直报 A list of partitions must be provided

本来以为是程序配置问题一直在找,国内百度不靠谱,基本没说出问题本质。

结果发现是11服务器的zk,kafka挂了导致的。

 

8-2

1,Spring stream 接收和消费kafka消息出现乱码,

监听者问题:Could not convert message: 313131

消费者问题:payload出现乱码

 

原因需要添加headerMode: raw

 

 

持续更新中

 

 

 

 

 

 

 

517-220-4599

Spring stream

简介

Spring Cloud Stream是创建消息驱动微服务应用的框架。Spring Cloud Stream是基于spring boot创建,用来建立单独的/工业级spring应用,使用spring integration提供与消息代理之间的连接。支持Rabbit mq 和kafka。

 

概念

应用模型

应用通过input和output通道与MQ软件进行通讯。这里的通道概念跟第三方的软件无关,是Stream自身的实现模型,这个可能会让初学者有点混淆。

Spring 为通道提供了默认的实现,预定义了Sink(input)、Source(output)、Processor则是同时继承了Sink, Source。

使用(以kafka为例)

在pom.xml文件引入依赖

<dependency>
<groupId>
org.springframework.cloud</groupId>
<artifactId>
spring-cloud-starter-bus-kafka</artifactId>
</dependency>

 

Application.yml 文件添加配置,指定broker和zookeeper。高版本的则指定broker即可。

stream:
#指定用kafka stream来作为默认消息中间件
default-binder: kafka
kafka:
#来自KafkaBinderConfigurationProperties
binder:
brokers:
127.0.0.1:9092,172.16.18.112:9092
zkNodes: 127.0.0.1:2181,172.16.18.112:2181

 

消费者定义

1,@EnableBinding 注解至spring应用的一个配置类中,即可将spring应用变成Spring Cloud Stream应用。@EnableBinding注解本身就包含@Configuration注解,并且会触发Spring Cloud Stream基本配置

2,@StreamListener 指定了Stream中的通道名,这里使用的是默认的input,也可以自定义一个input。对应的也需要在配置文件中配置input对应的topic名称alarm_input。

 

bindings:
input:
destination:
alarm_input
content-type: text/plain

 

生产者定义

也可以直接注入通道

 

同样的,对应的也需要在配置文件中配置output对应的topic名称alarm_out。

output:
destination:
alarm_out
content-type: text/plain

 

 

踩坑实录

  1. 消费者问题:Could not convert message: 313131。

    这个问题github上面给出了答案,需要添加

consumer:
header-mode:
raw

 

  1. 生产者问题:发送消息后,消费者受到的消息乱码:

原因:生产者也需要添加

    producer:
headerMode:
raw #这个不设置会导致乱码

 

 

问题持续记录中