目錄
- 1.k8s常用命令有哪些?
- 2.報錯檢視各種日誌方法?
- 3.k8s的組建有哪些?
- 4.k8s中安全機制是什麼?
- 5.常用的控制器有哪些?
- 6.service型別有哪些?
- 7.ingress-Nginx工作原理?
- 8.前端請求www.baidu.con響應流程?講出k8s內部呼叫?
- 9.講講pod的生命週期?
- 10.主容器作用?
- 11.配置清單基本結構?
- 12.ingress設定重定向方式有哪些?
- 13.configmap?使用configmap掛載方式
- 14.k8s儲存卷有哪些?
- 15.Secret是什麼?
- 16.什麼是容器探針?
- 17.健康檢查方式有哪些?存活性,就緒性
- 18.存活性探測有哪些方式?
- 19.就緒性探測?
- 20.什麼是汙點和容忍?以及作用,使用方法?
- 21.怎麼做彈性擴縮容,原理是什麼?
- 22.k8s的服務註冊和服務發現?
- 23.打標籤?標籤選擇?
- 24.部署一個服務的流程?
- 25.pod的日誌如何收集?
- 26.談下你對k8s叢集監控的心得,口述
- 27.叢集如何預防雪崩,簡要寫出必要的叢集優化措施
1.k8s常用命令有哪些?
引數解釋:
-n :指定名稱空間
-o :詳細資訊
-w :動態監控
kubectl describe //檢視詳細
kubectl get //索要資源
kubectl apply -f 資源清單的路徑 //建立資源
kubectl delete -f 資源清單的路徑 //刪除資源
kubectl exec -it test-6799fc88d8-42gkv -c nginx -- bash //進入pod容器
kubectl run test --image=nginx //啟動容器
kubectl explain pod //檢視幫助配置清單
kubectl --context=d get pod --show-labels // 檢視標籤
kubectl --context=d get namespace //檢視名稱空間
kubectl --context=d get deployments //檢視控制器
kubectl --context=d delete -n jeff //檢視控制器
kubectl --context=d describe pods -n sg-bs bikecompute-675b979885-l8xtz //檢視詳情
kubectl rollout history deployment test // 版本歷史
kubectl rollout undo deployment test // 回滾上一個版本
kubectl rollout undo deployment test --to-revision=1 // 回滾指定版本
2.報錯檢視各種日誌方法?
journalctl -f -u kubelet.service //檢視報錯日誌
kubectl logs -f -n kube-system coredns-6d56c8448f-5zzwn // 檢視dns日誌
tail -f /var/log/messages //檢視系統日誌
kubectl describe pod pod服務名字 //檢視pod啟動失敗原因,pod報錯資訊
3.k8s的組建有哪些?
架構圖:
kube-apiserver:中央管理器,各個元件的呼叫入口
etcd:叢集資料庫,儲存節點的基礎資料,比如:cpu,磁碟大小等
scheduler:排程器,排程資料
kubelet:node節點接受master的kube-apiserver發來的部署資訊
kube-proxy:node網橋,建立node容器網路互通
controller-manager:kube-apiserver告訴控制器pod建立好了,控制器監控pod狀態,監控資料
最少需要6套認證
4.k8s中安全機制是什麼?
元件之間安全機制:證書,根據上圖可見最少6套證書
5.常用的控制器有哪些?
k8s中控制器分為:deployment、DaemonSet、StatufluSet
Deployment:一般用來部署長期執行的、無狀態的應用
特點:叢集之中,隨機部署
DaemonSet:每一個節點上部署一個Pod,刪除節點自動刪除對應的Pod(zabbix-agent)
特點:每一臺上有且只有一臺
StatudfluSet: 部署有狀態應用
特點:有啟動順序
6.service型別有哪些?
# CluserIP : 向叢集內部暴露一個IP,外部無法訪問
# NodePort : 在宿主主機中開啟一個埠與負載均衡IP的埠一一對應,外界可以使用宿主主機的埠訪問叢集內部服務,埠隨機,也可以固定埠。一般測試用,正式環境不實用,因為埠占用嚴重
# LoadBalancer:是實現暴露服務的另一種解決方案,它依賴於公有云彈性IP實現
# ExternalName service 是sercice的一個特例,它沒有選擇器,也沒有定義任何埠。它的作用是返回叢集外service的外部別名。它將外部地址經過叢集內部的再一次封裝(實際上就是叢集DNS伺服器將CNAME解析到外部地址上),實現了叢集內部訪問即可。例如你們公司的映象倉庫,最開始時用ip訪問,等到後面域名下來了再使用域名訪問。你不可能去修改每處的引用。但是可以建立一個ExternalName,首先指向到IP,等後面再指向域名
7.ingress-Nginx工作原理?
ingress-Nginx:負載均衡器
service主要作用:提供負載均衡
ingress主要作用:提供域名轉發叢集流量入口
ingress工作原理:根據ingress配置清單,動態生成Nginx配置,並且使其生效,之後通過nginx反向代理轉發流量到pod中
Nginx配置檔案:vi /etc/nginx/nginx.conf
8.前端請求www.baidu.con響應流程?講出k8s內部呼叫?
常規版本:
1.前端輸入www.xxxx.com
2.本地hosts檔案尋找ip地址,如果沒有找到進行第三步,找到進行第四步
3.DNS域名解析ip地址
4.瀏覽器帶著ip訪問伺服器進行三次握手,建立tcp連線
5.瀏覽器發出http請求報文
6.進入雲服務外部閘道器(k8s外部閘道器),伺服器接收到請求
7.外部雲服務閘道器根據ingress配置的域名轉到對應的ingress-nginx
8.ingress-nginx生成動態nginx
9.nginx轉到service
10.service轉到自己編寫的內部反向代理閘道器
11.內部代理閘道器轉到相應的pod
12.pod有可能需要進行rpc呼叫
13.pod返回響應結果
14.瀏覽器解碼渲染
9.講講pod的生命週期?
pod生命週期:
1.建立pod
2.建立主容器
3.依次建立業務容器
4.執行回撥鉤子
5.進行探測(監控容器是否活著,和監控是否能被外網訪問,容器掛了會自動建立新的)
6.執行結束回撥鉤子
7.結束業務容器
8.結束主容器
9.銷燬pod
10.主容器作用?
主容器作用:
1.提供pod中基礎網路(基礎名稱空間)
2.提供共享儲存
3.監控業務容器
11.配置清單基本結構?
apiVersion :apps/v1 #指定k8s部署的api版本號
kind : Deployment #指定資源型別(pod)
metadata : #記錄部署應用的基礎資訊
name: admin
namespace: sg-bs
spec : #指定部署詳情
# k8s部署一個yaml的應用:kubectl apply -f [配置清單]
pod清單
# kubectl explain Pod # 檢視配置清單幫助
apiVersion: v1
kind: Pod
metadata:
name: test-pod
spec:
containers:
- name: nginx
image: nginx
- name: tomcat
image: tomcat
12.ingress設定重定向方式有哪些?
目的:訪問www.test.com重定向到https://www.baidu.com
方式一:直接在Ingress配置清單設定。
方式二:在配置中心configMap中配置,然後在Ingress配置清單中配置configMap中的值。
kind: Ingress
apiVersion: extensions/v1beta1
metadata:
name: ingress-ingress-nginx-tls
annotations:
kubernetes.io/ingress.class: "nginx"
nginx.ingress.kubernetes.io/permanent-redirect: https://www.baidu.com
spec:
rules:
- host: www.test.com
http:
paths:
- path: /
backend:
serviceName: wordpress-nginx
servicePort: 80
13.configmap?使用configmap掛載方式
configmap是配置中心,其他地方需要使用就掛載configmap
建立configmap:
# 建立名稱空間
apiVersion: v1
kind: Namespace
metadata:
name: sg-bs
labels:
app: sg-bs
---
# ConfigMap是名稱空間級資源
apiVersion: v1
kind: ConfigMap
metadata:
name: test-configmap
namespace: sg-bs
data: # 健 : 值
level: debug # 配置的資訊
使用configmap:
使用configmap中的level:debug
## 使用掛載方式,將配置檔案掛載到容器中
# 使用
kind: Deployment
apiVersion: apps/v1
metadata:
name: nginx-config
spec:
selector:
matchLabels:
app: nginx-config
template:
metadata:
labels:
app: nginx-config
spec:
containers:
- name: nginx
image: nginx
volumeMounts: # 掛載
- mountPath: /etc/nginx/conf.d # 掛載路徑
name: nginx-config-configmap # 儲存卷名字
volumes:
- name: nginx-config
persistentVolumeClaim:
claimName: nginx-config
- name: nginx-config-configmap
configMap:
name: test-configmap # ConfigMap名字
items:
- key: level
path: level # 最終路徑為:/etc/nginx/conf.d/level
14.k8s儲存卷有哪些?
https://www.cnblogs.com/guyouyin123/p/15630025.html#
1.emptyDir:pod排程到節點時建立的臨時目錄,pod刪除隨之刪除,用於容器間分享檔案
2.hostpath:節點儲存卷,掛載宿主機的檔案或目錄到pod中
3.pv/pvc:外部儲存系統中的一款儲存空間,具有永續性,生命週期獨立於pod
PV:描述一個具體的Volume屬性,比如Volume的型別、掛載目錄、遠端儲存伺服器地址等。相當於磁碟分割槽
PVC:描述 Pod想要使用的持久化屬性,比如儲存大小、讀寫許可權等。
4.StorageClass:充當pv模版,動態建立pv,自動構建相對應的pv持久化儲存卷
5.configmap:配置中心,掛載到pod即可以使用
15.Secret是什麼?
Secret將密碼轉為密文,寫入config中,起到加密的作用
使用方式:https://www.cnblogs.com/guyouyin123/p/15668227.html
16.什麼是容器探針?
容器探針:就是檢查容器的狀態。
17.健康檢查方式有哪些?存活性,就緒性
健康檢查方式2種:
1.存活性探測:檢查容器是否正常執行
2.就緒性探測:檢查容器是否能夠對外提供服務
兩者維度不一樣
兩者處理方式不一樣:
存活性檢查失敗:把容器刪掉
就緒性檢查失敗:移除叢集(移除負載均衡)
18.存活性探測有哪些方式?
存活性:livenessProbe
就緒性:readinessProbe
存活性探測有3種方式:
1.ExecAction:在容器內執行指定的命令。看執行成功與否
2.TCPSocketAction:對指定埠上Pod的IP地址執行TCP檢查。相當於ping
3.HTTPGetAction:GET在指定的埠和路徑上針對Pod的IP地址執行HTTP請求。相當於http請求服務內部的介面,一般服務內部建立一個ping路由。
https://www.cnblogs.com/guyouyin123/p/15603581.html
Exec:在容器內執行指定的命令
apiVersion: v1
kind: Pod
metadata:
name: probe-exec
namespace: defualt
spec:
containers:
- name: nginx
image: nginx
livenessProbe:
exec:
command:
- cat
- /tmp/health
initialDelaySeconds: 30 # 初始化時間
successThreshold: 1 # 連續成功多少次算成功
failureThreshold: 3 # 連續失敗幾次算失敗
timeoutSeconds: 2 # 探測超時時間
periodSeconds: 2 # 執行探測等頻率,單位秒。預設10秒,最小1
TCPSocket:相當於ping
apiVersion: v1
kind: Pod
metadata:
name: probe-tcp
namespace: default
spec:
containers:
- name: nginx
image: nginx
livenessProbe:
tcpSocket:
port: 80
initialDelaySeconds: 30 # 初始化時間
successThreshold: 1 # 連續成功多少次算成功
failureThreshold: 3 # 連續失敗幾次算失敗
timeoutSeconds: 2 # 探測超時時間
periodSeconds: 2 # 執行探測等頻率,單位秒。預設10秒,最小1
HTTPGet:相當於http請求服務內部的介面
apiVersion: v1
kind: Pod
metadata:
name: probe-http
namespace: default
spec:
containers:
- name: nginx
image: nginx
livenessProbe:
httpGet:
path: /ping
port: 80
scheme: HTTP
initialDelaySeconds: 30 # 初始化時間
successThreshold: 1 # 連續成功多少次算成功
failureThreshold: 3 # 連續失敗幾次算失敗
timeoutSeconds: 2 # 探測超時時間
periodSeconds: 2 # 執行探測等頻率,單位秒。預設10秒,最小1
19.就緒性探測?
存活性:livenessProbe
就緒性:readinessProbe
健康檢查方式2種:
1.存活性探測:檢查容器是否正常執行
2.就緒性探測:檢查容器是否能夠對外提供服務
兩者維度不一樣
兩者處理方式不一樣:
存活性檢查失敗:把容器刪掉
就緒性檢查失敗:移除叢集(移除負載均衡)
就緒性探測3種方式:
1.ExecAction:在容器內執行指定的命令。看執行成功與否
2.TCPSocketAction:對指定埠上Pod的IP地址執行TCP檢查。相當於ping
3.HTTPGetAction:GET在指定的埠和路徑上針對Pod的IP地址執行HTTP請求。相當於http請求服務內部的介面,一般服務內部建立一個ping路由。
20.什麼是汙點和容忍?以及作用,使用方法?
詳細使用:https://www.cnblogs.com/guyouyin123/p/15604212.html
汙點:被打上汙點Taints的node節點,不會被排程器部署pod應用。
容忍:允許排程器部署pod應用到打上汙點Taints的節點。
汙點作用:比如master節點不想部署那麼多的pod,因為不能讓master節點壓力太大。那麼給master節點打上汙點標籤,pod就不會部署到該節點了
汙點容忍:比如master節點打上汙點了,但是想要部署其中一個pod到master上,那麼就需要在pod配置清單中寫入容忍汙點。
引數:
NoSchedule: 不排程到汙點節點上去
PreferNoSchedule:NoSchedule 的軟策略版本,表示儘量不排程到汙點節點上去
NoExecute:該選項意味著一旦Taint生效,如該節點內正在執行的pod沒有對應Tolerate設定,會直接被逐出
節點標記汙點:
kubectl taint node sg-14 test=sg14:PreferNoSchedule
容忍汙點:
apiVersion: apps/v1
kind: Deployment
metadata:
name: deployment
spec:
replicas: 1 # pod數量
selector: # 選擇器
matchLabels: # 標籤
release: stable # 選擇標籤
template: # 模版
metadata:
name: test-tag # 控制器名字
labels:
release: stable # 設定控制器標籤
spec:
containers:
- name: nginx # 映象名稱
image: nginx # 映象
tolerations:
- key: "node-role.kubernetes.io/master"
operator: "Exists"
effect: "NoSchedule"
21.怎麼做彈性擴縮容,原理是什麼?
詳細教程:https://www.cnblogs.com/guyouyin123/p/15666274.html
hpa可以根據指標,來彈性增加刪除pod的副本數。控制pod配置清單的replicas參。
引數:
minReplicas: 最小pod例項數
maxReplicas: 最大pod例項數
metrics: 用於計算所需的Pod副本數量的指標列表
resource: 核心指標,包含cpu和記憶體兩種(被彈性伸縮的pod物件中容器的requests和limits中定義的指標。)
object: k8s內建物件的特定指標(需自己實現介面卡)
pods: 應用被彈性伸縮的pod物件的特定指標(例如,每個pod每秒處理的事務數)(需自己實現介面卡)
external: 非k8s內建物件的自定義指標(需自己實現介面卡)
案例:
apiVersion: autoscaling/v2beta1 #(支援cpu,memory,及自定義)
kind: HorizontalPodAutoscaler
metadata:
name: bikesvc
namespace: sg-bs
spec:
minReplicas: 1
maxReplicas: 10
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: bikesvc
metrics:
- type: Resource
resource:
name: memory # 記憶體佔用率(百分比)
targetAverageUtilization: 80
- type: Resource
resource:
name: cpu # cpu佔用率(百分比)
targetAverageUtilization: 80
22.k8s的服務註冊和服務發現?
k8s的服務註冊是通過service實現的。
pod服務在啟動成功後,會載入service資訊。
流量排程:ingress-->service-->pod
23.打標籤?標籤選擇?
檢視標籤:
kubectl get pod --show-labels
建立標籤,標籤選擇器:
replicas: 1 決定pod部署的數量
Deploymnet:在Deployment物件中描述所需的狀態,然後Deployment控制器將實際狀態以受控的速率更改為所需的狀態。
apiVersion: apps/v1
kind: Deployment
metadata:
name: deployment
spec:
replicas: 1 # pod數量
selector: # 選擇器
matchLabels: # 標籤選擇器
release: stable # 選擇標籤
template: # 模版
metadata:
name: test-tag # 控制器名字
labels:
release: stable # 設定控制器標籤
spec:
containers:
- name: nginx # 映象名稱
image: nginx # 映象
24.部署一個服務的流程?
cicd執行
1.程式碼打包映象
2.映象上傳倉庫
3.編寫配置清單(ingress,service,nameSpace,Deployment)
4.應用部署清單,kubectl apply -f 清單路徑
25.pod的日誌如何收集?
實現一個logservice服務
兩種方式:
1.kafka方式
缺點:需要依賴於kafka
優點:資料不會缺失。
需要考慮的點:日誌量大之後,是否影響業務服務。是否需要在k8s外面額外部署一個kafka服務。所以不建議
2.使用udp方式
實現一個udp服務端服務,再全域性初始化一個客戶端udp服務。
缺點:有可能日誌資料丟失(內網不穩定情況)
優點:只依賴於網路,擴充套件性高。自己編寫程式碼實現udp服務端,可以做一些限制。比如儲存時常,或者udp日誌資料包太長攔截掉。(很明顯不是日誌資訊,而是業務資料資訊)
26.談下你對k8s叢集監控的心得,口述
Promethus
27.叢集如何預防雪崩,簡要寫出必要的叢集優化措施
1、為每個pod設定資源限制
2、設定Kubelet資源預留