k8s day06

污点通常情况下是作用在worker节点上,其可以影响Pod的调度。

污点的语法格式如下:
    key[=value]:effect
    
相关字段说明:
    key:
        字母或数字开头,可以包含字母、数字、连字符(-)、点(.)和下划线(_),最多253个字符。
        也可以以DNS子域前缀和单个"/"开头
    
    value:
        该值是可选的。如果给定,它必须以字母或数字开头,可以包含字母、数字、连字符、点和下划线,最多63个字符。
    
    effect:[ɪˈfekt]
        effect必须是NoSchedule、PreferNoSchedule或NoExecute。
            NoSchedule: [noʊ,ˈskedʒuːl]
                该节点不再接收新的Pod调度,但不会驱赶已经调度到该节点的Pod。
            PreferNoSchedule: [prɪˈfɜːr,noʊ,ˈskedʒuː] 
                该节点可以接受调度,但会尽可能将Pod调度到其他节点,换句话说,让该节点的调度优先级降低啦。
            NoExecute:[ˈnoʊ,eksɪkjuːt] 
                该节点不再接收新的Pod调度,与此同时,会立刻驱逐已经调度到该节点的Pod。
                
                
实战案例:
    (1)查看污点(taints[teɪnts])
kubectl describe nodes | grep Taints 

    (2)打污点
kubectl taint node k8s153.oldboyedu.com school=oldboyedu:PreferNoSchedule
kubectl taint node k8s153.oldboyedu.com school=oldboyedu:NoSchedule
kubectl taint node k8s153.oldboyedu.com school=oldboyedu:NoExecute

    (3)取消污点
kubectl taint node k8s153.oldboyedu.com school-
kubectl taint node k8s153.oldboyedu.com school=oldboyedu:NoSchedule-
kubectl taint node k8s153.oldboyedu.com school=oldboyedu:NoExecute-

污点容忍(toleration[ˌtɑːləˈreɪʃn]):
    所谓的污点容忍,就是允许Pod调度到存在污点的节点。
    
    
实战案例:
    1.所有节点创建污点
kubectl taint node k8s151.oldboyedu.com school=oldboyedu:NoSchedule
kubectl taint node k8s152.oldboyedu.com school=oldboyedu:PreferNoSchedule
kubectl taint node k8s153.oldboyedu.com school=oldboyedu:NoExecute

    2.容忍污点
[root@k8s151.oldboyedu.com deploy]# cat 04-deploy-taints.yaml 
kind: Deployment
apiVersion: extensions/v1beta1
metadata:
  name: oldboyedu-linux82-deploy-nginx-taints-001
spec:
  replicas: 3
  selector:
     matchLabels:
        school: oldboyedu
  template:
     metadata:
        name: linux82-web
        labels:
           school: oldboyedu
     spec:
        # 配置污点容忍,则容器可以调度到具有该污点的节点
        tolerations:
          # 若key不定义,则表示匹配所有的key值。
        - key: school
          value: oldboyedu
          # operator表示key和value之间的关系,有效值为: Exists(存在),Equal(等于).默认值为"Equal"
          # 若operator的值为Exists,value的值必须为空,表示只要存在school这个KEY,默认匹配所有的值。
          operator: Equal
        - key: node-role.kubernetes.io/master
          operator: Exists
          # 注意,effect若不配置,则默认匹配所有的污点类型
          # 若指定,则有效值为: NoSchedule,PreferNoSchedule,NoExecute
          effect: NoSchedule
        containers:
        - name: linux82-web
          image: k8s151.oldboyedu.com:5000/oldboyedu-web/nginx:1.20.1
[root@k8s151.oldboyedu.com deploy]# 

亲和性(affinity)概述
    节点亲和性(nodeAffinity):
        用于控制Pod调度到哪些worker节点上,以及不能部署在哪些机器上。

    Pod亲和性(podAffinity):
        Pod可以和哪些Pod部署在同一个拓扑域。

    Pod反亲和性(podAntiAffinity):
        Pod可以和哪些Pod部署在不同一个拓扑域。
        
        
        
节点亲和性(nodeAffinity)
    (1)worker节点打标签
kubectl label nodes k8s151.oldboyedu.com school=oldboyedu
kubectl label nodes k8s152.oldboyedu.com school=yitiantian
kubectl label nodes k8s151.oldboyedu.com class=linux82
kubectl label nodes k8s152.oldboyedu.com class=jiaoshi05
kubectl get no --show-labels


    (2)创建资源清单
cat > 05-pods-nodeAffinity.yaml <<'EOF'
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: oldboyedu-linux82-affinity-nodeaffinity
  labels:
    school: oldboyedue
