第二节 Kubernetes核心组件-kubectl和pod

182 阅读6分钟

一、kubectl

kubectl 是 Kubernetes 集群的命令行工具,通过 kubectl 能够对集群本身进行管理,并能 够在集群上进行容器化应用的安装部署。

1.查看集群节点:kubectl get node/nodes

2.查看帮助:kubectl --help

3.创建nginx pod kubectl create deployment nginx --image=nginx

4.对外暴露端口:kubectl expose deployment nginx --port=80 --type=NodePort

5.查看对外暴露的svc端口列表:kubectl get pod,svc

6.查看状态:kubectl get cs

二、pod

Pod 是 k8s 系统中可以创建和管理的最小单元,是资源对象模型中由用户创建或部署的最 小资源对象模型,也是在 k8s 上运行容器化应用的资源对象,其他的资源对象都是用来支 撑或者扩展 Pod 对象功能的,比如控制器对象是用来管控 Pod 对象的,Service 或者 Ingress 资源对象是用来暴露 Pod 引用对象的,PersistentVolume 资源对象是用来为 Pod 提供存储等等,k8s 不会直接处理容器,而是 Pod,Pod 是由一个或多个 container 组成 Pod (一个pod包含一个或多个容器)是 Kubernetes 的最重要概念,每一个 Pod 都有一个特殊的被称为”根容器“的 Pause容器。Pause 容器对应的镜 像属于 Kubernetes 平台的一部分,除了 Pause 容器,每个 Pod 还包含一个或多个紧密相关的用户业务容器。

1.pod存在的意义:

1.一个pod运行多个容器,一个容器对应一个应用程序

2.pod多进程设计,运行多个应用程序。

3.pod存在为了亲密性应用,数据交互亲密性和网络连通亲密性。

2.pod实现机制:

1.共享网络

容器本身之间相互隔离的,一般是通过 namespace 和 group 进行隔离

关于Pod实现原理,首先会在Pod会创建一个根容器: pause容器,然后我们在创建业务容器 【nginx,redis 等】,在我们创建业务容器的时候,会把它添加到 info容器 中

而在 info容器 中会独立出 ip地址,mac地址,port 等信息,然后实现网络的共享。

image.png

完整步骤如下

  • 通过 Pause 容器,把其它业务容器加入到Pause容器里,让所有业务容器在同一个名称空间中,可以实现网络共享。

2.共享存储

Pod持久化数据,专门存储到某个地方中

image.png

使用 Volumn数据卷进行共享存储,node1和node2共享一个存储空间,一个节点宕机了,另外节点使用数据卷不会造成数据丢失。

3.Pod镜像拉取策略:

image.png

拉取策略主要分为了以下几种

  • IfNotPresent:默认值,镜像在宿主机上不存在才拉取
  • Always:每次创建Pod都会重新拉取一次镜像
  • Never:Pod永远不会主动拉取这个镜像

4.Pod资源限制

也就是我们Pod在进行调度的时候,可以对调度的资源进行限制,例如我们限制 Pod调度是使用的资源是 2C4G,那么在调度对应的node节点时,只会占用对应的资源,对于不满足资源的节点,将不会进行调度。

image.png

image.png

这里分了两个部分

  • request:表示调度所需的资源
  • limits:表示最大所占用的资源

5.Pod重启机制

因为Pod中包含了很多个容器,假设某个容器出现问题了,那么就会触发Pod重启机制

image.png

重启策略主要分为以下三种

  • Always:当容器终止退出后,总是重启容器,默认策略 【nginx等,需要不断提供服务】
  • OnFailure:当容器异常退出(退出状态码非0)时,才重启容器。
  • Never:当容器终止退出,从不重启容器 【批量任务】

6.Pod健康检查

通过容器检查,原来我们使用下面的命令来检查 kubectl get pod

# 存活检查,如果检查失败,将杀死容器,根据Pod的restartPolicy【重启策略】来操作
livenessProbe

