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**00

2、持久化操作

# 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    <none>                 2d10h   v1.21.3   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-n-01,kubernetes.io/os=linux,nodeenv=pro
k8s-n-02   Ready    <none>                 3d      v1.21.3   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-n-02,kubernetes.io/os=linux

# 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   <none> #不在k8s-n-01机器上

 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     <none>        <none>   

# 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   <none>   <none>   <none>    
taint2-544694789-bn7wb    0/1     Pending   0          35s   <none>   <none>   <none>     
taint3-6d78dbd749-tktkq   0/1     Pending   0          6s    <none>   <none>   <none>     

总结:
    使用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:&nbsp;v1
kind:&nbsp;Pod
metadata:
&nbsp;&nbsp;name:&nbsp;pod-toleration
&nbsp;&nbsp;namespace:&nbsp;dev
spec:
&nbsp;&nbsp;containers:
&nbsp;&nbsp;-&nbsp;name:&nbsp;nginx
&nbsp;&nbsp;&nbsp;&nbsp;image:&nbsp;nginx:1.17.1
&nbsp;&nbsp;tolerations:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;添加容忍
&nbsp;&nbsp;-&nbsp;key:&nbsp;&quot;tag&quot;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;要容忍的污点的key
&nbsp;&nbsp;&nbsp;&nbsp;operator:&nbsp;&quot;Equal&quot;&nbsp;#&nbsp;操作符
&nbsp;&nbsp;&nbsp;&nbsp;value:&nbsp;&quot;heima&quot;&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;容忍的污点的value
&nbsp;&nbsp;&nbsp;&nbsp;effect:&nbsp;&quot;NoExecute&quot;&nbsp;&nbsp;&nbsp;#&nbsp;添加容忍的规则,这里必须和标记的污点规则相同
#&nbsp;添加容忍之前的pod
[root@k8s-m-01&nbsp;~]#&nbsp;kubectl&nbsp;get&nbsp;pods&nbsp;-n&nbsp;dev&nbsp;-o&nbsp;wide
NAME&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;READY&nbsp;&nbsp;&nbsp;STATUS&nbsp;&nbsp;&nbsp;&nbsp;RESTARTS&nbsp;&nbsp;&nbsp;AGE&nbsp;&nbsp;&nbsp;IP&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NODE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NOMINATED&nbsp;
pod-toleration&nbsp;&nbsp;&nbsp;0/1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Pending&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3s&nbsp;&nbsp;&nbsp;&nbsp;&lt;none&gt;&nbsp;&nbsp;&nbsp;&lt;none&gt;&nbsp;&nbsp;&nbsp;&lt;none&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

#&nbsp;添加容忍之后的pod
[root@k8s-m-01&nbsp;~]#&nbsp;kubectl&nbsp;get&nbsp;pods&nbsp;-n&nbsp;dev&nbsp;-o&nbsp;wide
NAME&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;READY&nbsp;&nbsp;&nbsp;STATUS&nbsp;&nbsp;&nbsp;&nbsp;RESTARTS&nbsp;&nbsp;&nbsp;AGE&nbsp;&nbsp;&nbsp;IP&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NODE&nbsp;&nbsp;&nbsp;&nbsp;NOMINATED
pod-toleration&nbsp;&nbsp;&nbsp;1/1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Running&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3s&nbsp;&nbsp;&nbsp;&nbsp;10.244.1.62&nbsp;&nbsp;&nbsp;k8s-n-01&nbsp;&nbsp;&nbsp;&lt;none&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

###### 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上的停留时间


Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