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
      """
    }
  }
}

  

 

posted @ 2022-04-14 16:08  等风来~~  阅读(1549)  评论(0编辑  收藏  举报