一、应用和缓存部署在同一个域内¶
一种很常见的架构是后端服务器需要请求缓存中间件,而不是直接请求数据库来提高数据加载速度。在实际使用时,缓存中间件可能也是部署在Kubernetes集群中(如上一个示例),所以此时可以利用Pod反亲和力将后端应用尽量和缓存中间件部署在同一个域内的不同节点,用以减少网络上的消耗。
环境准备:
# 创建单实例redis
[root@k8s-master01 ~]# k create deploy cache --image=registry.cn-hangzhou.aliyuncs.com/abroad_images/redis:7.2.5
# 验证
[root@k8s-master01 ~]# kgp -l app=cache
NAME READY STATUS RESTARTS AGE
cache-64bb68ddff-v8m9k 1/1 Running 0 13s
1.1 应用和缓存必须部署在同一个域内¶
1.查看节点污点情况
[root@k8s-master01 ~]# kubectl describe node | grep Taint
Taints: <none>
Taints: <none>
Taints: <none>
Taints: <none>
2.定义一个名为podAntiAffinity07的yaml文件
[root@k8s-master01 Affinity]# vim podAntiAffinity05.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: my-app
name: my-app
spec:
replicas: 2
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
affinity:
podAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values:
- cache
topologyKey: kubernetes.io/hostname
containers:
- image: registry.cn-hangzhou.aliyuncs.com/zq-demo/nginx:1.14.2
imagePullPolicy: IfNotPresent
name: my-app
4.开始部署
[root@k8s-master01 ~]# kaf podAntiAffinity05.yaml
5.查看pod状态,观察到pod被部署到不同master节点
[root@k8s-master01 ~]# kgp -owide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
cache-64bb68ddff-2x6lk 1/1 Running 0 6m35s 192.168.58.196 k8s-node02 <none> <none>
my-app-57dbb66cb9-fwj86 1/1 Running 0 8s 192.168.58.197 k8s-node02 <none> <none>
my-app-57dbb66cb9-nq7md 1/1 Running 0 8s 192.168.58.198 k8s-node02 <none> <none>
6.重启应用,再次进行验证
# 重启应用
[root@k8s-master01 ~]# k rollout restart deploy my-app
# 观察到应用重启后仍然和redis部署在同一台节点
[root@k8s-master01 ~]# kgp -owide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
cache-64bb68ddff-2x6lk 1/1 Running 0 20m 192.168.58.196 k8s-node02 <none> <none>
my-app-6cbcf68c8-9f5rz 1/1 Running 0 5s 192.168.58.203 k8s-node02 <none> <none>
my-app-6cbcf68c8-b9xh9 1/1 Running 0 4s 192.168.58.205 k8s-node02 <none> <none>
7.环境复原
[root@k8s-master01 ~]# k delete -f podAntiAffinity05.yaml
1.2 应用和缓存尽量部署在同一个域内¶
1.查看节点污点情况
[root@k8s-master01 ~]# kubectl describe node | grep Taint
Taints: <none>
Taints: <none>
Taints: <none>
Taints: <none>
2.定义一个名为podAntiAffinity06的yaml文件
[root@k8s-master01 Affinity]# vim podAntiAffinity06.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: my-app
name: my-app
spec:
selector:
matchLabels:
app: my-app
replicas: 2
template:
metadata:
labels:
app: my-app
spec:
affinity:
podAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 100
podAffinityTerm:
labelSelector:
matchExpressions:
- key: app
operator: In
values:
- cache
topologyKey: zone
containers:
- image: registry.cn-hangzhou.aliyuncs.com/zq-demo/nginx:1.14.2
imagePullPolicy: IfNotPresent
name: my-app
4.开始部署
[root@k8s-master01 ~]# kaf podAntiAffinity06.yaml
5.查看pod状态,观察到该应用的一个pod已经和redis部署在同一个节点上
[root@k8s-master01 ~]# kgp -owide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
cache-64bb68ddff-2x6lk 1/1 Running 0 14m 192.168.58.196 k8s-node02 <none> <none>
my-app-5cf95fc45-9nqlq 1/1 Running 0 109s 192.168.58.199 k8s-node02 <none> <none>
my-app-5cf95fc45-vxjf8 1/1 Running 0 108s 192.168.32.134 k8s-master01 <none> <none>
6.重启my-app应用再次进行验证
# 重启应用
[root@k8s-master01 ~]# k rollout restart deploy my-app
# 再次验证,观察到该应用的一个pod已经和redis部署在同一个节点上
[root@k8s-master01 ~]# kgp -owide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
cache-64bb68ddff-2x6lk 1/1 Running 0 16m 192.168.58.196 k8s-node02 <none> <none>
my-app-d997c9465-d6jgp 1/1 Running 0 3s 192.168.32.136 k8s-master01 <none> <none>
my-app-d997c9465-pqnpp 1/1 Running 0 5s 192.168.58.202 k8s-node02 <none> <none>
7.环境复原
[root@k8s-master01 ~]# k delete -f podAntiAffinity06.yaml