Kubernetes部署:preStop不执行aws命令

时间:2019-02-21 17:54:03

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

我正在尝试在吊舱终止之前将日志转移到S3。为此,我们需要

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

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

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

pi@raspberrypi:/tmp $ ./a.out
Testing fgets() function: 

Reading contents of myfile.txt: 

P2

# CREATOR: GIMP PNM Filter Ve
rsion 1.1

445 243

255

108

107

104

102

102

installS3Script.sh

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

transferFilesToS3.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成功运行,但不执行AWS命令。

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

我想我可能对preStop挂钩有不同的看法。我在lifecyclepreStop钩子上读了几篇文章。对于使用preStop hook with grace period也有一个相对的问题。

对我可能会缺少的任何建议/帮助,表示赞赏。

1 个答案:

答案 0 :(得分:1)

使用Skbn也许会更容易。

  

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

您可以使用:

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

您应该查看in-cluster的用法,因为这将需要设置ClusterRole,ClusterRoleBinding和ServiceAccount。