K8S问题解决
K8S问题解决
1、pod容器时间和宿主机时间不同步 在yaml文件中设置环境变量(最简单方式) env: - name: TZ value: Asia/Shanghai
2、K8S中的port、targetport、nodeport、containerport(合理定义端口号,避免混淆) port 集群内部访问的service端口,即通过clusterIP:port可以访问到某个service target-port 是pod的端口,从port和nodeport来的流量经过kube-proxy流入到后端pod的targetport上,最后进入容器 nodeport:外部访问k8s集群中service的端口,如果不定义端口号会默认分配一个 containerport:是pod内部容器的端口,targetport映射到containerport(一般在deployment中设置) 需要注意的端口问题: Service selector 应该和 Pod 的标签匹配; Service 的 targetPort 应该和 Pod 里面容器的 containerPort 匹配; Service 端口可以是任意数字。多个 Service 可以使用同一个端口,因为不同的 Service 分配的 IP 地址不同; Ingress 的 service.port 应该和 Service 的 port 匹配; Service 的名称应该和 Ingress 中 service.name 字段匹配
K8S报错解决
1、failed to create kubelet: misconfiguration: kubelet cgroup driver: "cgroupfs" is different from docker cgroup driver: "systemd"
原因:k8s和docker的cgroup-driver不一致 解决:将k8s和docker的存储驱动都改成systemd vim /etc/docker/daemon.json { "exec-opts": ["native.cgroupdriver=systemd"] } systemctl daemon-reload systemctl restart docker
2、替换自签证书:解决k8s UI界面只能在火狐浏览器访问的问题
方法一:删除默认的secret,用自签证书创建新的secret kubectl delete secret kubernetes-dashboard-certs -n kubernetes-dashboard kubectl create secret generic kubernetes-dashboard-certs --from-file=/etc/kubernetes/pki/apipserver.key \ --from-file=/etc/kubernetes/pki/apipserver.crt 方法2:修改dashboard.yaml文件,在args下面增加证书俩行 args: - --auto-generate-certificates - --tls-key-file=apiserver.key - --tls-cert-file=apiserver.crt kubectl apply -f kubernetes-dashboard.yaml #让yaml文件生效
3、kubernetes token超时、时间不同步
错误:error execution phase preflight: couldn't validate the identity of the API Server: configmaps "cluster-info" is forbidden: User
"system:anonymous" cannot get resource "configmaps" in API group "" in the namespace "kube-public" To see the stack trace of this error execute with --v=5 or higher 原因:token超时、时间不同步 解决办法:重新创建toke kubeadm token create --print-join-command 时间同步:ntpdate us.pool.ntp.org 可能会用到的命令:清空k8s环境 kubeadm reset systemctl daemon-reload systemctl restart kubelet iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X
4、selfLink was empty 在k8s集群 v1.20之前都存在,在v1.20之后被删除
错误:persistentvolume-controller waiting for a volume to be created, either by external provisioner "fuseim.pri/ifs" or manually created
by system administrator 问题:在k8s 1.22.3版本使用NFS作为StorageClass,实现PV动态供给。但PVC一直是pending状态,Pod也无法运行 原因:selfLink was empty 在k8s集群 v1.20之前都存在,在v1.20之后被删除 解决:需要在/etc/kubernetes/manifests/kube-apiserver.yaml 添加参数 [root@k8s-matser01 nfs.rbac]# cat /etc/kubernetes/manifests/kube-apiserver.yaml apiVersion: v1 ··· - --tls-private-key-file=/etc/kubernetes/pki/apiserver.key - --feature-gates=RemoveSelfLink=false # 添加这个配置 然后再次查看deploy,pod,pvc,都会部署成功 kubectl get deploy,pod,pvc,sc,pv
5、k8s 1.22.3版本用官网提供的deploy.yaml文件安装ingress-nginx后,创建自定义的ingress规则出错
错误:Error from server (InternalError): error when creating "ingress-java-demo.yaml": Internal error occurred: failed calling webhook
"validate.nginx.ingress.kubernetes.io": Post "https://ingress-nginx-controller-admission.ingress-nginx.svc:443/networking/v1/ingresses?
timeout=10s": x509: certificate signed by unknown authority 需要了解:admission webhook:是k8s对请求资源对象的准入控制,Admission webhook有两种控制机制: MutatingAdmissionWebhook是对请求的对象的修改,sidecar就是通过此机制实现对请求对象进行修改,例如增加一个container或者配置。 ValidatingAdmissionWebhook是对请求资源对象的合法性进行检查,https的请求做检查 原因分析:yaml文件安装ingress-nginx会创建ValidatingWebhookConfiguration ingress-nginx-admission, 解决:1、删除ingress-nginx-admission的校验配置 kubectl get ValidatingWebhookConfiguration -n ingress-nginx kubectl delete -A ValidatingWebhookConfiguration ingress-nginx-admission 2、由于你已经使用了 helm 来安装它,你可以通过 helm 的参数来启用或禁用 webhook 可以自己查询一下
6、基于kubernetes搭建jenkins-slave CI/CD平台,jenkins中使用Kubernetes Continuous Deploy 插件将资源配置部署到k8s报错
报错:Starting Kubernetes deployment
Loading configuration: /home/jenkins/agent/workspace/java-demo/deploy.yaml
ERROR: ERROR: java.lang.RuntimeException: io.kubernetes.client.openapi.ApiException:
hudson.remoting.ProxyException: java.lang.RuntimeException: io.kubernetes.client.openapi.ApiException:
at com.microsoft.jenkins.kubernetes.wrapper.ResourceManager.handleApiExceptionExceptNotFound(ResourceManager.java:180)
原因:kubernetes Containuous Deploy插件版本有问题,因为社区已经不维护了,会有漏洞
解决:改用Config File Provider插件:用于存储kubectl用于连接k8s集群的kubeconfig配置文件
把生成的kubeconfig文件放到Jenkins中:需要安装Config File Provider插件,在Mansged files中配置
Manage Jenkins -> Managed files -> Add a new Config -> Custom file(自定义文件)
将生成的kubeconfig文件内容复制进去,复制ID号,在pipeline脚本定义变量:def k8s_auth = "ID号"
eg: pipeline中部署资源到k8s使用kubeconfig示例:
stage('部署到K8S平台'){ steps { configFileProvider([configFile(fileId: "${k8s_auth}", targetLocation: 'admin.kubeconfig')]) { sh """ pwd ls sed -i 's#IMAGE_NAME#${image_name}#' deploy.yaml sed -i 's#SECRET_NAME#${secret_name}#' deploy.yaml sed -i 's#RSCOUNT#${ReplicaCount}#' deploy.yaml sed -i 's#NS#${Namespace}#' deploy.yaml kubectl apply -f deploy.yaml -n ${Namespace} --kubeconfig=admin.kubeconfig sleep 10 kubectl get pod -n ${Namespace} --kubeconfig=admin.kubeconfig """ } } }
作者:等风来~~
本博客所有文章仅用于学习、研究和交流目的,欢迎转载。
如果觉得文章写得不错,或者帮助到您了,请点个赞。
如果文章有写的不足的地方,请你一定要指出,因为这样不光是对我写文章的一种促进,也是一份对后面看此文章的人的责任。谢谢。