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 ./
新建namespace: kubectl create namespace java-web
给业务机器打标签: kubectl label nodes agent0 app/awesome-java=‘true‘
编写deployment定义文件
deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
# 必填项 name
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.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定义文件
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
生产过程中部署应用到k8s的交付件是helm的charts包
Kubernetes官方文档:https://kubernetes.io/zh/docs/home/
Kubernetes基础知识目录: https://bbs.huaweicloud.com/blogs/203430
原文:https://www.cnblogs.com/varyuan/p/14238774.html