【问题标题】:Openshift - Variables in Config for different EnvironmentsOpenshift - 用于不同环境的 Config 中的变量
【发布时间】:2019-01-17 10:21:57
【问题描述】:

我目前正在尝试在两个不同的 openshift 集群上进行部署,但我只想使用一个部署配置文件。有什么好办法可以克服目前的问题

apiVersion: v1
kind: DeploymentConfig
metadata:
  labels:
    app: my-app
    deploymentconfig: my-app
  name: my-app
spec:
  selector:
    app: my-app
    deploymentconfig: my-app
  strategy:
    type: Rolling
    rollingParams:
      intervalSeconds: 1
      maxSurge: 25%
      maxUnavailability: 25%
      timeoutSeconds: 600
      updatePeriodSeconds: 1
  replicas: 1
  template:
    metadata:
      labels:
        app: my-app
        deploymentconfig: my-app
    spec:
      containers:
        - name: my-app-container
          image: 172.0.0.1:5000/int-myproject/my-app:latest
          imagePullPolicy: Always
          ports:
            - containerPort: 8080
              protocol: TCP
          env:
            - name: ROUTE_PATH
              value: /my-app
            - name: HTTP_PORT
              value: "8080"
            - name: HTTPS_PORT
              value: "8081"
    restartPolicy: Always
    dnsPolicy: ClusterFirst

现在如果你看一下 spec.template.spec.containers[0].image 有两个问题

Nr.1

172.0.0.1:5000/int-myproject/my-app:latest

内部注册表的 IP 在两个环境之间会有所不同

Nr.2

172.0.0.1:5000/int-myproject/my-app:latest

命名空间也不相同。在这种情况下,我希望它是 int-myproject 或 prod-myproject,具体取决于我要部署到的环境。我在想也许有一种方法可以在 yaml 中使用参数并将它们传递给 openshift,类似于此

oc create -f deploymentconfig.yaml --namespace=int-myproject

并且在我的 yaml 文件中有一个类似 ${namespace} 的参数。有什么好的方法可以实现吗?

【问题讨论】:

    标签: yaml openshift environment


    【解决方案1】:

    首先,回答您的问题,是的,您可以在 OpenShift 模板中使用参数并传递值和创建时间。

    为此,您将 add the required template values 写入您的 yaml 文件,而不是使用 oc create,您将使用 oc new-app -f deploymentconfig.yaml --param=SOME_KEY=someValue。在此处查看oc new-app --help 了解更多信息。

    其他一些需要注意的点:如果您从内部注册表中引用图像,您最好使用imagestreams。这些为从 OpenShift 上的内部 docker 注册表中提取的图像提供了抽象,就像您概述的情况一样。

    最后,每个 Pod 中的命名空间值都是 available via the downward API,您不需要(通常)手动注入它。

    【讨论】:

    • 谢谢。我实际上正在使用图像流并将我的构建推入一个 is。我想我当时在我的部署配置中引用了它错误。我是否需要按照链接中的说明在触发器下引用 IS 并从容器规范中完全删除图像,还是需要在那里引用它?
    • 您仍会在容器规范中引用该图像,但它不会是 ip,而是应该允许您使其跨集群通用的图像流名称。尝试部署目录中的任何服务,例如 nodejs,并查看它生成的对象(构建、图像流、部署)作为指南
    • 这就是我一开始尝试的,所以我只有 Image: my-app:latest 但是在使用“rpc error: code = 2 desc =”拉取图像时总是会给我一个错误(ImagePullBackOff)未经授权:需要身份验证
    • 您正在运行什么版本的 OpenShift 以及在什么环境/操作系统中运行?
    • 哦,也许还有最后一个问题。我无法谷歌它。如果我使用模板,是否可以从文件中引用对象?我希望它比在一个长文件中编写更多内容更模块化
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多