示例1:同一个应用部署在不同的宿主机

在使用Kubernetes时,一般都会有很多节点运行容器,此时可以使用Pod反亲和力将同一个应用部署到不同的节点上,达到更高的可用性,以免同一个应用部署到相同的宿主机带来的风险

yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: must-be-diff-nodes
spec:
  replicas: 3
  selector:
    matchLabels:
      app: must-be-diff-nodes
  template:
    metadata:
      labels:
        app: must-be-diff-nodes
    spec:
      tolerations:
      - key: node-role.kubernetes.io/master
        operator: Exists
        effect: NoSchedule
      affinity:
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
          - labelSelector:
              matchExpressions:
                - key: app
                  operator: In
                  values:
                  - must-be-diff-nodes
            topologyKey: kubernetes.io/hostname
      containers:
      - name: must-be-diff-nodes
        image: nginx:1.14.2
        resources:
          limits:
            memory: "128Mi"
            cpu: "500m"
        ports:
        - containerPort: 80
        env:
        - name: TZ
          value: Asia/Shanghai
        - name: LANG
          value: C.UTF-8

集群安装时会以主机名添加一个Label:kubernetes.io/hostname=HOSTNAME,所以每台主机相当于一个不同的域,这样的话就保证了相同业务应用不会被部署在同一台主机。

$ kubectl get node --show-labels
NAME     STATUS   ROLES           AGE    VERSION   LABELS
master   Ready    control-plane   3d3h   v1.27.6   ...,kubernetes.io/hostname=master,...
node01   Ready    <none>          3d3h   v1.27.6   ...,kubernetes.io/hostname=node01,...
node02   Ready    <none>          3d3h   v1.27.6   ...,kubernetes.io/hostname=node02,...

最后更新于