【问题标题】:Openshift: Unresolved ImageOpenshift:未解决的图像
【发布时间】:2017-12-05 05:52:47
【问题描述】:

我被 Openshift (Origin) 卡住了,需要一些帮助。

假设我想通过 CLI 将 grafana 部署添加到新启动的集群。

我做什么:

  1. 将模板上传到我的 openshift 集群(oc create -f openshift-grafana.yml)

  2. 从 docker hub 拉取必要的镜像(oc import-image --confirm grafana/grafana)

  3. 基于我的模板构建一个新应用(oc new-app grafana)

这些步骤会创建部署配置和路由。 但后来我无法通过 CLI 开始部署。

# oc deploy grafana                                                                                                                                            
grafana deployment #1 waiting on image or update
# oc rollout latest grafana                                                                                                                                    
Error from server (BadRequest): cannot trigger a deployment for "grafana" because it contains unresolved imagesenter code here

在 openshift web 控制台中它看起来像这样:

图像在那里,甚至链接都在工作。在 Web 控制台中,我可以单击“部署”并且它正在工作。但尽管如此,我还是无法通过命令行推出新版本。

唯一可行的方法是编辑部署 yml,以便 openshift 识别更改并根据“配置更改”启动部署(提示:我没有更改图像或图像名称)

我的模板没有什么特别之处,它只是通过 oc export 从工作配置中导出。

任何提示将不胜感激,我几乎被卡住了。 谢谢。

【问题讨论】:

  • 创建的资源列表是什么?使用oc get all。发生什么事件?使用oc get events。您使用的原始openshift-grafana.yml 模板在哪里找到?
  • @GrahamDumpleton openshift-grafana.yml 可以在这里找到:link这是我的 shell 输出:link
  • 图像流是从哪里来的?该模板不会为 grafana 创建图像流。如果我正在构建一个模板,我会让它创建图像流以触发图像的导入。我担心,由于您已经单独拥有一个名为 grafana 的图像流,因此它会在某种程度上与模板中直接从 Docker Hub 中使用 grafana 图像产生冲突。
  • @GrahamDumpleton 感谢您的提示,但它不起作用。我已经在我的模板中添加了一个图像流规范。现在,一旦我执行oc new-app,grafana 图像就会被拉取,但结果相同updated_template
  • 请注意,您不能按原样使用oc export --as-template 输出,它需要按摩。它出错的一件事是它如何引用内部图像注册表。给我一点时间,我会更正你的模板。

标签: openshift openshift-origin


【解决方案1】:

我遇到了同样的问题,我通过添加解决了它:

        lastTriggeredImage: >-
          mydockerrepo.com/repo/myimage@sha256:xxxxxxxxxxxxxxxx

开启:

  triggers:
    - type: ImageChange
      imageChangeParams:

部署配置 yaml。看起来如果它不知道最后触发的图像是什么,它就无法解析它。

【讨论】:

  • 你自己不应该碰它。如果您不得不摆弄它,那么您正在使用的部署配置中的其他地方仍然存在问题。如果您遇到问题,最好创建一个提供所有详细信息的新问题,然后有人可以为您的问题提供正确答案。
  • 我只是想提供帮助,而不是想获得帮助,这对我有用(而上述解决方案没有),我想分享它。如果我违反了某些规则,我很抱歉,这是我的第一个答案。
  • 如果您错过配置的triggers 部分,这确实可以解决问题。并确保不要在任何引号中添加它!
【解决方案2】:

下面是您可以用作入门的模板。请注意,grafana 映像似乎需要以 root 身份运行,否则将无法启动。这意味着您必须覆盖 OpenShift 的默认安全模型,并允许在项目中以 root 身份运行图像。不建议这样做。应修复 grafana 图像,以免要求它们以 root 身份运行。

要启用以 root 身份运行,您需要以集群管理员身份运行:

oc adm policy add-scc-to-user anyuid -z default -n myproject

其中myproject 是您正在使用的项目的名称。

我将其应用于默认服务帐户,但最好创建一个单独的服务帐户,将其应用于该帐户,然后更改模板,以便只有 grafana 作为该服务帐户运行。

您的意图可能是通过grafana.ini 文件覆盖默认设置,以便它使用您安装的emptyDir 目录,然后这不是问题。我没有尝试提供任何覆盖配置。

grafana 的模板如下所示。请注意,我使用 JSON 是因为我发现使用 JSON 更容易,而且还可以避免缩进被搞砸,使 YAML 无法使用。

在使用此模板之前,您显然应该创建相应的配置映射,其中名称的格式为${APPLICATION_NAME}-config,其中${APPLICATION_NAME}grafana,除非您在使用模板时覆盖它。配置映射中的键应该是grafana.ini,然后将配置文件内容作为值。

