110 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Bash
		
	
	
	
	
	
			
		
		
	
	
			110 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Bash
		
	
	
	
	
	
#!/usr/bin/env bash
 | 
						|
#
 | 
						|
set -euo pipefail
 | 
						|
IFS=$'\n\t'
 | 
						|
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
 | 
						|
 | 
						|
############## Setup #########################
 | 
						|
 | 
						|
function cleanup {
 | 
						|
    for f in "${pods[@]}"; do
 | 
						|
        log "Deleting $f"
 | 
						|
        kubectl delete pod --force=true --grace-period=0 --namespace homepage "$f"
 | 
						|
    done
 | 
						|
}
 | 
						|
pods=()
 | 
						|
for sig in EXIT INT QUIT HUP TERM; do
 | 
						|
  trap "set +e; cleanup" "$sig"
 | 
						|
done
 | 
						|
 | 
						|
function die {
 | 
						|
    local status_code="$1"
 | 
						|
    shift
 | 
						|
    (>&2 echo "${@}")
 | 
						|
    exit "$status_code"
 | 
						|
}
 | 
						|
 | 
						|
function log {
 | 
						|
    (>&2 echo "${@}")
 | 
						|
}
 | 
						|
 | 
						|
############## Program #########################
 | 
						|
 | 
						|
function main {
 | 
						|
    local pod_name="tom-$(uuidgen | cut -d '-' -f 1)"
 | 
						|
    pods+=("$pod_name")
 | 
						|
    create_pod "$pod_name"
 | 
						|
    kubectl wait pods -n homepage "$pod_name" --for condition=Ready --timeout=90s
 | 
						|
    kubectl exec -i -t --namespace homepage "$pod_name" -- "${@}"
 | 
						|
}
 | 
						|
 | 
						|
function create_pod {
 | 
						|
    local pod_name="$1"
 | 
						|
    kubectl apply -f - <<EOF
 | 
						|
apiVersion: v1
 | 
						|
kind: Pod
 | 
						|
metadata:
 | 
						|
  labels:
 | 
						|
    run: $pod_name
 | 
						|
  name: $pod_name
 | 
						|
  namespace: homepage
 | 
						|
spec:
 | 
						|
  imagePullSecrets:
 | 
						|
    - name: registry-credentials
 | 
						|
  containers:
 | 
						|
  - args:
 | 
						|
    - /bin/sleep
 | 
						|
    - infinity
 | 
						|
    image: harbor.fizz.buzz/dockerhub/library/alpine:3.18
 | 
						|
    imagePullPolicy: IfNotPresent
 | 
						|
    name: $pod_name
 | 
						|
    stdin: true
 | 
						|
    stdinOnce: true
 | 
						|
    terminationMessagePath: /dev/termination-log
 | 
						|
    terminationMessagePolicy: File
 | 
						|
    tty: true
 | 
						|
    volumeMounts:
 | 
						|
    - mountPath: /var/run/secrets/kubernetes.io/serviceaccount
 | 
						|
      name: kube-api-access-hskj7
 | 
						|
      readOnly: true
 | 
						|
  # serviceAccount: default
 | 
						|
  # serviceAccountName: default
 | 
						|
  terminationGracePeriodSeconds: 30
 | 
						|
  tolerations:
 | 
						|
  - effect: NoExecute
 | 
						|
    key: node.kubernetes.io/not-ready
 | 
						|
    operator: Exists
 | 
						|
    tolerationSeconds: 300
 | 
						|
  - effect: NoExecute
 | 
						|
    key: node.kubernetes.io/unreachable
 | 
						|
    operator: Exists
 | 
						|
    tolerationSeconds: 300
 | 
						|
  volumes:
 | 
						|
  - name: kube-api-access-hskj7
 | 
						|
    projected:
 | 
						|
      defaultMode: 420
 | 
						|
      sources:
 | 
						|
      - serviceAccountToken:
 | 
						|
          expirationSeconds: 3607
 | 
						|
          path: token
 | 
						|
      - configMap:
 | 
						|
          items:
 | 
						|
          - key: ca.crt
 | 
						|
            path: ca.crt
 | 
						|
          name: kube-root-ca.crt
 | 
						|
      - downwardAPI:
 | 
						|
          items:
 | 
						|
          - fieldRef:
 | 
						|
              apiVersion: v1
 | 
						|
              fieldPath: metadata.namespace
 | 
						|
            path: namespace
 | 
						|
EOF
 | 
						|
}
 | 
						|
 | 
						|
function delete_pod {
 | 
						|
    local pod_name="$1"
 | 
						|
    kubectl delete pod --force=true --grace-period=0 --namespace homepage "$pod_name"
 | 
						|
}
 | 
						|
 | 
						|
main "$@"
 |