标签: kubernetes-deployment

如何在Kubernetes中为服务选择特定的pod

我有一个由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.

使用主机名不是一个选项,因为主机名将在不同的环境中更改.

我已经搜索了文档,但对这个用例没什么好处的.希望这里有人知道如何解决这个问题.

kubernetes kubernetes-deployment

4
推荐指数
1
解决办法
7203
查看次数

具有共享环境变量的K8S部署

我们有一组部署(一组Pod)都使用相同的docker映像。例子:

  • 网络API
  • 网络管理员
  • Web任务工作程序节点
  • 数据任务工作者节点
  • ...

它们都需要一组通用的环境变量,例如数据库主机的位置,外部服务的秘密密钥等。它们还具有一组不通用的环境变量。

无论如何,有人可以:

  1. 重用定义了环境变量的模板
  2. 从文件加载环境变量并将其设置在Pod上

最佳解决方案是一种了解名称空间的解决方案,因为我们使用kubernetes名称空间来分隔测试,阶段和产品环境。

类似于dockers env_file的东西会很好。但我找不到与此相关的任何示例或参考。我唯一能找到的是通过机密设置env,但这并不干净,因为我仍然需要为每个部署编写所有环境变量。

kubernetes kubernetes-deployment

3
推荐指数
1
解决办法
2070
查看次数

Kubernetes部署中当前和可用的Pod副本之间有什么区别?

我正在尝试弄清Kubernetes。我射击以下命令:

kubectl get deployment
Run Code Online (Sandbox Code Playgroud)

我在输出中得到以下标题:

kubectll得到部署

我无法在以下输出中找到currentavailable列之间的区别?

我知道官方文档对这些领域都有一个简短的描述,但是并不能回答我的以下问题:

  1. Current<= Desired真的吗?
  2. Up-to-Date<= Current真的吗?
  3. Up-to-Date> CurrentUp-to-Date<= Desired真的吗?
  4. Available始终<= Current,也可以是> Available

简而言之,所有这些字段之间是什么关系?

deployment kubernetes kubernetes-deployment kubernetes-cluster

3
推荐指数
1
解决办法
1132
查看次数

获取部署的副本集

如果replica-set-name使用如下 api,我可以获得 ReplicaSet :

GET /apis/apps/v1/namespaces/{namespace}/replicasets/{name}
Run Code Online (Sandbox Code Playgroud)

但是如何根据部署获取ReplicaSet呢?

任何帮助表示赞赏。

谢谢

kubernetes kubernetes-deployment

3
推荐指数
1
解决办法
1104
查看次数

更新使用 ReadWriteOnce 卷的部署将在装载时失败

我的部署使用了几个卷,所有卷都定义为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

3
推荐指数
1
解决办法
1349
查看次数

为什么在单个部署中三次提到标签

我已经浏览了以下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提到标签的三个不同时间.

为什么我们需要每一个?我从官方文档中很难理解它.

kubernetes kubernetes-deployment

3
推荐指数
2
解决办法
102
查看次数

如何从 Kubernetes 部署中删除标签选择器?

我正在尝试从现有部署的spec.selector.matchLabels配置中删除键/值对。例如,我正在尝试some.old.label: blahspec.selector.matchLabels和中删除标签spec.template.metadata.labels。这是我发送至的内容的摘录kubectl apply -f

\n
    spec:\n      selector:\n        matchLabels:\n          app: my-app\n      template:\n        metadata:\n          labels:\n            app: my-app\n
Run Code Online (Sandbox Code Playgroud)\n

但这给了我以下错误:

\n
\n

selector与模板不匹配labels

\n
\n

我也尝试过kubectl replace,这给了我这个错误:

\n
\n

v1.LabelSelector{MatchLabels:map[string]string{\xe2\x80\x9capp\xe2\x80\x9d: "my-app"}, MatchExpressions:[]v1.LabelSelectorRequirement(nil)}:字段不可变

\n
\n

一旦我检查了产品中的部署配置,这就有意义了:

\n
metadata:\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)

kubernetes kubernetes-deployment kubernetes-label

3
推荐指数
1
解决办法
3902
查看次数

如何一次编辑kubernetes的所有部署

我们有数百个部署,在配置中,我们将大多数部署 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)

上面的命令有助于为一个特定的部署重置它。

docker kubernetes kubernetes-deployment

2
推荐指数
1
解决办法
1370
查看次数

Helm 图表无限期地停留在 PodInitializing 状态

我在家里的 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

2
推荐指数
1
解决办法
8934
查看次数

我可以强制 Kubernetes 不要在同一节点中运行超过 X 个 pod 副本吗?

我有一个小型 Kubernetes 集群,仅包含两个在t3a.microAWS EC2 实例上运行的节点(为了省钱)。

我有一个小型网络应用程序,我试图在这个集群中运行。我有一个Deployment这个应用程序的单曲。此部署已spec.replicas设置为 4。

当我运行此命令时Deployment,我注意到 Kubernetes 在一个节点中调度了 3 个 pod,在另一个节点中调度了 1 个 pod。

是否可以强制 Kubernetes 每个节点最多调度 2 个 pod Deployment?在同一个 Pod 中拥有 3 个实例,这些小型 EC2 实例的内存几乎耗尽。

谢谢!

kubernetes kubernetes-deployment kubernetes-pod

2
推荐指数
1
解决办法
1694
查看次数