2016-11-14 48 views
4

我希望我的部署配置使用作为构建配置输出的图像。如何在OpenShift的部署配置中使用图像流

我目前使用的是这样的:

- apiVersion: v1 
    kind: DeploymentConfig 
    metadata: 
    annotations: 
     openshift.io/generated-by: OpenShiftNewApp 
    creationTimestamp: null 
    labels: 
     app: myapp 
    name: myapp 
    spec: 
    replicas: 1 
    selector: 
     app: myapp 
     deploymentconfig: myapp 
    strategy: 
     resources: {} 
    template: 
     metadata: 
     annotations: 
      openshift.io/container.myapp.image.entrypoint: '["python3"]' 
      openshift.io/generated-by: OpenShiftNewApp 
     creationTimestamp: null 
     labels: 
      app: myapp 
      deploymentconfig: myapp 
     spec: 
     containers: 
     - name: myapp 
      image: 123.123.123.123/myproject/myapp-staging:latest 
      resources: {} 
      command: 
      - scripts/start_server.sh 
      ports: 
      - containerPort: 8000 
    test: false 
    triggers: [] 
    status: {} 

我不得不硬编码集成泊坞窗注册表的IP地址;否则Kubernetes/OpenShift无法找到要下拉的图像。我想不硬编码集成泊坞窗注册表的IP地址,而是使用这样的事:

- apiVersion: v1 
    kind: DeploymentConfig 
    metadata: 
    annotations: 
     openshift.io/generated-by: OpenShiftNewApp 
    creationTimestamp: null 
    labels: 
     app: myapp 
    name: myapp 
    spec: 
    replicas: 1 
    selector: 
     app: myapp 
     deploymentconfig: myapp 
    strategy: 
     resources: {} 
    template: 
     metadata: 
     annotations: 
      openshift.io/container.myapp.image.entrypoint: '["python3"]' 
      openshift.io/generated-by: OpenShiftNewApp 
     creationTimestamp: null 
     labels: 
      app: myapp 
      deploymentconfig: myapp 
     spec: 
     containers: 
     - name: myapp 
      from: 
      kind: "ImageStreamTag" 
      name: "myapp-staging:latest" 
      resources: {} 
      command: 
      - scripts/start_server.sh 
      ports: 
      - containerPort: 8000 
    test: false 
    triggers: [] 
    status: {} 

但这会导致Kubernetes/OpenShift与抱怨:

The DeploymentConfig "myapp" is invalid. 
spec.template.spec.containers[0].image: required value 

如何指定构建配置的输出作为在部署配置中使用的映像?

谢谢你的时间!

而且,奇怪的是,如果我部署配置链接到构建配置有扳机,Kubernetes/OpenShift知道在综合泊坞窗,以查找图像:

- apiVersion: v1 
    kind: DeploymentConfig 
    metadata: 
    annotations: 
     openshift.io/generated-by: OpenShiftNewApp 
    creationTimestamp: null 
    labels: 
     app: myapp-staging 
    name: myapp-staging 
    spec: 
    replicas: 1 
    selector: 
     app: myapp-staging 
     deploymentconfig: myapp-staging 
    strategy: 
     resources: {} 
    template: 
     metadata: 
     annotations: 
      openshift.io/container.myapp.image.entrypoint: '["python3"]' 
      openshift.io/generated-by: OpenShiftNewApp 
     creationTimestamp: null 
     labels: 
      app: myapp-staging 
      deploymentconfig: myapp-staging 
     spec: 
     containers: 
     - name: myapp-staging 
      image: myapp-staging:latest 
      resources: {} 
      command: 
      - scripts/start_server.sh 
      ports: 
      - containerPort: 8000 
    test: false 
    triggers: 
    - type: "ImageChange" 
     imageChangeParams: 
     automatic: true 
     containerNames: 
     - myapp-staging 
     from: 
      kind: ImageStreamTag 
      name: myapp-staging:latest 
    status: {} 

但我不想自动触发...

更新1(2016年11月21日): 配置触发,但具有触发禁用(因此手动触发部署),仍留有部署无法找到图像:

$ oc describe pod myapp-1-oodr5 
Name:     myapp-1-oodr5 
Namespace:    myproject 
Security Policy:  restricted 
Node:     node.url/123.123.123.123 
Start Time:    Mon, 21 Nov 2016 09:20:26 -1000 
Labels:     app=myapp 
         deployment=myapp-1 
         deploymentconfig=myapp 
