场景描述
在CI/CD的场景下,从代码提交合并到自动打包构建,会分好几个阶段,例如:git push -> 代码规范检查 -> sonar 扫描 -> maven 打包 --> docker 打包镜像 -> docker push harbor。在这里如果自动触发构建不做过多赘述(Jenkins内容,感兴趣的自行了解),这里只做Dockerfile 分阶段构建镜像的说明。
2025年3月19日大约 2 分钟
在CI/CD的场景下,从代码提交合并到自动打包构建,会分好几个阶段,例如:git push -> 代码规范检查 -> sonar 扫描 -> maven 打包 --> docker 打包镜像 -> docker push harbor。在这里如果自动触发构建不做过多赘述(Jenkins内容,感兴趣的自行了解),这里只做Dockerfile 分阶段构建镜像的说明。
版本:
elasticsearch-oss:7.4.2skywalking-oap-server:10.1.0skywalking-ui:10.1.0docker-compose.yaml 文件
version: '3.8'
services:
elasticsearch:
image: elasticsearch/elasticsearch-oss:7.4.2
container_name: elasticsearch
ports:
- "9200:9200"
- "9300:9300"
networks:
- sw
healthcheck:
test: [ "CMD-SHELL", "curl --silent --fail localhost:9200/_cluster/health || exit 1" ]
interval: 30s
timeout: 10s
retries: 3
start_period: 10s
environment:
- discovery.type=single-node
#锁定物理内存地址,防止es内存被交换出去,也就是避免es使用swap交换分区,频繁的交换,会导致IOPS变高
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
- "TZ=Asia/Shanghai"
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- /data/elasticsearch/data:/usr/share/elasticsearch/data
#- /data/elasticsearch/logs:/usr/share/elasticsearch/logs
oap-server:
image: apache/skywalking-oap-server:10.1.0
container_name: oap-server
depends_on:
- elasticsearch
ports:
- "11800:11800"
- "12800:12800"
networks:
- sw
healthcheck:
test: [ "CMD-SHELL", "curl http://localhost:12800/internal/l7check" ]
interval: 30s
timeout: 10s
retries: 3
start_period: 10s
links:
- elasticsearch
environment:
SW_HEALTH_CHECKER: default
SW_TELEMETRY: prometheus
JAVA_OPTS: "-Xms2048m -Xmx2048m"
SW_STORAGE: elasticsearch
SW_STORAGE_ES_CLUSTER_NODES: elasticsearch:9200
ui:
image: apache/skywalking-ui:10.1.0
container_name: ui
depends_on:
- oap-server
links:
- oap-server
ports:
- "8080:8080"
networks:
- sw
environment:
SW_OAP_ADDRESS: http://oap-server:12800
SW_ZIPKIN_ADDRESS: http://oap-server:9412
networks:
sw:
应用场景:当我们的环境无法访问互联网镜像库的时候,我们就需要手动上传基础镜像,才能完成镜像的构建和运行。
镜像导出
docker save -o images.tar [image:tag]
apiVersion: apps/v1
kind: Deployment
metadata:
name: MYAPP # Deployment名
namespace: default # 名称空间
labels:
app: MYAPP # 标签名,与pod name对应
spec:
selector:
matchLabels:
app: MYAPP
replicas: 1 # 副本数
strategy: # 策略指定用于用新 Pod 替换旧 Pod 的策略,文档:https://kubernetes.io/zh-cn/docs/concepts/workloads/controllers/deployment/#strategy
rollingUpdate: # 滚动更新
maxSurge: 25% # 最大峰值,用来指定可以创建的超出期望 Pod 个数的 Pod 数量,默认:25%
maxUnavailable: 25% # 最大不可用数或比例,默认:25%
type: RollingUpdate # 可以是 “Recreate” - 创建更新 或 “RollingUpdate” - 滚动更新,默认:“RollingUpdate”
template:
metadata:
labels:
app: MYAPP
spec:
# initContainers:
# Init containers are exactly like regular containers, except:
# - Init containers always run to completion.
# - Each init container must complete successfully before the next one starts.
containers:
- name: MYAPP # Pod中的容器名字
image: MYAPP:latest # Pod中容器镜像
resizePolicy: # 容器资源调整策略,调整策略允许更精细地控制 Pod 中的容器如何针对 CPU 和内存资源进行调整。
- resourceName: cpu
restartPolicy: NotRequired # 在运行时调整容器的资源,不需要重启,默认:NotRequired
- resourceName: memory
restartPolicy: RestartContainer # 重启容器并在重启后应用新资源,默认:NotRequired。
resources:
requests:
cpu: 0.5 # Pod 中的 CPU 请求
memory: 100Mi # pod 中的内存请求
limits:
cpu: 100m # Pod 中的 CPU 限制
memory: 200Mi # pod 中的内存限制
env: # 环境变量,可以从configMap中注入,也可以通过 K - V 传入
- name: DB_HOST
valueFrom:
configMapKeyRef:
name: MYAPP
key: DB_HOST
- name: SPRING_PROFILE_ACTIVE
vaule: test
ports:
- containerPort: 80 # 容器端口
name: MYAPP
volumeMounts: # pod 挂载卷
- name: localtime
mountPath: /etc/localtime # 挂载目录
volumes: # 卷,常用 hostPath、nfs、持久卷(pv、pvc),参考:https://kubernetes.io/zh-cn/docs/concepts/storage/volumes/
- name: localtime # name与volumeMounts[*].name对应
hostPath: # 宿主机目录
path: /usr/share/zoneinfo/Asia/Shanghai
restartPolicy: Always # pod的重启策略,Always - 总是重启;Never - 从不
Service
apiVersion: v1
kind: Service
metadata:
name: my-service # SVC 名称,如:gateway-svc
namespace: default # 所在的名称空间
spec:
selector: # pod 选择器
app: MYAPP # 过滤标签名,与pod标签名对应
type: ClusterIP # 服务类型,ClusterIP 集群ip,集群外无法访问;NodePort,通过每个节点上的 IP 和静态端口(NodePort)公开 Service
ports:
- name: MYAPP
protocol: TCP
port: # svc端口(非nodePort)
targetPort: # 目标端口,pod的端口
# 如果 type = NodePort,你可以设置nodePort的端口号,不能冲突
#nodePort:
文件/目录
# 以KB、MB、GB 显示文件大小
ls -lh
# 以KB显示文件大小
ls -ll
# 查看当前目录下各文件、文件夹的大小
du -h –max-depth=1 *
# 查看当前目录的总大小,s就是汇总, 后面可以跟指定目录
du -sh
# 创建目录
mkdir test
# 创建目录及子目录(递归创建)
mkdir -p test/test1/test2
# 复制文件/目录
cp source target
# 剪切/移动文件或目录
mv source target
# 重命名
mv old.text news.text
# 创建文件
touche file.text
# 创建并编辑文件
vim file.text
自定义skywalking agent java 基础镜像
版本:
10.3.010.3.09.3.0下载以及前期准备工作移步:Skywalking agent Java
场景一:
skywalking oap server 并不是在k8s集群内部部署,但是想在应用中通过svc访问 oap server。
# 配置 skywalking oap server svc 代理映射
apiVersion: v1
kind: Service
metadata:
name: oap-server-svc
namespace: default
spec:
ports:
- name: grpc
protocol: TCP
port: 11800
targetPort: 11800
- name: http
protocol: TCP
port: 12800
targetPort: 12800
---
apiVersion: v1
kind: Endpoints
metadata:
name: oap-server-svc
namespace: default
subsets:
- addresses:
- ip: 10.19.0.109 # 目标服务ip
ports:
- name: grpc
port: 11800
protocol: TCP
- name: http
port: 12800
protocol: TCP
要求
java8 作为基础镜像spring boot项目构建为docker 镜像vmargs、args场景描述
开发完成后,只需要手动打包为
jar或者通过jenkins进行编译打包为jar一次即可,即里面的项目配置通过外部配置进行覆盖,比如,在将jar打包为docker镜像时,将应用本身的配置覆盖,程序员不需要关注各个环境的部署配置,只关注业务开发(开发环境)。