【问题标题】:Multiple kube-shcedulers多个 kube-shcedulers
【发布时间】:2020-11-09 22:16:13
【问题描述】:

我正在尝试创建一个 kube-shceduler,供我的组织 pod 部署(数据中心)使用。目标是让任何部署的 pod 在数据中心的两个站点之间平均分配。为了存档,我创建了一个新的 kube-shceduler 清单(见下文),在其中我更改了使用的端口并使用 --config 参数添加了一个新的配置文件(见下文)。问题是,即使将 --port 参数设置为原始 kube-scheduler 尚未使用的新端口,它仍会尝试使用旧端口。因此新的 kube 调度器无法启动:

I1109 20:27:59.225996       1 registry.go:173] Registering SelectorSpread plugin
I1109 20:27:59.226097       1 registry.go:173] Registering SelectorSpread plugin
I1109 20:27:59.926994       1 serving.go:331] Generated self-signed cert in-memory
failed to create listener: failed to listen on 0.0.0.0:10251: listen tcp 0.0.0.0:10251: bind: address already in use

如何强制使用指定的端口,或者如何删除原来的 kube-scheduler,这样两者之间就不会发生冲突。第一个解决方案会更好。

配置 kube-scheduler (manifest - /etc/kubernetes/manifest/kube-scheduler.yaml):

apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    component: kube-scheduler
    tier: control-plane
  name: kube-scheduler
  namespace: kube-system
spec:
  containers:
  - command:
    - kube-scheduler
    - --authentication-kubeconfig=/etc/kubernetes/scheduler.conf
    - --authorization-kubeconfig=/etc/kubernetes/scheduler.conf
    - --bind-address=127.0.0.1
    - --kubeconfig=/etc/kubernetes/scheduler.conf
    - --leader-elect=true
      #- --port=0
    image: k8s.gcr.io/kube-scheduler:v1.19.3
    imagePullPolicy: IfNotPresent
    livenessProbe:
      failureThreshold: 8
      httpGet:
        host: 127.0.0.1
        path: /healthz
        port: 10259
        scheme: HTTPS
      initialDelaySeconds: 10
      periodSeconds: 10
      timeoutSeconds: 15
    name: kube-scheduler
    resources:
      requests:
        cpu: 100m
    startupProbe:
      failureThreshold: 24
      httpGet:
        host: 127.0.0.1
        path: /healthz
        port: 10259
        scheme: HTTPS
      initialDelaySeconds: 10
      periodSeconds: 10
      timeoutSeconds: 15
    volumeMounts:
    - mountPath: /etc/kubernetes/scheduler.conf
      name: kubeconfig
      readOnly: true
  hostNetwork: true
  priorityClassName: system-node-critical
  volumes:
  - hostPath:
      path: /etc/kubernetes/scheduler.conf
      type: FileOrCreate
    name: kubeconfig
status: {}

配置 kube-custom-scheduler.yaml (/etc/kubernetes/manifest/kube-custom-scheduler.yaml):

apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    component: kube-custom-scheduler
    tier: control-plane
  name: kube-custom-scheduler
  namespace: kube-system
spec:
  containers:
  - command:
    - kube-scheduler 
    - --config=/etc/kubernetes/scheduler-custom.conf
    - --master=true
    - --authentication-kubeconfig=/etc/kubernetes/scheduler.conf
    - --authorization-kubeconfig=/etc/kubernetes/scheduler.conf
    - --bind-address=127.0.0.1
    - --kubeconfig=/etc/kubernetes/scheduler.conf
    - --leader-elect=false
    - --secure-port=10269
    - --scheduler-name=kube-custom-shceduler
    - --port=10261
    image: k8s.gcr.io/kube-scheduler:v1.19.3
    imagePullPolicy: IfNotPresent
    livenessProbe:
      failureThreshold: 8
      httpGet:
        host: 127.0.0.1
        path: /healthz
        port: 10269
        scheme: HTTPS
      initialDelaySeconds: 10
      periodSeconds: 10
      timeoutSeconds: 15
    name: kube-scheduler
    resources:
      requests:
        cpu: 100m
    startupProbe:
      failureThreshold: 24
      httpGet:
        host: 127.0.0.1
        path: /healthz
        port: 10269
        scheme: HTTPS
      initialDelaySeconds: 10
      periodSeconds: 10
      timeoutSeconds: 15
    volumeMounts:
    - mountPath: /etc/kubernetes/scheduler.conf
      name: kubeconfig
      readOnly: true
    - mountPath: /etc/kubernetes/scheduler-custom.conf
      name: customconfig
      readOnly: true
  hostNetwork: true
  priorityClassName: system-node-critical
  volumes:
  - hostPath:
      path: /etc/kubernetes/scheduler.conf
      type: FileOrCreate
    name: kubeconfig
  - hostPath:
      path: /etc/kubernetes/scheduler-custom.conf
      type: FileOrCreate
    name: customconfig 
status: {}

kube-custom-scheduler.yaml(/etc/kubernetes/scheduler-custom.conf)中提到的自定义配置:

apiVersion: kubescheduler.config.k8s.io/v1beta1
kind: KubeSchedulerConfiguration

profiles:
  - pluginConfig:
      - name: PodTopologySpread
        args:
          defaultConstraints:
            - maxSkew: 1
              topologyKey: topology.kube.io/datacenter 
              whenUnsatisfiable: ScheduleAnyway 

如果您需要有关集群的更多信息,请不要犹豫。

【问题讨论】:

    标签: kubernetes kubernetes-pod


    【解决方案1】:

    根据https://kubernetes.io/docs/reference/command-line-tools-reference/kube-scheduler/--port 将被--config 指定的文件覆盖。将HealthzBindAddressMetricsBindAddress 添加到/etc/kubernetes/scheduler-custom.conf 有效:

    healthzBindAddress: 0.0.0.0:10261
    metricsBindAddress: 0.0.0.0:10261
    

    如果要移除默认调度器,可以将kube-scheduler.yaml移出/etc/kubernetes/manifests/

    【讨论】:

    • 感谢您的回复。所以在最后几天我尝试替换默认 kube-scheduler 的配置。添加选项 --config=config-file 并将上述配置文件安装到调度程序的 Pod 后,我使用 systemctl restart kubelet 重新启动了 Master 的 Pod。
    • 问题是每次重新启动对清单文件的任何更改后,kubelet 都会运行几秒钟,然后当前配置会恢复到原始配置。我尝试调试但使用 journalctl -u kubelet 但找不到与 kube-shceduler Pod 相关的任何错误。因此,我转向另一个替代方案来归档我的目标,使用准入控制器 (Kyverno) 来改变部署。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-31
    • 2021-10-04
    • 1970-01-01
    • 2021-04-05
    • 2019-01-31
    • 2020-06-16
    • 2017-08-06
    相关资源
    最近更新 更多