Tor*_*ger 112 pull image kubernetes
我在GKE上的Kubernetes中有以下复制控制器:
apiVersion: v1
kind: ReplicationController
metadata:
name: myapp
labels:
app: myapp
spec:
replicas: 2
selector:
app: myapp
deployment: initial
template:
metadata:
labels:
app: myapp
deployment: initial
spec:
containers:
- name: myapp
image: myregistry.com/myapp:5c3dda6b
ports:
- containerPort: 80
imagePullPolicy: Always
imagePullSecrets:
- name: myregistry.com-registry-key
Run Code Online (Sandbox Code Playgroud)
现在,如果我说
kubectl rolling-update myapp --image=us.gcr.io/project-107012/myapp:5c3dda6b
Run Code Online (Sandbox Code Playgroud)
执行滚动更新,但没有重新拉动.为什么?
Wer*_*ght 95
如果有的话,Kubernetes将会使用Pod创建(请参阅更新图像文档):
:latestimagePullPolicy: Always 已指定如果你想总是拉,这很好.但是,如果您想按需执行该操作:例如,如果您想使用some-public-image:latest但只想在您要求时手动提取新版本.你现在可以:
imagePullPolicy于IfNotPresent或Never与前拉:每个群集节点,因此最新的缓存上拉手动图像,然后做一个kubectl rolling-update或类似的重新启动吊舱(丑容易坏劈!)imagePullPolicy,做一个kubectl apply,重启pod(例如kubectl rolling-update),还原imagePullPolicy,重做kubectl apply(丑陋!)some-public-image:latest送到您的私人存储库并执行kubectl rolling-update(重!)对于on-demande pull来说没有好的解决方案.如果有变化,请评论; 我会更新这个anwser.
Tor*_*ger 50
必须imagePullPolicy在容器数据内部而不是在规范数据内部进行分组.但是,我提出了一个问题,因为我发现它很奇怪.此外,没有错误信息.
所以,这个规范片段有效:
spec:
containers:
- name: myapp
image: myregistry.com/myapp:5c3dda6b
ports:
- containerPort: 80
imagePullPolicy: Always
imagePullSecrets:
- name: myregistry.com-registry-key
Run Code Online (Sandbox Code Playgroud)
Eve*_*ews 22
我在开发过程中的黑客攻击是更改我的部署清单以添加最新标记,并始终如此拉动
image: etoews/my-image:latest
imagePullPolicy: Always
Run Code Online (Sandbox Code Playgroud)
然后我手动删除pod
kubectl delete pod my-app-3498980157-2zxhd
Run Code Online (Sandbox Code Playgroud)
因为它是一个部署,Kubernetes将自动重新创建pod并提取最新图像.
Tam*_*lyn 13
一个流行的解决方法是使用虚拟注释(或标签)修补部署:
kubectl patch deployment <name> -p \
"{\"spec\":{\"template\":{\"metadata\":{\"annotations\":{\"date\":\"`date +'%s'`\"}}}}}"
Run Code Online (Sandbox Code Playgroud)
假设您的部署满足这些要求,这将导致K8拉动任何新映像并重新部署。
Ora*_*bîg 12
现在,kubectl rollout restart deploy YOUR-DEPLOYMENT结合imagePullPolicy: Always策略的命令将允许您使用最新版本的映像重新启动所有 pod。
Gin*_*nts 10
strategy:
type: Recreate
rollingUpdate: null
Run Code Online (Sandbox Code Playgroud)
template:
metadata:
labels:
app.kubernetes.io/name: AppName
app.kubernetes.io/instance: ReleaseName
annotations:
rollme: {{ randAlphaNum 5 | quote }}
Run Code Online (Sandbox Code Playgroud)
containers:
- name: {{ .Chart.Name }}
image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
imagePullPolicy: Always
Run Code Online (Sandbox Code Playgroud)
iou*_*das 10
在浏览了所有其他答案但不满意之后,我在这里找到了更好的解决方案: https: //cloud.google.com/kubernetes-engine/docs/how-to/updating-apps
它无需使用最新标签或imagePullPolicy: Always 即可工作。如果您通过指定图像 sha256 摘要将新图像推送到同一标签,它也可以工作。
脚步:
kubectl get deploymentskubectl set image deployment/<your-deployment> <your_container_name>=<some/image>@sha256:<your sha>kubectl scale deployment <your-deployment>--replicas=0kubectl scale deployment <your-deployment>--replicas=original replicas count注意:推出也可能比扩展更有效,但就我而言,我们没有足够的硬件资源来创建另一个实例,k8s 就会陷入困境。
# Linux
kubectl patch deployment <name> -p "{\"spec\":{\"template\":{\"metadata\":{\"annotations\":{\"date\":\"`date +'%s'`\"}}}}}"
# windows
kubectl patch deployment <name> -p (-join("{\""spec\"":{\""template\"":{\""metadata\"":{\""annotations\"":{\""date\"":\""" , $(Get-Date -Format o).replace(':','-').replace('+','_') , "\""}}}}}"))
Run Code Online (Sandbox Code Playgroud)
此答案旨在在您的节点已下载同名镜像的情况下强制拉取镜像,因此即使您将新镜像推送到容器注册表,当您启动一些 pod 时,您的 pod 也会显示“镜像已经存在”。
对于 Azure Container Registry 中的一个案例(可能 AWS 和 GCP 也提供了这个):
您可以查看您的 Azure 容器注册表,并通过检查清单创建日期来确定哪个映像是最新的。
然后,复制其摘要哈希(格式为sha256:xxx...xxx)。
您可以通过运行以下命令缩小当前副本。请注意,这显然会停止您的容器并导致停机。
kubectl scale --replicas=0 deployment <deployment-name> -n <namespace-name>
Run Code Online (Sandbox Code Playgroud)
kubectl get deployments.apps <deployment-name> -o yaml > deployment.yaml
Run Code Online (Sandbox Code Playgroud)
然后将带有图像字段的行从 更改<image-name>:<tag>为<image-name>@sha256:xxx...xxx,保存文件。
现在您可以再次扩展您的副本。新图像将以其独特的摘要被拉出。
注意:假设容器中存在 imagePullPolicy: Always 字段。
显然,现在当您使用与--image现有容器图像相同的参数运行滚动更新时,您还必须指定一个--image-pull-policy.当以下命令与容器图像相同时,应强制拉动图像:
kubectl rolling-update myapp --image=us.gcr.io/project-107012/myapp:5c3dda6b --image-pull-policy Always
我已经为我的 springboot api 使用了 kubectl rollout restart 并且它有效。
kubectl rollout restart -f pod-staging.yml --namespace test
Run Code Online (Sandbox Code Playgroud)
用于部署的 Yaml:
apiVersion: "apps/v1"
kind: "Deployment"
metadata:
name: "my-api"
labels:
app: "my-api"
spec:
replicas: 1
selector:
matchLabels:
app: "my-api"
template:
metadata:
labels:
app: "my-api"
spec:
containers:
- name: my-api
image: harbor.url.com/mycompany/my-api:staging
ports:
- containerPort: 8099
protocol: TCP
imagePullPolicy: Always
livenessProbe:
httpGet:
path: /actuator/health/liveness
port: 8099
initialDelaySeconds: 90
periodSeconds: 10
readinessProbe:
httpGet:
path: /actuator/health/readiness
port: 8099
initialDelaySeconds: 90
periodSeconds: 5
envFrom:
- configMapRef:
name: "my-api-configmap"
env:
- name: "TOKEN_VALUE"
valueFrom:
secretKeyRef:
name: "my-api-secret"
key: "TOKEN_VALUE"
resources:
requests:
memory: "512Mi"
cpu: "500m"
limits:
memory: "2048Mi"
cpu: "1000m"
imagePullSecrets:
- name: "my-ci-user"
Run Code Online (Sandbox Code Playgroud)