kube-apiserver位于哪里?

38

基础问题:当我尝试在我的主节点上使用kube-apiserver时,我收到了找不到命令的错误。我该如何安装/配置kube-apiserver?任何示例链接都会有所帮助。

$ kube-apiserver --enable-admission-plugins DefaultStorageClass
-bash: kube-apiserver: command not found

细节:我是 Kubernetes 和 Docker 的新手,试图使用 volumeClaimTemplates 创建 StatefulSet。我的问题是自动 PV 没有被创建,并且在 PVC 日志中出现此消息:"persistentvolume-controller正在等待创建卷"。我不确定是否需要定义 DefaultStorageClass 并且需要 kube-apiserver 来定义它。

Name:          nfs
Namespace:     default
StorageClass:  example-nfs
Status:        Pending
Volume:
Labels:        <none>
Annotations:   volume.beta.kubernetes.io/storage-provisioner=example.com/nfs
Finalizers:    [kubernetes.io/pvc-protection]
Capacity:
Access Modes:
Events:
  Type    Reason                Age                  From                         Message
  ----    ------                ----                 ----                         -------
  Normal  ExternalProvisioning  3m (x2401 over 10h)  persistentvolume-controller  waiting for a volume to be created, either by external provisioner "example.com/nfs" or manually created by system administrator

这里是获取PVC结果:

$ kubectl get pvc
NAME      STATUS    VOLUME    CAPACITY   ACCESS MODES   STORAGECLASS   AGE
nfs       Pending                                       example-nfs    10h

获取存储类:

$ kubectl describe storageclass example-nfs
Name:                  example-nfs
IsDefaultClass:        No
Annotations:           <none>
Provisioner:           example.com/nfs
Parameters:            <none>
AllowVolumeExpansion:  <unset>
MountOptions:          <none>
ReclaimPolicy:         Delete
VolumeBindingMode:     Immediate
Events:                <none>

我应该如何解决这个问题(例如查看哪些日志以了解为什么未创建存储)?


1
这真的取决于你的Kubernetes集群是如何部署的。通常,apiserver被部署为静态pod。在这种情况下,当你运行 kubectl get po -n kube-system 时,你应该能够看到它被列出。 - whites11
@whites11 只是一个后续问题:如果使用 kubeadm 部署了 k8s 集群,当相应的 manifest yaml 文件被更新时,静态 pod(例如 kube-scheduler)是否会重新启动?谢谢! - kz28
是的。您也可以通过将yml文件从静态清单文件夹中移开并将其放回原位来强制重新启动。 - whites11
3个回答

68
你提出了两个不同的问题,一个关于kube-apiserver配置,另一个是有关你StorageClass故障排除的问题。
以下是第一个问题的答案: kube-apiserver运行在您的主节点上作为Docker容器。因此,二进制文件在容器中,而不是在您的主机系统上。它由主节点的kubelet从位于/etc/kubernetes/manifests的文件启动。kubelet正在监视此目录,并将任何在此处定义为“静态Pod”的Pod启动。
要配置kube-apiserver命令行参数,您需要在主节点上修改/etc/kubernetes/manifests/kube-apiserver.yaml

谢谢。这正是我在寻找的。 - raj_arni
@embik。只是一个跟进的问题:您的意思是说,在主节点上的kubelete进程会自动重新启动任何组件Pod(例如kube-scheduler),如果相应的kube-scheduler.yaml文件已经更新了吗? - kz28
@kz28 是的,你可以通过检查 'docker ps' 来验证。 - Softlion
1
我该如何访问我的主节点上的文件系统?我只能够访问该 pod。 - Chris B.
我和上面的提问者有同样的问题。当您说要在主节点上修改/etc/kubernetes/manifests/kube-apiserver.yaml时,是指修改主节点的物理文件系统吗?如果我正在使用Docker桌面版,那该怎么做呢? - Rob L
RtMy的回答更加详细,考虑了API服务器组件的实际运行方式。 - KnockingHeads

10
我将参考关于api服务器位置的问题。
基本答案(特定于问题标题):
kube api服务器位于主节点上(称为控制平面)。
它可以通过以下方式执行:
1) 通过主机的init系统(如systemd)。
2) 作为pod(我将在下面解释)。
在这两种情况下,它都位于控制平面上(下图左侧)。

enter image description here

如果它在systemD下运行,您可以运行:systemctl status api-server查看配置(附加)文件的路径。
如果它作为pod运行,则可以在kube-system命名空间下查看它与所有其他控制面板组件(加上kube-proxy和可能的网络解决方案,如下面的weave):
$ kubectl get pods -n kube-system
NAME                                      READY   STATUS    RESTARTS   AGE
coredns-f9fd979d6-lpdlc                   1/1     Running   1          2d22h
coredns-f9fd979d6-vcs7g                   1/1     Running   1          2d22h
etcd-my-master                            1/1     Running   1          2d22h
kube-apiserver-my-master                  1/1     Running   1          2d22h #<----Here
kube-controller-manager-my-master         1/1     Running   1          2d22h
kube-proxy-kh2lc                          1/1     Running   1          2d22h
kube-scheduler-my-master                  1/1     Running   1          2d22h
weave-net-59r5b                           2/2     Running   3          2d22h

你可以运行:

kubectl describe pod/kube-apiserver-my-master -n kube-system

为了获得有关pod的更多详细信息。
稍微高级一点的答案:
让我们假设我们不知道在哪里找到kube-api-server配置文件的相关路径。
但是我们需要记住两件重要的事情:
1)kube-api-server正在主节点上运行。
2)Kubelet未作为pod运行,当控制平面组件(加上kube-proxy)作为{{link1:静态pod}}执行时-它由主节点上的Kubelet执行。
因此,我们可以通过调查Kubelet日志来开始到达清单路径的旅程。 如果Kubelet运行了很长时间,它将是一个非常大的文件,我们需要将其转储到某个地方并返回 - 或者如果Kubelet在5分钟前启动,则可以运行:
sudo journalctl -u kubelet --since -5m >> kubelet_5_minutes.log

快速搜索"api-server",会让我们找到下面2行,其中提到了清单路径:

my-master kubelet[71..]: 00:03:21 kubelet.go:261] Adding pod path: /etc/kubernetes/manifests
my-master kubelet[71..]: 00:03:21 kubelet.go:273] Watching apiserver

同时我们可以看到Kubelet正在尝试在my-master节点下的kube-system命名空间内创建kube-apiserver pod:

my-master kubelet[71..]: 00:03:29.05  kubelet.go:1576] ..
           Creating a  mirror pod for "kube-apiserver-my-master_kube-system

0

要将存储类“example-nfs”设置为默认值,您需要运行以下命令:

kubectl patch storageclass example-nfs -p '{"metadata": 
  {"annotations": {"storageclass.kubernetes.io/is-default-class": "true"}}}'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接