业务机器准备镜像
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包
学习资料
-
Kubernetes官方文档:https://kubernetes.io/zh/docs/home/
-
Kubernetes基础知识目录: https://bbs.huaweicloud.com/blogs/203430