spec:
  replicas: 10
  template:
    metadata:
       name: linux82-web
       labels:
          apps: web
    spec:
      # 容忍污点
      tolerations:
      - operator: Exists
      # 亲和性
      affinity:
         # 节点亲和性
         nodeAffinity:
            # 硬限制,必须满足的条件
            requiredDuringSchedulingIgnoredDuringExecution:
              # 定义节点选择器列表 
              nodeSelectorTerms:
                # 基于节点的标签进行关联
              - matchExpressions:
                - key: class
                  operator: NotIn
                  values:
                  - linux82
                  - jiaoshi05
            # 软限制,不一定要满足,但会优先满足,相当于提高了调度的优先级
            preferredDuringSchedulingIgnoredDuringExecution:
              # 配置权重
            - weight: 10
              # 偏向性
              preference:
                 # 基于节点的标签进行关联
                 matchExpressions:
                   # 表示节点的标签名称
                 - key: school
                   # 关联关系,表示key和values的关系
                   #  In
                   #     包含,要求values字段不能为空。
                   #  NotIn
                   #     不包含,要求values字段不能为空。
                   #  Exists
                   #     存在,要求values字段必须为空。
                   #  DoesNotExist
                   #     不存在,要求values字段必须为空。
                   #  Gt
                   #     大于,要求values字段必须是一个单一的元素,且值将被解释为整数。
                   #  Lt
                   #     小于,要求values字段必须是一个单一的元素,且值将被解释为整数。
                   operator: In
                   # 定义标签的值
                   values: 
                   - "oldboyedu"
                   - "yitiantian"
                   - "laonanhai"
      containers:
      - name: linux82-web
        image: k8s151.oldboyedu.com:5000/oldboyedu-web/nginx:1.20.1
EOF


Pod亲和性(podAffinity):
cat > 06-pods-podAffinity.yaml <<'EOF'
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: oldboyedu-linux82-affinity-podaffinity
spec:
  replicas: 20
  selector:
    matchLabels:
      apps: oldboyedu-web
  template:
    metadata:
      name: linux82-web
      labels:
        apps: oldboyedu-web
    spec:
      tolerations:
      - operator: Exists
      affinity:
        # 定义Pod的亲和性
        podAffinity:
          # 定义硬限制
          requiredDuringSchedulingIgnoredDuringExecution:
            # 指定的拓扑域为"kubernetes.io/hostname"时:
            #      就会发现所有的Pod被调度到同一个节点的现象,这是因为所有的node节点key其values值不同导致的。
            # 指定的拓扑域为"beta.kubernetes.io/os"时:
            #      就会发现所有的Pod被调度到不同的节点,这是因为所有的node节点的key其values值相同。
          # - topologyKey: kubernetes.io/hostname
          - topologyKey: beta.kubernetes.io/os
          # 值得注意的是,如果有的节点没有school这个key,在K8S 1.15.12版本中测试发现,有可能会调度到没有school的KEY节点哟!
          # - topologyKey: school
            # 注意,上面的topologyKey拓扑域并不能立刻确定Pod应该调度到哪个节点,
            # 因为可能选择较多(即节点的key相同value不相同的情况),所以需要借助pod的标签选择器进行再次确认!
            labelSelector:
               matchExpressions:
                 # 此处的KEY并非是node的标签,而是pods的标签哟~
               - key: apps
                 # 注意,如果Pod出现了key值相同,但value不相同的标签,这个时候不建议使用Exists
                 # 而是建设设置白名单,即采用"operator: In"的方式进行匹配,当然此时values不能为空。
                 operator: Exists
      containers:
      - name: linux82-web
        image: k8s151.oldboyedu.com:5000/oldboyedu-web/nginx:1.20.1
EOF

Pod反亲和性(podAntiAffinity):
cat > 07-podAntiAffinity <<'EOF'
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: oldboyedu-linux82-affinity-podantiaffinity
spec:
  replicas: 10
  selector:
    matchLabels:
      apps: oldboyedu-web
  template:
    metadata:
      name: linux82-web
      labels:
        apps: oldboyedu-web
    spec:
      tolerations:
      - operator: Exists
      affinity:
        # 定义Pod的反亲和性
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
          - topologyKey: kubernetes.io/hostname
            labelSelector:
               matchExpressions:
               - key: apps
                 values:
                 - oldboyedu-web
                 operator: In
      containers:
      - name: linux82-web
        image: k8s151.oldboyedu.com:5000/oldboyedu-web/nginx:1.20.1
EOF


节点选择器nodeSelector:
    1.节点打标签
kubectl label nodes --all --overwrite school=oldboyedu
kubectl label nodes k8s152.oldboyedu.com school-

    2.创建资源清单
