如何更新正在运行的Kubernetes Pod中的卷?

时间:2017-11-15 18:34:00

标签: kubernetes minikube coredns

我有一个已经在Minikube(v0.23.0)节点上运行的Kubernetes pod。

某些上下文:它是通过启用插件创建的coredns pod。我正在浏览此博客文章,尝试为我的Kubernetes群集设置自定义DNS条目:https://coredns.io/2017/05/08/custom-dns-entries-for-kubernetes/

我能够毫无问题地更换配置图;我修改了博客帖子中的模板规范以满足我的需求并运行:

kubectl create -f configmap.yml -o yaml --dry-run | kubectl replace -f -

这似乎有效;我使用kubectl检查了configmap,一切看起来都很好。

但是我不确定如何更新卷。我尝试将这样的东西放在一个文件中:

apiVersion: v1
kind: Pod
metadata:
  labels:
    k8s-app: coredns
  namespace: kube-system
spec:
  containers:
  - name: coredns
  volumes:
  - configMap:
      items:
      - key: Corefile
        path: Corefile
      - key: cluster.db
        path: cluster.db
      name: coredns
    name: config-volume

然后我尝试将其应用于:

kubectl create -f k8s_config/coredns/volumes.yml -o yaml --dry-run | kubectl apply -f -

但是这给出了这个错误信息:

error: error when retrieving current configuration of:
&{0xc4218be840 0xc420213500 kube-system  STDIN 0xc421a9e5e0 0xc421a9e5e0  false}
from server for: "STDIN": resource name may not be empty

我还尝试将coredns pod的内容转储到文件中,相应地更改了卷部分,然后更换了pod,但收到了以下消息:

The Pod "coredns-6b4fd7784-xhb5s" is invalid: spec: Forbidden: pod updates may not change fields other than `spec.containers[*].image`, `spec.initContainers[*].image`, `spec.activeDeadlineSeconds` or `spec.tolerations` (only additions to existing tolerations)

如果没有删除pod并重新启动它,我应该如何更新Pod中的卷?它甚至可能吗?

我认为另一个首要问题是:更新/配置coredns pod /插件的正确方法是什么?我似乎无法在任何地方找到指南。在博客文章中,它说:

  

要创建新区域,我们需要修改我们的coredns.yaml   一直用来在pod中创建一个额外的文件。

然而,这必须来自于在Kubernetes中手动设置coredns,现在它已经正常运行"作为一个插件,我不知道如何配置它。

1 个答案:

答案 0 :(得分:1)

查看Pod名称coredns-6b4fd7784-xhb5s,看起来您的CoreDNS Pod实际上由Deployment controller管理。

请勿直接修改部署控制器管理的Pod。要编辑部署管理的Pod,请编辑部署对象本身(kubectl -n kube-system edit deployment coredns)并修改spec.template属性。编辑部署后,控制器将删除旧pod并使用更新的规范创建一个新pod。

如果您只是更新了ConfigMap对象并希望CoreDNS Pod接收新内容,那么它也足以删除旧Pod;部署控制器将使用最新版本的ConfigMap创建一个新的。

如果您因删除CoreDNS Pod而担心可能的服务中断,请考虑将部署的spec.replica值增加到高于1的值。