Skaffold 1.4.0: "Skipping deploy due to sync error: copying files:"
Skaffold 1.4.0: "Skipping deploy due to sync error: copying files:"
使用:
Skaffold 1.4.0
minikube 1.6.2
kubectl: 客户端 1.15.5 和服务器 1.17.0
Django 3.0.3
Python 3.8.2
我最近刚开始收到此错误,因为我正在使用 Django API。每当我在进行更改后保存时,我都会得到:
WARN[0234] Skipping deploy due to sync error: copying files: Running [kubectl --context minikube exec api-deployment-6946878554-n7lc2 --namespace default -c api -i -- tar xmf - -C / --no-same-owner]
- stdout:
- stderr: error: unable to upgrade connection: container not found ("api")
: exit status 1
不确定是什么改变导致了这个。我必须执行 CTRL + C
来关闭 Skaffold 并重新启动它以反映更改。
这是我的 skaffold.yaml
:
apiVersion: skaffold/v1beta15
kind: Config
build:
local:
push: false
artifacts:
- image: postgres
context: postgres
docker:
dockerfile: Dockerfile.dev
sync:
manual:
- src: "***/*.sql"
dest: .
- image: testappacr.azurecr.io/test-app-api
context: api
docker:
dockerfile: Dockerfile.dev
sync:
manual:
- src: "***/*.py"
dest: .
deploy:
kubectl:
manifests:
- manifests/dev-ingress.yaml
- manifests/postgres.yaml
- manifests/api.yaml
还有api.yaml
:
apiVersion: apps/v1
kind: Deployment
metadata:
name: api-deployment
spec:
replicas: 3
selector:
matchLabels:
component: api
template:
metadata:
labels:
component: api
spec:
containers:
- name: api
image: testappacr.azurecr.io/test-app-api
ports:
- containerPort: 5000
env:
- name: PGUSER
valueFrom:
secretKeyRef:
name: test-app-secrets
key: PGUSER
- name: PGHOST
value: postgres-cluster-ip-service
- name: PGPORT
value: "1423"
- name: PGDATABASE
valueFrom:
secretKeyRef:
name: test-app-secrets
key: PGDATABASE
- name: PGPASSWORD
valueFrom:
secretKeyRef:
name: test-app-secrets
key: PGPASSWORD
- name: SECRET_KEY
valueFrom:
secretKeyRef:
name: test-app-secrets
key: SECRET_KEY
- name: DEBUG
valueFrom:
secretKeyRef:
name: test-app-secrets
key: DEBUG
livenessProbe:
tcpSocket:
port: 5000
initialDelaySeconds: 2
periodSeconds: 2
readinessProbe:
tcpSocket:
port: 5000
initialDelaySeconds: 2
periodSeconds: 2
volumeMounts:
- mountPath: "/mnt/test-app"
name: file-storage
volumes:
- name: file-storage
persistentVolumeClaim:
claimName: file-storage
---
apiVersion: v1
kind: Service
metadata:
name: api-cluster-ip-service
spec:
type: ClusterIP
selector:
component: api
ports:
- port: 5000
targetPort: 5000
对这里可能发生的事情有什么建议吗?
发现问题是由 readinessProbe
和 api.yaml
中的 livenessProbe
引起的。
livenessProbe:
tcpSocket:
port: 5000
initialDelaySeconds: 2
periodSeconds: 2
readinessProbe:
tcpSocket:
port: 5000
initialDelaySeconds: 2
periodSeconds: 2
现在我没有收到这个错误。
然而,我首先将它们放在那里的原因是因为 skaffold
有时会在 API 之后启动数据库,导致它失败。所以这就是我的权衡:没有 probes
DB 偶尔会在 API 之后启动导致失败或有它们并且它更频繁地导致与这个问题相关的错误。
对于其他完全不熟悉 Kubernetes 的人,请注意,此错误的发生可能只是因为您的服务器 script/process 在尝试执行 skaffold-sync 命令之前已完成; kubernetes 将进程的结束解释为失败,因此关闭容器(或至少关闭容器,以便 skaffold 无法调用它来应用文件同步)。
更多信息在这里:
因此,解决方案是通过 运行 睡眠和日志循环或其他方式“让您的进程保持活动状态”。 (即使它没有真正的工作要做,例如,如果您刚刚编写了一个记录和退出的测试脚本)
NodeJS 示例:
console.log("Test server-script started!");
// loop forever, to keep process alive, so kubernetes doesn't kill the container, so skaffold-sync can work
while (true) {
console.log("Keep-alive loop. Time:", Date.now());
await new Promise(resolve=>setTimeout(resolve, 1000));
}
使用:
Skaffold 1.4.0
minikube 1.6.2
kubectl: 客户端 1.15.5 和服务器 1.17.0
Django 3.0.3
Python 3.8.2
我最近刚开始收到此错误,因为我正在使用 Django API。每当我在进行更改后保存时,我都会得到:
WARN[0234] Skipping deploy due to sync error: copying files: Running [kubectl --context minikube exec api-deployment-6946878554-n7lc2 --namespace default -c api -i -- tar xmf - -C / --no-same-owner]
- stdout:
- stderr: error: unable to upgrade connection: container not found ("api")
: exit status 1
不确定是什么改变导致了这个。我必须执行 CTRL + C
来关闭 Skaffold 并重新启动它以反映更改。
这是我的 skaffold.yaml
:
apiVersion: skaffold/v1beta15
kind: Config
build:
local:
push: false
artifacts:
- image: postgres
context: postgres
docker:
dockerfile: Dockerfile.dev
sync:
manual:
- src: "***/*.sql"
dest: .
- image: testappacr.azurecr.io/test-app-api
context: api
docker:
dockerfile: Dockerfile.dev
sync:
manual:
- src: "***/*.py"
dest: .
deploy:
kubectl:
manifests:
- manifests/dev-ingress.yaml
- manifests/postgres.yaml
- manifests/api.yaml
还有api.yaml
:
apiVersion: apps/v1
kind: Deployment
metadata:
name: api-deployment
spec:
replicas: 3
selector:
matchLabels:
component: api
template:
metadata:
labels:
component: api
spec:
containers:
- name: api
image: testappacr.azurecr.io/test-app-api
ports:
- containerPort: 5000
env:
- name: PGUSER
valueFrom:
secretKeyRef:
name: test-app-secrets
key: PGUSER
- name: PGHOST
value: postgres-cluster-ip-service
- name: PGPORT
value: "1423"
- name: PGDATABASE
valueFrom:
secretKeyRef:
name: test-app-secrets
key: PGDATABASE
- name: PGPASSWORD
valueFrom:
secretKeyRef:
name: test-app-secrets
key: PGPASSWORD
- name: SECRET_KEY
valueFrom:
secretKeyRef:
name: test-app-secrets
key: SECRET_KEY
- name: DEBUG
valueFrom:
secretKeyRef:
name: test-app-secrets
key: DEBUG
livenessProbe:
tcpSocket:
port: 5000
initialDelaySeconds: 2
periodSeconds: 2
readinessProbe:
tcpSocket:
port: 5000
initialDelaySeconds: 2
periodSeconds: 2
volumeMounts:
- mountPath: "/mnt/test-app"
name: file-storage
volumes:
- name: file-storage
persistentVolumeClaim:
claimName: file-storage
---
apiVersion: v1
kind: Service
metadata:
name: api-cluster-ip-service
spec:
type: ClusterIP
selector:
component: api
ports:
- port: 5000
targetPort: 5000
对这里可能发生的事情有什么建议吗?
发现问题是由 readinessProbe
和 api.yaml
中的 livenessProbe
引起的。
livenessProbe:
tcpSocket:
port: 5000
initialDelaySeconds: 2
periodSeconds: 2
readinessProbe:
tcpSocket:
port: 5000
initialDelaySeconds: 2
periodSeconds: 2
现在我没有收到这个错误。
然而,我首先将它们放在那里的原因是因为 skaffold
有时会在 API 之后启动数据库,导致它失败。所以这就是我的权衡:没有 probes
DB 偶尔会在 API 之后启动导致失败或有它们并且它更频繁地导致与这个问题相关的错误。
对于其他完全不熟悉 Kubernetes 的人,请注意,此错误的发生可能只是因为您的服务器 script/process 在尝试执行 skaffold-sync 命令之前已完成; kubernetes 将进程的结束解释为失败,因此关闭容器(或至少关闭容器,以便 skaffold 无法调用它来应用文件同步)。
更多信息在这里:
因此,解决方案是通过 运行 睡眠和日志循环或其他方式“让您的进程保持活动状态”。 (即使它没有真正的工作要做,例如,如果您刚刚编写了一个记录和退出的测试脚本)
NodeJS 示例:
console.log("Test server-script started!");
// loop forever, to keep process alive, so kubernetes doesn't kill the container, so skaffold-sync can work
while (true) {
console.log("Keep-alive loop. Time:", Date.now());
await new Promise(resolve=>setTimeout(resolve, 1000));
}