cat > 08-pods-nodeSelector.yaml <<'EOF'
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: oldboyedu-linux82-affinity-podantiaffinity
spec:
  replicas: 10
  selector:
    matchLabels:
      apps: oldboyedu-web
  template:
    metadata:
      name: linux82-web
      labels:
        apps: oldboyedu-web
    spec:
      tolerations:
      - operator: Exists
      # 将Pod调度到包含特定标签的节点
      nodeSelector:
        school: oldboyedu
      containers:
      - name: ds-web-linux82
        image: k8s151.oldboyedu.com:5000/oldboyedu-web/nginx:1.20.1
EOF

Job概述:
    一次性任务,Pod完成作业后并不重启容器。其重启策略为"restartPolicy: Never"
    
    
Job控制器参考案例:
cat > 01-job.yaml <<EOF
apiVersion: batch/v1
kind: Job
metadata:
  name: oldboyedu-linux82-pi
spec:
  template:
    spec:
      containers:
      - name: pi
        image: perl:5.34
        # 它计算π到2000个位置并打印出来。大约需要10秒才能完成。
        # command: ["perl",  "-Mbignum=bpi", "-wle", "print bpi(2000)"]
        command: 
        - "/bin/sh"
        - "-c"
        - "for ((i=0;i<3600;i++)); do echo $i > /dev/stdout; sleep 1 ;done"
      # 注意,此处的重启策略表示容器退出时是否重新创建,但手动杀死容器,发现依旧会自动拉起,这是CM组件保证了这个特性。
      restartPolicy: Never
  # 指定标记此作业失败之前的重试次数。官方文档说默认值为6次,但实际测试为7次。
  # 此处我指定为2次,表示容器启动失败时,会尝试重新启动新的Pod次数为2.
  backoffLimit: 2
EOF
    

CronJob概述:
    周期性任务,CronJob底层逻辑是周期性创建Job控制器来实现周期性任务的。
    
    
CronJob控制器参考案例:
cat > cronjob.yaml <<'EOF'
apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: oldboyedu-hello
spec:
  # 定义调度格式,参考链接:https://en.wikipedia.org/wiki/Cron
  # ┌───────────── 分钟 (0 - 59)
  # │ ┌───────────── 小时 (0 - 23)
  # │ │ ┌───────────── 月的某天 (1 - 31)
  # │ │ │ ┌───────────── 月份 (1 - 12)
  # │ │ │ │ ┌───────────── 周的某天 (0 - 6)(周日到周一;在某些系统上,7 也是星期日)
  # │ │ │ │ │                          或者是 sun,mon,tue,web,thu,fri,sat
  # │ │ │ │ │
  # │ │ │ │ │
  # * * * * *
  schedule: "* * * * *"
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: hello
            image: k8s151.oldboyedu.com:5000/oldboyedu-linux/busybox:1.28
            imagePullPolicy: IfNotPresent
            command:
            - /bin/sh
            - -c
            - date; echo Hello from the oldboyedu linux82 Kubernetes cluster
          restartPolicy: OnFailure
EOF

DaemonSet概述:
    DaemonSet确保全部worker节点上运行一个Pod的副本,换句话说,在不考虑污点的情况下,保证每个worker节点有且只有一个Pod副本。

    DaemonSet的一些典型用法:
        (1)在每个节点上运行集群守护进程(flannel等)
        (2)在每个节点上运行日志收集守护进程(flume,filebeat,fluentd等)
        (3)在每个节点上运行监控守护进程(zabbix agent,node_exportor等)


    温馨提示:
        (1)当有新节点加入集群时,也会为新节点新增一个Pod;
        (2)当有节点从集群移除时,这些Pod也会被回收;
        (3)删除DaemonSet将会删除它创建的所有Pod;
        (4)如果节点被打了污点的话,且DaemonSet中未定义污点容忍,则Pod并不会被调度到该节点上;("flannel案例")

DaemonSet参考案例:
cat > 01-ds-nginx.yaml <<EOF
kind: DaemonSet
apiVersion: extensions/v1beta1
metadata:
  name: oldboyedu-linux82-ds-nginx
spec:
  selector:
     matchLabels:
        school: oldboyedu
  template:
     metadata:
        name: linux82-web
        labels:
           school: oldboyedu
     spec:
        tolerations:
        - operator: Exists
        containers:
        - name: linux82-web
          image: k8s151.oldboyedu.com:5000/oldboyedu-web/nginx:1.20.1
EOF


