K8S 部署应用
一、部署流程
应该将每个微服务打包制作成镜像,然后将镜像上传到镜像仓库,可以上传到dockerhub或者私有仓库。由于微服务众多,为了自动化部署,采用CI/CD,流水线自动的拉取镜像。
步骤:
1、为每一个项目准备一个 Dockerfile;Docker 按照这个Dockerfile将项目制作成镜像。
2、为每一个项目生成K8S的描述
3、Jenkins 编写好 Jenkinsfile
二、项目修改
新建生产环境的配置文件 application-prod.yml
将访问连接IP改为域名,这里的域名是在K8S里边做了配置的,内部可以访问的。
spring:
# 配置nacos注册中心
cloud:
nacos:
discovery:
server-addr: nacos-service.gulimall:8848
# sentinel控制台地址配置
sentinel:
transport:
port: 8719
dashboard: sentinel-service.gulimall:8333
application:
name: gulimall-auth-server
#zipkin配置
zipkin:
base-url: http://zipkin-service.gulimall:9411/ # zipkin服务器地址
# 关闭服务发现,否则spring cloud会把zipkin的url当做服务名称
discoveryClientEnabled: false
sender:
type: web #设置使用http的方式传输数据,也可以使用RabbitMQ,Kafka
sleuth:
sampler:
probability: 1 # 设置抽样采集率为100%,默认为0.1,即10%
thymeleaf:
cache: false # 测试期间关掉缓存
redis:
host: redis.gulimall
prot: 6379
session:
store-type: redis # Session store type,SpringSession整合
server:
port: 20000
servlet:
session:
timeout: 30m # Session timeout,SpringSession整合
#--------------Feign负载均衡配置 配置全局超时时间 毫秒单位 根据业务酌情配置
feign:
client:
config:
default:
connectTimeout: 50000
readTimeout: 50000
loggerLevel: basic
三、打包
可以参考 renren-fast 微服务的 Dockerfile
文件:
FROM java:8 # 表示微服务依赖的基础镜像是java8
EXPOSE 8080 # jar包启动暴露的是8080端口,也可以对外暴露端口
VOLUME /tmp # 挂载的目录
ADD renren-fast.jar /app.jar # ADD 命令如同Linux下的cp命令, 复制打包好的jar包到镜像的根目录下,起名为app.jar
RUN bash -c 'touch /app.jar' # 相当于创建一个app.jar,如果已经创建,则会修改创建时间
ENTRYPOINT ["java","-jar","/app.jar"] # 容器启动默认运行的命令
在IDEA打包人人微服务:
mvn clean package -Dmaven.test.skip=true
打包出现这样的问题:
打包报错,renren-fast 依赖 gulimall-common
公共组件,gulimall-common
是一个基础包,在打包的时候,所依赖的包必须是本地仓库或者是远程仓库,而 gulimall-common
是代码。
在项目根目录下,将我们所需要的微服务全部聚合在一起:
mvn install -Dmaven.test.skip=true
在大项目根目录下运行上述的命令,就可以将每个微服务装在本地仓库
然后再使用如下命令进行打包:
mvn clean package -Dmaven.test.skip=true
可以看到打包后的jar包了。
四、镜像
将打包后的jar包和Dockerfile文件上传到服务器,然后进行打包为镜像。
> docker build -f Dockerfile -t docker.io/leifengyang/admin:v1.0 .
后边的 .
表示 Dockerfile同目录下的资源打包成镜像资源
可以查看本地镜像 docker images
:
然后可以尝试启动该镜像:
docker run -d --name hello-admin -p 8080:8080 leifengyang/admin:v1.0
然后给每个微服务根目录下创建一个通用的 Dockerfile 文件
FROM java:8
EXPOSE 8080
VOLUME /tmp
ADD target/*.jar /app.jar
RUN bash -c 'touch /app.jar'
ENTRYPOINT ["java","-jar","/app.jar","--spring.profiles.active=prod"]
说明:target/*.jar
表示target目录下只有一个.jar
文件,所以,这里使用通配符; --spring.profiles.active=prod
表示激活 prod 文件,
五、创建描述文件
创建微服务k8s部署描述文件
deploy/gulimall-auth-server-deploy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: gulimall-auth-server
namespace: gulimall
labels:
app: gulimall-auth-server
spec:
progressDeadlineSeconds: 600
replicas: 1
selector:
matchLabels:
app: gulimall-auth-server
component: ks-sample
tier: backend
strategy:
rollingUpdate:
maxSurge: 100%
maxUnavailable: 100%
type: RollingUpdate
template:
metadata:
labels:
app: gulimall-auth-server
spec:
containers:
- env:
- name: CACHE_IGNORE
value: js|html
- name: CACHE_PUBLIC_EXPIRATION
value: 3d
image: $REGISTRY/$DOCKERHUB_NAMESPACE/$APP_NAME:$TAG_NAME
readinessProbe:
httpGet:
path: /
port: 8080
timeoutSeconds: 10
failureThreshold: 30
periodSeconds: 5
imagePullPolicy: Always
name: ks
ports:
- containerPort: 8080
protocol: TCP
resources:
limits:
cpu: 1000m
memory: 600Mi
requests:
cpu: 100m
memory: 100Mi
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
dnsPolicy: ClusterFirst
restartPolicy: Always
terminationGracePeriodSeconds: 30
六、理解各种port
为者常成,行者常至
自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)