上一次我们讲了Pod的基本概念,今天我们来谈谈如何实现Pod的隔离和QoS。
理论知识Pod
Pod的网络隔离
默认情况下,每个Pod都可以相互通讯,没有任何边界。网络策略是Pod的软件防火墙,它通过命令空间选择器和Pod选择器,定义了谁可以访问Pod的哪个端口。
一旦Pod启用了策略,它就会拒绝任何其他入站流量(默认拒绝所有)。
目前有很多网络提供商支持网络策略如Calico,Weave Net。有兴趣的同学可以参考下面的链接来设置
https://medium.com/flant-com/calico-for-kubernetes-networking-792b41e19d69
Pod QoS
当Node存在足够资源时,管理员可以随意部署应用程序。但是一旦达到资源限制,调度器将根据配置执行不同的操作。
根据Pod的设置,Kubernetes将Pod分为三类
- Guaranteed Pod:保证关键业务比如数据库,相关的主节点(Elasticsearch和HDFS)
- Burstable Pod: 任何应用都可以用
- BestEffort Pod: 常用于无状态和可恢复的应用程序
他们的优先级分别是从Guaranteed > Burstable > BestEffort, 具体的配置可以参考下面的链接
https://kubernetes.io/docs/tasks/configure-pod-container/quality-service-pod/#create-a-pod-that-gets-assigned-a-qos-class-of-guaranteed
从配置可以看出,通过在Pod中设定requests和limits来确认其level类型。
Node QoS
为了保证共享相同物理集群的每个项目团队我们使用namepace来进行逻辑隔离,为了保证各团队的服务质量,我们可以使用resource-quotas.
resource-quotas是一个资源对象,允许我们限制命名空间内可以消耗的资源:
- 计算资源(CPU、Memory)
- 存储资源(Volume、PV)
- 对象数量(Pod、RC、ConfigMap、Service、LB)
在设置完Namespace的资源配置后,我们还可以通过LimitRange资源对象指定来指定其namespace内默认Pod的请求和限制。
动手实验
- 创建名为dev的namespace,限制其可以消耗的资源为
- Request: CPU(0.5) Memory(100M)
- Limit: CPU(4) Memory(1000M)
- Pods: 20(个)
参考文档: https://kubernetes.io/docs/concepts/policy/resource-quotas/
参考代码:
root@u1:~/cka# kubectl create ns dev
root@u1:~/cka# cat quota.yaml
apiVersion: v1
kind: ResourceQuota
metadata:
name: dev
spec:
hard:
requests.cpu: "0.5"
requests.memory: "100M"
limits.cpu: "4"
limits.memory: 1Gi
pods: "20"
root@u1:~/cka# kubectl create -f quota.yaml -n dev
- 在dev namespace内创建Pod,确认其默认资源请求为
- Request: CPU(0.5) Memory(20M)
- Limit: CPU(1) Memory(100M)参考文档: https://kubernetes.io/docs/concepts/policy/limit-range/参考代码:
root@u1:~/cka# cat dev-limit.yaml
apiVersion: v1
kind: LimitRange
metadata:
name: dev-limit-range
spec:
limits:
- default:
cpu: 1
memory: 100Mi
defaultRequest:
cpu: 0.5
memory: 50Mi
type: Container
root@u1:~/cka# kubectl run nginx --image=nginx -n dev
root@u1:~/cka# kubectl describe pod -n dev nginx
nginx:
Container ID:
Image: nginx
Image ID:
Port: <none>
Host Port: <none>
State: Waiting
Reason: ContainerCreating
Ready: False
Restart Count: 0
Limits:
cpu: 1
memory: 100M
Requests:
cpu: 500m
memory: 50M
Environment: <none>