StatefulSets概述:
    以Nginx的为例,当任意一个Nginx挂掉,其处理的逻辑是相同的,即仅需重新创建一个Pod副本即可,这类服务我们称之为无状态服务。

    以MySQL主从同步为例,master,slave两个库任意一个库挂掉,其处理逻辑是不相同的,这类服务我们称之为有状态服务。

    有状态服务面临的难题:
        (1)启动/停止顺序;
        (2)pod实例的数据是独立存储;
        (3)需要固定的IP地址或者主机名;
        
     
    StatefulSet一般用于有状态服务,StatefulSets对于需要满足以下一个或多个需求的应用程序很有价值。
        (1)稳定唯一的网络标识符。
        (2)稳定独立持久的存储。
        (4)有序优雅的部署和缩放。
        (5)有序自动的滚动更新。    
        
        
    稳定的网络标识:
        其本质对应的是一个service资源,只不过这个service没有定义VIP,我们称之为headless service,即"无头服务"。
        通过"headless service"来维护Pod的网络身份,会为每个Pod分配一个数字编号并且按照编号顺序部署。
        综上所述,无头服务("headless service")要求满足以下两点:
            (1)将svc资源的clusterIP字段设置None,即"clusterIP: None";
            (2)将sts资源的serviceName字段声明为无头服务的名称;
                
                
    独享存储:
        Statefulset的存储卷使用VolumeClaimTemplate创建,称为"存储卷申请模板"。
        当sts资源使用VolumeClaimTemplate创建一个PVC时,同样也会为每个Pod分配并创建唯一的pvc编号,每个pvc绑定对应pv,从而保证每个Pod都有独立的存储。

StatefulSets控制器-网络唯一标识之headless:
    (1)编写资源清单
cat > 01-statefulset-headless-network.yaml <<'EOF'
apiVersion: v1
kind: Service
metadata:
  name: linux82-headless
spec:
  ports:
  - port: 80
    name: web
  # 将clusterIP字段设置为None表示为一个无头服务(headless services),即svc将不会分配VIP。
  clusterIP: None
  selector:
    app: nginx

---

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: linux82-web
spec:
  selector:
    matchLabels:
      app: nginx
  # 声明无头服务    
  serviceName: linux82-headless
  replicas: 3 
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: k8s151.oldboyedu.com:5000/oldboyedu-web/nginx:1.20.1
        ports:
        - containerPort: 80
EOF


    (2)使用响应式API创建测试Pod
# kubectl run -it dns-test --rm --image=k8s151.oldboyedu.com:5000/oldboyedu-linux/alpine -- sh
#
# for i in `seq 0 2`;do ping linux82-web-${i}.linux82-headless.default.svc.cluster.local  -c 3;done

StatefulSets控制器-独享存储
    (1)编写资源清单
cat > 02-statefulset-headless-volumeClaimTemplates.yaml <<'EOF'
apiVersion: v1
kind: Service
metadata:
  name: linux82-headless
spec:
  ports:
  - port: 80
    name: web
  # 将clusterIP字段设置为None表示为一个无头服务,即svc将不会分配VIP。
  clusterIP: None
  selector:
    app: nginx
    
---

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: linux82-web
spec:
  selector:
    matchLabels:
      app: nginx
  # 声明无头服务    
  serviceName: linux82-headless
  replicas: 3 
  # 卷申请模板,会为每个Pod去创建唯一的pvc并与之关联哟!
  volumeClaimTemplates:
  - metadata:
      name: data
    spec:
      accessModes: [ "ReadWriteOnce" ]
      # 声明咱们自定义的动态存储类,即sc资源。
      storageClassName: "linux82-sc"
      resources:
        requests:
          storage: 2Gi
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.20.1
        ports:
        - containerPort: 80
        volumeMounts:
        - name: data
          mountPath: /usr/share/nginx/html
          
---

apiVersion: v1
kind: Service
metadata:
  name: oldboyedu-linux82-sts
spec:
  selector:
     app: nginx
  ports:
  - port: 80
    targetPort: 80
EOF

    
    (2)连接到Pod逐个修改nginx首页文件
# kubectl exec -it linux81-web-0 -- bash
echo AAAAAAAAAAAA > /usr/share/nginx/html/index.html

# kubectl exec -it linux81-web-1 -- bash
echo BBBBBBBBBBBB > /usr/share/nginx/html/index.html

# kubectl exec -it linux81-web-2 -- bash
echo CCCCCCCCCCCC > /usr/share/nginx/html/index.html
    
    
    (3)测试SVC访问
# vim /etc/resolv.conf   # 不修改宿主机的配置文件的话,可以直接启动pod进行测试即可。
nameserver 10.254.0.10
# curl oldboyedu-linux81-sts.default.svc.cluster.local


持久卷Persistent Volume(简称"PV"):
    (1)编写PV资源清单
cat > manual-pv.yaml <<'EOF'
apiVersion: v1
kind: PersistentVolume
metadata:
  name: oldboyedu-linux82-pv01
  labels:
    school: oldboyedu
