k8s基础

k8s核心技术

kubectl

概述

  • 是k8s集群的命令行工具,通过这个工具可以对集群本身进行管理,并且可以在集群上进行容器化的操作。

基本语法

  • kubectl [command] [TYPE] [NAME] [flags]
    • command:指定对资源执行的操作,例如create get describe delete
    • type: 指定资源类型,资源的类型是大小写敏感的,开发者可以通过单数,复数,和缩略的形式
      在这里插入图片描述
    • name :指定资源的名称,也是大小写敏感的,如果省略名称就会显示所有
    • flags:指定参数
[root@k8s-master1 YAML]# kubectl get nodes
NAME        STATUS   ROLES    AGE   VERSION
k8s-node1   Ready    <none>   47m   v1.16.0
k8s-node2   Ready    <none>   42m   v1.16.0

命令列表详解

常用命令

在这里插入图片描述
在这里插入图片描述

yaml文件

概述

  • 上述的kubectl命令一般只能执行一次 不方便
  • 在集群中对资源管理和资源对象的编排部署都可以使用yaml文件,也就是可以把需要的对资源的操作编辑到yaml文件中,我们把这种文件叫做资源清单文件,通过kubectl命令可以直接使用资源清单文件就可以实现大量的资源对象的编排部署工作。

语法格式

  • 可以认为是一种标记语言,为了强调这种语言以数据为中心,而不是以标记语言为中心。yaml是一个可读性高,用来表示数据序列的格式
  • yaml基本语法在这里插入图片描述
    • 一般开头缩进两个空格,字符后边缩进一个空格 如冒号,逗号等后边
    • 使用—表示新的yaml文件的开始

完整yaml文件组成部分

  1. 控制器定义
    在这里插入图片描述
  2. 被控制对象
    在这里插入图片描述

常用字段

在这里插入图片描述

编写方式

  • 一般不会从0手写出来,一般会通过生成的方式来做
    1. 使用kubectl create生成一个yaml文件(而不去执行create操作)

      [root@k8s-master1 ~]# kubectl create deployment web --image=nginx -o yaml --dry-run
      apiVersion: apps/v1
      kind: Deployment
      metadata:
        creationTimestamp: null
        labels:
          app: web
        name: web
      spec:
        replicas: 1
        selector:
          matchLabels:
            app: web
        strategy: {}
        template:
          metadata:
            creationTimestamp: null
            labels:
              app: web
          spec:
            containers:
            - image: nginx
              name: nginx
              resources: {}
      status: {}
      
    2. 资源已经部署,从资源中拿出yaml文件,kubectl get导出yaml文件

      [root@k8s-master1 ~]# kubectl get deploy
      NAME    READY   UP-TO-DATE   AVAILABLE   AGE
      myweb   1/1     1            1           42m
      [root@k8s-master1 ~]# kubectl get deploy myweb -o=yaml --export > myweb_expose.yaml
      Flag --export has been deprecated, This flag is deprecated and will be removed in future.
      [root@k8s-master1 ~]# ls
      anaconda-ks.cfg  etcd.tar.gz  k8sFiles  myweb_expose.yaml  TLS  TLS.tar.gz
      [root@k8s-master1 ~]# vi myweb_expose.yaml 
      
      apiVersion: apps/v1
      kind: Deployment
      metadata:
        annotations:
          deployment.kubernetes.io/revision: "1"
        creationTimestamp: null
        generation: 1
        labels:
          app: myweb
        name: myweb
        selfLink: /apis/apps/v1/namespaces/default/deployments/myweb
      spec:
        progressDeadlineSeconds: 600
        replicas: 1
        revisionHistoryLimit: 10
        selector:
          matchLabels:
            app: myweb
        strategy:
          rollingUpdate:
            maxSurge: 25%
            maxUnavailable: 25%
          type: RollingUpdate
        template:
          metadata:
            creationTimestamp: null
            labels:
              app: myweb
          spec:
            containers:
            - image: nginx:1.7.9
              imagePullPolicy: IfNotPresent
              name: nginx
              resources: {}
      
      

