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

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM