k8s部署应用模板(spring/vue/golang)项目示例 - Go语言中文社区

k8s部署应用模板(spring/vue/golang)项目示例


一、后端项目,jar包为例

1、配置文件

application.yml

#以实际项目的yml为准即可。

server:
  port: 8888
spring:
  application:
    name: test-jar 


#=================[Eureka]注册中心配置=======================#
eureka:
  client:
    fetch-registry: true
    register-with-eureka: true
    # 注册器中心地址
    service-url:
      defaultZone: http://192.168.1.9/eureka/eureka
      # 在服务端定义的地址
  instance:
    leaseRenewalIntervalInSeconds: 10
    # 在Eureka 中健康 点击的地址
    health-check-url-path: /actuator/health
    # 使用IP 注册 非Host
    prefer-ip-address: true
ignore:
  urls:
    - /test/ignore

创建configmap,命名为testjarconfig,在yaml文件中要用到。

kubectl create configmap -n testnamespace testjarconfig --from-file=application.yml

2、yaml(deployment/service/ingress),一个文件中将所有配置都写完。

vim testjar.yaml

直接替换testjar=项目名称,ingress路径使用的也是项目名称。namespace命名空间。

:%s/testjar/yourprojectname/g

configmap使用项目名称+config命名

nginx-rewrite规则还有其它的参考官方文档。

端口替换:8888

:%s/8888/yourport/g

命名空间提前创建好:

kubectl create namespace testnamespace

kind: Deployment
apiVersion: apps/v1
metadata:
  name: testjar
  namespace: testnamespace
spec:
  replicas: 1
  selector:
    matchLabels:
      app: testjar
  template:
    metadata:
      labels:
        app: testjar
    spec:
      containers:
      - name: testjar
        image: harbor.zlxk.com/public/testjar:2020.12.3.15.66
        resources: # 资源限制
          limits:
            cpu: 2000m
            memory: 1Gi
          requests:
            cpu: 200m
            memory: 512Mi		
        livenessProbe: # 存活探针
          failureThreshold: 2
          httpGet:
            path: /actuator/health
            port: 8888
            scheme: HTTP
          periodSeconds: 10
          successThreshold: 1
          timeoutSeconds: 2          
        readinessProbe: # 就绪探针
          failureThreshold: 2
          httpGet:
            path: /actuator/health
            port: 8888
            scheme: HTTP
          periodSeconds: 10
          successThreshold: 1
          timeoutSeconds: 2 
        startupProbe:       # 启动探针      
          httpGet:
            path: /actuator/health #URL
            port: 8888 #端口
            scheme: HTTP #协议
          initialDelaySeconds: 60 #延时60秒才开始检测
          periodSeconds: 10 #检测频率
          successThreshold: 1 #成功次数限制
          failureThreshold: 15    #启动失败计次*检测频率10秒=最大失败时长150秒			
          timeoutSeconds: 1 #超时时间限制
        volumeMounts:
        - name: testjarconfig
          mountPath: /config #挂载路径,会将www.conf放到该路径下。
          readOnly: true  #是否允许pod去修改
      volumes:
      - name: appconfig
        configMap:  #挂载configmap,使用name定位。
          name: testjarconfig
---
apiVersion: v1
kind: Service
metadata:
  name: testjar
  namespace: testnamespace
spec:
  selector:
    app: testjar
  ports:
  - protocol: TCP
    port: 8888
    targetPort: 8888
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: testjar
  namespace: testnamespace
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /$2
    nginx.ingress.kubernetes.io/proxy-body-size: 100M #413时使用
spec:
  rules:
  - http:
      paths:
      - path: /testjar(/|$)(.*)
        pathType: Prefix
        backend:
          service:
            name: testjar
            port:
              number: 8888

创建:

kubectl apply -f  testjar.yaml

3、多eureka相互注册例:StatefulSet。yml中的配置注意。

application.yml

server:
  port: 8761
