manifests
  ├── etcd.yaml
  ├── kube-apiserver.yaml
  ├── kube-controller-manager.yaml
  └── kube-scheduler.yaml

您可以从这些容器清单中获取这些组件的所有配置位置。

API 服务器配置

如果您查看 kube-apiserver.yaml,在容器规范下,您可以看到指向 TLS 证书的所有参数以及 API 服务器工作和与其他集群组件通信所需的其他参数。

apiVersion: v1
kind: Pod
metadata:
  annotations:
    kubeadm.kubernetes.io/kube-apiserver.advertise-address.endpoint: 172.31.42.106:6443
  creationTimestamp: null
  labels:
    component: kube-apiserver
    tier: control-plane
  name: kube-apiserver
  namespace: kube-system
spec:
  containers:
  - command:
    - kube-apiserver
    - --advertise-address=172.31.42.106
    - --allow-privileged=true
    - --authorization-mode=Node,RBAC
    - --client-ca-file=/etc/kubernetes/pki/ca.crt
    - --enable-admission-plugins=NodeRestriction
    - --enable-bootstrap-token-auth=true
    - --etcd-cafile=/etc/kubernetes/pki/etcd/ca.crt
    - --etcd-certfile=/etc/kubernetes/pki/apiserver-etcd-client.crt
    - --etcd-keyfile=/etc/kubernetes/pki/apiserver-etcd-client.key
    - --etcd-servers=https://127.0.0.1:2379
    - --kubelet-client-certificate=/etc/kubernetes/pki/apiserver-kubelet-client.crt
    - --kubelet-client-key=/etc/kubernetes/pki/apiserver-kubelet-client.key
    - --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname
    - --proxy-client-cert-file=/etc/kubernetes/pki/front-proxy-client.crt
    - --proxy-client-key-file=/etc/kubernetes/pki/front-proxy-client.key
    - --requestheader-allowed-names=front-proxy-client
    - --requestheader-client-ca-file=/etc/kubernetes/pki/front-proxy-ca.crt
    - --requestheader-extra-headers-prefix=X-Remote-Extra-
    - --requestheader-group-headers=X-Remote-Group
    - --requestheader-username-headers=X-Remote-User
    - --secure-port=6443
    - --service-account-issuer=https://kubernetes.default.svc.cluster.local
    - --service-account-key-file=/etc/kubernetes/pki/sa.pub
    - --service-account-signing-key-file=/etc/kubernetes/pki/sa.key
    - --service-cluster-ip-range=10.96.0.0/12
    - --tls-cert-file=/etc/kubernetes/pki/apiserver.crt
    - --tls-private-key-file=/etc/kubernetes/pki/apiserver.key
    image: registry.k8s.io/kube-apiserver:v1.26.3

因此,如果要对集群组件配置进行故障排除或验证,首先应查看静态 Pod 清单配置。

etcd 配置

如果要与 etcd 组件交互,可以使用静态 pod YAML 中的详细信息。

例如,如果要备份 etcd,则需要知道 etcd 服务端点和相关证书,以便对 etcd 进行身份验证并创建备份。

如果打开 etcd.yaml

kubekey 设置已存在的harbor kubelet配置文件_API

TLS 证书

在 Kubernetes 中,所有组件都通过 mTLS 相互通信。在 PKI 文件夹下,您将找到所有 TLS 证书和密钥。Kubernetes 控制平面组件使用这些证书进行身份验证并相互通信。

此外,还有一个 etcd 子目录,其中包含特定于 etcd 的证书和私钥。它们用于保护 etcd 节点之间以及 API 服务器和 etcd 节点之间的通信。

下图显示了 PKI 文件夹的文件结构。

kubekey 设置已存在的harbor kubelet配置文件_Pod_02

静态 Pod 清单引用此文件夹中所需的 TLS 证书和密钥。

当您使用 kubeadm 等工具在自托管集群上工作时,这些证书由该工具自动生成。在托管的 Kubernetes 集群中,云提供商负责管理控制平面组件,因此负责满足所有 TLS 要求。