# 就绪检查,如果检查失败,Kubernetes会把Pod从Service endpoints中剔除
readinessProbe

image.png

Probe支持以下三种检查方式

  • http Get:发送HTTP请求,返回200 - 400 范围状态码为成功
  • exec:执行Shell命令返回状态码是0为成功
  • tcpSocket:发起TCP Socket建立成功

7.Pod调度策略

查看容器详细信息:kubectl get pods -o wide

创建Pod流程

  • 首先创建一个pod,然后创建一个API Server 和 Etcd【把创建出来的信息存储在etcd中】
  • 然后创建 Scheduler,监控API Server是否有新的Pod,如果有的话,会通过调度算法,把pod调度某个node上
  • 在node节点,会通过 kubelet -- apiserver 读取etcd 拿到分配在当前node节点上的pod,然后通过docker创建容器

image.png

8.影响Pod调度的属性

1.根据request找到足够node节点进行调度

image.png

2.节点选择器标签影响Pod调度

image.png

image.png

我们可以通过以下命令,给我们的节点新增标签,然后节点选择器就会进行调度了

kubectl label node node1 env_role=prod

3.节点亲和性

节点亲和性 nodeAffinity和之前nodeSelector基本一样的,根据节点上标签约束来决定Pod调度到哪些节点上

  • 硬亲和性:约束条件必须满足
  • 软亲和性:尝试满足,不保证

image.png

支持常用操作符:in、NotIn、Exists、Gt、Lt、DoesNotExists

反亲和性:就是和亲和性刚刚相反,如 NotIn、DoesNotExists等

4.污点和污点容忍

概述

nodeSelector 和 NodeAffinity,都是Prod调度到某些节点上,属于Pod的属性,是在调度的时候实现的。

Taint 污点:节点不做普通分配调度,是节点属性。

场景

  • 专用节点【限制ip】
  • 配置特定硬件的节点【固态硬盘】
  • 基于Taint驱逐【在node1不放,在node2放】

**查看污点情况

kubectl describe node k8smaster | grep Taint

image.png

污点值有三个

  • NoSchedule:一定不被调度
  • PreferNoSchedule:尽量不被调度【也有被调度的几率】
  • NoExecute:不会调度,并且还会驱逐Node已有Pod

未节点添加污点

kubectl taint node [node] key=value:污点的三个值

举例:

kubectl taint node k8snode1 env_role=yes:NoSchedule

删除污点

kubectl taint node k8snode1 env_role:NoSchedule-

演示

我们现在创建多个Pod,查看最后分配到Node上的情况

首先我们创建一个 nginx 的pod

kubectl create deployment web --image=nginx

然后使用命令查看

kubectl get pods -o wide

image.png

我们可以非常明显的看到,这个Pod已经被分配到 k8snode3 节点上了

下面我们把pod复制5份,在查看情况pod情况

kubectl scale deployment web --replicas=5

我们可以发现,因为master节点存在污点的情况,所以节点都被分配到了 node2 和 node3节点上

image.png

我们可以使用下面命令,把刚刚我们创建的pod都删除

kubectl delete deployment web

现在给了更好的演示污点的用法,我们现在给 node2节点打上污点

kubectl taint node k8snode2 env_role=yes:NoSchedule

然后我们查看污点是否成功添加

kubectl describe node k8snode2 | grep Taint

image.png

然后我们再建一个 pod

# 创建nginx pod
kubectl create deployment web --image=nginx
# 复制五次
kubectl scale deployment web --replicas=5

然后我们再进行查看

kubectl get pods -o wide

我们能够看到现在所有的pod都被分配到了 k8snode3上,因为刚刚我们给node2节点设置了污点

image.png

最后我们可以删除刚刚添加的污点

kubectl taint node k8snode2 env_role:NoSchedule-

污点容忍

污点容忍就是某个节点可能被调度,也可能不被调度

image.png