面试题答案
一键面试资源分配与调度策略及实现
- 资源请求与限制
- 策略:为每个容器定义CPU和内存的请求(request)和限制(limit)。请求表示容器正常运行所需的资源量,限制则是容器所能使用的最大资源量。这样可以避免容器过度占用资源影响其他服务,同时保证每个服务有足够资源运行。
- 实现:在Kubernetes的Pod配置文件(如YAML)中,通过
resources
字段设置,例如:
apiVersion: v1
kind: Pod
metadata:
name: my - pod
spec:
containers:
- name: my - container
image: my - image
resources:
requests:
cpu: "250m" # 250 millicpu
memory: "64Mi"
limits:
cpu: "500m"
memory: "128Mi"
- 节点选择与亲和性
- 策略:根据节点的标签(如硬件类型、地域等),将Pod调度到合适的节点上。亲和性规则可以进一步细化调度逻辑,例如软亲和性(preferredDuringSchedulingIgnoredDuringExecution)和硬亲和性(requiredDuringSchedulingIgnoredDuringExecution)。这样能确保对特定资源有需求的服务部署到满足条件的节点,提高资源利用效率和服务稳定性。
- 实现:通过在Pod配置文件的
spec
中设置nodeSelector
或affinity
字段。例如,使用nodeSelector
将Pod调度到具有特定标签的节点:
apiVersion: v1
kind: Pod
metadata:
name: my - pod
spec:
nodeSelector:
disktype: ssd
使用`affinity`设置亲和性规则:
apiVersion: v1
kind: Pod
metadata:
name: my - pod
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/os
operator: In
values:
- linux
- 资源配额与限制范围
- 策略:在Kubernetes集群中,可以设置资源配额(ResourceQuota)来限制命名空间(Namespace)内的资源使用总量,如总的CPU、内存请求和限制等。限制范围(LimitRange)则可以为命名空间内的容器设置默认的资源请求和限制,确保所有容器都遵循一定的资源使用规范。
- 实现:创建
ResourceQuota
和LimitRange
资源对象。例如,创建一个ResourceQuota
:
apiVersion: v1
kind: ResourceQuota
metadata:
name: my - quota
namespace: my - namespace
spec:
hard:
requests.cpu: "1"
requests.memory: "1Gi"
limits.cpu: "2"
limits.memory: "2Gi"
创建一个LimitRange
:
apiVersion: v1
kind: LimitRange
metadata:
name: my - limit - range
namespace: my - namespace
spec:
limits:
- default:
cpu: "500m"
memory: "128Mi"
defaultRequest:
cpu: "250m"
memory: "64Mi"
type: Container
负载均衡策略及实现
- 服务类型选择
- 策略:根据服务的需求选择合适的Kubernetes服务类型。
ClusterIP
类型用于集群内部通信,提供一个集群内部可访问的IP地址;NodePort
类型在每个节点上开放一个指定端口,通过<NodeIP>:<NodePort>
方式访问,适用于测试和临时服务暴露;LoadBalancer
类型借助云提供商的负载均衡器,将外部流量引入集群,适合对外提供服务的场景。 - 实现:在创建Kubernetes服务(Service)时指定
type
字段。例如,创建一个ClusterIP
服务:
- 策略:根据服务的需求选择合适的Kubernetes服务类型。
apiVersion: v1
kind: Service
metadata:
name: my - service
spec:
selector:
app: my - app
ports:
- protocol: TCP
port: 80
targetPort: 8080
type: ClusterIP
创建一个NodePort
服务:
apiVersion: v1
kind: Service
metadata:
name: my - service
spec:
selector:
app: my - app
ports:
- protocol: TCP
port: 80
targetPort: 8080
nodePort: 30080
type: NodePort
创建一个LoadBalancer
服务(假设在支持的云环境中):
apiVersion: v1
kind: Service
metadata:
name: my - service
spec:
selector:
app: my - app
ports:
- protocol: TCP
port: 80
targetPort: 8080
type: LoadBalancer
- Ingress资源
- 策略:对于HTTP/HTTPS流量的负载均衡,使用Ingress资源。Ingress可以基于域名、URL路径等规则将外部流量路由到不同的后端服务,同时支持TLS终止、会话亲和性等功能,有效管理和优化对外服务的流量。
- 实现:首先需要部署一个Ingress控制器(如Nginx Ingress Controller、Traefik等)。然后创建Ingress资源对象,例如:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my - ingress
spec:
rules:
- host: mydomain.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: my - service
port:
number: 80
- 健康检查
- 策略:Kubernetes通过健康检查机制确保只有健康的Pod才能接收流量。存活探针(livenessProbe)用于检测容器是否正在运行,如果容器不健康,Kubernetes会自动重启容器;就绪探针(readinessProbe)用于检测容器是否准备好接收流量,只有当容器通过就绪探针,才会被添加到服务的负载均衡池中。
- 实现:在Pod配置文件的容器部分设置探针。例如,设置一个HTTP存活探针:
apiVersion: v1
kind: Pod
metadata:
name: my - pod
spec:
containers:
- name: my - container
image: my - image
livenessProbe:
httpGet:
path: /healthz
port: 8080
initialDelaySeconds: 15
periodSeconds: 20
设置一个HTTP就绪探针:
apiVersion: v1
kind: Pod
metadata:
name: my - pod
spec:
containers:
- name: my - container
image: my - image
readinessProbe:
httpGet:
path: /ready
port: 8080
initialDelaySeconds: 5
periodSeconds: 10