Status:     Pending 
IP:      123.123.123.123 
Controllers:   ReplicationController/myapp-1 
Containers: 
    myapp: 
    Container ID: 
    Image:    myapp-staging:latest 
    Image ID: 
    Port:    8000/TCP 
    Command: 
     scripts/start_server.sh 
    State:    Waiting 
     Reason:   ImagePullBackOff 
    Ready:    False 
    Restart Count:  0 
    Volume Mounts: 
     /var/run/secrets/kubernetes.io/serviceaccount from default-token-goe98 (ro) 
    Environment Variables: 
     ALLOWED_HOSTS: myapp-myproject.url 
Conditions: 
    Type   Status 
    Ready   False 
Volumes: 
    default-token-goe98: 
    Type:  Secret (a volume populated by a Secret) 
    SecretName: default-token-goe98 
QoS Tier:  BestEffort 
Events: 
    FirstSeen  LastSeen  Count From         SubobjectPath       Type   Reason   Message 
    ---------  --------  ----- ----         -------------       --------  ------   ------- 
    42s   42s    1  {scheduler }                     Scheduled  Successfully assigned myapp-1-oodr5 to node.url 
    40s   40s    1  {kubelet node.url} implicitly required container POD      Pulled   Container image "openshift3/ose-pod:v3.1.1.7" already present on machine 
    40s   40s    1  {kubelet node.url} implicitly required container POD      Created   Created with docker id d3318e880e4a 
    40s   40s    1  {kubelet node.url} implicitly required container POD      Started   Started with docker id d3318e880e4a 
    40s   24s    2  {kubelet node.url} spec.containers{myapp}       Pulling   pulling image "myapp-staging:latest" 
    38s   23s    2  {kubelet node.url} spec.containers{myapp}       Failed   Failed to pull image "myapp-staging:latest": Error: image library/myapp-staging:latest not found 
    35s   15s    2  {kubelet node.url} spec.containers{myapp}       Back-off  Back-off pulling image "myapp-staging:latest" 

更新2(08/23/2017): 如果这有助于他人,下面是解决方案的总结。

triggers:  
- type: "ImageChange" 
    imageChangeParams: 
    automatic: true # this is required to link the build and deployment 
    containerNames: 
    - myapp-staging 
    from: 
     kind: ImageStreamTag 
     name: myapp-staging:latest 

随着扳机和automatic设置为true,部署应在内部注册表使用的生成的图像。

有关使构建不触发部署的其他评论涉及到想要从内部注册表手动部署映像的单独要求。以下是关于该部分的更多信息:

构建需要在automatic设置为false之前触发部署至少一次。到目前为止一段时间,我是:

  1. 设置automatictrue
  2. 发起构建和部署部署完成后
  3. ,手动更改automaticfalse
  4. 手动,后来引发的部署(虽然我没有验证这是否部署过时的,过时的图像)

我最初尝试使用这个manu部署作为非开发人员进入Web控制台并进行部署的一种方式。但是这个要求已经被删除,所以每次构建触发器部署对我们来说都很好。构建可以在不同的分支构建,然后以不同的方式标记图像。部署可以使用恰当标记的图像。

希望有帮助!

回答

2

您是在手动构建资源定义吗?

如果您确实需要将其设置为两步,出于某种原因,使用oc new-build然后使用oc new-app会更容易。如果您只想一次性设置构建和部署,请使用oc new-app

例如,要一气呵成使用的设置构建和部署:

oc new-app --name myapp <repository-url> 

要做到这一点分两步使用:

oc new-build --name myapp <repository-url> 
oc new-app myapp 

如果仍然愿意使用手工创建的资源,至少使用具有--dry-run -o yaml选项的单步变体查看它将为图像流创建的内容以及构建和部署配置。这样你可以从中学习如何去做。您目前缺少的位是图像流。

顺便说一句。看起来有点怀疑你的入口点设置为python3。这非常不寻常。你现在想做什么,看起来你可能试图以某种方式做某些事情,而这种方式可能与OpenShift的工作方式无关。 OpenShift主要是关于长时间运行的进程,而不是用于执行单个docker run。你可以做后者,但不是你目前如何做。

+0

感谢您的反馈。我最初确实使用'oc new-app'来输出一个我已经建立的模板。我确实有一个我没有发布的构建配置YAML。但如果你认为这很重要,我可以发布它。我通常运行'oc create -f ...',并且创建并运行构建,映像流,部署,服务和路由。我正在尝试进行此修改以支持单独的分段和生产实例。暂存实例工作正常,因为触发器以某种方式使Openshift/Kubernetes找到正确的图像。我不想要生产实例... –

+0

...自动触发。因此,当我在没有触发器的情况下进行新的部署配置时,OpenShift/Kubernetes无法再查找从构建配置构建的映像,因为它看起来像Docker Hub。 –

+0

而'python3'是从'oc new-app'创建的模板剩余的。 'command'脚本似乎即使使用'入口点'也能运行服务器。再次感谢,请让我知道,如果你看到其他任何可疑的东西! :) –