1、base64 加密和解密 # 1、加密 [root@k8s-m-01 nfs]# echo -n 'Mm2022**00' |base64 TW0yMDIyKiowMA==# 2、解密 [root@k8s-m-01 nfs]# echo -n 'TW0yMDIyKiowMA==' |base64 -d Mm2022**002、持久化操作# 1、PV&PVC PV:持久卷(Persistent Volume),将应用需要持久化的数据保存到指定位置 (磁盘分区) PVC:持久卷申明(Persistent Volume Claim),申明需要使用的持久卷规格 (磁盘请求)# 2、Secret Secret 对象类型用来保存敏感信息,例如密码、OAuth 令牌和 SSH 密钥。 将这些信息放在 secret 中比放在 Pod 的定义或者 容器镜像 中来说更加安全和灵活。 #命令格式 kubectl create secret docker-registry regcred \--docker-server=<你的镜像仓库服务器> \--docker-username=<你的用户名> \--docker-password=<你的密码> \--docker-email=<你的邮箱地址>3、scheduuler调度器公平: 每个节点分配资源 资源高效利用: 集群所有资源最大化 效率: 调度性能要好 灵活: 根据自己的需求来调度
- 自动调度:运行在哪个节点上完全由Scheduler经过一系列的算法计算得出
 - 定向调度:NodeName、NodeSelector
 - 亲和性调度:NodeAffinity、PodAffinity、PodAntiAffinity
 - 污点(容忍)调度:Taints、Toleration
4、节点亲和性
Affinity主要分为三类:
- nodeAffinity(node亲和性): 以node为目标,解决pod可以调度到哪些node的问题
- podAffinity(pod亲和性) : 以pod为目标,解决pod可以和哪些已存在的pod部署在同一个拓扑域中的问题
- podAntiAffinity(pod反亲和性) : 以pod为目标,解决pod不能和哪些已存在pod部署在同一个拓扑域中的问题
案例:
 # 1、先打标签
 [root@k8s-m-01 pod]# kubectl label nodes k8s-n-01 nodeenv=pro
[root@k8s-m-01 pod]# kubectl get node --show-labels
 NAME       STATUS   ROLES                  AGE     VERSION   LABELS
 k8s-m-01   Ready    control-plane,master   3d      v1.21.3   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-m-01,kubernetes.io/os=linux,node-role.kubernetes.io/control-plane=,node-role.kubernetes.io/master=,node.kubernetes.io/exclude-from-external-load-balancers=
 k8s-n-01   Ready    
 k8s-n-02   Ready    
# 2、编写yml
 apiVersion: v1
 kind: Pod
 metadata:
   name: pod-nodeaffinity-required
   namespace: dev
 spec:
   containers:
   - name: nginx
     image: nginx:1.17.1
   affinity:  #亲和性设置
     nodeAffinity: #设置node亲和性
       requiredDuringSchedulingIgnoredDuringExecution: # 硬限制
         nodeSelectorTerms:
         - matchExpressions: # 匹配env的值在["pro,"yyy"]中的标签
           - key: nodeenv
             operator: In
             values: ["pro","yyy"]
 #3、验证结果
 [root@k8s-m-01 ~]# kubectl create -f pod-nodeaffinity-required.yaml
 pod/pod-nodeaffinity-required created
#4、此时查看,发现调度成功,已经将pod调度到了k8s-n-01上
 [root@k8s-m-01 ~]# kubectl get pods pod-nodeaffinity-required -n dev -o wide
 NAME                        READY   STATUS    RESTARTS   AGE   IP            NODE  … 
 pod-nodeaffinity-required   1/1     Running   0          11s   10.244.1.89   k8s-n-01 …
