当前位置: 首页 > 知识库问答 >
问题:

该容器在Google Cloud Shell中启动,但在Kubernetes引擎上失败

岳嘉良
2023-03-14

我是使用库伯内特斯、Docker和GCP的新手,如果这个问题很愚蠢和(或)明显,我很抱歉。

我尝试使用谷歌示例创建带有http(s)映射的简单gRPC服务器。问题是,我的容器可以从Google cloud shell启动,没有任何问题,但部署后在Kubernetes引擎上失败。

在谷歌云控制台:

git clone https://gitlab.com/myrepos/grpc.git
cd grpc
docker build -t gcr.io/project-id/python-grpc-diagnostic-server:v1 .

# Run the container "locally"
docker run --rm -p 8000:8000 gcr.io/mproject-id/python-grpc-diagnostic-server:v1                                    
Server is started
^CServer is stopped

# Pushing the image to Container Registry
gcloud docker -- push gcr.io/project-id/python-grpc-diagnostic-server:v1

# Deployment 
kubectl create -f grpc-diagnostic.yaml

在部署详细信息'诊断'容器具有"CrashLoopBackOff"状态,并在日志中出现下一个错误:

File "/diagnostic/diagnostic_pb2.py", line 17, in <module>
    from google.api import annotations_pb2 as google_dot_api_dot_annotations__pb2
ModuleNotFoundError: No module named 'google.api'

你能告诉我为什么相同的容器在shell中启动,在Kubernetes引擎上失败吗?谢谢

要求。txt

grpcio
grpcio-tools
pytz
google-auth
googleapis-common-protos

文档

FROM gcr.io/google_appengine/python

# Create a virtualenv for dependencies. This isolates these packages from
# system-level packages.
RUN virtualenv -p python3.6 /env

# Setting these environment variables are the same as running
# source /env/bin/activate.
ENV VIRTUAL_ENV -p python3.6 /env
ENV PATH /env/bin:$PATH

ADD . /diagnostic/

WORKDIR /diagnostic
RUN pip install -r requirements.txt

EXPOSE 8000

ENTRYPOINT ["python", "/diagnostic/diagnostic_server.py"]

grpc诊断。亚马尔

apiVersion: v1
kind: Service
metadata:
  name: esp-grpc-diagnostic
spec:
  ports:
  # Port that accepts gRPC and JSON/HTTP2 requests over HTTP.
  - port: 80
    targetPort: 9000 # or 8000?
    protocol: TCP
    name: http2
  selector:
    app: esp-grpc-diagnostic
  type: LoadBalancer
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: esp-grpc-diagnostic
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: esp-grpc-diagnostic
    spec:
      containers:
      - name: esp
        image: gcr.io/endpoints-release/endpoints-runtime:1
        args: [
          "--http2_port=9000",
          "--service=diagnostic.endpoints.project-id.cloud.goog",
          "--rollout_strategy=managed",
          "--backend=grpc://127.0.0.1:8000"
        ]
        ports:
          - containerPort: 9000
      - name: diagnostic
        image: gcr.io/project-id/python-grpc-diagnostic-server:v1
        ports:
          - containerPort: 8000

共有1个答案

韦原
2023-03-14

那是我愚蠢的错误。我更改了图像,但图像的名称是相同的,所以集群继续使用旧的错误图像,认为没有任何更改。重新部署代码的正确方法是使用新标记创建图像,例如v1。01并为现有部署设置新映像,如文档中所述。我删除了服务和部署,并重新创建了它,但我没有删除集群,认为我是从零开始的。

正确的方式:

docker build -t gcr.io/project-id/python-grpc-diagnostic-server:v1.01 . 
gcloud docker -- push gcr.io/project-id/python-grpc-diagnostic-server:v1.01   
kubectl set image deployment/esp-grpc-diagnostic diagnostic=gcr.io/project-id/python-grpc-diagnostic-server:v1.01

另一种不更改名称的拉取更新图像的方法是更改默认设置为IfNotPresentImagePullPolicy

 类似资料:
  • 我试图在Google Container Engine(GKE)上创建一个kubernetes NFS卷,并让部署使用它。 我在github存储库kubernetes-nfs-volume-on-gke中显示了以下几个步骤: 创建GKE集群和GCE持久化磁盘 配置kubectl处理GKE集群的上下文 创建PersistentVolume(PV)和PersistentVolumeClaim(PVC)

  • 问题内容: 我遇到错误了; 问题答案: 错误是 看来您有一个指的是您尚未声明的。 您需要具有以下声明

  • 问题内容: 我有一个利用Google Cloud Logging API的go应用程序。 相关代码与他们的文档中的该示例相同:https : //github.com/GoogleCloudPlatform/golang- samples/blob/master/logging/logging_quickstart/main.go 检查它是否可与minikube配合使用(我的有效负载出现在日志查看

  • 我有一个Ubuntu Xenial容器,在我的Arch Linux计算机上安装了amd64体系结构。容器工作正常。但是,当我第二次尝试启动容器时,出现以下错误: 容器启动失败。 要获得更多详细信息,请在前台模式下运行容器。 其他信息可以通过设置--logfile和--log优先级选项获得。 是什么原因造成的? 在使用-F、-logfile和--logpriority选项运行后得到了这个。 lxc开

  • 我们将使用IntelliJ IDEA/Android Studio来创建这个工程,因此你会对截图看起来比较熟悉。 让我们开始创建一个新的Android工程。你可以创建你自己的工程或者用本书中提供的导入。选择你自己喜欢的创建方式这取决于你。 如果你想用Android Studio创建一个新的工程,通常你可以参考官方文档:http://developer.android.com/intl/zh-cn/