我是Kubernetes的新手,可能会被推测,所以请原谅我,如果我对术语的使用不太正确的话.我希望我的问题的意图是明确的.
我试图围绕有状态集合.它们的使用与使用持久卷的"无状态"Pod有何不同?也就是说,假设一个"正常"的Pod可能声称持久存储,我错过了哪些显而易见的东西需要这个新的构造(有序的启动/停止等)?
我正在使用 mysql Kubernetes statefulset,我将 PV 映射到主机目录(CentOS 8 VM)但得到“pod has unbound直接 PersistentVolumeClaims”
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: mysql-container
spec:
serviceName: mysql
replicas: 1
selector:
matchLabels:
app: mysql-container
template:
metadata:
labels:
app: mysql-container
spec:
containers:
- name: mysql-container
image: mysql:dev
imagePullPolicy: "IfNotPresent"
envFrom:
- secretRef:
name: prod-secrets
ports:
- containerPort: 3306
# container (pod) path
volumeMounts:
- name: mysql-persistent-storage
mountPath: /var/lib/mysql
volumes:
- name: mysql-persistent-storage
persistentVolumeClaim:
claimName: mysql-pvc
volumeClaimTemplates:
- metadata:
name: data
spec:
storageClassName: localstorage
accessModes: ["ReadWriteOnce"]
resources:
requests:
storage: …Run Code Online (Sandbox Code Playgroud) 我最近将 StatefulSet 中的 podManagementPolicy 字段从默认(OrderedReady)更新为 Parallel。
我想知道我是否会遇到任何问题?
cloud kubernetes microservices kubernetes-statefulset kubernetes-pod
在 GKE 上,我将有状态集资源设置为
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: redis
spec:
serviceName: "redis"
selector:
matchLabels:
app: redis
updateStrategy:
type: RollingUpdate
replicas: 3
template:
metadata:
labels:
app: redis
spec:
containers:
- name: redis
image: redis
resources:
limits:
memory: 2Gi
ports:
- containerPort: 6379
volumeMounts:
- name: redis-data
mountPath: /usr/share/redis
volumes:
- name: redis-data
persistentVolumeClaim:
claimName: redis-data-pvc
Run Code Online (Sandbox Code Playgroud)
想要使用 PVC 所以创建了这个。(这一步是在statefulset部署之前完成的)
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: redis-data-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
Run Code Online (Sandbox Code Playgroud)
当检查kubernetes中的资源时
kubectl get pvc
NAME …Run Code Online (Sandbox Code Playgroud) kubernetes google-kubernetes-engine persistent-volumes kubernetes-pvc kubernetes-statefulset
我需要在 kubernetes 集群上设置一个基本的 rabbit mq 实例(没有集群设置),而没有持久性或安全性要求。
我需要的:
单个rabbit mq pod作为有状态集运行,副本数= 1,并通过特定的url(amgp端口和管理接口端口)从集群内部和外部访问它
我不需要的东西:
到目前为止,我发现的舵图都是通过集群、持久性等解决生产设置的,但我不需要这些东西,因为我将仅使用实例进行测试
这是我到目前为止:
apiVersion: v1
kind: Service
metadata:
name: rs-rmq-mgt
spec:
selector:
app: rs-rmq
ports:
- protocol: TCP
port: 1337
targetPort: 15672
type: NodePort
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: rs-rmq
spec:
selector:
matchLabels:
app: rs-rmq
serviceName: "rs-rmq"
replicas: 1
template:
metadata:
labels:
app: rs-rmq
spec:
containers:
- name: rs-rmq
image: rabbitmq:management
ports:
- containerPort: 25672
- containerPort: 5672
- containerPort: 4369
- containerPort: 15672
Run Code Online (Sandbox Code Playgroud) rabbitmq kubernetes kubernetes-ingress kubernetes-statefulset
我正在使用 Kubernetes 运行 Docker Desktop。
我可以通过 ssh 连接到该节点,并且该节点上正在运行其他 pod。
但是,当我将 StatefulSet 应用于集群时,我得到:
0/1 nodes are available: 1 pod has unbound immediate PersistentVolumeClaims. preemption: 0/1 nodes are available: 1 Preemption is not helpful for scheduling.
Run Code Online (Sandbox Code Playgroud)
状态集在这里:
https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/#components
kubectl get no
NAME STATUS ROLES AGE VERSION
docker-desktop Ready control-plane 6d2h v1.24.1
Run Code Online (Sandbox Code Playgroud) 正如文档所述:
对于 StatefulSet 中定义的每个 VolumeClaimTemplate 条目,每个 Pod 都会收到一个 PersistentVolumeClaim。在上面的 nginx 示例中,每个 Pod 都会收到一个具有 my-storage-class 的 StorageClass 和 1 Gib 预配置存储的 PersistentVolume。如果未指定 StorageClass,则将使用默认 StorageClass。当 Pod 被(重新)调度到节点上时,其 volumeMount 会挂载与其 PersistentVolume Claims 关联的 PersistentVolume。请注意,删除 Pod 或 StatefulSet 时,与 Pod 的 PersistentVolume Claim 关联的 PersistentVolume 不会被删除。这必须手动完成。
我感兴趣的部分是:If no StorageClassis specified, then the default StorageClass will be used
我创建了一个 StatefulSet,如下所示:
apiVersion: apps/v1
kind: StatefulSet
metadata:
namespace: ches
name: ches
spec:
serviceName: ches
replicas: 1
selector:
matchLabels:
app: ches
template:
metadata:
labels:
app: …Run Code Online (Sandbox Code Playgroud) 我想在virtualbox的kubernetes中创建一个statefulset elasticsearch。我没有使用云提供商,所以我为我的statefulset的两个副本创建了两个持久卷本地:
pv0:
kind: PersistentVolume
apiVersion: v1
metadata:
name: pv-elk-0
namespace: elk
labels:
type: local
spec:
storageClassName: gp2
capacity:
storage: 5Gi
accessModes:
- ReadWriteOnce
hostPath:
path: "/mnt/data/pv0"
Run Code Online (Sandbox Code Playgroud)
pv1:
kind: PersistentVolume
apiVersion: v1
metadata:
name: pv-elk-1
namespace: elk
labels:
type: local
spec:
storageClassName: gp2
capacity:
storage: 5Gi
accessModes:
- ReadWriteOnce
hostPath:
path: "/mnt/data/pv1"
Run Code Online (Sandbox Code Playgroud)
状态集:
apiVersion: apps/v1beta1
kind: StatefulSet
metadata:
name: elasticsearch-logging
namespace: elk
labels:
k8s-app: elasticsearch-logging
version: v5.6.2
kubernetes.io/cluster-service: "true"
addonmanager.kubernetes.io/mode: Reconcile
spec:
serviceName: elasticsearch-logging
replicas: 2
selector:
matchLabels:
k8s-app: elasticsearch-logging …Run Code Online (Sandbox Code Playgroud) 有时,我需要对 StatefulSet 中的所有 Pod 进行滚动替换,以便所有 PV 也从头开始重新创建。这样做的原因是摆脱所有使用旧版本加密密钥的底层硬盘驱动器。此操作不应与常规滚动升级相混淆,为此我仍然希望卷能够在 Pod 终止后继续存在。到目前为止,我认为最好的例程如下:
我对第 5 步不满意。我希望 StatefulSet 为我重新创建 PVC,但不幸的是它没有。我必须自己做,否则 Pod 创建失败并出现以下错误:
Warning FailedScheduling 3s (x15 over 15m) default-scheduler persistentvolumeclaim "foo-bar-0" not found
Run Code Online (Sandbox Code Playgroud)
有更好的方法吗?
我有一个有 2 个副本的 StatefulSet。我想创建一个端点,以便能够访问该副本的任何一个,并传递主机名 ID,并且如果我将其扩展到更多副本,则需要可以访问新的 Pod。
我可以像这样创建一个 Ingress:
apiVersion: voyager.appscode.com/v1beta1
kind: Ingress
metadata:
name: test-ingress
namespace: default
spec:
rules:
- host: appscode.example.com
http:
paths:
- path: /0
backend:
hostNames:
- web-0
serviceName: nginx-set
servicePort: '80'
- path: /1
backend:
hostNames:
- web-1
serviceName: nginx-set
servicePort: '80'
Run Code Online (Sandbox Code Playgroud)
这样,GETonappscode.example.com/0将被路由到web-0pod。但是,我怎样才能以动态的方式做到这一点呢?如果我将副本更改为 3,我将需要手动创建一条新的 pod 路径web-2才能访问。