K8S 部署应用

一、部署流程

file

应该将每个微服务打包制作成镜像,然后将镜像上传到镜像仓库,可以上传到dockerhub或者私有仓库。由于微服务众多,为了自动化部署,采用CI/CD,流水线自动的拉取镜像。
步骤:
1、为每一个项目准备一个 Dockerfile;Docker 按照这个Dockerfile将项目制作成镜像。
2、为每一个项目生成K8S的描述
3、Jenkins 编写好 Jenkinsfile

二、项目修改

file

新建生产环境的配置文件 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

打包出现这样的问题:
file

打包报错,renren-fast 依赖 gulimall-common 公共组件,gulimall-common 是一个基础包,在打包的时候,所依赖的包必须是本地仓库或者是远程仓库,而 gulimall-common 是代码。

在项目根目录下,将我们所需要的微服务全部聚合在一起:
file

mvn install -Dmaven.test.skip=true

在大项目根目录下运行上述的命令,就可以将每个微服务装在本地仓库
file

file

然后再使用如下命令进行打包:

mvn clean package -Dmaven.test.skip=true

可以看到打包后的jar包了。

四、镜像

将打包后的jar包和Dockerfile文件上传到服务器,然后进行打包为镜像。

> docker build -f Dockerfile -t docker.io/leifengyang/admin:v1.0 .

后边的 . 表示 Dockerfile同目录下的资源打包成镜像资源

file

可以查看本地镜像 docker images
file

然后可以尝试启动该镜像:

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

file

为者常成,行者常至