业务机器准备镜像

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 部署wordpress k8s部署web应用_k8s

k8s-master机器部署应用

  • 新建namespace: kubectl create namespace java-web
  • 给业务机器打标签: kubectl label nodes agent0 app/awesome-java='true'
部署deployment
  1. 编写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
  1. 创建deployment: kubectl apply -f deployment.yaml -n java-web
  2. 查看生成的3个pod: kubectl get po -o wide -n java-web

用k8s 部署wordpress k8s部署web应用_用k8s 部署wordpress_02

  1. 访问测试:curl ${IP}:8080/awesome/health , 如此例中可使用: curl 10.42.1.5:8080/awesome/health
部署service
  1. 编写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
  1. 创建service: kubectl apply -f service.yaml
  2. 查看service: kubectl describe svc awesome-java , 可以看到Endpoints 即为当前service负载的pod列表

用k8s 部署wordpress k8s部署web应用_云原生_03

  1. 可以访问: curl ${IP}:8080/awesome/health , 本例中为: curl 10.43.229.112:8080/awesome/health
部署ingress
  • 注意: k3s已经默认安装了traefik作为ingress-controller,所以只需要部署ingress即可
  1. 编写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的端口
  1. 创建ingress:kubectl apply -f ingress-traefik.yaml
  2. 查看ingress: kubectl describe ingress awesome-java-ingress-traefik
  3. 可以直接访问: curl localhost/awesome/health

Q&A: