Kubernetes Pod 创建失败问题

在测试部署 k8s 环境后,测试创建容器环境,执行创建命令后,提示 deployment 创建成功,但是在查看 pod 时,提示没有 pod。

[root@k8s1-1 kubernetes]# kubectl run nginx  --image=nginx --replicas=1 --port=8000
deployment "nginx" created
[root@k8s1-1 kubernetes]# kubectl get pod
No resources found.
[root@k8s1-1 kubernetes]# kubectl get deployment
NAME      DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
nginx     1         0         0            0           23s

当我们使用 kubectl create -f nginx.yml 命令的方式创建应用对应的 pod 的时候,命令首先会提交给 API Server,API Server 解析 yml 文件,并对其以 API 对象的形式存到 etcd 里。

这时候,master 组件中的 Controller Manager 会通过控制循环的方式来做编排工作,创建应用所需的 Pod。

同时 Scheduler 会 watch etcd 中新 pod 的变化,如果 Scheduler 发现有一个新的 pod 出现,会运行调度算法,然后选择出最佳的 Node 节点,并将这个节点的名字写到 pod 对象的 NodeName 字段上,这一步就是所谓的 Bind Pod to Node,然后把 bind 的结果写到 etcd。

其次,当我们在构建 k8s 集群的时候,默认每个节点都会初始化创建一个 kubectl 进程,kubectl 进程会 watch etcd 中 pod 的变化,当 kubectl 进程监听到 pod 的 bind 的更新操作,并且 bind 的节点是本节点时,它会接管接下来的所有事情,如镜像下载,创建容器等。

基于以上工作流程,我们可以先判断出可能出现问题的点:controller-manager,排查 controller-manager,证明就是该点创建 pod 报错,并根据提示报错提示信息解决问题的,

1. 查看controller-manager的服务启动是否正常,服务正常,但是有提示replica_set 创建 nginx 的 pod 失败。

[root@k8s1-1 ~]# systemctl status  kube-controller-manager -l
kube-controller-manager.service - Kubernetes Controller Manager
   Loaded: loaded (/usr/lib/systemd/system/kube-controller-manager.service; enabled; vendor preset: disabled)
   Active: active (running) since 三 2020-03-11 22:27:45 CST; 13h ago
     Docs: https://github.com/GoogleCloudPlatform/kubernetes
 Main PID: 2749 (kube-controller)
   Memory: 63.0M
   CGroup: /system.slice/kube-controller-manager.service
           └─2749 /usr/bin/kube-controller-manager --logtostderr=true --v=0 --master=http://192.168.191.20:8080
3月 12 12:18:00 k8s1-1 kube-controller-manager[2749]: E0312 12:18:00.745860    2749 replica_set.go:448] Sync "default/nginx-3360602662" failed...account
3月 12 12:18:00 k8s1-1 kube-controller-manager[2749]: I0312 12:18:00.746001    2749 event.go:217] Event(api.ObjectReference{Kind:"ReplicaSet", Namesp...
3月 12 12:18:10 k8s1-1 kube-controller-manager[2749]: I0312 12:18:10.964525    2749 event.go:217] Event(api.ObjectReference{Kind:"ReplicaSet", Namesp...
3月 12 12:18:10 k8s1-1 kube-controller-manager[2749]: E0312 12:18:10.964989    2749 replica_set.go:448] Sync "default/nginx-3360602662" failed...account
3月 12 12:19:00 k8s1-1 kube-controller-manager[2749]: E0312 12:19:00.974815    2749 replica_set.go:448] Sync "default/nginx-3360602662" failed...account
3月 12 12:19:00 k8s1-1 kube-controller-manager[2749]: I0312 12:19:00.975211    2749 event.go:217] Event(api.ObjectReference{Kind:"ReplicaSet", Namesp...
3月 12 12:20:31 k8s1-1 kube-controller-manager[2749]: E0312 12:20:31.943106    2749 replica_set.go:448] Sync "default/nginx-3360602662" failed...account
3月 12 12:20:31 k8s1-1 kube-controller-manager[2749]: I0312 12:20:31.944967    2749 event.go:217] Event(api.ObjectReference{Kind:"ReplicaSet", Namesp...
3月 12 12:23:24 k8s1-1 kube-controller-manager[2749]: I0312 12:23:24.817465    2749 event.go:217] Event(api.ObjectReference{Kind:"ReplicaSet", Namesp...
3月 12 12:23:24 k8s1-1 kube-controller-manager[2749]: E0312 12:23:24.817504    2749 replica_set.go:448] Sync "default/nginx-3360602662" failed...account
Hint: Some lines were ellipsized, use -l to show in full.

2. 查看具体的信息

tail -f  /var/log/message
Mar 12 10:32:09 k8s1-1 kube-controller-manager: E0312 10:32:09.872378    2749 replica_set.go:448] Sync "default/nginx-3360602662" failed with unable to c
reate pods: No API token found for service account "default", retry after the token is automatically created and added to the service account
Mar 12 10:32:09 k8s1-1 kube-controller-manager: I0312 10:32:09.873371    2749 event.go:217] Event(api.ObjectReference{Kind:"ReplicaSet", Namespace:"defau
lt", Name:"nginx-3360602662", UID:"826df3de-63ab-11ea-86b1-000c295f23c3", APIVersion:"extensions", ResourceVersion:"3632", FieldPath:""}): type: 'Warning
' reason: 'FailedCreate' Error creating: No API token found for service account "default", retry after the token is automatically created and added to th
e service account

3. 查到是因为 kube-apiservice 和 kube-controller-manager 中没有配置serviceaccount

1、首先生成密钥:
openssl genrsa -out /etc/kubernetes/serviceaccount.key 2048
2、编辑/etc/kubernetes/apiserver
添加以下内容:
KUBE_API_ARGS="--service_account_key_file=/etc/kubernetes/serviceaccount.key"
3、再编辑/etc/kubernetes/controller-manager
添加以下内容:
KUBE_CONTROLLER_MANAGER_ARGS="--service_account_private_key_file=/etc/kubernetes/serviceaccount.key"
最后无论是哪种解决方式都需要再重启kubernetes服务:
systemctl restart etcd kube-apiserver kube-controller-manager kube-scheduler

4.再次查看创建的 pod 和 deployment 信息正常

[root@k8s1-1 ~]# kubectl get deployment
NAME      DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
nginx     1         1         1            0           2h
[root@k8s1-1 ~]# kubectl get pod
NAME                     READY     STATUS              RESTARTS   AGE
nginx-3360602662-1bl96   0/1       ContainerCreating   0          25m

Kubernetes 节点的底层由一个叫做 容器运行时 的软件进行支撑,它主要负责启停容器。Docker 是目前最广为人知的容器运行时软件,但是它并非唯一。在这几年中,容器运行时这个领域发展的迅 ...