Kubernetes实战总结 - DevOps实现
一、概述
Git:一个开源的分布式版本控制系统,可以有效、高速地处理从很小到非常大的项目版本管理。
Jenkins:一个开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作。
Maven:项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告和文档的项目管理工具软件。
Harbor:构建企业级私有Docker镜像的仓库的开源解决方案。
Kubernetes:一个开源的,用于管理云平台中多个主机上的容器化的应用。
二、Java镜像构建
启动脚本run.sh:
- #!/bin/sh
- java ${JVM_OPTS} ${JAVA_OPTS} -jar *.jar ${CLI_OPTS} 2>&1 | tee -a ${OUTPUT}
构建脚本Dockerfile:
- # 基础镜像
- FROM hub.jhmy.com/base/centos
- # 维护者
- MAINTAINER leozhang
- # 切换目录
- WORKDIR /root
- # 添加环境变量
- ENV JDK_VERSION=jdk1.8.0_191
- ENV JAVA_HOME=/usr/local/$JDK_VERSION
- ENV PATH=$PATH:$JAVA_HOME/bin:$JAVA_HOME/lib/
- ENV JAVA_OPTS='' CLI_OPTS='' OUTPUT='logs/output.log'
- ENV JVM_OPTS='-XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap -XX:MaxRAMFraction=2'
- # 设置时区语言
- ENV TZ='Asia/Shanghai'
- ENV LANG='C.UTF-8' LANGUAGE='C.UTF-8' LC_ALL='C.UTF-8'
- # 添加程序包
- ADD $JDK_VERSION.tar.gz /usr/local/
- COPY run.sh .
- # 执行命令
- RUN chmod a+x run.sh && rm -rf `ls | grep -v "^run.sh$"` && mkdir -p /root/logs
- # 构建镜像示例
- # docker build -t hub.jhmy.com/base/java:1.8 .
- # 启动容器示例
- # docker run -dit --name=java hub.jhmy.com/base/java:1.8
环境变量说明:
- JDK_VERSION:用于指定jdk包版本(需要提前下载好jdk软件包,且保证解压后名称一致)
- JVM_OPTS:用于指定jvm运行参数
- JAVA_OPTS:用于指定java自定义参数
- CLI_OPTS:用于指定其他命令行参数
- OUTPUT:用于指定服务运行日志保存路径
- 注意:
-XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap -XX:MaxRAMFraction=2
用于jvm自动识别容器内存限制以及自动分配内存大小(jdk10版本之后则不需要设置)更多详情>>>容器中的JVM资源该如何被安全的限制?
三、Java项目镜像构建
增加项目依赖脚本addPlugins.py:
- # -*- coding:utf-8 -*-
- # ****************************
- # Author :leozhang
- # Date :2020/7/16
- # File :addPlugins.py
- # Description :增加POM文件依赖
- # ****************************
- import os
- pomplug=os.environ["PLUGINS"]
- newpom = ""
- with open("pom.xml", "r+") as fp:
- for line in fp.readlines():
- if(line.find("<build>") != -1):
- line += "\n" + pomplug + "\n"
- newpom += line
- with open("pom.xml", "r+") as f:
- f.write(newpom)print(newpom)
构建脚本Dockerfile:
- # 基础镜像
- FROM hub.jhmy.com/base/java:1.8
- # 维护者
- MAINTAINER leozhang
- # 工作目录
- WORKDIR /root
- # 复制文件到镜像
- COPY *.jar .
- COPY lib/ lib/
- # 查看当前目录
- RUN ls -l .
- # 容器启动时运行命令
- CMD ["./run.sh"]
- # 构建镜像示例
- # docker build -t hub.jhmy.com/test/appservice .
- # 启动容器示例
- # docker run -dit --name=appservice hub.jhmy.com/test/appservice
镜像构建脚本buildImage.sh:
- #!/bin/sh
- # creator: leozhang
- # up-date: 2020/03/21
- # description: buildImage.sh
- # 公共参数
- env=$1
- name=$2
- tag=$3
- file=$4
- # 设置仓库地址和账户
- harbor=hub.jhmy.com
- username=jenkins
- password=$(echo Q2hpc2NkY0AxMjMK | base64 -d)
- # 修改镜像名称为小写
- image=${harbor}/${env}/$(echo ${name} | tr '[A-Z]' '[a-z]')
- # 默认名Dockerfile
- if [ ! "${file}" ] ;then
- file=Dockerfile
- fi
- # 构建镜像
- echo "************* build image ***************"
- docker build -t ${image}:${tag} -f ${file} .
- echo "************* push image ***************"
# 登录仓库- docker login -u ${username} -p ${password} https://${harbor}
- # 上传镜像
docker push ${image}:${tag}- # 如果非latest标签,则更新latest标签镜像
- if [ "${tag}" != "latest" ]; then
- docker tag ${image}:${tag} ${image}:latest
- docker push ${image}:latest
- fi
# 登出仓库- docker logout https://${harbor}
四、Java项目容器化部署
Deployment文件:
- apiVersion: apps/v1 # 资源版本
- kind: Deployment #资源类型
- metadata: #资源元数据:名称、命名空间等
- name: appservice
- namespace: default
- spec:
- replicas: 3 #副本数
- selector: #选择器
- matchLabels:
- app: appservice
- template: #Pod模板
- metadata: #Pod元数据:标签、注解等
- labels:
- app: appservice
- annotations:
- version: ""
- spec: #Pod配置:名称、镜像、拉取策略、端口等
- containers:
- - name: appservice
- image: hub.jhmy.com/test/appservice:latest
- imagePullPolicy: Always
- env: #环境变量
- - name: JAVA_OPTS
- value: "-Dprops=/root/appservice.properties -Dlogpath=/root/logs"
- ports:
- - name: dubbo
- containerPort: 20114
- resources: #资源限制:cpu、mem
- limits:
- memory: 2Gi
- cpu: 1
- livenessProbe: #就绪检测&生存检测:初始时间、超时、检测方式等
- initialDelaySeconds: 60
- timeoutSeconds: 10
- tcpSocket:
- port: 20114
- readinessProbe:
- initialDelaySeconds: 20
- timeoutSeconds: 10
- tcpSocket:
- port: 20114
- volumeMounts: #存储挂载
- - name: config
- mountPath: /root/appservice.properties
- subPath: appservice.properties
- - name: log
- mountPath: /root/logs
- volumes: #存储声明:服务配置、持久化存储请求、本地存储
- - name: config
- configMap:
- name: appservice
- - name: log
- hostPath:
- path: /home/ymt/logs/appservice
- type: DirectoryOrCreate
- #affinity: #节点亲和性
- # nodeAffinity:
- # requiredDuringSchedulingIgnoredDuringExecution:
- # nodeSelectorTerms:
- # - matchExpressions:
- # - key: app
- # operator: In
- # values:
- # - appservice
ConfigMap文件:
- apiVersion: v1
- kind: ConfigMap
- metadata:
- name: appservice
- namespace: default
- data:
- appservice.properties: |-
- server.port=20114
......
......
......
Service文件:
- apiVersion: v1
- kind: Service
- metadata:
- name: apprestserver
- namespace: default
- spec:
- selector:
- app: apprestserver
- ports:
- - name: rest
- port: 20114
五、Jenkins持续部署
Pipeline任务脚本:
- def NOW = new Date().format("yyyyMMddHHmmss")
- def SERVER = env.JOB_BASE_NAME.toLowerCase()
- pipeline {
- agent any
- // parameters {
- // string(name: 'TAG', defaultValue: 'latest', description: '镜像标签' )
- // string(name: 'BRANCH', defaultValue: 'test_0629', description: '分支名称' )
- // string(name: 'URL', defaultValue: 'http://10.88.88.226:8090/jhmy/source/wx_v1/appdataservicetemp.git', description: '项目地址' )
- // string(name: 'PLUGINS', defaultValue: '<plugins> <plugin> ...... </plugin> </plugins> ', description: '相关依赖' )
- //
- environment {
- ENV="test"
- MVN="/application/mvnBranch/bin/mvn"
- SCRIPT="${JENKINS_HOME}/workspace/Docker/updateConfigs/script"
- }
- stages {
- stage('Git Clone') {
- steps {
- git branch: '${BRANCH}', credentialsId: 'yf3b_gitlab', url: '${URL}'
- }
- }
- stage('Clean Package') {
- steps {
- sh "python ${SCRIPT}/addPlugins.py"
- sh "${MVN} clean package -Dmaven.test.skip=true"
- }
- post { success { archiveArtifacts "target/*.jar" } }
- }
- stage('Build Image') {
- steps {
- dir('target') {
- sh "cp ${SCRIPT}/Dockerfile-jar Dockerfile"
- sh "sh ${SCRIPT}/buildImage.sh ${ENV} ${SERVER} ${TAG}"
- }
- }
- }
- stage('Rolling Update') {
- steps {
- sh "kubectl config use-context k8s-ymt"
- sh """kubectl patch deployment ${SERVER} --patch '{"spec":{"template":{"metadata":{"annotations":{"version":"${NOW}"}}}}}'"""
- sh "sleep 30 && kubectl get pod -o wide | grep ${SERVER}"
- }
- }
- stage('Clean up') {
- steps { deleteDir() }
- }
- }
- }
作者:Leozhanggg
出处:https://www.cnblogs.com/leozhanggg/p/12069994.html
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
Kubernetes实战总结 - DevOps实现的更多相关文章
- Kubernetes实战 - 从零开始搭建微服务 - 1.5 提高可用性-发布多节点的Node/Express网络应用程序
1.5 提高可用性-发布多节点的Node/Express网络应用程序 Kubernetes实战 - 从零开始搭建微服务 前言 在上一篇文章中,已经学习了如何简单地开发一个单层网络应用.[Kuberne ...
- 2020 最新 Kubernetes实战指南
1.Kubernetes带来的变革 对于开发人员 由于公司业务多,开发环境.测试环境.预生产环境和生产环境都是隔离的,而且除了生产环境,为了节省成本,其他环境可能是没有日志收集的,在没有用k8s的 ...
- 新书推荐《再也不踩坑的Kubernetes实战指南》
<再也不踩坑的Kubernetes实战指南>终于出版啦.目前可以在京东.天猫购买,京东自营和当当网预计一个星期左右上架. 本书贴合生产环境经验,解决在初次使用或者是构建集群中的痛点,帮 ...
- kubernetes实战(二十六):kubeadm 安装 高可用 k8s v1.16.x dashboard 2.x
1.基本配置 基本配置.内核升级.基本服务安装参考https://www.cnblogs.com/dukuan/p/10278637.html,或者参考<再也不踩坑的Kubernetes实战指南 ...
- kubernetes实战(二十七):CentOS 8 二进制 高可用 安装 k8s 1.16.x
1. 基本说明 本文章将演示CentOS 8二进制方式安装高可用k8s 1.16.x,相对于其他版本,二进制安装方式并无太大区别.CentOS 8相对于CentOS 7操作更加方便,比如一些服务的关闭 ...
- kubernetes实战(二十八):Kubernetes一键式资源管理平台Ratel安装及使用
1. Ratel是什么? Ratel是一个Kubernetes资源平台,基于管理Kubernetes的资源开发,可以管理Kubernetes的Deployment.DaemonSet.Stateful ...
- kubernetes实战(二十九):Kubernetes RBAC实现不同用户在不同Namespace的不同权限
1.基本说明 在生产环境使用k8s以后,大部分应用都实现了高可用,不仅降低了维护成本,也简化了很多应用的部署成本,但是同时也带来了诸多问题.比如开发可能需要查看自己的应用状态.连接信息.日志.执行命令 ...
- kubernetes实战(三十):CentOS 8 二进制 高可用 安装 k8s 1.17.x
1. 基本说明 本文章将演示CentOS 8二进制方式安装高可用k8s 1.17.x,相对于其他版本,二进制安装方式并无太大区别. 2. 基本环境配置 主机信息 192.168.1.19 k8s-ma ...
- Kubernetes实战 - 从零开始搭建微服务 1 - 使用kind构建一个单层架构Node/Express网络应用程序
使用kind构建一个单层架构Node/Express网络应用程序 Kubernetes实战-从零开始搭建微服务 1 前言 准备写一个Kubernetes实战系列教程,毕竟cnblogs作为国内最早的技 ...
随机推荐
- Redis五种数据类型应用场景
目录 1.1 回顾 2.1 应用场景 2.1.1 String 2.1.2 Hash 2.1.3 List 2.1.4 Zet 2.1.5 zset 3.1 小结 1.1 回顾 Redis的五种数据类 ...
- Dubbo想要个网关怎么办?试试整合Spring Cloud Gateway
一.背景 在微服务架构中 API网关 非常重要,网关作为全局流量入口并不单单是一个反向路由,更多的是把各个边缘服务(Web层)的各种共性需求抽取出来放在一个公共的"服务"(网关)中 ...
- caffe的python接口学习(2)生成solver文件
caffe在训练的时候,需要一些参数设置,我们一般将这些参数设置在一个叫solver.prototxt的文件里面 有一些参数需要计算的,也不是乱设置. 假设我们有50000个训练样本,batch_si ...
- node+ajax实战案例(3)
3.用户注册实现 3.1.注册用户功能的实现逻辑 1 用户在表单上输入注册信息 2 点击注册后,收集用户在表单上输入的注册信息并且发送给后台 3 后台接收用户发送过来的注册信息 4 后台需要处理数据并 ...
- 【数位dp+状压】XHXJ 's LIS
题目 define xhxj (Xin Hang senior sister(学姐)) If you do not know xhxj, then carefully reading the enti ...
- 理解与使用Javascript中的回调函数
在Javascript中,函数是第一类对象,这意味着函数可以像对象一样按照第一类管理被使用.既然函数实际上是对象:它们能被“存储”在变量中,能作为函数参数被传递,能在函数中被创建,能从函数中返回. 因 ...
- 6.30集训模拟赛4(炸裂的一天qwq)
T1浇水: 题目描述 在一条长n米,宽m米米的长方形草地上放置着k个喷水装置.假设长方形草地的坐标范围为[ 0 , 0 ] ~ [ n , m ],那么第 i 个喷水装置的位置为(ai,m/2),也就 ...
- java语言基础-start
计算机基础 1.1 计算机以二进制存储数据 十进制数据转成二进制数据:使用除以2获取余数的方式 二进制数据转成十进制数据:使用8421编码的方式 1.2 字节 位(bit):一个数字0或者一个数字1, ...
- 如何针对 iPhone X 设计网站?
在全面屏的 iPhone X 上,不需要而外的代码,Safari 可以非常完美的展示现有的网站.整个网站的内容都会自动地展示在一个“安全区域”内,并不会被四周的圆角或者“小刘海”遮挡住. Safari ...
- 成熟度模型:企业规模化推广敏捷和DevOps利器
摘要: 本文介绍了成熟度模型在软件开发行业的应用,重点阐述了成熟度模型对于敏捷和DevOps在企业中进行规模化推广的价值,探讨了成熟度模型的设计原则,并对于如何明智使用成熟度模型给出了建议. 导言 在 ...