我有一个由3个主机组成的kubernetes集群,其中每个主机都有一个唯一的ID标签.在此群集上有一个具有3个实例(副本)的软件.
每个副本都需要与所有其他副本进行通信.此外,还有一个包含所有pod的服务,以便此应用程序永久可用.
所以我有:
Instance1 (with labels run: theTool,instanceid: 1)
Instance2 (with labels run: theTool,instanceid: 2)
Instance3 (with labels run: theTool,instanceid: 3)
Run Code Online (Sandbox Code Playgroud)
和
Service1 (selecting pods with label instanceid=1)
Service2 (selecting pods with label instanceid=2)
Service3 (selecting pods with label instanceid=3)
Service (selecting pods with label run=theTool)
Run Code Online (Sandbox Code Playgroud)
这种方法有效,但我无法扩展或使用滚动更新功能.
我想定义一个包含3个副本的部署,其中每个副本都获得一个唯一的通用标签(例如副本ID,如1/3,2/3等).
在服务中,我可以使用选择器来获取即使在更新后也会存在的标签.
另一种解决方案可能是选择pod/deployment,具体取决于运行它的主机.我可以使用DaemonSet或只是一个具有亲缘关系的pod /部署来确保每个主机都具有我部署的完全一个副本.
但我不知道如何根据运行它的主机标签选择一个pod.
使用主机名不是一个选项,因为主机名将在不同的环境中更改.
我已经搜索了文档,但对这个用例没什么好处的.希望这里有人知道如何解决这个问题.
我们有一组部署(一组Pod)都使用相同的docker映像。例子:
它们都需要一组通用的环境变量,例如数据库主机的位置,外部服务的秘密密钥等。它们还具有一组不通用的环境变量。
无论如何,有人可以:
最佳解决方案是一种了解名称空间的解决方案,因为我们使用kubernetes名称空间来分隔测试,阶段和产品环境。
类似于dockers env_file的东西会很好。但我找不到与此相关的任何示例或参考。我唯一能找到的是通过机密设置env,但这并不干净,因为我仍然需要为每个部署编写所有环境变量。
我正在尝试弄清Kubernetes。我射击以下命令:
kubectl get deployment
Run Code Online (Sandbox Code Playgroud)
我在输出中得到以下标题:
我无法在以下输出中找到current和available列之间的区别?
我知道官方文档对这些领域都有一个简短的描述,但是并不能回答我的以下问题:
Current<= Desired真的吗?Up-to-Date<= Current真的吗?Up-to-Date> Current和Up-to-Date<= Desired真的吗?Available始终<= Current,也可以是> Available?简而言之,所有这些字段之间是什么关系?
deployment kubernetes kubernetes-deployment kubernetes-cluster
如果replica-set-name使用如下 api,我可以获得 ReplicaSet :
GET /apis/apps/v1/namespaces/{namespace}/replicasets/{name}
Run Code Online (Sandbox Code Playgroud)
但是如何根据部署获取ReplicaSet呢?
任何帮助表示赞赏。
谢谢
我的部署使用了几个卷,所有卷都定义为ReadWriteOnce.
将部署应用到干净的集群时,pod 已成功创建。
但是,如果我更新我的部署(即更新容器映像),当为我的部署创建一个新的 pod 时,它总是会在卷挂载时失败:
/Mugen$ kubectl get pods
NAME READY STATUS RESTARTS AGE
my-app-556c8d646b-4s2kg 5/5 Running 1 2d
my-app-6dbbd99cc4-h442r 0/5 ContainerCreating 0 39m
/Mugen$ kubectl describe pod my-app-6dbbd99cc4-h442r
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 9m default-scheduler Successfully assigned my-app-6dbbd99cc4-h442r to gke-my-test-default-pool-671c9db5-k71l
Warning FailedAttachVolume 9m attachdetach-controller Multi-Attach error for volume "pvc-b57e8a7f-1ca9-11e9-ae03-42010a8400a8" Volume is already used by pod(s) my-app-556c8d646b-4s2kg
Normal SuccessfulMountVolume 9m kubelet, gke-my-test-default-pool-671c9db5-k71l MountVolume.SetUp succeeded for volume "default-token-ksrbf"
Normal SuccessfulAttachVolume 9m …Run Code Online (Sandbox Code Playgroud) kubernetes google-kubernetes-engine kubernetes-pvc kubernetes-deployment
我已经浏览了以下docomentation页面:https://kubernetes.io/docs/concepts/workloads/controllers/deployment/
示例部署yaml如下:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.7.9
ports:
- containerPort: 80
Run Code Online (Sandbox Code Playgroud)
我们可以在这里看到app: nginx提到标签的三个不同时间.
为什么我们需要每一个?我从官方文档中很难理解它.
我正在尝试从现有部署的spec.selector.matchLabels配置中删除键/值对。例如,我正在尝试some.old.label: blah从spec.selector.matchLabels和中删除标签spec.template.metadata.labels。这是我发送至的内容的摘录kubectl apply -f:
spec:\n selector:\n matchLabels:\n app: my-app\n template:\n metadata:\n labels:\n app: my-app\nRun Code Online (Sandbox Code Playgroud)\n但这给了我以下错误:
\n\n\n\n
selector与模板不匹配labels
我也尝试过kubectl replace,这给了我这个错误:
\n\nv1.LabelSelector{MatchLabels:map[string]string{\xe2\x80\x9capp\xe2\x80\x9d: "my-app"}, MatchExpressions:[]v1.LabelSelectorRequirement(nil)}:字段不可变
\n
一旦我检查了产品中的部署配置,这就有意义了:
\nmetadata:\n annotations:\n kubectl.kubernetes.io/last-applied-configuration: |\n # my config is trying to mutate the matchLabels here:\n {"apiVersion":"apps/v1", ... "selector":{"matchLabels":{"app":"my-app"} ... }\n # etc...\nspec:\n selector:\n matchLabels:\n app: my-app\n some.old.label: blah # how do I remove this …Run Code Online (Sandbox Code Playgroud) 我们有数百个部署,在配置中,我们将大多数部署 imagePullPolicy 设置为“ifnotpresent”,少数设置为“always”,现在我想修改所有将ifnotpresent 设置为always 的部署。
我们怎样才能做到这一点呢?
前任:
kubectl get deployment -n test -o json | jq ‘.spec.template.spec.contianer[0].imagePullPolicy=“ifnotpresent”| kubectl -n test replace -f -
Run Code Online (Sandbox Code Playgroud)
上面的命令有助于为一个特定的部署重置它。
我在家里的 Ubuntu 服务器上运行microk8s集群,并将其连接到本地 NAS 服务器以进行持久存储。我一直用它作为学习 Kubernetes 的个人试验场,但我似乎在每一步都会遇到一个又一个问题。
我已经安装了NFS Client Provisioner Helm 图表,我已确认该图表可以正常工作 - 它将在我的 NAS 服务器上动态配置 PVC。我后来能够成功安装Postgres Helm 图表,至少我是这么认为的。创建后,我可以使用 SQL 客户端连接到它,感觉很好。
直到几天后,我注意到 Pod 显示 0/1 容器已就绪。有趣的是,nfs-client-provisioner pod 仍然显示 1/1。长话短说:我已经删除/清除了 Postgres Helm 图表,并尝试重新安装它,但现在它不再起作用。事实上,我尝试部署的任何新内容都不起作用。一切看起来好像都能正常工作,但随后就永远挂在 Init 或 ContainerCreating 上。
特别是对于 Postgres,我运行的命令是这样的:
helm install --name postgres stable/postgresql -f postgres.yaml
Run Code Online (Sandbox Code Playgroud)
我的postgres.yaml文件如下所示:
persistence:
storageClass: nfs-client
accessMode: ReadWriteMany
size: 2Gi
Run Code Online (Sandbox Code Playgroud)
但如果我这样做,kubectl get pods我仍然会看到这个:
NAME READY STATUS RESTARTS AGE
nfs-client-provisioner 1/1 Running 1 11d
postgres-postgresql-0 0/1 Init:0/1 0 3h51m
Run Code Online (Sandbox Code Playgroud)
如果我执行 …
kubernetes kubernetes-helm kubernetes-deployment kubernetes-pod kubernetes-service
我有一个小型 Kubernetes 集群,仅包含两个在t3a.microAWS EC2 实例上运行的节点(为了省钱)。
我有一个小型网络应用程序,我试图在这个集群中运行。我有一个Deployment这个应用程序的单曲。此部署已spec.replicas设置为 4。
当我运行此命令时Deployment,我注意到 Kubernetes 在一个节点中调度了 3 个 pod,在另一个节点中调度了 1 个 pod。
是否可以强制 Kubernetes 每个节点最多调度 2 个 pod Deployment?在同一个 Pod 中拥有 3 个实例,这些小型 EC2 实例的内存几乎耗尽。
谢谢!