Pod

概述

在这里插入图片描述

  • 最小的管理单元
  • 包含多个容器(一组容器的集合)
  • 一个pod中容器共享网络命名空间
  • pod是短暂的(生命周期中ip等可能不唯一)
    在这里插入图片描述

存在意义

  • 创建容器使用的是docker,一个docker对应一个容器,一个容器对应一个应用程序。一个容器必定有一个进程,docker对应的是单进程一旦挂掉,不便于管理。
  • pod是一个多进程的设计,一个pod有多个容器,一个容器一个应用程序,可以运行多个应用程序。
  • pod的存在也是为了亲密性应用而产生的
    • 多个应用之间需要进行交互
    • 网络之间的调用,内部更舒服
    • 两个应用之间频繁进行调用

实现机制

共享网络(Pause容器)

  • 容器本身只应该是相互隔离的,多个容器在一个namespace下,在pod中,pod会自己创建一个根容器(pause/info容器),创建业务容器的时候会把业务容器加入到根容器中去,info会独立出一个ip mac port ,业务容器进入了同一个namespa,共享ip mac port

共享存储(数据卷)

  • pod中需要进行持久化存储,如日志、业务数据、引入数据卷的概念,使用数据卷进行持久化的存储
  • 在这里插入图片描述

Pod操作

镜像

在这里插入图片描述

  • IfNotPresent:默认值,镜像在宿主机不存在的时候就会拉取
  • Always:每次创建pod都会重新拉取
  • Never:不会主动拉取镜像

资源限制

  • 在部署pod的时候往往需要设置该pod需要的资源的数量,那么集群中的node节点可能会出现不同的资源配置,就会导致部分机器无法部署这样的一个pod,于是pod在白那些配置文件的时候就可以指出需要的资源限制情况。
  • 在这里插入图片描述
  • 配置文件
    • requests:调度的时候做到,调度大小
    • limits: 最大的大小
    • 单位:
      • Mi:兆
      • 1c = 1000m —>0.25核:250m …
    • 限制本身不是pod做到的,而是由docker做到的

重启机制

  • pod中有多个容器,若容器退出、终止了,后续的操作可以是终止或者重启
  • 在这里插入图片描述
  • 策略
    • Always:当容器终止或者退出之后,总是重启容器,默认策略
      • 需要一直提供服务的docker(nginx等)
    • OnFailure:当容器异常退出,状态码非0,才会重启
      • 对于批量任务来说,发生了错误才会重启,正常做完就不重启
    • Never:容器退出不会重启
      • 对于批量任务来说,执行了之后就不用再执行了

Pod健康检查

  • 在k8s集群中,状态是根据容器状态检查,有时候容器可能还在running,但是已经不能对外提供服务,需要前往应用层面进行健康检查。
检查机制

在这里插入图片描述
在这里插入图片描述

例子

在这里插入图片描述

  • 通过shell检查返回码,刚开始5秒系统正常,文件存在,返回的结果码为0,在删除了文件之后,再进行cat则无法成功,$?得到的状态码为非0,exec策略下回去检查重启策略。

调度策略

