k8s:简单部署应用

业务机器准备镜像

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

  1. 编写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
    
  2. 创建deployment: kubectl apply -f deployment.yaml -n java-web

  3. 查看生成的3个pod: kubectl get po -o wide -n java-web

  1. 访问测试:curl ${IP}:8080/awesome/health , 如此例中可使用: curl 10.42.1.5:8080/awesome/health

部署service

  1. 编写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
    
  2. 创建service: kubectl apply -f service.yaml

  3. 查看service: kubectl describe svc awesome-java , 可以看到Endpoints 即为当前service负载的pod列表

  1. 可以访问: curl ${IP}:8080/awesome/health , 本例中为: curl 10.43.229.112:8080/awesome/health

部署ingress

  • 注意: k3s已经默认安装了traefik作为ingress-controller,所以只需要部署ingress即可
  1. 编写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的端口
    
  2. 创建ingress:kubectl apply -f ingress-traefik.yaml

  3. 查看ingress: kubectl describe ingress awesome-java-ingress-traefik

  4. 可以直接访问: curl localhost/awesome/health

Q&A:

学习资料

posted @ 2021-01-06 00:16  varyuan  阅读(148)  评论(0编辑  收藏  举报