业务机器准备镜像
Dockerfile
FROM openjdk:8-jre-alpine
# 配置同级目录下jar包名字
ENV JAR_NAME=awesome-java-0.1.jar
# 工作目录/opt,jar包会被复制为/opt/app.jar
WORKDIR /opt
COPY $JAR_NAME app.jar
EXPOSE 8080
ENTRYPOINT ["java","-jar","/opt/app.jar"]
将Dockerfile 与awesome-java-0.1.jar放在同一目录下, 执行
docker build --force-rm=true --no-cache=true -t awesome-java:0.1 -f Dockerfile ./
k8s-master机器部署应用
- 新建namespace:
kubectl create namespace java-web
- 给业务机器打标签:
kubectl label nodes agent0 app/awesome-java='true'
部署deployment
- 编写deployment定义文件
deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
# 必填项 应用名
name: awesome-java
# Deployment的规格描述
spec:
replicas: 3 #部署的pod数量
# 标签选择器
selector:
# 匹配标签为 app=awesome-java 的pod
matchLabels:
app: awesome-java
# 定义pod的模板
template:
# pod 的元数据,名称/标签/namespace等信息。
metadata:
# pod 的标签,与selector.matchLabels 对应
labels:
app: awesome-java
# pod 的规格描述
spec:
nodeSelector:
app/awesome-java: "true" # 节点选择标签,选择含有此标签的机器进行部署
# 容器
containers:
# 容器名称
- name: awesome-java
# 镜像名
image: awesome-java:0.1
# 拉取策略 Always:每次都从镜像仓库拉取最新的镜像, IfNotPresent:镜像已存在就不重新拉取
imagePullPolicy: IfNotPresent
# 容器端口 8080,名为http
ports:
- name: http
containerPort: 8080
# 就绪探针,检测容器应用是否启动完成,可以接收请求,对外提供服务
readinessProbe:
# 以http请求形式检测
httpGet:
# 访问的url,即健康检查页,若响应状态码为2xx或3xx,则服务是ok的
path: /awesome/health
# 访问的端口为http,其实就是上面定义的容器端口8080
port: http
# 延迟多少秒开始检测,因为应用启动需要时间
initialDelaySeconds: 30
# 表示每10s探测一次
periodSeconds: 10
# 超时时间,表示必须在1s内进行响应,否则这次探测记作失败
timeoutSeconds: 1
# 表示连续3次失败后会重启容器
failureThreshold: 3
# 表示连续1次成功后记作成功
successThreshold: 1
# 存活探针,检测容器应用是否运行正常,状态是否健康
livenessProbe:
httpGet:
path: /awesome/health
port: http
initialDelaySeconds: 30
periodSeconds: 10
timeoutSeconds: 1
failureThreshold: 3
successThreshold: 1
# 存储卷挂载, 容器内目录
volumeMounts:
- name: logs
mountPath: /opt/log
# 存储卷,宿主机目录
volumes:
- name: logs
hostPath:
path: /tmp/awesomelog
- 创建deployment:
kubectl apply -f deployment.yaml -n java-web
- 查看生成的3个pod:
kubectl get po -o wide -n java-web
- 访问测试:
curl ${IP}:8080/awesome/health
, 如此例中可使用: curl 10.42.1.5:8080/awesome/health
部署service
- 编写service定义文件, service的作用是负载均衡同一个应用的多个pod,默认轮询; pod经常重建,分配的ip也每次改变, service提供了自动监察存活pod的ip功能
service.yaml
apiVersion: v1
kind: Service
metadata:
name: awesome-java-service
spec:
selector:
app: awesome-java # 选择含有标签 app=awesome 的pod 作为Service的Endpoint
ports:
- name: http
port: 8080 # 尽量与targetPort相同
targetPort: 8080 # 目标端口,对应pod的端口
protocol: TCP # 转发协议类型,支持TCP和UDP
- 创建service:
kubectl apply -f service.yaml
- 查看service:
kubectl describe svc awesome-java
, 可以看到Endpoints 即为当前service负载的pod列表
- 可以访问:
curl ${IP}:8080/awesome/health
, 本例中为: curl 10.43.229.112:8080/awesome/health
部署ingress
- 注意: k3s已经默认安装了traefik作为ingress-controller,所以只需要部署ingress即可
- 编写ingress定义文件, ingress作用就是nginx,默认监听主机80端口
ingress-traefik.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: awesome-java-ingress-traefik
annotations:
kubernetes.io/ingress.class: traefik
spec:
rules:
- http:
paths:
- path: /awesome # 路由规则
pathType: Prefix
backend:
service:
name: awesome-java-service # 处理路由的service
port:
number: 8080 # service的端口
- 创建ingress:
kubectl apply -f ingress-traefik.yaml
- 查看ingress:
kubectl describe ingress awesome-java-ingress-traefik
- 可以直接访问:
curl localhost/awesome/health
Q&A:
- 生产过程中部署应用到k8s的交付件是helm的charts包
- awesome-java项目地址awesome-java-0.1.jar包下载地址