spec:
   # 声明PV的访问模式,常用的有"ReadWriteOnce","ReadOnlyMany"和"ReadWriteMany":
   #   ReadWriteOnce:(简称:"RWO")
   #      只允许单个worker节点读写存储卷,但是该节点的多个Pod是可以同时访问该存储卷的。
   #   ReadOnlyMany:(简称:"ROX")
   #      允许多个worker节点进行只读存储卷。
   #   ReadWriteMany:(简称:"RWX")
   #      允许多个worker节点进行读写存储卷。
   #   ReadWriteOncePod:(简称:"RWOP")
   #       该卷可以通过单个Pod以读写方式装入。
   #       如果您想确保整个集群中只有一个pod可以读取或写入PVC,请使用ReadWriteOncePod访问模式。
   #       这仅适用于CSI卷和Kubernetes版本1.22+。
   accessModes:
   - ReadWriteMany
   # 声明存储卷的类型为nfs
   nfs:
     path: /oldboyedu/data/kubernetes/pv/linux82/pv001
     server: 10.0.0.151
   # 指定存储卷的回收策略,常用的有"Retain"和"Delete"
   #    Retain:
   #       "保留回收"策略允许手动回收资源。
   #       删除PersistentVolumeClaim时,PersistentVolume仍然存在,并且该卷被视为"已释放"。
   #       在管理员手动回收资源之前,使用该策略其他Pod将无法直接使用。
   #    Delete:
   #       对于支持删除回收策略的卷插件,k8s将删除pv及其对应的数据卷数据。
   #    Recycle:
   #       对于"回收利用"策略官方已弃用。相反,推荐的方法是使用动态资源调配。
   #       如果基础卷插件支持,回收回收策略将对卷执行基本清理(rm -rf /thevolume/*),并使其再次可用于新的声明。
   persistentVolumeReclaimPolicy: Retain
   # 声明存储的容量
   capacity:
     storage: 2Gi

---

apiVersion: v1
kind: PersistentVolume
metadata:
  name: oldboyedu-linux82-pv02
  labels:
    school: oldboyedu
spec:
   accessModes:
   - ReadWriteMany
   nfs:
     path: /oldboyedu/data/kubernetes/pv/linux82/pv002
     server: 10.0.0.151
   persistentVolumeReclaimPolicy: Retain
   capacity:
     storage: 5Gi

---

apiVersion: v1
kind: PersistentVolume
metadata:
  name: oldboyedu-linux82-pv03
  labels:
    school: oldboyedu
spec:
   accessModes:
   - ReadWriteMany
   nfs:
     path: /oldboyedu/data/kubernetes/pv/linux82/pv003
     server: 10.0.0.151
   persistentVolumeReclaimPolicy: Retain
   capacity:
     storage: 10Gi
EOF


    (2)创建pv
kubectl apply -f manual-pv.yaml


    (3)查看pv资源
kubectl get pv
        NAME : 
            pv的名称
        CAPACITY : 
            pv的容量
        ACCESS MODES: 
            pv的访问模式
        RECLAIM POLICY:
            pv的回收策略。
        STATUS :
            pv的状态。
        CLAIM:
            pv被哪个pvc使用。
        STORAGECLASS  
            sc的名称。
        REASON   
            pv出错时的原因。
        AGE
            创建的时间。

    (4)创建PVC对应的nfs挂载路径(如下图所示)
mkdir -pv /oldboyedu/data/kubernetes/pv/linux82/pv00{1..3}
ll -R /oldboyedu/data/kubernetes/pv/linux81


参考链接:
    https://kubernetes.io/docs/concepts/storage/persistent-volumes/#access-modes
    https://kubernetes.io/docs/concepts/storage/persistent-volumes/#reclaiming
    
    
    
    
持久卷声明Persistent Volume Claim(简称"PVC")
    (1)编写pvc的资源清单
cat > manual-pvc.yaml <<'EOF'
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: oldboyedu-linux82-pvc
spec:
  # 声明资源的访问模式
  accessModes:
  - ReadWriteMany
  # 声明资源的使用量
  resources:
    limits:
       storage: 4Gi
    requests:
       storage: 3Gi
EOF


    (2)创建资源
kubectl apply -f manual-pvc.yaml

    (3)查看pvc资源
kubectl get pvc


Pod引用PVC:
cat > 09-pvc.yaml <<EOF
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: oldboyedu-linux82-deploy
spec:
  replicas: 5
  selector:
    matchLabels:
      apps: oldboyedu-web
  template:
    metadata:
      name: oldboyedu-linux82-pvc
      labels:
         apps:  oldboyedu-web
    spec:
      volumes:
      - name: myweb
        # 声明NFS存储卷
        # nfs: 
        #   server: 10.0.0.201
        #   path: /oldboyedu/data/kubernetes
        # 声明PVC
        persistentVolumeClaim:
          claimName: oldboyedu-linux82-pvc
      tolerations:
      - operator: Exists
      containers:
      - name: linux82-web
        image: k8s151.oldboyedu.com:5000/oldboyedu-web/nginx:1.20.1
        volumeMounts:
        - name: myweb
          mountPath: /usr/share/nginx/html
