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 是目前最广为人知的容器运行时软件,但是它并非唯一。在这几年中,容器运行时这个领域发展的迅 ...