Openshift - 运行 带有 alpine、java 和 jmeter 的基本容器

Openshift - Run a basic container with alpine, java and jmeter

在Openshift环境中(Kubernetes v1.18.3+47c0e71) 我正在尝试 运行 一个非常基本的容器,其中将包含:

我只是想让它在容器中启动并 运行,希望从命令行终端连接到 运行 Jmeter CLI。

我已经让它在我的本地 Docker 发行版中完美运行。这是 Dokerfile 内容:

FROM alpine:latest

ARG JMETER_VERSION="5.3"
ENV JMETER_HOME /opt/apache-jmeter-${JMETER_VERSION}
ENV JMETER_BIN  ${JMETER_HOME}/bin
ENV JMETER_DOWNLOAD_URL https://archive.apache.org/dist/jmeter/binaries/apache-jmeter-${JMETER_VERSION}.tgz

USER root

ARG TZ="Europe/Amsterdam"
RUN    apk update \
    && apk upgrade \
    && apk add ca-certificates \
    && update-ca-certificates \
    && apk add --update openjdk8-jre tzdata curl unzip bash \
    && apk add --no-cache nss \
    && rm -rf /var/cache/apk/ \
    && mkdir -p /tmp/dependencies  \
    && curl -L --silent ${JMETER_DOWNLOAD_URL} >  /tmp/dependencies/apache-jmeter-${JMETER_VERSION}.tgz  \
    && mkdir -p /opt  \
    && tar -xzf /tmp/dependencies/apache-jmeter-${JMETER_VERSION}.tgz -C /opt  \
    && rm -rf /tmp/dependencies

# Set global PATH such that "jmeter" command is found
ENV PATH $PATH:$JMETER_BIN

WORKDIR ${JMETER_HOME}

出于某种原因,当我用一个容器配置一个 Pod,该容器具有之前上传到私有 Docker 图像注册表的确切配置,它不起作用。

这是部署配置 (yaml) 文件(也非常基本):

apiVersion: apps/v1
kind: Deployment
metadata:
  name: jmeter
  namespace: myNamespace
  labels:
    app: jmeter
    group: myGroup
spec:
  selector:
    matchLabels:
      app: jmeter
  replicas: 1
  template:
    metadata:
      labels:
        app: jmeter
    spec:
      containers:
        - name: jmeter
          image: myprivateregistry.azurecr.io/jmeter:dev
          resources:
            limits:
              cpu: 100m
              memory: 500Mi
            requests:
              cpu: 100m
              memory: 500Mi
          imagePullPolicy: Always
      restartPolicy: Always
      imagePullSecrets:
        - name: myregistrysecret

很遗憾,我没有收到任何日志:

Pod 事件的屏幕截图:

不幸的是,无法访问容器的终端:

任何想法:

在您的本地计算机上,您可能正在使用 docker run -it <my_container_image> 或类似的。使用 -it 选项将在您的容器中 运行 一个交互式 shell 而无需您指定 CMD 并将保持 shell 运行ning 作为主要进程在您的容器中启动。所以通过使用这个命令,你基本上已经指定了一个命令。

Kubernetes 期望容器映像包含一个在启动时 运行 (CMD) 的进程,并且只要容器处于活动状态就会 运行(例如网络服务器).

在您的情况下,Kubernetes 正在启动容器,但您没有指定启动容器映像时应该发生什么。这会导致容器立即终止,您可以在上面的事件中看到这一点。因为您使用的是 Deployment,所以失败的 Pod 会一次又一次地重新启动。

一个可能的解决方法是在启动时通过在 Pod 中指定 command 在容器中 运行 命令 sleep ,如下所示:

apiVersion: v1
kind: Pod
metadata:
  name: command-demo
  labels:
    purpose: demonstrate-command
spec:
  containers:
  - name: command-demo-container
    image: alpine
    command: ["/bin/sleep", "infinite"]
  restartPolicy: OnFailure

(Kubernetes documentation)

这将启动 Pod 并立即 运行 /bin/sleep infinite 命令,导致主进程成为此 sleep 进程,永远不会终止。您的容器现在将无限期 运行。现在您可以使用 oc rsh <name_of_the_pod 连接到容器和 运行 任何您想要交互的东西(例如 jmeter)。