Openshift - 运行 带有 alpine、java 和 jmeter 的基本容器
Openshift - Run a basic container with alpine, java and jmeter
在Openshift环境中(Kubernetes v1.18.3+47c0e71)
我正在尝试 运行 一个非常基本的容器,其中将包含:
- Alpine(最新版本)
- JDK 1.8
- Jmeter 5.3
我只是想让它在容器中启动并 运行,希望从命令行终端连接到 运行 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
这将启动 Pod 并立即 运行 /bin/sleep infinite
命令,导致主进程成为此 sleep
进程,永远不会终止。您的容器现在将无限期 运行。现在您可以使用 oc rsh <name_of_the_pod
连接到容器和 运行 任何您想要交互的东西(例如 jmeter
)。
在Openshift环境中(Kubernetes v1.18.3+47c0e71) 我正在尝试 运行 一个非常基本的容器,其中将包含:
- Alpine(最新版本)
- JDK 1.8
- Jmeter 5.3
我只是想让它在容器中启动并 运行,希望从命令行终端连接到 运行 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
这将启动 Pod 并立即 运行 /bin/sleep infinite
命令,导致主进程成为此 sleep
进程,永远不会终止。您的容器现在将无限期 运行。现在您可以使用 oc rsh <name_of_the_pod
连接到容器和 运行 任何您想要交互的东西(例如 jmeter
)。