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