k8s面試1-27

Jeff的技術棧發表於2022-04-17

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的組建有哪些?

架構圖:

image-20220412154317260

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

image-20220412154317260

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

img

容忍汙點:

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資源預留