【问题标题】:Getting running config for kube master components from active cluster从活动集群中获取 kube master 组件的运行配置
【发布时间】:2019-08-07 01:53:00
【问题描述】:

我们有一个包含 5 个主节点和 50 个工作节点的 kube 集群。 kube 集群在裸机服务器上运行,而不是作为容器运行。在集群初始化期间,我们会根据环境需要更新 kube-api-server/scheduler/controller 的参数,但不是所有选项。 就像节点一样,我们可以使用 API 获取当前应用的 kubelet 配置 - :/api/v1/nodes//proxy/configz,有没有办法获取当前配置(如 kube-api-qps、kube-api -burst 等)用于主组件(控制器、调度程序)。

我可以在 10252 和 10251 上获取控制器和调度程序的指标和 healthz。但是,我找不到如何通过 API 获取这些组件的当前配置。

【问题讨论】:

    标签: kubernetes controller


    【解决方案1】:

    不是来自 API(在撰写本文时)通常组件配置是通过 command line 或/和 Pod YAML 清单文件传递的。通常,清单文件位于/etc/kubernetes/manifests

    • kube-apisever -> /etc/kubernetes/manifests/kube-apiserver.yaml
    • kube-controller-manager -> /etc/kubernetes/manifests/kube-apiserver.yaml
    • kube 调度程序 -> /etc/kubernetes/manifests/kube-scheduler.yaml

    例如minikubekube-apiserver:

    apiVersion: v1
    kind: Pod
    metadata:
      creationTimestamp: null
      labels:
        component: kube-apiserver
        tier: control-plane
      name: kube-apiserver
      namespace: kube-system
    spec:
      containers:
      - command:
        - kube-apiserver
        - --advertise-address=192.168.64.6
        - --allow-privileged=true
        - --authorization-mode=Node,RBAC
        - --client-ca-file=/var/lib/minikube/certs/ca.crt
        - --enable-admission-plugins=NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota
        - --enable-bootstrap-token-auth=true
        - --etcd-cafile=/var/lib/minikube/certs/etcd/ca.crt
        - --etcd-certfile=/var/lib/minikube/certs/apiserver-etcd-client.crt
        - --etcd-keyfile=/var/lib/minikube/certs/apiserver-etcd-client.key
        - --etcd-servers=https://127.0.0.1:2379
        - --insecure-port=0
        - --kubelet-client-certificate=/var/lib/minikube/certs/apiserver-kubelet-client.crt
        - --kubelet-client-key=/var/lib/minikube/certs/apiserver-kubelet-client.key
        - --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname
        ...
    

    kube-proxy 有点不同。

    • kube-proxy -> kube-system 命名空间中的 kube-proxy ConfigMap YAML

    要了解您可以使用 API 做什么,您可以使用 kubectl get --raw 命令。例如:

    $ kubectl get --raw /
    {
      "paths": [
        "/api",
        "/api/v1",
        "/apis",
        "/apis/",
        "/apis/admissionregistration.k8s.io",
        "/apis/admissionregistration.k8s.io/v1beta1",
        "/apis/apiextensions.k8s.io",
        "/apis/apiextensions.k8s.io/v1beta1",
        "/apis/apiregistration.k8s.io",
        "/apis/apiregistration.k8s.io/v1",
        ...
    

    【讨论】:

    • 我们如何启动 api 服务器的例子如下,虽然我没有包括我们在这里设置的所有选项。如果这些没有传播到 etcd,那么我认为没有办法在正在运行的集群中获取当前值。正如我所说,我们不使用清单文件来启动主组件。例如启动 api-server /usr/bin/kube-apiserver --secure-port=443--alsologtostderr=true --service-cluster-ip-range=/24 --client-ca-file= --tls-cert-file= --tls-private-key-file= --allow-privileged=true --service-account-key-file=
    • 没错。所有这些选项的状态都不会保存在 etcd 中,而是保存在 mem 变量中。我认为您可以查询节点这一事实很好。
    【解决方案2】:

    控制平面资源文件将存储在 /etc/kubernetes/manifests 目录中。您可以从那里查看这些组件的配置。

    或者你可以运行下面的命令来获取正在运行的 pod 的输出。

       kubectl -n kube-system get <pod name> -o yaml
    

    【讨论】:

    • 我们从命令行启动 kube-controller/scheduler/api-server,并根据我们的环境更新选项。我们不为此使用 yaml 文件。我们将客户端证书、ca、审计路径等作为参数从命令行传递。我们正在查看的是,除了我们已修改的参数之外,还有一组参数,并且可以检查调度程序/控制器中所有这些参数的值是什么。由于我们不将这些主组件作为容器运行,因此 kube-system 命名空间中没有 pod。
    猜你喜欢
    • 2020-12-08
    • 1970-01-01
    • 1970-01-01
    • 2018-06-15
    • 2023-01-29
    • 1970-01-01
    • 1970-01-01
    • 2017-04-19
    • 1970-01-01
    相关资源
    最近更新 更多