面試題整理9----談談對k8s的理解2
- 1. Service 資源
- 1.1 Service
- ClusterIP
- NodePort
- LoadBalancer
- Ingress
- ExternalName
- 1.2 Endpoints
- 1.3 Ingress
- 1.4 EndpointSlice
- 1.5 IngressClass
- 2. 配置和存儲資源
- 2.1 ConfigMap
- 2.2 Secret
- 2.3 PersistentVolume
- 2.4 PersistentVolumeClaim
- 2.5 StorageClass
- 2.5.1 PV,PVC,StorageClass之間的關系
- 2.6 Volume
- 2.7 CSIDriver
- 2.8 CSINode
- 2.9 CSIStorageCapacity
- 2.10 StorageVersionMigration v1alpha1
- 3. RBAC 鑒權資源
- 3.1 Role和RoleBinding
- 3.1.1 Role
- 3.1.2 RoleBinding
- 3.1.3 常見用例
- 3.2 ClusterRole和ClusterRoleBinding
- 3.2.1 ClusterRole
- 3.2.2 ClusterRoleBinding
- 3.2.3 常見用例
- 3.3 LocalSubjectAccessReview
- 3.4 SelfSubjectAccessReview
- 3.5 SelfSubjectRulesReview
- 3.6 SubjectAccessReview
1. Service 資源
1.1 Service
Service 是軟件服務(例如 mysql)的命名抽象,包含代理要偵聽的本地端口(例如 3306)和一個選擇算符,選擇算符用來確定哪些 Pod 將響應通過代理發送的請求。
Service幾種模式:
適用于集群內部的服務間通信。
apiVersion: v1
kind: Service
metadata:name: my-service
spec:selector:app: my-appports:- protocol: TCPport: 80targetPort: 8080
適用于需要從集群外部通過node節點的映射訪問服務的場景。
api版version: v1
kind: Service
metadata:name: my-service
spec:selector:app: my-apptype: NodePortports:- protocol: TCPport: 80targetPort: 8080nodePort: 30007
適用于需要從互聯網訪問服務的場景。
apiVersion: v1
kind: Service
metadata:name: my-service
spec:selector:app: my-apptype: LoadBalancerports:- protocol: TCPport: 80targetPort: 8080
適用于需要基于路徑或主機名路由流量的場景。
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: my-ingress
spec:rules:- host: my-app.comhttp:paths:- path: /pathType: Prefixbackend:service:name: my-serviceport:number: 80
將 Service 映射到一個外部名稱,通常是一個 DNS 名稱。適用于需要將 Kubernetes 服務與外部服務集成的場景。
apiVersion: v1
kind: Service
metadata:name: my-service
spec:type: ExternalNameexternalName: my-external-service.com
1.2 Endpoints
Endpoints 是實現實際服務的端點的集合。即是通過service發現的后端pods的集合.
1.3 Ingress
Ingress 是允許入站連接到達后端定義的端點的規則集合。
1.4 EndpointSlice
EndpointSlice 是實現某 Service 的端點的子集.
1.5 IngressClass
IngressClass 代表 Ingress 的類,被 Ingress 的規約引用
2. 配置和存儲資源
2.1 ConfigMap
ConfigMap 包含供 Pod 使用的配置數據。存儲非敏感的配置數據。如配置文件、環境變量等。
有2種方法可以加載configmap中的環境變量:
apiVersion: v1
kind: Pod
metadata:name: my-pod
spec:containers:- name: my-containerimage: my-imageenvFrom:- configMapRef:name: my-configmap
或者
apiVersion: v1
kind: Pod
metadata:name: my-pod
spec:containers:- name: my-containerimage: my-imageenv:- name: MY_ENV_VARIABLEvalueFrom:configMapKeyRef:name: my-configmapkey: my-config-key
2.2 Secret
Secret 包含某些類別的秘密數據。 存儲敏感數據,并確保數據的安全性和訪問控制。如密碼、密鑰、證書等。
用戶名密碼的引用方式:
apiVersion: v1
kind: Pod
metadata:name: my-pod
spec:containers:- name: my-containerimage: my-imageenv:- name: DB_USERNAMEvalueFrom:secretKeyRef:name: my-secretkey: username- name: DB_PASSWORDvalueFrom:secretKeyRef:name: my-secretkey: password
證書文件的引用:
secret的導入
kubectl create secret tls my-tls-secret \--cert=path/to/tls.crt \--key=path/to/tls.key
pod中的引用
apiVersion: v1
kind: Pod
metadata:name: my-pod
spec:containers:- name: my-containerimage: my-imagevolumeMounts:- name: tls-certsmountPath: /app/tlsreadOnly: truevolumes:- name: tls-certssecret:secretName: my-tls-secret
2.3 PersistentVolume
PersistentVolume (PV) 是管理員制備的一個存儲資源。全局資源
2.4 PersistentVolumeClaim
PersistentVolumeClaim 是用戶針對一個持久卷的請求和申領。名稱空間資源
2.5 StorageClass
StorageClass 為可以動態制備 PersistentVolume 的存儲類描述參數。全局資源
2.5.1 PV,PVC,StorageClass之間的關系
- Storage Class:定義了一種存儲類型,包括存儲的類型、回收策略等。它允許動態創建 PV。
- Persistent Volume (PV):是集群中的一塊存儲資源,類似于一個物理磁盤。PV 可以是靜態創建的,也可以是通過 Storage Class 動態創建的。
- Persistent Volume Claim (PVC):是用戶對存儲資源的請求,類似于對 PV 的申請。PVC 可以綁定到一個 PV,從而使用該 PV 提供的存儲資源。
2.6 Volume
Volume 表示 Pod 中一個有名字的卷,可以由 Pod 中的任意容器進行訪問。
2.7 CSIDriver
CSIDriver 抓取集群上部署的容器存儲接口(CSI)卷驅動有關的信息。
2.8 CSINode
CSINode 包含節點上安裝的所有 CSI 驅動有關的信息。
2.9 CSIStorageCapacity
CSIStorageCapacity 存儲一個 CSI GetCapacity 調用的結果。
2.10 StorageVersionMigration v1alpha1
StorageVersionMigration 表示存儲的數據向最新存儲版本的一次遷移。
3. RBAC 鑒權資源
3.1 Role和RoleBinding
Role
和 RoleBinding
是 Kubernetes 中用于管理命名空間級別權限的兩個核心資源。它們與 ClusterRole
和 ClusterRoleBinding
類似,但作用范圍僅限于特定的命名空間。
3.1.1 Role
Role
定義了一組在特定命名空間內的權限。你可以把它看作是一種命名空間級別的“角色”,它描述了哪些 API 組、資源類型以及操作可以被允許。
Role 示例:
- 查看特定命名空間中的 pods
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:namespace: defaultname: pod-reader
rules:
- apiGroups: [""]resources: ["pods"]verbs: ["get", "watch", "list"]
- 管理特定命名空間中的 ConfigMaps
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:namespace: defaultname: configmap-admin
rules:
- apiGroups: [""]resources: ["configmaps"]verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]
3.1.2 RoleBinding
RoleBinding
將 Role
綁定到一個或多個用戶、組或服務賬戶上,從而授予這些實體在特定命名空間內的相應權限。你可以把它看作是一種命名空間級別的“角色綁定”。
RoleBinding 示例:
- 將
pod-reader
Role 綁定到特定用戶
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:name: read-podsnamespace: default
subjects:
- kind: Username: janeapiGroup: rbac.authorization.k8s.io
roleRef:kind: Rolename: pod-readerapiGroup: rbac.authorization.k8s.io
- 將
configmap-admin
Role 綁定到一個服務賬戶
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:name: configmap-admin-bindingnamespace: default
subjects:
- kind: ServiceAccountname: configmap-admin-sa
roleRef:kind: Rolename: configmap-adminapiGroup: rbac.authorization.k8s.io
3.1.3 常見用例
-
命名空間管理員:創建一個具有特定命名空間內所有權限的
Role
,并將其綁定到命名空間管理員用戶或組。 -
應用程序訪問控制:為應用程序創建一個
Role
,允許它訪問和修改特定命名空間內的資源(如 pods、services、configmaps 等),并將其綁定到應用程序使用的服務賬戶。 -
CI/CD 管道:為 CI/CD 管道創建一個
Role
,允許它在特定命名空間內創建、更新和刪除部署、服務等資源,并將其綁定到 CI/CD 工具使用的服務賬戶。 -
多租戶環境:在多租戶環境中,為每個租戶創建一個獨立的命名空間,并為每個租戶分配一個
Role
和RoleBinding
,以限制他們對資源的訪問權限。
通過合理地使用 Role
和 RoleBinding
,你可以實現細粒度的訪問控制,確保集群中各個命名空間的安全性和穩定性。
3.2 ClusterRole和ClusterRoleBinding
ClusterRole
和 ClusterRoleBinding
是 Kubernetes 中用于管理集群級別權限的兩個核心資源。它們與 Role
和 RoleBinding
類似,但作用范圍是整個集群,而不僅僅是某個命名空間。
3.2.1 ClusterRole
ClusterRole
定義了一組跨集群范圍的權限。你可以把它看作是一種集群級別的“角色”,它描述了哪些 API 組、資源類型以及操作可以被允許。
ClusterRole 示例:
- 查看所有命名空間中的 pods
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:name: pod-reader
rules:
- apiGroups: [""]resources: ["pods"]verbs: ["get", "watch", "list"]
- 管理集群中的所有 ConfigMaps
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:name: configmap-admin
rules:
- apiGroups: [""]resources: ["configmaps"]verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]
3.2.2 ClusterRoleBinding
ClusterRoleBinding
將 ClusterRole
綁定到一個或多個用戶、組或服務賬戶上,從而授予這些實體相應的權限。你可以把它看作是一種集群級別的“角色綁定”。
ClusterRoleBinding 示例:
- 將
pod-reader
ClusterRole 綁定到特定用戶
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:name: read-pods
subjects:
- kind: Username: janeapiGroup: rbac.authorization.k8s.io
roleRef:kind: ClusterRolename: pod-readerapiGroup: rbac.authorization.k8s.io
- 將
configmap-admin
ClusterRole 綁定到一個服務賬戶
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:name: configmap-admin-binding
subjects:
- kind: ServiceAccountname: configmap-admin-sanamespace: kube-system
roleRef:kind: ClusterRolename: configmap-adminapiGroup: rbac.authorization.k8s.io
3.2.3 常見用例
-
集群管理員:創建一個具有所有權限的
ClusterRole
,并將其綁定到集群管理員用戶或組。 -
監控和日志收集:為監控和日志收集工具創建一個
ClusterRole
,允許它們讀取集群中的各種資源(如 pods、nodes、services 等),并將其綁定到相應的服務賬戶。 -
CI/CD 管道:為 CI/CD 管道創建一個
ClusterRole
,允許它創建、更新和刪除部署、服務等資源,并將其綁定到 CI/CD 工具使用的服務賬戶。 -
備份和恢復:為備份和恢復工具創建一個
ClusterRole
,允許它讀取和修改持久卷、配置映射等資源,并將其綁定到備份和恢復工具使用的服務賬戶。
3.3 LocalSubjectAccessReview
LocalSubjectAccessReview 檢查用戶或組是否可以在給定的命名空間內執行某操作。
3.4 SelfSubjectAccessReview
SelfSubjectAccessReview 檢查當前用戶是否可以執行某操作。
3.5 SelfSubjectRulesReview
SelfSubjectRulesReview 枚舉當前用戶可以在某命名空間內執行的操作集合。
3.6 SubjectAccessReview
SubjectAccessReview 檢查用戶或組是否可以執行某操作。
至此對k8s的理解應該就差不多了.當然面試中不過不攔著可以繼續對K8s的監控,告警,日志,流量治理,CICD等各個面繼續深入闡述自己的理解.