如何高效解决K8S平台上的问题?
- 内容介绍
- 文章标签
- 相关推荐
本文共计1149个文字,预计阅读时间需要5分钟。
K8S问题解决+1、Pod时间与宿主机时间不同步、在yaml文件中设置环境变量(最简单方式)+env: - name: TZ value: Asia/Shanghai 2、K8S中的port、targetport、nodeport、containerport(合理定义端口号)
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 字段匹配
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、kubernetestoken超时、时间不同步
错误: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 "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 """ } } }
本文共计1149个文字,预计阅读时间需要5分钟。
K8S问题解决+1、Pod时间与宿主机时间不同步、在yaml文件中设置环境变量(最简单方式)+env: - name: TZ value: Asia/Shanghai 2、K8S中的port、targetport、nodeport、containerport(合理定义端口号)
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 字段匹配
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、kubernetestoken超时、时间不同步
错误: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 "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 """ } } }

