kubernetes|云原生|Deployment does not have minimum availability 的解決方案(資源隱藏的由來)

前言:

最近在部署prometheus的過程中遇到的這個問題,感覺比較的經典,有必要記錄一下。

現象是部署prometheus主服務的時候,看不到pod,只能看到deployment,由于慌亂,一度以為是集群有毛病了,然后重新做了集群,具體情況如下圖:

注:up-to-date表示沒有部署,available表示無可用pod

[root@node4 yaml]# k get deployments.apps -n monitor-sa 
NAME                READY   UP-TO-DATE   AVAILABLE   AGE
prometheus-server   0/2     0            0           2m5s
[root@node4 yaml]# k get po -n monitor-sa 
NAME                                 READY   STATUS        RESTARTS   AGE
node-exporter-6ttbl                  1/1     Running       0          23h
node-exporter-7ls5t                  1/1     Running       0          23h
node-exporter-r287q                  1/1     Running       0          23h
node-exporter-z85dm                  1/1     Running       0          23h

部署文件如下;

注意注意,有一個sa的引用哦??serviceAccountName: monitor

[root@node4 yaml]# cat prometheus-deploy.yaml 
---
apiVersion: apps/v1
kind: Deployment
metadata:name: prometheus-servernamespace: monitor-salabels:app: prometheus
spec:replicas: 2selector:matchLabels:app: prometheuscomponent: server#matchExpressions:#- {key: app, operator: In, values: [prometheus]}#- {key: component, operator: In, values: [server]}template:metadata:labels:app: prometheuscomponent: serverannotations:prometheus.io/scrape: 'false'spec:nodeName: node4serviceAccountName: monitorcontainers:- name: prometheusimage: prom/prometheus:v2.2.1imagePullPolicy: IfNotPresentcommand:- prometheus- --config.file=/etc/prometheus/prometheus.yml- --storage.tsdb.path=/prometheus- --storage.tsdb.retention=720hports:- containerPort: 9090protocol: TCPvolumeMounts:- mountPath: /etc/prometheus/prometheus.ymlname: prometheus-configsubPath: prometheus.yml- mountPath: /prometheus/name: prometheus-storage-volumevolumes:- name: prometheus-configconfigMap:name: prometheus-configitems:- key: prometheus.ymlpath: prometheus.ymlmode: 0644- name: prometheus-storage-volumehostPath:path: /datatype: Directory

?

解決方案:

那么,遇到這種情況,我們應該怎么做呢?當然了,第一點就是不要慌,其次deployment控制器有一個比較不讓人注意的地方,就是編輯deployment可以看到該deployment的當前狀態詳情,會有非常詳細的信息給我們看,也就是status字段

具體的命令是?kubectl?edit?deployment -n?命名空間? deployment名稱,在本例中是這樣的:

。。。。。。略略略   path: prometheus.ymlname: prometheus-configname: prometheus-config- hostPath:path: /datatype: Directoryname: prometheus-storage-volume
status:conditions:- lastTransitionTime: "2023-11-22T15:21:06Z"lastUpdateTime: "2023-11-22T15:21:06Z"message: Deployment does not have minimum availability.reason: MinimumReplicasUnavailablestatus: "False"type: Available- lastTransitionTime: "2023-11-22T15:21:06Z"lastUpdateTime: "2023-11-22T15:21:06Z"message: 'pods "prometheus-server-78bbb77dd7-" is forbidden: error looking upservice account monitor-sa/monitor: serviceaccount "monitor" not found'reason: FailedCreatestatus: "True"type: ReplicaFailure- lastTransitionTime: "2023-11-22T15:31:07Z"lastUpdateTime: "2023-11-22T15:31:07Z"message: ReplicaSet "prometheus-server-78bbb77dd7" has timed out progressing.reason: ProgressDeadlineExceededstatus: "False"type: ProgressingobservedGeneration: 1unavailableReplicas: 2

可以看到有三個message,第一個是標題里提到的報錯信息,在dashboard里這個信息會優先顯示,如果是報錯的時候,第二個message是進一步解釋錯誤問題在哪,本例里是說有個名叫?monitor的sa沒有找到,第三個信息說的是這個deployment控制的rs部署失敗,此信息無關緊要了,那么,重要的是第二個信息,這個信息是解決問題的關鍵。

附:一個正常的deployment?的status:

這個status告訴我們,他是一個副本,部署成功的,因此,第一個message是Deployment has minimum availability

      serviceAccount: kube-state-metricsserviceAccountName: kube-state-metricsterminationGracePeriodSeconds: 30
