将 Kubernetes 卷限制为单个 pod
Restrict Kubernetes volume to a single pod
我有一个 Scylla 数据库的 Kubernetes 部署,并附加了一个卷。它有一个副本,清单类似于以下内容:
apiVersion: apps/v1
kind: Deployment
metadata:
name: scylla
labels:
app: myapp
role: scylla
spec:
replicas: 1
selector:
matchLabels:
app: myapp
role: scylla
template:
metadata:
labels:
app: myapp
role: scylla
spec:
containers:
- name: scylla
image: scylladb/scylla
imagePullPolicy: Always
volumeMounts:
- mountPath: /var/lib/scylla/data
name: scylladb
volumes:
- name: scylladb
hostPath:
path: /var/myapp/scylla/
type: DirectoryOrCreate
当我执行更新时,它会终止旧的 pod 并在旧的 pod 停止之前启动一个新的 pod。这会导致新 pod 上的数据库失败,因为它无法访问存储在卷中的数据库文件(因为旧 pod 仍在使用它)。我怎样才能使一次只有一个 pod 使用该卷? (停机时间短是可以的)
您可以在 Deployment 中使用 Recreate Strategy 来做到这一点。这将在创建新的 Pods 之前杀死所有现有的 Pods 。参考:Kubernetes doc。因此,他们将因此而停机。
apiVersion: apps/v1
kind: Deployment
metadata:
name: scylla
labels:
app: myapp
role: scylla
spec:
replicas: 1
selector:
matchLabels:
app: myapp
role: scylla
strategy:
type: Recreate
template:
metadata:
labels:
app: myapp
role: scylla
spec:
containers:
- name: scylla
image: scylladb/scylla
imagePullPolicy: Always
volumeMounts:
- mountPath: /var/lib/scylla/data
name: scylladb
volumes:
- name: scylladb
hostPath:
path: /var/myapp/scylla/
type: DirectoryOrCreate
我有一个 Scylla 数据库的 Kubernetes 部署,并附加了一个卷。它有一个副本,清单类似于以下内容:
apiVersion: apps/v1
kind: Deployment
metadata:
name: scylla
labels:
app: myapp
role: scylla
spec:
replicas: 1
selector:
matchLabels:
app: myapp
role: scylla
template:
metadata:
labels:
app: myapp
role: scylla
spec:
containers:
- name: scylla
image: scylladb/scylla
imagePullPolicy: Always
volumeMounts:
- mountPath: /var/lib/scylla/data
name: scylladb
volumes:
- name: scylladb
hostPath:
path: /var/myapp/scylla/
type: DirectoryOrCreate
当我执行更新时,它会终止旧的 pod 并在旧的 pod 停止之前启动一个新的 pod。这会导致新 pod 上的数据库失败,因为它无法访问存储在卷中的数据库文件(因为旧 pod 仍在使用它)。我怎样才能使一次只有一个 pod 使用该卷? (停机时间短是可以的)
您可以在 Deployment 中使用 Recreate Strategy 来做到这一点。这将在创建新的 Pods 之前杀死所有现有的 Pods 。参考:Kubernetes doc。因此,他们将因此而停机。
apiVersion: apps/v1
kind: Deployment
metadata:
name: scylla
labels:
app: myapp
role: scylla
spec:
replicas: 1
selector:
matchLabels:
app: myapp
role: scylla
strategy:
type: Recreate
template:
metadata:
labels:
app: myapp
role: scylla
spec:
containers:
- name: scylla
image: scylladb/scylla
imagePullPolicy: Always
volumeMounts:
- mountPath: /var/lib/scylla/data
name: scylladb
volumes:
- name: scylladb
hostPath:
path: /var/myapp/scylla/
type: DirectoryOrCreate