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文件组成部分
- 控制器定义
- 被控制对象
常用字段
编写方式
- 一般不会从0手写出来,一般会通过生成的方式来做
-
使用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: {}
-
资源已经部署,从资源中拿出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:容器退出不会重启
- 对于批量任务来说,执行了之后就不用再执行了
- Always:当容器终止或者退出之后,总是重启容器,默认策略
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的机器
- 可以对集群中的node进行分组,每个分组的名字即标签
- 节点亲和性对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也可能会被调度。
- 污点容忍:即便是设置为NoSchedule也可能会被调度。