status:availableReplicas: 1conditions:- lastTransitionTime: "2023-11-21T14:56:14Z"lastUpdateTime: "2023-11-21T14:56:14Z"message: Deployment has minimum availability.reason: MinimumReplicasAvailablestatus: "True"type: Available- lastTransitionTime: "2023-11-21T14:56:13Z"lastUpdateTime: "2023-11-21T14:56:14Z"message: ReplicaSet "kube-state-metrics-57794dcf65" has successfully progressed.reason: NewReplicaSetAvailablestatus: "True"type: ProgressingobservedGeneration: 1readyReplicas: 1replicas: 1updatedReplicas: 1

具體的解決方案:

根據以上報錯信息,那么,我們就需要一個sa,當然了,如果不想給太高的權限,就需要自己編寫權限文件了,這里我偷懶?使用cluster-admin,具體的命令如下:

[root@node4 yaml]# k create sa -n monitor-sa monitor
serviceaccount/monitor created
[root@node4 yaml]# k create clusterrolebinding monitor-clusterrolebinding -n monitor-sa --clusterrole=cluster-admin  --serviceaccount=monitor-sa:monitor

再次部署就成功了:

[root@node4 yaml]# k get po -n monitor-sa  -owide
NAME                                 READY   STATUS      RESTARTS        AGE   IP               NODE    NOMINATED NODE   READINESS GATES
node-exporter-6ttbl                  1/1     Running     0               24h   192.168.123.12   node2   <none>           <none>
node-exporter-7ls5t                  1/1     Running     0               24h   192.168.123.11   node1   <none>           <none>
node-exporter-r287q                  1/1     Running     1 (2m57s ago)   24h   192.168.123.14   node4   <none>           <none>
node-exporter-z85dm                  1/1     Running     0               24h   192.168.123.13   node3   <none>           <none>
prometheus-server-78bbb77dd7-6smlt   1/1     Running     0               20s   10.244.41.19     node4   <none>           <none>
prometheus-server-78bbb77dd7-fhf5k   1/1     Running     0               20s   10.244.41.18     node4   <none>           <none>

總結來了:

那么,其實缺少sa可能會導致pod被隱藏,可以得出,sa是這個deployment的必要非顯性依賴,同樣的,如果部署文件內有寫configmap,但configmap并沒有提前創建也會出現這種錯誤,就是創建了deployment,但pod創建不出來,不像namespace沒有提前創建的情況,namespace是必要顯性依賴,沒有會直接不讓創建。

配額設置也是和sa一樣的必要非顯性依賴。

例如,下面創建一個針對default這個命名空間的配額文件,此文件定義如下:

定義的內容為規定default命名空間下最多4個pods,最多20個services,只能使用10G的內存,5.5的CPU

[root@node4 yaml]# cat quota-nginx.yaml 
apiVersion: v1
kind: ResourceQuota
metadata:name: quotanamespace: default
spec:hard:requests.cpu: "5.5"limits.cpu: "5.5"requests.memory: 10Gilimits.memory: 10Gipods: "4"services: "20"

下面創建一個deployment,副本是6個的nginx:

[root@node4 yaml]# cat nginx.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:annotations:deployment.kubernetes.io/revision: "1"creationTimestamp: "2023-11-22T16:13:33Z"generation: 1labels:app: nginxname: nginxnamespace: defaultresourceVersion: "16411"uid: e9a5cdc5-c6f0-45fb-a001-fcdd695eb925
spec:progressDeadlineSeconds: 600replicas: 6revisionHistoryLimit: 10selector:matchLabels:app: nginxstrategy:rollingUpdate:maxSurge: 25%maxUnavailable: 25%type: RollingUpdatetemplate:metadata:creationTimestamp: nulllabels:app: nginxspec:containers:- image: nginx:1.18imagePullPolicy: IfNotPresentname: nginxresources: {}terminationMessagePath: /dev/termination-logterminationMessagePolicy: Fileresources:limits:cpu: 1memory: 1Girequests:cpu: 500mmemory: 512MidnsPolicy: ClusterFirstrestartPolicy: AlwaysschedulerName: default-schedulersecurityContext: {}terminationGracePeriodSeconds: 30

創建完畢后,發現只有四個pod,配額有效:

[root@node4 yaml]# k get po
NAME                     READY   STATUS    RESTARTS   AGE
nginx-54f9858f64-g65pk   1/1     Running   0          4m50s
nginx-54f9858f64-h42vf   1/1     Running   0          4m50s
nginx-54f9858f64-s776t   1/1     Running   0          4m50s
nginx-54f9858f64-wl7wz   1/1     Running   0          4m50s

