一、应用和缓存部署在同一个域内

一种很常见的架构是后端服务器需要请求缓存中间件,而不是直接请求数据库来提高数据加载速度。在实际使用时,缓存中间件可能也是部署在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