n-Kubernetes配置解析与入坑解决FAQ记录
[TOC]
0x00 简述
描述:在学习任何一门新技术总是免不了坑坑拌拌,当您学会了记录坑后然后将其记录当下次遇到,相同问题的时候可以第一时间进行处理;
0x01 配置文件与启动参数
Kubelet 启动参数
启动参数总结一览表:
--register-node [Boolean] # 节点是否自动注册
/etc/kubernetes/kubelet.conf
关于构建环境
您可以根据自己的情况将构建环境与部署环境分开,例如:
学习时,参考本教程,使用 kubernetes 的 master 节点完成 构建和镜像推送
开发时,在自己的笔记本上完成 构建和镜像推送
工作中,使用 Jenkins Pipeline 或者 gitlab-runner Pipeline 来完成 构建和镜像推送
0x02 入坑弃坑
安装所遇
问题1.初始化master节点问题:
- APISERVER_NAME 不能是 master 的 hostname,且必须全为小写字母、数字、小数点,不能包含减号
export APISERVER_NAME=apiserver.weiyi
; - POD_SUBNET 所使用的网段不能与 master节点/worker节点 所在的网段重叠( CIDR 值:无类别域间路由,
Classless Inter-Domain Routing
),export POD_SUBNET=10.100.0.1/16
#1.如不能下载 kubernetes 的 docker 镜像 ,请替换镜像源以及手工初始化
imageRepository: gcr.azk8s.cn/google-containers
imageRepository: mirrorgcrio
#2.检查环境变量
echo MASTER_IP=${MASTER_IP} && echo APISERVER_NAME=${APISERVER_NAME} && echo POD_SUBNET=${POD_SUBNET}
注意事项:
- 重新初始化 master 节点前,请先执行
kubeadm reset -f
操作;
问题2.Master与pod状态查看异常问题 问题描述:
$kubectl get pods calico-node-4vql2 -n kube-system -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
calico-node-4vql2 0/1 Pending[ImagePullBackoff ] 0 7m22s <none> node <none> <none>
- 1.如果输出结果中出现 ImagePullBackoff 或者长时间处于 Pending 的情况
NAME READY STATUS RESTARTS AGE
coredns-94d74667-6dj45 1/1 ImagePullBackOff 0 12m
calico-node-4vql2 1/1 Pending 0 12m
- 12m 解决方法如下:
#(1)通过get pods找到pod被调度到了哪一个节点并,确定 Pod 所使用的容器镜像:
kubectl get pods calico-node-4vql2 -n kube-system -o yaml | grep image:
- image: calico/node:v3.13.1
- image: calico/cni:v3.13.1
- image: calico/pod2daemon-flexvol:v3.13.1
kubectl get pods coredns-94d74667-6dj45 -n kube-system -o yaml | grep image:
- image: registry.aliyuncs.com/google_containers/coredns:1.3.1
#(2)在 Pod 所在节点执行 docker pull 指令(当Node状态为NotReady时候也可以采用此种方法,但不是唯一)d
docker pull calico/node:v3.13.1
docker pull calico/cni:v3.13.1
docker pull calico/pod2daemon-flexvol:v3.13.1
docker pull registry.aliyuncs.com/google_containers/coredns:1.3.1
#(3)然后在master节点上查看状态恢复正常
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
calico-node-4vql2 1/1 Running 0 36m 10.10.107.192 node <none> <none>
WeiyiGeek.Pending
- 2.输出结果中某个 Pod 长期处于
ContainerCreating、PodInitializing 或 Init:0/3
的状态: 解决办法:
#(1)查看该 Pod 的状态
kubectl describe pods -n kube-system calico-node-4vql2
kubectl describe pods -n kube-system coredns-8567978547-bmd9f
#(2)如果输出结果中,最后一行显示的是 Pulling image,请耐心等待
Normal Pulling 44s kubelet, k8s-worker-02 Pulling image "calico/pod2daemon-flexvol:v3.13.1"
#(3)将该 Pod 删除,系统会自动重建一个新的 Pod
kubectl delete pod kube-flannel-ds-amd64-8l25c -n kube-system
问题3.worker节点 join加入cluster集群不成功的几种情况
- 1.#worker 节点不能访问 apiserver
- 如果 master 节点能够访问 apiserver、而 worker 节点不能,则请检查自己的网络设置,
/etc/hosts 是否正确设置? 是否有安全组或防火墙的限制?
- 如果 master 节点能够访问 apiserver、而 worker 节点不能,则请检查自己的网络设置,
#master节点验证
curl -ik https://localhost:6443
#worker节点验证
curl -ik https://apiserver.weiyi:6443
#正常输出结果如下所示:
HTTP/1.1 403 Forbidden
Cache-Control: no-cache, private
Content-Type: application/json
X-Content-Type-Options: nosniff
Date: Fri, 15 Nov 2019 04:34:40 GMT
Content-Length: 233
{
"kind": "Status",
"apiVersion": "v1",
"metadata": {
...
- 2.#worker 节点默认网卡
- Kubelet使用的 IP 地址 与 master 节点可互通(无需 NAT 映射),且没有防火墙、安全组隔离
- 3.#master 节点生成的token已过有效时间为 2 个小时
kubeadm token create
问题4.在master节点上执行kubectl命令报错localhost:8080 was refused
错误信息:
kubectl apply -f calico-3.13.1.yaml
The connection to the server localhost:8080 was refused - did you specify the right host or port?
错误原因: 由于在初始化之后没将k8s的/etc/kubernetes/admin.conf
拷贝到用户的加目录之中/root/.kube/config
解决办法:
rm -rf /root/.kube/
mkdir /root/.kube/
cp -i /etc/kubernetes/admin.conf /root/.kube/config
问题5:安装K8s时候kubelet报错提示Container runtime network not ready
错误信息:
systemctl status kubelet
6月 23 09:04:02 master-01 kubelet[8085]: E0623 09:04:02.186893 8085 kubelet.go:2187] Container runtime network not ready: NetworkReady=false reason:NetworkPluginNotReady mes...ninitialized
6月 23 09:04:04 master-01 kubelet[8085]: W0623 09:04:04.938700 8085 cni.go:237] Unable to update cni config: no networks found in /etc/cni/net.d
问题原因: 由于master节点初始化安装后报错,在未进行重置的情况下又进行初始化操作或者重置操作不完整导致,还有一种情况是没有安装网络组件比如(flannel 或者 calico
);
解决办法: 执行以下命令重置初始化信息,然后在重新初始化;
systemctl stop kubelet
docker stop $(docker ps -aq)
docker rm -f $(docker ps -aq)
systemctl stop docker
kubeadm reset
rm -rf $HOME/.kube /etc/kubernetes
rm -rf /var/lib/cni/ /etc/cni/ /var/lib/kubelet/*
iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X
systemctl start docker
systemctl start kubelet
#安装 calico 网络插件
rm -f calico-3.13.1.yaml
wget -L https://kuboard.cn/install-script/calico/calico-3.13.1.yaml
kubectl apply -f calico-3.13.1.yaml
问题6:执行kubeadm reset
无法进行节点重置,提示retrying of unary invoker failed
;
错误信息:
[reset] Removing info for node "master-01" from the ConfigMap "kubeadm-config" in the "kube-system" Namespace
{"level":"warn","ts":"2020-06-23T09:10:30.074+0800","caller":"clientv3/retry_interceptor.go:61","msg":"retrying of unary invoker failed","target":"endpoint://client-174bf993-5731-4b29-9b30-7e958ade79a4/10.10.107.191:2379","attempt":0,"error":"rpc error: code = Unknown desc = etcdserver: re-configuration failed due to not enough started members"}
问题原因: 在重置前etcd容器处于运转之中导致无法进行节点的重置操作;
解决办法: 停止所有的容器以及docker服务然后再执行节点的重置操作
docker stop $(docker ps -aq) && systemctl stop docker
问题7:节点初始化在进行preflight时候提示error execution phase preflight:[ERROR ImagePull]
问题描述:
kubeadm init --config=kubeadm-config.yaml --upload-certs
W0623 09:17:13.281279 29557 configset.go:202] WARNING: kubeadm cannot validate component configs for API groups [kubelet.config.k8s.io kubeproxy.config.k8s.io]
[init] Using Kubernetes version: v1.18.4
[preflight] You can also perform this action in beforehand using 'kubeadm config images pull'
error execution phase preflight: [preflight] Some fatal errors occurred:
[ERROR ImagePull]: failed to pull image registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.18.4: output: Error response from daemon: manifest for registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.18.4 not found: manifest unknown: manifest unknown
, error: exit status 1
问题原因: 由于k8s.gcr.io官方镜像网站无法下载镜像,而采用的同步镜像源站registry.cn-hangzhou.aliyuncs.com/google_containers/
仓库中没有指定k8s版本的依赖组件;
解决办法: 换其它镜像进行尝试或者离线将镜像包导入的docker中(参考前面的笔记2-Kubernetes入门手动安装部署
),建议在进行执行上面的命令前先执行kubeadm config images pull --image-repository mirrorgcrio --kubernetes-version=1.18.4
查看镜像是否能被拉取;
# 常规k8s.gcr.io镜像站点
gcr.azk8s.cn/google_containers/
registry.aliyuncs.com/google_containers/
registry.cn-hangzhou.aliyuncs.com/google_containers/
# harbor中k8s.gcr.io的镜像
mirrorgcrio
问题8:容器内部Kubernetes Service不能ping; 问题描述:
PING gateway-example.example.svc.cluster.local (10.105.141.232) 56(84) bytes of data.
From 172.17.76.171 (172.17.76.171) icmp_seq=1 Time to live exceeded
From 172.17.76.171 (172.17.76.171) icmp_seq=2 Time to live exceeded
问题原因:在 Kubernetes 的网络中Service 就是 ping 不通的,因为 Kubernetes 只是为 Service 生成了一个虚拟 IP 地址,实现的方式有三种 User space / Iptables / IPVS
等代理模式;
不管是哪种代理模式Kubernetes Service 的 IP 背后都没有任何实体可以响应「ICMP」全称为 Internet 控制报文协议(Internet Control Message Protocol)
,但是可以通过curl或者telnet进行访问与
问题解决:
$kubectl cluster-info
# Kubernetes master is running at https://k8s.weiyigeek.top:6443
# KubeDNS is running at https://k8s.weiyigeek.top:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
0x03 FAQ
https://www.cnblogs.com/dwq-good/p/13175150.html
https://www.cnblogs.com/klvchen/archive/2018/09/04/9585746.html
https://blog.csdn.net/weixin_39963973/article/details/80568498
https://blog.csdn.net/weixin_43224068/article/details/104060320
https://www.cnblogs.com/djoker/p/10700607.html
https://www.cnblogs.com/minseo/p/12447147.html
https://www.cnblogs.com/1gaoyu/p/12983127.html
- SparkStreaming窗口操作
- 史上最全Git使用手册
- 我所理解的 PHP Trait
- 算法 | 数据结构常见的八大排序算法
- 高通量数据下载还能这样操作?
- ofbiz实体引擎(八) 创建表
- ofbiz实体引擎(七) 检查数据源
- ofbiz实体引擎(六) GenericHelper的初始化创建
- ofbiz实体引擎(五) ModelGroupReader
- HBitcoin:C#高级比特币钱包库 - 保护您的财产安全
- ofbiz实体引擎(四) ModelReader的作用
- ofbiz实体引擎(三) GenericDelegator实例化的具体过程
- 机器学习实战 | 第五章:模型保存(持久化)
- Python编程任务 | 斯坦福CS231n-深度学习与计算机视觉课程
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法