那么,還有兩個pod呢?

[root@node4 yaml]# k get deployments.apps nginx -oyaml |grep messagemessage: Deployment does not have minimum availability.message: 'pods "nginx-54f9858f64-p8rxf" is forbidden: exceeded quota: quota, requested:message: ReplicaSet "nginx-54f9858f64" is progressing.

那么解決的方法也很簡單,也就是調整quota啦,怎么調整就不在這里廢話了吧!!!!!!!!!~~~~~~

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/161623.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/161623.shtml
英文地址,請注明出處:http://en.pswp.cn/news/161623.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

c# 基礎語法

c# 程序結構 using System.Collections.Generic; namespace demo1; //一個命名空間可以包含多個類 using System.IO; using System.Drawing;class proj {/// <summary>/// c#是微軟開發的&#xff0c;基于c和c的一種面象對象編程語言&#xff0c;用于快速開發windows桌…

真實網絡中的 bbr

本文包含中心極限定理&#xff0c;大數定律&#xff0c;經濟規律等&#xff0c;bbr 倒沒多少&#xff0c;不過已經習慣把 bbr 當靶子了。 上周寫了 揭秘 bbr 以及 搶帶寬的原理&#xff0c;我對自己說&#xff0c;這都是理論上如何&#xff0c;可實際上呢。于是有必要結合更實際…

ubuntu cutecom串口調試工具使用方法(圖形界面)

文章目錄 Ubuntu下使用CuteCom進行串口調試使用指南什么是CuteCom&#xff1f;主要特點 安裝CuteCom使用APT包管理器從源碼編譯安裝 配置串口CuteCom界面解析&#xff08;啟動cutecom&#xff09;使用CuteCom進行數據發送和接收配置串口參數數據接收數據發送 高級功能和技巧流控…

Vatee萬騰的數字化掌舵:Vatee科技解決方案的全面引領

隨著數字化時代的到來&#xff0c;Vatee萬騰憑借其卓越的科技實力和全面的解決方案&#xff0c;成功地在數字化探索的航程中掌舵引領。 首先&#xff0c;Vatee萬騰以其強大的數字化科技實力成為行業的引領者。vatee萬騰不僅在人工智能、大數據分析、云計算等前沿領域取得了顯著…

PLC通過Modbus轉Profinet網關連接安華變頻器通訊控制電機案例

背景&#xff1a;近年來&#xff0c;隨著自動化技術的不斷進步&#xff0c;Modbus與Profinet之間的轉換成為了許多工廠和企業普遍關注的問題。 Modbus轉Profinet網關作為兩個不同協議設備連接的橋梁&#xff0c;安華變頻器作為一種電氣設備&#xff0c;能夠改變電源的頻率和電…

負載均衡lvs

簡介 ipvsadm 是 Linux 內核中的 IP 虛擬服務器&#xff08;IPVS&#xff09;管理工具。IPVS是 Linux 內核提供的一種負載均衡解決方案&#xff0c;它允許將入站的網絡流量分發到多個后端服務器&#xff0c;以實現負載均衡和高可用性。IPVS通過在內核中維護一個虛擬服務器表&a…

Pytorch中的tensor維度理解

Pytorch中的tensor維度理解 文章目錄 Pytorch中的tensor維度理解摘要打消心理恐懼&#xff0c;從三維學起三維tensor參考文獻 摘要 面對pytorch編程中的tensor時&#xff0c;我不時會感到恐懼。對里面數據是怎么排布的&#xff0c;一直沒有一個直觀的理解。今天我想把這個事情…

