簡體   English   中英

kube.netes“kubectl apply”如何不更新現有部署

[英]How to kubernetes "kubectl apply" does not update existing deployments

我有一個 .NET-core web 申請。 這被部署到 Azure Container Registry。 我將其部署到我的 Azure Kube.netes 服務使用

kubectl apply -f testdeployment.yaml

使用下面的 yaml 文件

 apiVersion: apps/v1 kind: Deployment metadata: name: myweb spec: replicas: 1 selector: matchLabels: app: myweb template: metadata: labels: app: myweb spec: containers: - name: myweb image: mycontainerregistry.azurecr.io/myweb:latest ports: - containerPort: 80 imagePullSecrets: - name: my-registry-key

這很好用,但是當我更改一些代碼時,將新代碼推送到容器並運行

kubectl apply -f 測試部署

再次,AKS/網站不會更新,直到我刪除部署

kubectl 刪除部署 myweb

我應該怎么做才能讓它覆蓋已部署的任何內容? 我想在我的 yaml 文件中添加一些內容。 (我試圖將其用於 Azure DevOps 中的持續交付)。

我相信您正在尋找的是 imagePullPolicy。 默認為 ifNotPresent,表示不會拉取最新版本。

https://kubernetes.io/docs/concepts/containers/images/

apiVersion: apps/v1
kind: Deployment
metadata:
  name: myweb
spec:
  replicas: 1
  selector:
    matchLabels:
      app: myweb
  template:
    metadata:
      labels:
        app: myweb
    spec:
      containers:
      - name: myweb
        image: mycontainerregistry.azurecr.io/myweb
        imagePullPolicy: Always
        ports:
        - containerPort: 80
      imagePullSecrets:
        - name: my-registry-key

要確保重新創建 pod,請運行:

kubectl delete -f testdeployment && kubectl apply -f testdeployment

kubectl在您的部署 yaml 文件中看不到任何更改,因此它不會進行任何更改。 這是使用latest標簽的問題之一。

將您的圖像標記為某個增量版本或內部版本號,並用 CI 管道中的該標記替換latest (例如使用envsubst或類似的)。 這樣kubectl知道鏡像已經改變了。 而且您還知道正在運行哪個版本的映像。 latest標簽可以是任何圖像版本。

Azure DevOps 的簡化示例:

# <snippet>
        image: mycontainerregistry.azurecr.io/myweb:${TAG}
# </snippet>

管道 YAML:

stages:
- stage: Build
  jobs:
  - job: Build
    variables:
    - name: TAG
      value: $(Build.BuildId)
    steps:
    - script: |
        envsubst '${TAG}' < deployment-template.yaml > deployment.yaml
      displayName: Replace Environment Variables

或者,您也可以使用其他工具,例如Replace Tokens (不同的語法: #{TAG}# )。

首先通過在部署文件的相對路徑上運行以下命令來刪除部署配置文件。

kubectl delete -f .\deployment-file-name.yaml

早些時候我曾經得到

deployment.apps/deployment-file-name 不變

意味着部署文件保持緩存。 當您修復部署 YAML 上的一些錯誤/拼寫錯誤時會發生這種情況,並且一旦錯誤被清除,配置就會被緩存。

只有kubectl delete -f.\deployment-file-name.yaml可以刪除緩存。

稍后您可以通過以下方式進行部署

kubectl apply -f .\deployment-file-name.yaml

示例 yaml 文件如下:


apiVersion:apps/v1 種類:部署元數據:名稱:部署文件名規范:副本:1 選擇器:matchLabels:應用程序:myservicename 模板:元數據:標簽:應用程序:平台服務規范:容器:-名稱:平台服務圖像:/平台服務:最新的

這里的問題是在 kubernetes 中運行的用於此部署的 pod 是舊的。 這就是為什么您在應用程序中看不到更改的原因。

每當您部署或推送新代碼時,您都必須刪除正在運行的 pod。 然后,它會從容器注冊表中拉取鏡像,並且您可以看到新的更改。

我建議您在應用部署文件后將其作為 CI/CD 管道中的一個步驟。 如果您手動應用 deployment.yml 文件,則必須使用以下命令手動刪除 pod:kubectl delete pod

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM