基本问题:当我尝试在主节点上使用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
获取storageclass:
$ 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>
如何解决此问题(例如,记录未创建存储的原因)?
答案 0 :(得分:18)
您在这里提出两个不同的问题,一个是关于kube-apiserver配置,另一个是关于对StorageClass
进行问题排查的问题。
以下是您第一个问题的答案:
kube-apiserver
作为主节点上的Docker容器运行。因此,二进制文件在容器内,而不是在主机系统上。它由主人kubelet
从位于/etc/kubernetes/manifests
的文件启动。 kubelet
正在观看此目录,并将启动此处定义为“静态pod”的任何Pod。
要配置kube-apiserver
命令行参数,您需要修改主服务器上的/etc/kubernetes/manifests/kube-apiserver.yaml
。
答案 1 :(得分:0)
要将存储类“ example-nfs”设置为默认值,您需要运行以下命令:
kubectl patch storageclass example-nfs -p '{"metadata":
{"annotations": {"storageclass.kubernetes.io/is-default-class": "true"}}}'
答案 2 :(得分:0)
我将参考有关api服务器位置的问题。
kube apiserver位于主节点(称为控制平面)上。
它可以执行:
1)通过主机的初始化系统(如systemd)。
2)作为吊舱(我将在下面说明)。
在两种情况下,它都将位于control plane(下面的左侧)上:
如果它在systemD下运行,则可以运行:systemctl status api-server
以查看配置(插入)文件的路径。
如果它以Pod的形式运行,则可以在kube-system
名称空间下与所有其他控制面板组件一起查看它(加上 kube-proxy 以及下面类似的网络解决方案):
$ 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
为了获得有关广告连播的更多详细信息。
(关于/ etc / kubernetes / manifests的位置)
让我们说我们不知道在哪里可以找到kube-api-server配置文件的相关路径。
但是我们需要记住两件重要的事情:
1)kube-api-server在主节点上运行。
2)Kubelet不能作为pod运行,并且当控制平面组件(加上kube-proxy)以static pods的形式执行时,它是由主节点上的Kubelet完成的。
因此,我们可以通过调查Kubelet日志来开始到达清单路径的旅程。
如果Kubelet运行了很长时间,它将是一个很大的文件,我们需要将其转储到某个地方并开始乞讨-如果Kubelet在5分钟前启动,则可以运行:
sudo journalctl -u kubelet --since -5m >> kubelet_5_minutes.log
然后快速搜索“ api-server” 将使我们进入下面提到的清单路径的两行:
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