springboot(ssm中醫學習服務管理系統 醫學生在線學習平臺Java(codeLW)

springboot(ssm中醫學習服務管理系統 醫學生在線學習平臺Java(code&LW) 開發語言&#xff1a;Java 框架&#xff1a;ssm/springboot vue JDK版本&#xff1a;JDK1.8&#xff08;或11&#xff09; 服務器&#xff1a;tomcat 數據庫&#xff1a;mysql 5.7&#xff08;或…

基于VM虛擬機下Ubuntu18.04系統,Hadoop的安裝與詳細配置

參考博客&#xff1a; https://blog.csdn.net/duchenlong/article/details/114597944 與上面這個博客幾乎差不多&#xff0c;就是java環境配置以及后面的hadoop的hdfs-site.xml文件有一些不同的地方。 準備工作 1.更新 # 更新 sudo apt update sudo apt upgrade2.關閉防火…

MS2401隔離Σ-Δ調制器,可替代ADI的AD7401

產品簡述 MS2401 是一款二階 Σ-Δ 調制器&#xff0c;集成片上數字隔離器&#xff0c;能 將模擬輸入信號轉換為高速 1 位碼流。調制器對輸入信號連續 采樣&#xff0c;無需外部采樣保持電路。模擬信號輸入滿量程為 320 mV &#xff0c;轉換后的數字碼流的最高數據速率為 2…

C++ Boost Thread 編程總結

1.前言 標準C線程即將到來。CUJ預言它將衍生自Boost線程庫&#xff0c;現在就由Bill帶領我們探索一下Boost線程庫。 就在幾年前&#xff0c;用多線程執行程序還是一件非比尋常的事。然而今天互聯網應用服務程序普遍使用多線程來提高與多客戶鏈接時的效率&#xff1b;為了達到最…

統計voc格式數據中的xml標簽、bndbox到excel表格中

有這么個需求是將xml的內容: 1,filename 2.label 3.bndbox:xmin,xmax,ymin,ymax。 … 將這些東西寫入excel表格中,方便我統計標簽數量和框的分布! 于是撰寫了腳本:xml2csv.py 我的xml文件形式如下。大家的目標檢測格式大同小異! <annotation><folder>UAV_d…

【MySQL】多表查詢、子查詢、自連接、合并查詢詳解,包含大量示例,包你會。

復合查詢 前言正式開始一些開胃菜多表查詢自連接子查詢單行子查詢多行子查詢in關鍵字all關鍵字any關鍵字多列子查詢在from中使用子查詢 合并查詢union 和 union all 前言 我前面博客講的所有的查詢都是在單表中進行的&#xff0c;從這里開始就要專門針對查詢這個話題進行進一步…

ansible學習

一文掌握 Ansible 自動化運維 - 知乎 ansible的安裝與簡單的使用_堅持到所有人都放棄!!!的技術博客_51CTO博客

GIT | 基礎操作 | 初始化 | 添加文件 | 修改文件 | 版本回退 | 撤銷修改 | 刪除文件

GIT | 基礎操作 | 初始化 | 添加文件 | 修改文件 | 版本回退 | 撤銷修改 | 刪除文件 文章目錄 GIT | 基礎操作 | 初始化 | 添加文件 | 修改文件 | 版本回退 | 撤銷修改 | 刪除文件前言一、安裝git二、git基本操作2.1 初始化git2.2 配置局部生效2.3 配置全局生效 三、認識工作區…

淺談堆和棧內存以及編程語言

淺談堆和棧內存以及編程語言 棧和堆C 和 C# 的區別&#xff1a;C#總結 編程語言C匯編語言&#xff08;Assembly Language&#xff09;&#xff1a;機器語言&#xff08;Machine Language&#xff09;&#xff1a; 拓展C#依賴注入&#xff08;Dependency Injection&#xff09;模…

2018年全國碩士研究生入學統一考試管理類專業學位聯考數學試題——解析版

文章目錄 2018 年考研管理類聯考數學真題一、問題求解&#xff08;本大題共 5 小題&#xff0c;每小題 3 分&#xff0c;共 45 分&#xff09;下列每題給出 5 個選項中&#xff0c;只有一個是符合要求的&#xff0c;請在答題卡上將所選擇的字母涂黑。真題&#xff08;2018-01&a…

DRF-項目-(1):構建純凈版的drf項目,不再使用django的后臺管理,django的認證,django的session等功能,作為一個純接口項目

項目的目錄結構&#xff1a; -HeartFailure |-- apps |--user |--HeartFailure |-- static |--manage.py 一、django項目相關的 1、命令行中創建django項目 #1、切換到指定的虛擬環境中 workon my_drf#2、該虛擬環境已經安裝好django和rest_framework了 django-admin startp…

補充:linux rsyslog配置多端口監聽(基于UDP)

rsyslog默認udp監聽端口為514,我們可以配置rsyslog基于udp的多端口監聽,實現監控的豐富性 1.環境信息 環境信息 HostnameIpAddressOS versionModuleNotersyslog1192.168.10.246Red Hat Enterprise Linux Server release 7.7 (Maipo)rsyslogd 8.24.0-38.el7linux基礎配置 Li…

④【Set】Redis常用數據類型: Set [使用手冊]

個人簡介&#xff1a;Java領域新星創作者&#xff1b;阿里云技術博主、星級博主、專家博主&#xff1b;正在Java學習的路上摸爬滾打&#xff0c;記錄學習的過程~ 個人主頁&#xff1a;.29.的博客 學習社區&#xff1a;進去逛一逛~ Redis Set ④Redis Set 操作命令匯總1. sadd …