我们在 Kubernetes 1.9.0 上,想知道是否有办法在其 statefulset 配置文件中访问 pod 的“序数索引”。我们喜欢动态地为 pod 的标签分配一个值(从序数索引派生),然后在规范下使用它来设置 pod 关联(或反关联)。
或者,pod 的实例名称是否在 statefulset 配置文件中可用?如果是这样,我们希望从中提取序数索引并动态分配给标签(供以后用于亲和力)。
我们正在创建一个 kubernetes statefulset,用于挂载预先存在的 NFS 共享。
这是一个精简的示例:
apiVersion: apps/v1beta2
kind: StatefulSet
metadata:
name: hostname
spec:
replicas: 1
selector:
matchLabels:
app: test
template:
metadata:
labels:
app: test
spec:
containers:
- name: container
image: 4730230466298.dkr.ecr.us-east-1.amazonaws.com/container:latest
volumeMounts:
- name: efs
mountPath: /efs
readOnly: true
volumes:
- name: efs
nfs:
path: /
server: 10.33.1.90
readOnly: true
Run Code Online (Sandbox Code Playgroud)
这工作正常,并且 nfs 卷已正确安装到容器中。但是如何在挂载上指定挂载选项呢?我尝试设置 mountOptions 参数,如下所示: https: //kubernetes.io/docs/concepts/storage/persistent-volumes/#mount-options
在卷和volumeMount 上,但验证失败。我不需要(或不想)创建 PV 或 PVC,因为 nfs 卷已经存在于 k8s 之外,我只需要使用它。
是否有指定安装选项?
困境:使用相同的 docker 映像和代码,但配置不同(使用子域的不同客户端)部署多个应用程序和数据库容器对。
有哪些合乎逻辑的方法可以解决这个问题,因为 kubernetes 似乎没有支持这种设置的集成?
可能的方法
理想情况下,如果 StatefulSet 可以使用向下 api 根据有状态集的索引动态选择配置映射名称,这将解决问题(您基本上可以使用名称中的索引手动创建配置文件,并且它将被选择)适当地)。就像是:
env:
- name: POD_NAME
valueFrom:
fieldRef:
fieldPath: metadata.name
envFrom:
- configMapRef:
name: $(POD_NAME)-config
Run Code Online (Sandbox Code Playgroud)
然而,该功能在 kubernetes 中不可用。
我有一个非常简单的 Kubernetes pod。我想要一个有状态的集合并想要以下过程:
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: app
namespace: test
labels:
name: app
spec:
serviceName: app
replicas: 1
selector:
matchLabels:
app: app
template:
metadata:
labels:
app: app
spec:
initContainers:
- name: preparing
image: alpine:3.8
imagePullPolicy: IfNotPresent
command:
- "sh"
- "-c"
- |
echo "Downloading data"
wget https://s3.amazonaws.com/.........
tar -xvzf xxxx-........ -C /root/
volumeMounts:
- name: node-volume
mountPath: /root/data/
containers:
- name: main-container
image: ecr.us-west-2.amazonaws.com/image/:latest
imagePullPolicy: Always
volumeMounts: …Run Code Online (Sandbox Code Playgroud) 这是我的总体目标:
\n\n运行 MongoDB
通过 Pod 故障/更新等保留数据
我\xe2\x80\x99采取的方法:
\n\nK8S提供商:数字海洋
节点:3
创建PVC
创建无头服务
创建一个 StatefulSet
这里\xe2\x80\x99是配置的简化版本:
\n\napiVersion: v1\nkind: PersistentVolumeClaim\nmetadata:\n name: some-pvc\nspec:\n accessModes:\n - ReadWriteOnce\n resources:\n requests:\n storage: 5Gi\n storageClassName: do-block-storage\n---\napiVersion: v1\nkind: Service\nmetadata:\n name: some-headless-service\n labels:\n app: my-app\nspec:\n ports:\n - port: 27017\n name: my-app-database\n clusterIP: None\n selector:\n app: my-app\n tier: database\n---\napiVersion: apps/v1\nkind: StatefulSet\nmetadata:\n name: my-app-database\n labels:\n app: my-app\n tier: database\nspec:\n serviceName: some-headless-service\n replicas: 1\n selector:\n matchLabels:\n app: my-app\n tier: …Run Code Online (Sandbox Code Playgroud) 我正在尝试在 Kubernetes 上自动缩放 StatefulSet。为此,我需要获取当前的 Pod 数量。
处理部署时:
kubectl describe deployments [deployment-name] | grep desired | awk '{print $2}' | head -n1
Run Code Online (Sandbox Code Playgroud)
这会输出一个数字,即当前部署的数量。
然而,当你跑步时
kubectl describe statefulsets
Run Code Online (Sandbox Code Playgroud)
我们没有得到那么多信息。知道如何获取有状态集的当前副本数量吗?
autoscaling google-cloud-platform kubernetes google-kubernetes-engine statefulset
我正在尝试将现有的 NFS 与 StateFulSets 一起使用。
PresistentVolumeClaim使用 似乎自动创建volumeClaimTemplates。
问题:
但是,由于PresistentVolumeClaim索赔整个PresistentVolume. 我必须PresistentVolume手动创建所有副本。有没有办法在 Kubernetes 中动态配置 NFS 持久卷?
注意: NFS Server 本身是静态的,只需要在 K8s 中动态创建卷,而不是 NFS Server 本身。
我正在使用 mongo statefulset 示例:
---
apiVersion: v1
kind: Service
metadata:
name: mongo
labels:
name: mongo
spec:
ports:
- port: 27017
targetPort: 27017
clusterIP: None
selector:
role: mongo
---
apiVersion: apps/v1beta1
kind: StatefulSet
metadata:
name: mongo
spec:
serviceName: "mongo"
replicas: 3
template:
metadata:
labels:
role: mongo
spec:
terminationGracePeriodSeconds: 10 …Run Code Online (Sandbox Code Playgroud) nfs kubernetes persistent-volumes persistent-volume-claims statefulset
我正在配置一个 StatefulSet,我希望副本的数量(如下所示的spec.replicas)以某种方式作为参数传递给应用程序实例。我的应用程序需要spec.replicas来确定副本的数量,以便它知道要从 MySQL 表加载哪些行。我不想对spec.replicas和 application 参数中的副本数量进行硬编码,因为这在向上或向下缩放副本数量时不起作用,因为在缩放时需要调整 application 参数。
这是我的 StatefulSet 配置:
apiVersion: 应用程序/v1beta1
种类:StatefulSet
元数据:
标签:
运行:我的应用程序
名称:我的应用程序
命名空间:my-ns
规格:
复制品:3
选择器:
匹配标签:
运行:我的应用程序
服务名称:我的应用程序
podManagementPolicy:并行
模板:
元数据:
标签:
运行:我的应用程序
规格:
容器:
- 名称:我的应用程序
图片:我的应用程序:最新
命令:
- /bin/sh
- /bin/start.sh
- 开发
- 2000米
- “0”
- "3" **需要替换为#个副本**
- 127.0.0.1
- “32990”
imagePullPolicy:始终
活性探针:
获取:
路径:/健康
端口:8081
初始延迟秒数:180
周期秒数:10
超时秒数:3
就绪探针:
失败阈值:10
获取:
路径:/就绪
端口:8081
方案:HTTP
初始延迟秒数:30
周期秒数:15
成功阈值:1
超时秒数:3
端口:
- 容器端口:8080 … 我目前正在尝试创建一组 X pod,每个都有一个个人持久卷。为此,我创建了一个StateFulSet带有 X 个副本的副本,并且PersistentVolumeClaimTemplate该部分正在工作。
问题是似乎不可能以与 a 相同的方式使用 LoadBalancer 公开那些 pod deployment(因为 pod 在 statefulset 中的唯一性)。
此刻我试图将它公开,因为一个简单的部署女巫不起作用,我发现的唯一方法是一个一个地公开每个豆荚(我没有测试过,但我在this上看到了它)但它是没有那么可扩展...
我没有在任何云提供商平台上运行 kubernetes,那么请避免使用独占命令行。
我有一个运行Multipe应用程序(服务)的Kubernetes环境。现在,我有点困惑如何设置MySQL数据库实例。
根据不同的来源,每个微服务都应该有自己的数据库。我应该在HA模式下创建一个运行多个数据库的MySQL状态集还是为每个运行一个数据库的应用程序(服务)部署一个单独的MySQL实例。
我的第一个想法是第一选择,因此HA总体上应在哪里使用?希望听到一些与此不同的看法。
kubernetes ×10
statefulset ×10
autoscaling ×1
configmap ×1
database ×1
deployment ×1
docker ×1
kops ×1
mysql ×1
nfs ×1