【问题标题】:Kubernetes Deployment: preStop does not execute aws commandsKubernetes 部署:preStop 不执行 aws 命令
【发布时间】:2019-07-15 17:40:11
【问题描述】:

我正在尝试在 Pod 终止之前将日志传输到 S3。为此,我们需要

  1. 将我们的容器配置为具有 AWS-CLI。我成功地做到了 在 postStart 挂钩中使用脚本。

  2. 执行 AWS S3 命令将文件从 hostPath 传输到 S3 桶。差点有这个!!!

这是我的 Kube 部署(在 minikube 上运行):

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: logtransfer-poc
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: logs
    spec:
      volumes:
      - name: secret-resources
        secret:
          secretName: local-secrets
      - name: testdata
        hostPath:
          path: /data/testdata
      containers:
        - name: logtransfer-poc
          image: someImage
          ports:
          - name: https-port
            containerPort: 8443
          command: ["/bin/bash","-c","--"]
          args: ["while true; do sleep 30; done;"]
          volumeMounts:
          - name: secret-resources
            mountPath: "/data/apache-tomcat/tomcat/resources"
          - name: testdata
            mountPath: "/data/testdata"
          lifecycle:
            postStart:
              exec:
                command: ["/bin/sh", "-c", "cd /data/testdata/ && chmod u+x installS3Script.sh && ./installS3Script.sh > postInstall.logs"]
            preStop:
              exec:
                command: ["/bin/sh", "-c", "cd /data/testdata/ && chmod u+x transferFilesToS3.sh && ./transferFilesToS3.sh > postTransfer.logs"]
          terminationMessagePath: /data/testdata/termination-log
      terminationGracePeriodSeconds: 30
      imagePullSecrets:
        - name: my-docker-credentials

installS3Script.sh

#!/bin/bash

apt-get update
curl -O https://bootstrap.pypa.io/get-pip.py
python3 get-pip.py --user
chmod u+x get-pip.py
echo "PATH=$PATH:/root/.local/bin" >> ~/.bashrc && echo "Path Exported !!"
source ~/.bashrc && echo "Refreshed profile !"
pip3 install awscli --upgrade --user
mkdir -p ~/.aws
cp /data/testdata/config/config ~/.aws
cp /data/testdata/config/credentials ~/.aws

transferFilesToS3.sh

#!/bin/bash

# export AWS_DEFAULT_PROFILE=admin
echo "Transfering files to S3.."
aws s3 cp /data/testdata/data s3://testpratham --recursive --profile admin
aws s3 ls s3://testpratham --profile admin
echo "Transfer to S3 successfull !!"

失败的原因:transferFilesToS3.sh 运行成功但它不执行 AWS 命令​​..

什么有效:我创建了测试日志文件并将 aws 命令放在 postStart 挂钩 (installS3Script.sh) 中,它工作正常!!

我想我可能会以不同的方式研究 preStop 挂钩。我读了几篇关于lifecyclepreStop 钩子的文章。还有一个关于使用preStop hook with grace period的相关问题。

感谢任何关于我可能遗漏的建议/帮助。

【问题讨论】:

    标签: bash amazon-web-services kubernetes minikube kubernetes-deployment


    【解决方案1】:

    也许使用Skbn 会更容易。

    Skbn 是用于在 Kubernetes 和云存储提供商之间复制文件和目录的工具。它以 1981 年的电子游戏 Sokoban 命名。 Skbn 使用内存缓冲区进行复制过程,以避免过多的内存消耗。 Skbn 目前支持以下提供商: - AWS S3 - 迷你 S3 - Azure Blob 存储

    你可以使用:

    skbn cp \
        --src k8s://<namespace>/<podName>/<containerName>/<path> \
        --dst s3://<bucket>/<path>
    

    您应该查看in-cluster 的使用情况,因为它需要设置 ClusterRole、ClusterRoleBinding 和 ServiceAccount。

    【讨论】:

    • 我不确定 skbn 是否符合我想要实现的目标?!
    • 仅供参考,我将 installScript 添加到 transferScript 以便我设置 aws-cli 并在 preStop 挂钩中完全执行 aws 命令,这有效!仍然不确定为什么我不能同时使用 postStart 和 preStop !?!?
    猜你喜欢
    • 2015-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-03
    • 1970-01-01
    • 2021-12-18
    • 2019-03-16
    相关资源
    最近更新 更多