在这里插入图片描述
在这里插入图片描述

  • 调度过程的影响因素
    • pod的资源的限制,根据上文说过的request找到足够应付的一个node节点进行调度;
    • 配置文件中有一个节点选择器标签
      • 可以对集群中的node进行分组,每个分组的名字即标签
        • 命令
          [root@k8s-master1 ~]# kubectl label node k8s-node1 env_role=dev
          node/k8s-node1 labeled
          [root@k8s-master1 ~]# kubectl get nodes --show-labels
          NAME        STATUS   ROLES    AGE     VERSION   LABELS
          k8s-node1   Ready    <none>   7h1m    v1.16.0   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,env_role=dev,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-node1,kubernetes.io/os=linux
          k8s-node2   Ready    <none>   6h56m   v1.16.0   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-node2,kubernetes.io/os=linux
          # 包含一些其他信息还有
          
      • 把pod节点调度到标签为dev的机器
      • 在这里插入图片描述
    • 节点亲和性对pod调度影响
      • 亲和性功能标签更强大,如果没有对应标签就无法使用标签调度。
      • nodeAffinity和之前的nodeSelector基本一致,也是根据节点上标签的约束,来决定pod调度到哪些节点
      • 操作符:
        • In NotIn Exists Gt Lt DoesNotExists
        • 硬亲和性:约束条件必须满足,不满足就等待在这里插入图片描述
        • 软亲和性:做一次尝试满足,不满足还是会找另外的节点进行调度,weight表示权重
          在这里插入图片描述
    • 污点 污点容忍对调度的影响
      • 污点不做普通的分配调度,是一种节点的属性,针对特定场景进行调度
        • 专用节点
        • 配置特点硬件节点
        • 基于Taint驱逐
      • 常用命令
        • 查看节点污点情况
        [root@k8s-master1 ~]# kubectl describe node k8s-node1 | grep Taint
        Taints:             <none>
        
        • 打污点
        [root@k8s-master1 ~]# kubectl taint node k8s-node1 env_role=yes:NoSchedule
        node/k8s-node1 tainted
        
        • 删除污点
        [root@k8s-master1 ~]# kubectl taint node k8s-node1 env_role:NoSchedule-
        node/k8s-node1 untainted
        
      • 污点的值
        • NoSchedule:这个节点一定不会被调度
        • PreferNoSchedule: 尽量不要调度这个节点,但也有被调度的几率
        • NoExecute:当前不会调度,并且驱逐到node的已有的pod(其他节点)
      • 实例分析