EOF

删除pvc验证pv的回收策略:
    Retain:
       "保留回收"策略允许手动回收资源,删除pvc时,pv仍然存在,并且该卷被视为"已释放(Released)"。
       在管理员手动回收资源之前,使用该策略其他Pod将无法直接使用。
       温馨提示:
           (1)在k8s1.15.12版本测试时,删除pvc发现nfs存储卷的数据并不会被删除,pv也不会被删除;
           
    Delete:
       对于支持删除回收策略的卷插件,k8s将删除pv及其对应的数据卷数据。建议使用动态存储类(sc)实现,才能看到效果哟!
       对于AWS EBS, GCE PD, Azure Disk, or OpenStack Cinder等存储卷会被删除。
       温馨提示:
           (1)在k8s1.15.12版本测试时,在不使用sc时,则删除pvc发现nfs存储卷的数据并不会被删除;
           (2)在k8s1.15.12版本测试时,在使用sc后,可以看到删除效果哟;

    Recycle:
       对于"回收利用"策略官方已弃用。相反,推荐的方法是使用动态资源调配。
       如果基础卷插件支持,回收回收策略将对卷执行基本清理(rm -rf /thevolume/*),并使其再次可用于新的声明。
       温馨提示,在k8s1.15.12版本测试时,删除pvc发现nfs存储卷的数据被删除。


临时更改pv的回收策略:
    kubectl patch pv oldboyedu-linux82-pv02  -p '{"spec":{"persistentVolumeReclaimPolicy":"Retain"}}'


    参考链接:
        https://kubernetes.io/docs/tasks/administer-cluster/change-pv-reclaim-policy/
        
        
    温馨提示:
        基于命令行的方式修改配置,基本上都是临时修改,当资源被删除后,重新创建时依旧会根据资源清单的配置创建哟。
        
        
        
部署nfs动态存储类:
(1)k8s组件原生并不支持NFS动态存储
https://kubernetes.io/docs/concepts/storage/storage-classes/#provisioner

(2)NFS不提供内部配置器实现动态存储,但可以使用外部配置器。
git clone https://gitee.com/yinzhengjie/k8s-external-storage.git

(3)修改配置文件
cd k8s-external-storage/nfs-client/deploy
vim deployment.yaml 
...
spec:
  ...
  template:
    ...
    spec:
      ...
      containers:
        - name: nfs-client-provisioner
          ...
          env:
            - name: PROVISIONER_NAME
              value: fuseim.pri/ifs
              # 指定NFS服务器地址
            - name: NFS_SERVER
              value: 10.0.0.201
              # 指定NFS的共享路径
            - name: NFS_PATH
              value: /oldboyedu/data/kubernetes/sc
      volumes:
        - name: nfs-client-root
          # 配置NFS共享
          nfs:
            server: 10.0.0.201
            path: /oldboyedu/data/kubernetes/sc


(4)nfs服务器端创建sc需要共享路径
mkdir -pv /oldboyedu/data/kubernetes/sc

(5)创建动态存储类
kubectl apply -f class.yaml && kubectl get sc

(6)创建授权角色
kubectl apply -f rbac.yaml 

(7)部署nfs动态存储配置器
kubectl apply -f deployment.yaml 

(8)查看是否部署成功(如下图所示)
kubectl get sc,po

温馨提示:
    生产环境建议设置回收策略为保留(Retain)。
cat > class.yaml  <<'EOF'
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: managed-nfs-storage
# provisioner: fuseim.pri/ifs # or choose another name, must match deployment's env PROVISIONER_NAME'
provisioner: oldboyedu/linux
parameters:
  # 注意哈,仅对"reclaimPolicy: Delete"时生效,如果回收策略是"reclaimPolicy: Retain",则无视此参数!
  # 如果设置为false,删除数据后,不会在存储卷路径创建"archived-*"前缀的目录哟!
  # archiveOnDelete: "false"
  # 如果设置为true,删除数据后,会在存储卷路径创建"archived-*"前缀的目录哟
  archiveOnDelete: "true"
# 声明PV回收策略,默认值为Delete
reclaimPolicy: Retain
EOF

今日内容回顾:
    - 污点 
        影响POD调度。
    - 污点容忍    ***
        当一个pod能够容忍一个worker节点的所有污点。
    - 亲和性:  ***
        - 节点亲和性
        - Pod亲和性
        - Pod的反亲和性
    - 节点选择器
    - 一波控制器来袭:
        - Job:
            一次性任务。失败时可以指定重试次数。
        - CronJob:
            周期性任务。底层调用的是Job。
        - DaemonSet : *****
            每个节点都只能运行一个pod副本。
        - StatefulSet:
            适合用状态服务的部署。
        - rc:
        - rs:
        - Deployment: *****  CAK ---> 75%+
            部署微服务.
    - pv     ***
        绑定后端的真是存储设备。
    - pvc    *****
        绑定pv。
    - sc    *****
        自动创建pv。
    
            
今日作业:
    (1)晚上课堂的所有练习并完善思维导图;
    (2)将"jasonyin2020/oldboyedu-games:v0.3"镜像使用deployment组件部署,要求如下:
        - 使用cm资源配置nginx配置文件
        - 使用svc暴露服务
        - 使用sc存储网站的代码
        - 要求将该镜像传输到harbor的私有仓库,要求用户名为:"linux82",密码为:"oldboyEDU@2022",需要使用secret资源
        - 要求所有节点打污点"school=oldboyedu"
        - 要求上述所有资源清单使用单独的文件,然后再合并为一个资源清单。
        - 要求浏览器访问任意worker节点的[80-90]端口时能够访问到11个游戏哟
        
        
扩展作业:
    (1)调研isito服务的基础使用;
        关于版本支持:
            https://istio.io/latest/docs/releases/supported-releases/
        

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/112662.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Leetcode54螺旋矩阵

代码&#xff1a; class Solution {public List<Integer> spiralOrder(int[][] matrix) {List<Integer> res new ArrayList<>();if(matrixnull||matrix.length0||matrix[0].length0)return res;int left0,rightmatrix[0].length-1,up0,down matrix.length…

使用guacamole进行WEB远程桌面连接

Apache Guacamole 是一个无客户端的远程桌面网关。它支持标准协议&#xff0c;如 VNC、RDP 和 SSH&#xff0c;甚至还支持k8s、telnet连接。它可以在任何有网络的地方连接上你的服务器和Windows主机。可以同时连接多个终端&#xff0c;并且能够无缝切换。本文采用docker进行部署…

数据结构与算法(十):动态规划与贪心算法

参考引用 Hello 算法 Github&#xff1a;hello-algo 1. 动态规划算法 动态规划将一个问题分解为一系列更小的子问题&#xff0c;并通过存储子问题的解来避免重复计算&#xff0c;从而大幅提升时间效率 问题&#xff1a;给定一个共有 n 阶的楼梯&#xff0c;你每步可以上 1 阶或…

【王道代码】【2.3链表】d1

关键字&#xff1a; 递归删除x&#xff1b;删除所有x&#xff1b;递归反向输出&#xff1b;删除最小结点&#xff08;2组指针&#xff09;&#xff1b;原地逆置&#xff1b;使递增有序

2008-2021年上市公司实体企业金融化程度测算数据(原始数据+stata代码)

2008-2021年上市公司实体企业金融化程度测算&#xff08;原始数据stata代码&#xff09; 1、时间&#xff1a;2008-2021年 2、指标&#xff1a;股票代码、年份、交易性金融资产、衍生金融资产、发放贷款及垫款净额、可供出售金融资产净额、持有至到期投资净额、长期债权投资净…

github 终端克隆操作,以及对 https/ssh 的理解

前言 最近瞎搞 github 的一些配置&#xff0c;结果搞得有一段时间克隆不了仓库。不过经历了这次风波后&#xff0c;我对 github 的一些原理有了更清楚的了解。所以想稍微写一小篇文章总结输出一下&#xff0c;也欢迎有疑问的读者与博主进一步交流&#xff0c;我的理解还是有限…

我的发布.

<!DOCTYPE html> <html><head><title>我的发布</title><meta http-equiv"content-type" content"text/html; charsetutf-8"/><meta name"apple-mobile-web-app-capable" content"yes"/><…

[1Panel]开源,现代化,新一代的 Linux 服务器运维管理面板

测评介绍 本期测评试用一下1Panel这款面板。1Panel是国内飞致云旗下开源产品。整个界面简洁清爽&#xff0c;后端使用GO开发&#xff0c;前端使用VUE的Element-Plus作为UI框架&#xff0c;整个面板的管理都是基于docker的&#xff0c;想法很先进。官方还提供了视频的使用教程&…

【SA8295P 源码分析 (四)】23 - QNX Ethernet MAC 驱动 之 emac1_config.conf 配置文件解析

【SA8295P 源码分析】23 - QNX Ethernet MAC 驱动 之 emac1_config.conf 配置文件解析 系列文章汇总见:《【SA8295P 源码分析 (四)】网络模块 文章链接汇总 - 持续更新中》 本文链接:《【SA8295P 源码分析 (四)】23 - QNX Ethernet MAC 驱动 之 emac1_config.conf 配置文件解…

mysql 指定库对所有表加tenant_id

mysql 指定库里所有表加tenant_id 由于业务所需&#xff0c;区分公司主体&#xff0c;tenant_id油然而生 但库里表至少几百个&#xff0c;不可能一个一个去加&#xff0c;时间成本&#xff0c;人力成本都很大&#xff0c;所以写一个存储过程函数&#xff0c;对其进行一次性操作…

leetcode:2678. 老人的数目(python3解法)

难度&#xff1a;简单 给你一个下标从 0 开始的字符串 details 。details 中每个元素都是一位乘客的信息&#xff0c;信息用长度为 15 的字符串表示&#xff0c;表示方式如下&#xff1a; 前十个字符是乘客的手机号码。接下来的一个字符是乘客的性别。接下来两个字符是乘客的年…

leetcode:217. 存在重复元素(先排序再比较邻位)

一、题目&#xff1a; 函数原型&#xff1a; bool containsDuplicate(int* nums, int numsSize) 参数分析&#xff1a; nums是传入的数组 numsSize是传入数组的元素个数 二、思路&#xff1a; 根据题意&#xff0c;判断数组中是否存在出现两次以上的元素。可以先将数组排序&…

基于混沌博弈优化的BP神经网络(分类应用) - 附代码

基于混沌博弈优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码 文章目录 基于混沌博弈优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码1.鸢尾花iris数据介绍2.数据集整理3.混沌博弈优化BP神经网络3.1 BP神经网络参数设置3.2 混沌博弈算法应用 4.测试结果…

【汇编语言特别篇】DOSBox及常用汇编工具的详细安装教程

文章目录 &#x1f4cb;前言一. ⛳️dosbox的介绍、下载和安装1.1 &#x1f514;dosbos简介1.2 &#x1f514;dosbox的下载1.2.1 &#x1f47b;方式一&#xff1a;官网下载(推荐)1.2.2 &#x1f47b;方式二&#xff1a;网盘安装包 1.3 &#x1f514;dosbox的安装1.4 &#x1f5…

CSS 滚动驱动动画 timeline-scope

timeline-scope 语法兼容性 timeline-scope 看到 scope 就知道这个属性是和范围有关, 没错, timeline-scope 就是用来修改一个具名时间线(named animation timeline)的范围. 我们介绍过的两种时间线 scroll progress timeline 和 view progress timeline, 使用这两种时间线(通…

TCP/IP网络分层模型

TCP/IP当初的设计者真的是非常聪明&#xff0c;创造性地提出了“分层”的概念&#xff0c;把复杂的网络通信划分出多个层次&#xff0c;再给每一个层次分配不同的职责&#xff0c;层次内只专心做自己的事情就好&#xff0c;用“分而治之”的思想把一个“大麻烦”拆分成了数个“…

Linux篇 五、Ubuntu与Linux板卡建立NFS服务

Linux系列文章目录 一、香橙派Zero2设置开机连接wifi 二、香橙派Zero2获取Linux SDK源码 三、香橙派Zero2搭建Qt环境 四、Linux修改用户名 文章目录 Linux系列文章目录前言一、连接到局域网互ping测试 二、安装NFS服务配置NFS更新exports配置三、板卡安装NFS客户端四、板卡临时…

LINUX | hexdump以16进制查看文件内容

LINUX | hexdump以16进制查看文件内容 时间&#xff1a;2023-10-20 文章目录 LINUX | hexdump以16进制查看文件内容1.参考2.示例1.以ASCII字符显示文件中字符2.以16进制和相应的ASCII字符显示文件里的字符3.只显示文件中前n个字符4.以偏移量开始格式输出 1.参考 1.Linux命令–h…

前端 js 经典:递归

1. 什么是递归 函数内部调用自己&#xff0c;这就是递归 2. 为什么用递归 对数据进行处理&#xff0c;优化处理流程可以用递归 3. 构成递归三要素&#xff08;必须&#xff09; 3.1 参数递归逻辑&#xff1a;如下例&#xff0c;demo(n-1)对比 demo(n)参数递归逻辑为 n-1 …

【SA8295P 源码分析 (四)】32 - QNX Ethernet Phy_Switch 驱动初始化 源码分析

【SA8295P 源码分析】32 - QNX Ethernet Phy_Switch 驱动初始化 源码分析 一、使用现有的库配置 emac 和 phy_switch功能二、phy_switch 驱动初始化流程分析2.1 emac_mdio_register() 函数分析2.2 emac_mdio_callback() 函数分析系列文章汇总见:《【SA8295P 源码分析 (四)】网…