1. 问题场景
希望一个worker节点上仅部署同样的服务一个. 比如: kubernets有三个worker节点,三个节点部署N个副本的api服务, 为了提高服务效率希望加入缓存,需要为三个节点个部署一个redis服务, 这个时候我们定义这个redis服务副本为3, 但是如何设置一个节点仅部署一个redis服务呢?
2. 相关知识
-
亲和性
k8s设计了亲和性来配置pod和node, pod和pod的关系, 即:
-
思路
pod和node关系解决的pod选择node的场景, 这里不是解决本问题的关键, pod和pod的关系才是解决的关键, 只要让服务副本设置为3, 且每个node上redis的pod是互斥或者排他的选择即可, 如何设置同一个node上的pod互斥呢? 通过Inter-pod affinity and anti-affinity 可以知道需要指定: topologyKey
-
具体配置结果
apiVersion: apps/v1 kind: Deployment metadata: name: redis spec: nodeSelector: matchLabels: service: mirage selector: matchLabels: service: redis replicas: 3 template: metadata: labels: service: redis spec: affinity: podAntiAffinity: preferredDuringSchedulingIgnoredDuringExecution: - weight: 100 podAffinityTerm: labelSelector: matchExpressions: - key: service operator: In values: - redis topologyKey: kubernetes.io/hostname containers: - name: redis image: redis:latest ports: - containerPort: 3306
解读上面的配置: 在Pod进行选择则node创建Pod的时候首先排除那些在该node上有redis pod的节点. 有点绕但是就是这样的逻辑.