k8s series 7: Deployment部署应用

  Pod控制器中管理无状态应用,特别是业务类型应用,大多采用deployment控制器,接下来以一个简单的例子实际部署一下。

java项目打包

使用springboot写了一个简单查询hive数据的demo,打成jar包。

mvn clean package -Dmaven.test.skip=true 
复制代码

制作docker image

编写Dockerfile配置将jar包制作成docker image

FROM java:8
VOLUME /tmp
ADD springboot-hive.jar app.jar 
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
复制代码

上传私有仓库

将本地docker image上传到私有镜像仓库harbor, harbor部署见后续文章

docker tag springboot-hive:v1 harbor-test.libaigo.cn/dev/springboot-hive:v1
docker push harbor-test.libaigo.cn/dev/springboot-hive:v1
复制代码

创建namespace

kubectl create namespace devops
复制代码

 deployment yaml配置

apiVersion: apps/v1
kind: Deployment
metadata:
  name: springboot-hive
  namespace: devops
  labels:
    app: springboot
    version: "1.0"
spec:
  replicas: 3
  selector:
    matchLabels:
      app: springboot
  template:
    metadata:
      labels:
        app: springboot
        version: "1.0"
    spec:
      terminationGracePeriodSeconds: 30
      containers: 
      - name: springboot-hive
        image: harbor-test.libaigo.cn/dev/springboot-hive:v1
        imagePullPolicy: IfNotPresent
        resources:
          requests:
            cpu: 100m
            memory: 1Gi
        livenessProbe:
          tcpSocket:
            port: 8080
          initialDelaySeconds: 10
          periodSeconds: 60
        ports:
        - containerPort: 8080
          name: web
          protocol: TCP
复制代码
  • 项目使用devops namespace

  • labels 标明了 app名称 和版本,也可以加上项目名称和以及相关特点,加以区分

  • 加了入优雅关闭策略(terminationGracePeriodSeconds),宽限期30s来优雅关闭pod,可视情况延长时间

  • 镜像拉取策略 选择使用本地镜像,不拉取,避免镜像更新自动拉取

  • 资源限制使用requests,CPU和内存 最大请求资源,这里没有写最小请求,也没有限制最大最小

  • 检查容器存活状态(livenessProbe),使用tcp协议和8080端口探测

  • 最后声明服务在pod中的端口和协议

运行以下命令创建部署

kubectl apply -f springboot-hi-deployment.yaml
复制代码

查看deploy和pods状态

kubectl get deploy,po  -n devops -o wide
复制代码

应用已经成功部署了(如果状态不是Running,可使用describe查看具体情况)

kubectl describe deploy/springboot-hive  -n devops
复制代码

因为应用在k8s内部,如果你在k8s集群节点上,可以通过IP访问,但是外部是无法访问的

k8s集群内部访问

外部访问

为了让外部能够访问到,这里我们需要用到service 对象

Service yaml配置

apiVersion: v1
kind: Service
metadata:
  name: springboot-hive-service
  namespace: devops
  labels:
    app: springboot
    version: "1.0"
spec:
  type: NodePort
  ports:
    - port: 8080
      protocol: TCP
      nodePort: 30112
  selector:
    app: springboot
    version: "1.0"
复制代码

这边我们使用NodePort类型来将 应用的8080端口映射到 k8s集群的 30112端口

运行以下命令创建部署

kubectl apply -f springboot-hive-service.yaml
kubectl get svc -o wide -n devops
复制代码

可以看到service 已经生效, 访问集群任意节点  ip:30112 既可访问服务

查看日志

kubectl logs -f springboot-hive-7c844584f9-2v256 -n devops
复制代码

登陆到容器

kubectl exec -it springboot-hive-7c844584f9-2v256 bash -n devops
复制代码

查看deployment配置

kubectl get  deploy/springboot-hive -n devops  -o yaml
复制代码

执行上述命令会在终端 以yaml格式输出 配置,也支持json

在线更改deployment配置

kubectl edit deploy/springboot-hive -n devops -o json
复制代码

以json格式在线更改配置,保存既生效

动态扩缩容

kubectl scale deploy/springboot-hive --replicas=5 -n devops
复制代码

在线镜像升级和回滚

kubectl set image deploy springboot-hive springboot-hive=harbor-test.qupeiyin.cn/dev/springboot-hive:v2
复制代码

更新执行完成后,查看一下历史的部署记录

kubectl rollout history deploy/springboot-hive
复制代码

如果历史部署记录没有或缺少,说明没有记录,在更新时加上–record

kubectl set image deploy springboot-hive springboot-hive=harbor-test.qupeiyin.cn/dev/springboot-hive:v2 --record
复制代码
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享