在 Openshift 环境中(Kubernetes v1.18.3+47c0e71)
我正在尝试运行一个非常基本的容器,其中将包含:
我只希望它在容器中启动并运行,期望连接从命令行终端运行 Jmeter CLI。
我已经让它在我的本地 Docker 发行版中完美运行。这是 Dockerfile 内容:
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}
出于某种原因,当我使用先前上传到私有(private) Docker 镜像注册表的确切配置的容器配置 Pod 时,它不起作用。这是部署配置(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 作为容器中启动的主要进程运行。所以通过使用这个命令,你基本上已经指定了一个命令。
Kubernetes 期望容器镜像包含一个在启动时运行的进程 (CMD
),并且只要容器处于事件状态(例如 Web 服务器)就会运行。
在您的情况下,Kubernetes 正在启动容器,但您没有指定启动容器镜像时应该发生什么。这会导致容器立即终止,您可以在上面的事件中看到这一点。因为您使用的是 Deployment
,失败的 Pod 会一次又一次地重新启动。
一个可能的解决方法是运行 sleep
通过指定 command
启动容器中的命令在你的 Pod 中像这样:
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
)。
关于docker - Openshift - 使用 alpine、java 和 jmeter 运行基本容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64467992/