{
    "apiVersion": "v1",
    "kind": "Template",
    "metadata": {
        "name": "grafana"
    },
    "parameters": [
        {
            "name": "APPLICATION_NAME",
            "value": "grafana",
            "from": "[a-zA-Z0-9]",
            "required": true
        }
    ],
    "objects": [
        {
            "apiVersion": "v1",
            "kind": "ImageStream",
            "metadata": {
                "name": "${APPLICATION_NAME}-img",
                "labels": {
                    "app": "${APPLICATION_NAME}"
                }
            },
            "spec": {
                "tags": [
                    {
                        "name": "latest",
                        "from": {
                            "kind": "DockerImage",
                            "name": "grafana/grafana"
                        }
                    }
                ]
            }
        },
        {
            "apiVersion": "v1",
            "kind": "DeploymentConfig",
            "metadata": {
                "name": "${APPLICATION_NAME}",
                "labels": {
                    "app": "${APPLICATION_NAME}",
                    "type": "monitoring"
                }
            },
            "spec": {
                "replicas": 1,
                "selector": {
                    "app": "${APPLICATION_NAME}",
                    "deploymentconfig": "${APPLICATION_NAME}"
                },
                "template": {
                    "metadata": {
                        "labels": {
                            "app": "${APPLICATION_NAME}",
                            "deploymentconfig": "${APPLICATION_NAME}",
                            "type": "monitoring"
                        }
                    },
                    "spec": {
                        "containers": [
                            {
                                "name": "grafana",
                                "image": "${APPLICATION_NAME}-img:latest",
                                "imagePullPolicy": "Always",
                                "livenessProbe": {
                                    "failureThreshold": 3,
                                    "httpGet": {
                                        "path": "/",
                                        "port": 3000,
                                        "scheme": "HTTP"
                                    },
                                    "periodSeconds": 10,
                                    "successThreshold": 1,
                                    "timeoutSeconds": 1
                                },
                                "ports": [
                                    {
                                        "containerPort": 3000,
                                        "protocol": "TCP"
                                    }
                                ],
                                "volumeMounts": [
                                    {
                                        "mountPath": "/etc/grafana",
                                        "name": "grafana-1"
                                    },
                                    {
                                        "mountPath": "/var/lib/grafana",
                                        "name": "grafana-2"
                                    },
                                    {
                                        "mountPath": "/var/log/grafana",
                                        "name": "grafana-3"
                                    }
                                ]
                            }
                        ],
                        "volumes": [
                            {
                                "configMap": {
                                    "defaultMode": 420,
                                    "name": "${APPLICATION_NAME}-config"
                                },
                                "name": "grafana-1"
                            },
                            {
                                "emptyDir": {},
                                "name": "grafana-2"
                            },
                            {
                                "emptyDir": {},
                                "name": "grafana-3"
                            }
                        ]
                    }
                },
                "test": false,
                "triggers": [
                    {
                        "type": "ConfigChange"
                    },
                    {
                        "imageChangeParams": {
                            "automatic": true,
                            "containerNames": [
                                "grafana"
                            ],
                            "from": {
                                "kind": "ImageStreamTag",
                                "name": "${APPLICATION_NAME}-img:latest"
                            }
                        },
                        "type": "ImageChange"
                    }
                ]
            }
        },
        {
            "apiVersion": "v1",
            "kind": "Service",
            "metadata": {
                "name": "${APPLICATION_NAME}",
                "labels": {
                    "app": "${APPLICATION_NAME}",
                    "type": "monitoring"
                }
            },
            "spec": {
                "ports": [
                    {
                        "name": "3000-tcp",
                        "port": 3000,
                        "protocol": "TCP",
                        "targetPort": 3000
                    }
                ],
                "selector": {
                    "deploymentconfig": "${APPLICATION_NAME}"
                },
                "type": "ClusterIP"
            }
        },
        {
            "apiVersion": "v1",
            "kind": "Route",
            "metadata": {
                "name": "${APPLICATION_NAME}",
                "labels": {
                    "app": "${APPLICATION_NAME}",
                    "type": "monitoring"
                }
            },
            "spec": {
                "host": "",
                "port": {
                    "targetPort": "3000-tcp"
                },
                "to": {
                    "kind": "Service",
                    "name": "${APPLICATION_NAME}",
                    "weight": 100
                }
            }
        }
    ]
}

【讨论】:

  • 谢谢。您的模板工作正常。我将使用您的文件作为进一步修改的基础。非常感谢,我从没想过oc export --as-template 坏了。
  • 这是一个已知问题。有问题的不仅仅是创建模板,还有从项目中导出所有内容,以便可以在不同的 OpenShift 项目甚至单独的集群中重新创建它。正在努力改进这些工具。
【解决方案3】:

对我来说,我在“来自”下的图片名称不正确:

triggers:
    - type: ConfigChange
    - imageChangeParams:
        automatic: true
        containerNames:
          - alcatraz-ha
        from:
          kind: ImageStreamTag
          name: 'alcatraz-haproxy:latest'
          namespace: alcatraz-ha-dev
      type: ImageChange

我有名字:'alcatraz-ha:latest' 所以找不到图片

【讨论】:

    【解决方案4】:

    确保spec.triggers.imageChangeParams.from.name作为图像流存在

    triggers:
        - imageChangeParams:
            from:
              kind: ImageStreamTag
              name: 'myapp:latest' # Does "myapp" exist if you run oc get is ????!!!
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-29
      • 2013-05-16
      • 2019-09-15
      相关资源
      最近更新 更多