但是,如果要设置用于生产的自承载群集,则必须向组织的网络或安全团队请求这些证书。他们将生成由组织的内部证书颁发机构签名的这些证书,并将其提供给您。

kubeconfig文件

任何需要向 API 服务器进行身份验证的组件都需要 kubeconfig 文件

所有集群 Kubeconfig 文件都存在于 **/etc/kubernetes** 文件夹(.conf 文件)中。您将找到以下文件。

  1. admin.conf
  2. controller-manager.conf
  3. kubelet.conf
  4. scheduler.conf

它包含 API 服务器端点、集群 CA 证书、集群客户端证书和其他信息。

admin.conf

Controller 管理器、调度器和 Kubelet 的 Kubeconfig 用于 API 服务器身份验证和授权。

例如,如果检查 Controller Manager 静态 Pod 清单文件,则可以看到 controller-manager.conf

kubekey 设置已存在的harbor kubelet配置文件_学习_03

Kubelet 配置

Kubelet 服务作为系统服务在所有集群节点上运行。

您可以在 /etc/systemd/system/kubelet.service.d

以下是系统文件内容。

[Service]
Environment="KUBELET_KUBECONFIG_ARGS=--bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf"
Environment="KUBELET_CONFIG_ARGS=--config=/var/lib/kubelet/config.yaml"
EnvironmentFile=-/var/lib/kubelet/kubeadm-flags.env
EnvironmentFile=-/etc/default/kubelet
ExecStart=
ExecStart=/usr/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_CONFIG_ARGS $KUBELET_KUBEADM_ARGS $KUBELET_EXTRA_ARGS

我用粗体突出显示了两个重要的 kubelet 配置。

  1. kubelet kubeconfig 文件:/etc/kubernetes/kubelet.conf
  2. kubelet 配置文件:/var/lib/kubelet/config.yaml
  3. EnvironmentFile=-/var/lib/kubelet/kubeadm-flags.env

kubeconfig 文件将用于 API 服务器身份验证和授权。

/var/lib/kubelet/config.yaml 包含所有与 kubelet 相关的配置。静态 Pod 清单位置作为 staticPodPath 参数的一部分添加。

staticPodPath: /etc/kubernetes/manifests

/var/lib/kubelet/kubeadm-flags.env 文件包含容器运行时环境 Linux 套接字和基础结构容器(暂停容器)映像。

例如,下面是使用 CRI-O 容器运行时的 kubelet 配置,如 Unix 套接字和 pause 容器镜像所示。

KUBELET_KUBEADM_ARGS="--container-runtime-endpoint=unix:///var/run/crio/crio.sock --pod-infra-container-image=registry.k8s.io/pa

pause 容器是一个最小的容器,它是第一个在 Kubernetes Pod 中启动的容器。然后,pause 容器的作用是保存同一 Pod 中所有其他容器的网络命名空间和其他共享资源。

如果你看一下托管的 k8s 集群中的 kubelet 配置,它看起来与 kubeadm 设置略有不同。

例如,下面是 AWS EKS 集群的 kubelet 服务文件。

kubekey 设置已存在的harbor kubelet配置文件_API_04

这里可以看到容器运行时是 containerd,它的 Unix 套接字标志直接添加到服务文件中

与 kubeadm 配置相比,kubelet kubeconfig 文件位于不同的目录中。

CoreDNS配置

CoreDNS插件组件处理集群DNS配置。

所有 CoreDNS 配置都是 kubesystem 命名空间中名为 CoreDNS 的 configmap 的一部分。

如果在 kube-system 命名空间中列出 Configmap,则可以看到 CoreDNS configmap

kubectl get configmap --namespace=kube-system

kubekey 设置已存在的harbor kubelet配置文件_go_05

使用以下命令查看 CoreDNS configmap 内容。

kubectl edit configmap coredns --namespace=kube-system

您将看到以下内容。

apiVersion: v1
data:
  Corefile: |
    .:53 {
        errors
        health {
           lameduck 5s
        }
        ready
        kubernetes cluster.local in-addr.arpa ip6.arpa {


![img]()
![img]()