注:
 NodeAffinity规则设置的注意事项:
 # 1 、如果同时定义了nodeSelector和nodeAffinity,那么必须两个条件都得到满足,Pod才能运行在指定的Node上
 # 2 、如果nodeAffinity指定了多个nodeSelectorTerms,那么只需要其中一个能够匹配成功即可
 # 3 、如果一个nodeSelectorTerms中有多个matchExpressions ,则一个节点必须满足所有的才能匹配成功
 # 4 、如果一个pod所在的Node在Pod运行期间其标签发生了改变,不再符合该Pod的节点亲和性需求,则系统将忽略此变化
5、pod亲和(PodAntiAffinity)
PodAntiAffinity主要实现以运行的Pod为参照,让新创建的Pod跟参照pod不在一个区域中的功能。
 它的配置方式和选项跟PodAffinty是一样的,这里不再做详细解释,直接做一个测试案例。
apiVersion: v1
 kind: Pod
 metadata:
   name: pod-podantiaffinity-required
   namespace: dev
 spec:
   containers:
   - name: nginx
     image: nginx:1.17.1
   affinity:  #亲和性设置
     podAntiAffinity: #设置pod亲和性
       requiredDuringSchedulingIgnoredDuringExecution: # 硬限制
       - labelSelector:
           matchExpressions: # 匹配podenv的值在["pro"]中的标签
           - key: podenv
             operator: In
             values: ["pro"]
         topologyKey: kubernetes.io/hostname
         
  [root@k8s-m-01 pod]# kubectl get pod -ndev -owide
 NAME                           READY   STATUS    RESTARTS   AGE   IP            NODE       NOMINATED NODE   READINESS GATES
 pod-podantiaffinity-required   1/1     Running   0    70s   10.244.1.53   k8s-n-02   
6、污点和容忍
# 1、污点(Taints)
前面的调度方式都是站在Pod的角度上,通过在Pod上添加属性,来确定Pod是否要调度到指定的Node上,其实我们也可以站在Node的角度上,通过在Node上添加污点属性,来决定是否允许Pod调度过来。
Node被设置上污点之后就和Pod之间存在了一种相斥的关系,进而拒绝Pod调度进来,甚至可以将已经存在的Pod驱逐出去。
污点的格式为:key=value:effect, key和value是污点的标签,effect描述污点的作用,支持如下三个选项:
- PreferNoSchedule:kubernetes将尽量避免把Pod调度到具有该污点的Node上,除非没有其他节点可调度
 - NoSchedule:kubernetes将不会把Pod调度到具有该污点的Node上,但不会影响当前Node上已存在的Pod
 - NoExecute:kubernetes将不会把Pod调度到具有该污点的Node上,同时也会将Node上已存在的Pod驱离
# 1、设置污点
 kubectl taint nodes k8s-n-01 key=value:effect
# 2、去除污点
 kubectl taint nodes k8s-n-01 key:effect-
# 3、去除所有污点
 kubectl taint nodes k8s-n-01 key-
接下来,演示下污点的效果:
1. 准备节点k8s-n-01(为了演示效果更加明显,暂时停止k8s-n-02节点)
 2. 为k8s-n-01节点设置一个污点: tag=heima:PreferNoSchedule;然后创建pod1( pod1 可以 )
 3. 修改为k8s-n-01节点设置一个污点: tag=heima:NoSchedule;然后创建pod2( pod1 正常  pod2 失败 )
 4. 修改为k8s-n-01节点设置一个污点: tag=heima:NoExecute;然后创建pod3 ( 3个pod都失败 )
# 1、为k8s-n-01设置污点(PreferNoSchedule)
 [root@k8s-m-01 ~]# kubectl taint nodes k8s-n-01 tag=heima:PreferNoSchedule
# 2、创建pod1
 [root@k8s-m-01 ~]# kubectl run taint1 --image=nginx:1.17.1 -n dev
 [root@k8s-m-01 ~]# kubectl get pods -n dev -o wide
 NAME                      READY   STATUS    RESTARTS   AGE     IP           NODE   
 taint1-7665f7fd85-574h4   1/1     Running   0          2m24s   10.244.1.59   k8s-n-01    