[root@k8s-master1 ~]# kubectl create deployment wen --image=nignx
deployment.apps/wen created
[root@k8s-master1 ~]# kubectl get pod
NAME                     READY   STATUS              RESTARTS   AGE
myweb-7ccb985444-d8xf7   1/1     Running             0          8h
wen-6df6947c5f-q7f88     0/1     ContainerCreating   0          3s
[root@k8s-master1 ~]# kubectl get pod -o wide
NAME                     READY   STATUS         RESTARTS   AGE   IP           NODE        NOMINATED NODE   READINESS GATES
myweb-7ccb985444-d8xf7   1/1     Running        0          8h    10.244.0.2   k8s-node1   <none>           <none>
wen-6df6947c5f-q7f88     0/1     ErrImagePull   0          10s   10.244.1.2   k8s-node2   <none>           <none>
[root@k8s-master1 ~]# kubectl scale deployment web --replicas=5
Error from server (NotFound): deployments.apps "web" not found
[root@k8s-master1 ~]# kubectl scale deployment wen --replicas=5
deployment.apps/wen scaled
[root@k8s-master1 ~]# kubectl get pod -o wide
NAME                     READY   STATUS              RESTARTS   AGE   IP           NODE        NOMINATED NODE   READINESS GATES
myweb-7ccb985444-d8xf7   1/1     Running             0          8h    10.244.0.2   k8s-node1   <none>           <none>
wen-6df6947c5f-2cfpm     0/1     ContainerCreating   0          5s    <none>       k8s-node2   <none>           <none>
wen-6df6947c5f-48xsh     0/1     ContainerCreating   0          5s    <none>       k8s-node2   <none>           <none>
wen-6df6947c5f-cx5zs     0/1     ContainerCreating   0          5s    <none>       k8s-node1   <none>           <none>
wen-6df6947c5f-dbc8p     0/1     ContainerCreating   0          5s    <none>       k8s-node1   <none>           <none>
wen-6df6947c5f-q7f88     0/1     ErrImagePull        0          54s   10.244.1.2   k8s-node2   <none>           <none>
[root@k8s-master1 ~]# kubectl get pod -o wide
NAME                     READY   STATUS             RESTARTS   AGE   IP           NODE        NOMINATED NODE   READINESS GATES
myweb-7ccb985444-d8xf7   1/1     Running            0          8h    10.244.0.2   k8s-node1   <none>           <none>
wen-6df6947c5f-2cfpm     0/1     ErrImagePull       0          13s   10.244.1.3   k8s-node2   <none>           <none>
wen-6df6947c5f-48xsh     0/1     ErrImagePull       0          13s   10.244.1.4   k8s-node2   <none>           <none>
wen-6df6947c5f-cx5zs     0/1     ImagePullBackOff   0          13s   10.244.0.5   k8s-node1   <none>           <none>
wen-6df6947c5f-dbc8p     0/1     ImagePullBackOff   0          13s   10.244.0.6   k8s-node1   <none>           <none>
wen-6df6947c5f-q7f88     0/1     ImagePullBackOff   0          62s   10.244.1.2   k8s-node2   <none>           <none>
[root@k8s-master1 ~]# kubectl delete deployment wen
deployment.apps "wen" deleted
[root@k8s-master1 ~]# kubectl get pod -o wide
NAME                     READY   STATUS    RESTARTS   AGE   IP           NODE        NOMINATED NODE   READINESS GATES
myweb-7ccb985444-d8xf7   1/1     Running   0          8h    10.244.0.2   k8s-node1   <none>           <none>
[root@k8s-master1 ~]# kubectl taint node k8s-node1 env_role=yes:NoShchedule
error: invalid taint effect: NoShchedule, unsupported taint effect
See 'kubectl taint -h' for help and examples
[root@k8s-master1 ~]# kubectl taint node k8s-node1 env_role=yes:NoSchedule
node/k8s-node1 tainted
[root@k8s-master1 ~]# kubectl describe node k8s-node1 | grep Taint
Taints:             env_role=yes:NoSchedule
[root@k8s-master1 ~]# kubectl create deployment web --image=nginx
deployment.apps/web created
[root@k8s-master1 ~]# kubectl get pod -o wide
NAME                     READY   STATUS              RESTARTS   AGE   IP           NODE        NOMINATED NODE   READINESS GATES
myweb-7ccb985444-d8xf7   1/1     Running             0          8h    10.244.0.2   k8s-node1   <none>           <none>
web-d86c95cc9-fjg7w      0/1     ContainerCreating   0          6s    <none>       k8s-node2   <none>           <none>
[root@k8s-master1 ~]# kubectl scale deployment web --replicas=5
deployment.apps/web scaled
[root@k8s-master1 ~]# kubectl get pod -o wide
NAME                     READY   STATUS              RESTARTS   AGE   IP           NODE        NOMINATED NODE   READINESS GATES
myweb-7ccb985444-d8xf7   1/1     Running             0          8h    10.244.0.2   k8s-node1   <none>           <none>
web-d86c95cc9-2wtgh      0/1     ContainerCreating   0          2s    <none>       k8s-node2   <none>           <none>
web-d86c95cc9-5btnj      0/1     ContainerCreating   0          2s    <none>       k8s-node2   <none>           <none>
web-d86c95cc9-fjg7w      1/1     Running             0          36s   10.244.1.5   k8s-node2   <none>           <none>
web-d86c95cc9-jpq8x      0/1     ContainerCreating   0          2s    <none>       k8s-node2   <none>           <none>
web-d86c95cc9-mrqp9      0/1     ContainerCreating   0          2s    <none>       k8s-node2   <none>           <none>
[root@k8s-master1 ~]#
  • 可以看到的是在没有打污点之前执行多份镜像之后,基本可以做到在node中进行平均分配,但是如果给node1打上了NoSchedule的污点,就没有再出现在node1的节点上。

    • 污点容忍:即便是设置为NoSchedule也可能会被调度。 在这里插入图片描述
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值