eureka:
  instance:
    hostname: ${EUREKA_HOST_NAME:peer1} #服务主机
    appname: ${spring.application.name} #服务名,默认为 unknow,取spring.application.name
  client:
    register-with-eureka: ${BOOL_REGISTER:true} # 把服务中心当client 注册,默认true
    fetch-registry: ${BOOL_FETCH:true} # 拉取 eureka server注册信息,默认true
    service-url:
      defaultZone: ${EUREKA_URL_LIST:http://peer1:8761/eureka/} # eureka server的地址
  server:
    enable-self-preservation: ${SELF_PRESERVATION:false} # 开启自我保护,为 true.

spring:
  application:
    name: ${EUREKA_APPLICATION_NAME:eureka-server}

eureka3.yaml

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: eureka
spec:
  selector:
    matchLabels:
      app: eureka
  serviceName: "eureka-service-internal"
  replicas: 3
  template:
    metadata:
      labels:
        app: eureka
    spec:
      terminationGracePeriodSeconds: 10
      containers:
      - env:
        - name: MY_NODE_NAME
          valueFrom:
            fieldRef:
              fieldPath: spec.nodeName
        - name: MY_POD_NAME
          valueFrom:
            fieldRef:
              fieldPath: metadata.name
        - name: MY_POD_NAMESPACE # 传入当前命名空间
          valueFrom:
            fieldRef:
              fieldPath: metadata.namespace
        - name: MY_POD_IP
          valueFrom:
            fieldRef:
              fieldPath: status.podIP
        - name: MY_IN_SERVICE_NAME # 因为pod 通过域名互相访问,需要使用headless 服务名称
          value: eureka-service-internal
        - name: EUREKA_APPLICATION_NAME
          value: "eureka"
        - name: EUREKA_REPLICAS
          value: "3"
        image:  harbor.zlxk.com/public/eureka:3node # 这个镜像是修改后的
        imagePullPolicy: IfNotPresent
        name: eureka-container
        ports:
        - containerPort: 8761
          protocol: TCP
---
apiVersion: v1
kind: Service
metadata:
  name: eureka-service-internal
  labels:
    app: eureka-service-internal
  namespace: default    
spec:
  clusterIP: None
  ports:
  - port: 8761
    protocol: TCP
    targetPort: 8761
  selector:
    app: eureka
  type: ClusterIP

---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: eureka
  namespace: default
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /$2
spec:
  rules:
  - http:
      paths:
      - path: /eureka(/|$)(.*)
        pathType: Prefix
        backend:
          service:
            name: eureka-service-internal
            port:
              number: 8761

eureka3.yaml中的修改过的镜像构建:先准备eureka.jar包和init.sh脚本。基于openjdk:8,其它不同的底包可能有不同的方式,请自行研究。

Dockerfile

FROM harbor.zlxk.com/public/openjdk:8
LABEL maintainer  hxq/zlxk.com
ADD init.sh /init.sh
ADD eureka.jar /eureka.jar
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN echo 'Asia/Shanghai' >/etc/timezone
EXPOSE 8761
RUN rm /bin/sh && ln -s /bin/bash /bin/sh
ENTRYPOINT ["/bin/bash","-c","source /init.sh"]

init.sh

参考网上资料。

#!/usr/bin/env bash
postFix="svc.cluster.local"
EUREKA_HOST_NAME="$MY_POD_NAME.$MY_IN_SERVICE_NAME.$MY_POD_NAMESPACE.$postFix"
export EUREKA_HOST_NAME=$EUREKA_HOST_NAME
BOOL_REGISTER="true"
BOOL_FETCH="true"
#根据参数选择erueka副本数量运行不同的配置
if [ $EUREKA_REPLICAS = 1 ]; then
    echo "the replicas of eureka pod is one"
    BOOL_REGISTER="false"
    BOOL_FETCH="false"
    EUREKA_URL_LIST="http://$EUREKA_HOST_NAME:8761/eureka/,"
    echo " set the EUREKA_URL_LIST is $EUREKA_URL_LIST"
else
    echo "the replicas of the eureka pod is $EUREKA_REPLICAS" > /log.txt
    BOOL_REGISTER="true"
    BOOL_FETCH="true"
    for ((i=0 ;i<$EUREKA_REPLICAS; i ++))
    do
        temp="http://$EUREKA_APPLICATION_NAME-$i.$MY_IN_SERVICE_NAME.$MY_POD_NAMESPACE.$postFix:8761/eureka/,"
        EUREKA_URL_LIST="$EUREKA_URL_LIST$temp"
        echo $EUREKA_URL_LIST >> /log.txt
    done
fi
# 每个 pod 的 EUREKA_URL_LIST 都设置成了全部的 pod 内部域名,自行选择是否向自己注册。
#如 eureka-0 的 EUREKA_URL_LIST 可以不加 http://eureka-0.eureka-service-internal.default.svc.cluster.local:8761/eureka/
EUREKA_URL_LIST=${EUREKA_URL_LIST%?}
export EUREKA_URL_LIST=$EUREKA_URL_LIST
export BOOL_FETCH=$BOOL_FETCH
export BOOL_REGISTER=$BOOL_REGISTER
echo "start jar...." >>/log.txt
java -jar /eureka.jar

二,前端项目,nginx包

yaml(deployment/service/ingress)

不需要配置文件,直接使用nginx底包打包即可。

kind: Deployment
apiVersion: apps/v1
metadata:
  name: web-test
  namespace: testnamespace
spec:
  replicas: 1
  selector:
    matchLabels:
      app: web-test
  template:
    metadata:
      labels:
        app: web-test
    spec:
      containers:
      - name: web-test
        image: harbor.zlxk.com/public/testweb:2020.10.13.17
---
apiVersion: v1
kind: Service
metadata:
  name: web-test
  namespace: testnamespace
spec:
  selector:
    app: web-test
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: web-test
  namespace: testnamespace
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /$2
spec:
  rules:
  - http:
      paths:
      - path: /web-test(/|$)(.*)
        pathType: Prefix
        backend:
          service:
            name: web-test
            port:
              number: 80

三、centos调用docker build -t 构建前后端包脚本并推送本地仓

1、后端包

提前准备:

a、jar包

b、项目端口

c、本地仓地址及提前登陆

Dockerfile

底包自选:java,JDK

FROM harbor.zlxk.com/public/openjdk:8-jdk-alpine
LABEL maintainer  hxq/zlxk.com
ADD *.jar /app.jar
ARG port
EXPOSE $port
ENTRYPOINT [ "sh", "-c", "java -Duser.timezone=GMT+08 -Dfile.encoding=utf-8  -jar /app.jar" ]
RUN if [ "x$port" = "x" ] ; then echo Argument not provided ; else echo Argument is $arg ; fi

buildjarimg.sh

传入:$1=打包后的镜像名称,$2=暴露端口。脚本功能涉及到创建configmap等,适用于第一次部署或删除配置重新部署。

#!/bin/bash
dir=$(cd $(dirname $0);pwd)       #获取当前路径
echo call format:imagename port
imagename=$1                      #打成的images名称,传入参数决定Image名称
port=$2 #port                     #暴露端口
harbor='harbor.zlxk.com/public'   #本地仓项目地址路径
tag=`date +%-Y`.`date +%-m`.`date +%-d`.`date +%-H`.`date +%-M` #TAG用时间到分钟
if [ "x$imagename" = "x" ] ; then echo imagename must set! ; exit 1; else echo ----imagename is:  $imagename ; fi
if [ "x$port" = "x" ] ; then echo port must set! ;exit 1; else echo ----imagename is:  $imagename ; fi
#判断传入参数是否完整
docker build -t $harbor/$imagename:$tag . --build-arg port=$port
#使用指定r:rag创建镜像
docker push $harbor/$imagename:$tag
#抢着到私仓
echo $tag
#输出TAG用于dashboard上使用
docker rmi $harbor/$imagename:$tag
#删除本机镜像

2、前端包,提前准备好前端项目dist目录和文件。

Dockerfile

FROM harbor.zlxk.com/public/nginx
MAINTAINER "hxq"
LABEL description="web"
COPY dist/ /usr/share/nginx/html/
#将dist下的文件复制到nginx/html/下
EXPOSE 80

buildwebimg.sh

调用时传入 imagename即可。

#!/bin/bash
dir=$(cd $(dirname $0);pwd)                 #获取当前路径
echo call format:imagename,default port 80  #暴露80端口
imagename=$1                                #打成的images名称,传入参数决定Image名称
port=80 #port
harbor='harbor.zlxk.com/public'
tag=`date +%-Y`.`date +%-m`.`date +%-d`.`date +%-H`

if [ "x$imagename" = "x" ] ; then echo imagename must set! ; exit 1; else echo ----imagename is:  $imagename ; fi
if [ "x$port" = "x" ] ; then echo port must set! ;exit 1; else echo ----imagename is:  $imagename ; fi
#判断参数
docker build -t $harbor/$imagename:$tag . --build-arg port=$port
docker push $harbor/$imagename:$tag
echo $harbor/$imagename >tag.txt
echo $harbor/$imagename:$tag
docker rmi $harbor/$imagename:$tag

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/huhaiand/article/details/110733534
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2022-12-31 20:49:44
  • 阅读 ( 356 )
  • 分类:Go应用

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