# 3、为k8s-n-01设置污点(取消PreferNoSchedule,设置NoSchedule)
 [root@k8s-m-01 ~]# kubectl taint nodes k8s-n-01 tag:PreferNoSchedule-
 [root@k8s-m-01 ~]# kubectl taint nodes k8s-n-01 tag=heima:NoSchedule
# 4、创建pod2
 [root@k8s-m-01 ~]# kubectl run taint2 --image=nginx:1.17.1 -n dev
 [root@k8s-m-01 ~]# kubectl get pods taint2 -n dev -o wide
 NAME                      READY   STATUS    RESTARTS   AGE     IP            NODE
 taint1-7665f7fd85-574h4   1/1     Running   0          2m24s   10.244.1.59   k8s-n-01 
 taint2-544694789-6zmlf    0/1     Pending   0          21s     
# 5、为k8s-n-01设置污点(取消NoSchedule,设置NoExecute)
 [root@k8s-m-01 ~]# kubectl taint nodes k8s-n-01 tag:NoSchedule-
 [root@k8s-m-01 ~]# kubectl taint nodes k8s-n-01 tag=heima:NoExecute
# 6、创建pod3
 [root@k8s-m-01 ~]# kubectl run taint3 --image=nginx:1.17.1 -n dev
 [root@k8s-m-01 ~]# kubectl get pods -n dev -o wide
 NAME                      READY   STATUS    RESTARTS   AGE   IP       NODE     NOMINATED 
 taint1-7665f7fd85-htkmp   0/1     Pending   0          35s   
 taint2-544694789-bn7wb    0/1     Pending   0          35s   
 taint3-6d78dbd749-tktkq   0/1     Pending   0          6s    
总结:
     使用kubeadm搭建的集群,默认就会给master节点添加一个污点标记,所以pod就不会调度到master节点上.
2、容忍
 ##### 2、容忍(Toleration)
我们可以在node上添加污点用于拒绝pod调度上来,但是如果就是想将一个pod调度到一个有污点的node上去,这时候应该怎么做呢?这就要使用到容忍。
> 污点就是拒绝,容忍就是忽略,Node通过污点拒绝pod调度上去,Pod通过容忍忽略拒绝
下面先通过一个案例看下效果:
1、已经在k8s-n-01节点上打上了NoExecute的污点,此时pod是调度不上去的
 2、可以通过给pod添加容忍,然后将其调度上去
###### 1、创建pod-toleration.yaml,内容如下
apiVersion: v1
kind: Pod
metadata:
  name: pod-toleration
  namespace: dev
spec:
  containers:
  - name: nginx
    image: nginx:1.17.1
  tolerations:      # 添加容忍
  - key: "tag"        # 要容忍的污点的key
    operator: "Equal" # 操作符
    value: "heima"    # 容忍的污点的value
    effect: "NoExecute"   # 添加容忍的规则,这里必须和标记的污点规则相同
# 添加容忍之前的pod
[root@k8s-m-01 ~]# kubectl get pods -n dev -o wide
NAME             READY   STATUS    RESTARTS   AGE   IP       NODE     NOMINATED 
pod-toleration   0/1     Pending   0          3s    <none>   <none>   <none>           # 添加容忍之后的pod
[root@k8s-m-01 ~]# kubectl get pods -n dev -o wide
NAME             READY   STATUS    RESTARTS   AGE   IP            NODE    NOMINATED
pod-toleration   1/1     Running   0          3s    10.244.1.62   k8s-n-01   <none>        
###### 2、下面看一下容忍的详细配置:
 [root@k8s-m-01 ~]# kubectl explain pod.spec.tolerations
 …
 FIELDS:
    key       # 对应着要容忍的污点的键,空意味着匹配所有的键
    value     # 对应着要容忍的污点的值
    operator  # key-value的运算符,支持Equal和Exists(默认)
    effect    # 对应污点的effect,空意味着匹配所有影响
    tolerationSeconds   # 容忍时间, 当effect为NoExecute时生效,表示pod在Node上的停留时间