- 3 kubectl 命令行工具
- 4 yaml文件详解
- 5 k8s 核心技术概念 pod
- 查看节点污点
- 设置污点 kubectl taint nodes [node] key=value:NoExecute value 可以为空
- NoExecute:不会调度,并且还会驱逐Node已有Pod
- PreferNoSchedule:尽量不会调度
- NoExecute:一点不被调度
- 因为pod是自主式pod,没有控制器控制的pod。去除后就不存在了,如果是Deployment和StatefullSet,它就会在node02上创建,维持副本数
- 节点说明中,查找 Taints 字段
- 去除污点
- 6 k8s 核心技术概念 controller
3 kubectl 命令行工具
参考: https://blog.csdn.net/LG_15011399296/article/details/123875831
https://blog.csdn.net/zhengzaifeidelushang/article/details/122545110
3.1 命令介绍
kubectl 是Kubernetes 集群的命令行工具,通过kubectl 能够对集群本身进行管理,并能够在集群上进行容器化应用的安装部署。
3.2 使用语法
#command:指定要对一个或多个资源执行的操作,比如create、get、describe、delete。
#TYPE:指定资源类型。资源类型不区分大小写,可以指定单数、复数或缩写形式。
#NAME: 指定资源的名称。名称区分大小写。如果省略名称,则显示所有资源的详细信息
#flags: 指定可选的参数,例如,可以使用-s 或-server参数指定Kubernetes API服务器的地址入口
kubectl [command] [TYPE] [NAME] [flags]
#查看全局help命令
kubectl --help
#查看某个具体操作的命令
kubectl get --help
# 以纯文本输出格式列出所有 pod。
kubectl get pods
# 以纯文本输出格式列出所有 pod,并包含附加信息(如节点名)。
kubectl get pods -o wide
#常看pod当前信息
kubectl get pod,svc
# 以纯文本输出格式列出所有 deploy
kubectl get deploy
# 以纯文本输出格式列出所有副本控制器和服务。
kubectl get rc,services
# 列出在节点 server01 上运行的所有 pod
kubectl get pods --field-selector=spec.nodeName=server01
#查看节点信息
kubectl get node
#查看集群基本状态
kubectl get cs
#创建一个pod
kubectl create deployment nginx --image=nginx
#创建一个pod 并且对外暴露端口
kubectl expose deployment nginx --port=80 --type=NodePort
# 使用 <directory> 路径下的任意 .yaml, .yml, 或 .json 文件 创建对象。
kubectl apply -f <directory>
# 使用 example-service.yaml 中的定义创建服务。
kubectl apply -f example-service.yaml
# 显示名称为 <node-name> 的节点的详细信息。
kubectl describe nodes <node-name>
# 显示名为 <pod-name> 的 pod 的详细信息。
kubectl describe pods <pod-name>
# 显示由名为 <rc-name> 的副本控制器管理的所有 pod 的详细信息。
# 记住:副本控制器创建的任何 pod 都以复制控制器的名称为前缀。
kubectl describe pods <rc-name>
# 描述所有的 pod,不包括未初始化的 pod
kubectl describe pods
# 使用 pod.yaml 文件中指定的类型和名称删除 pod。
kubectl delete -f pod.yaml
# 删除所有带有 '<label-key>=<label-value>' 标签的 Pod 和服务。
kubectl delete pods,services -l <label-key>=<label-value>
# 删除所有 pod,包括未初始化的 pod。
kubectl delete pods --all
# 删除名称为nginx的deployment
kubectl delete deployment nginx
# 从 pod <pod-name> 中获取运行 'date' 的输出。默认情况下,输出来自第一个容器。
kubectl exec <pod-name> -- date
# 运行输出 'date' 获取在容器的 <container-name> 中 pod <pod-name> 的输出。
kubectl exec <pod-name> -c <container-name> -- date
# 获取一个交互 TTY 并运行 /bin/bash <pod-name >。默认情况下,输出来自第一个容器。
kubectl exec -ti <pod-name> -- /bin/bash
# 从 pod 返回日志快照。
kubectl logs <pod-name>
# 从 pod <pod-name> 开始流式传输日志。这类似于 'tail -f' Linux 命令。
kubectl logs -f <pod-name>
# kubectl exec:进入pod启动的容器
kubectl exec -it podName -n nsName /bin/sh #进入容器
kubectl exec -it podName -n nsName /bin/bash #进入容器
# kubectl label:添加label值
kubectl label nodes k8s-node01 zone=north #为指定节点添加标签
kubectl label nodes k8s-node01 zone- #为指定节点删除标签
kubectl label pod podName -n nsName role-name=test #为指定pod添加标签
kubectl label pod podName -n nsName role-name=dev --overwrite #修改lable标签值
kubectl label pod podName -n nsName role-name- #删除lable标签
# kubectl滚动升级; 通过 kubectl apply -f myapp-deployment-v1.yaml 启动deploy
kubectl apply -f myapp-deployment-v2.yaml #通过配置文件滚动升级
kubectl set image deploy/myapp-deployment myapp="registry.cn-beijing.aliyuncs.com/google_registry/myapp:v3" #通过命令滚动升级
kubectl rollout undo deploy/myapp-deployment 或者 kubectl rollout undo deploy myapp-deployment #pod回滚到前一个版本
kubectl rollout undo deploy/myapp-deployment --to-revision=2 #回滚到指定历史版本
# kubectl scale:动态伸缩
kubectl scale deploy myapp-deployment --replicas=5 # 动态伸缩
kubectl scale --replicas=8 -f myapp-deployment-v2.yaml #动态伸缩【根据资源类型和名称伸缩,其他配置「如:镜像版本不同」不生效】
4 yaml文件详解
参考: https://blog.csdn.net/xxb249/article/details/116232493
4.1 YAML 文件概述
k8s 集群中对资源管理和资源对象编排部署都可以通过声明样式(YAML)文件来解决,也就是可以把需要对资源对象操作编辑到YAML 格式文件中,我们把这种文件叫做资源清单文件,通过kubectl 命令直接使用资源清单文件就可以实现对大量的资源对象进行编排部署了。
4.2 YAML 文件组成部分
#使用kubectl create 命令生成yaml文件
kubectl create deployment web --image=nginx -o yaml --dry-run
#使用kubectl create 命令生成yaml文件 生成到指定文件里面去
kubectl create deployment web --image=nginx -o yaml --dry-run > m1.yaml
#使用kubectl get命令导出yaml文件
kubectl get deploy nginx -o=yaml --export >my2.yaml
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: {}
4.2.1 控制器定义
apiVersion: apps/v1
kind: Deployment
metadata:
creationTimestamp: null
labels:
app: web
name: web
spec:
replicas: 1
selector:
matchLabels:
app: web
4.2.2 被控制对象
template:
metadata:
creationTimestamp: null
labels:
app: web
spec:
containers:
- image: nginx
name: nginx
resources: {}
4.3 常用字段含义
apiVersion: v1 #指定api版本,此值必须在kubectl apiversion中
kind: Pod #指定创建资源的角色/类型
metadata: #资源的元数据/属性
name: web04-pod #资源的名字,在同一个namespace中必须唯一
labels: #设定资源的标签,详情请见http://blog.csdn.net/liyingke112/article/details/77482384
k8s-app: apache
version: v1
kubernetes.io/cluster-service: "true"
annotations: #自定义注解列表
- name: String #自定义注解名字
spec: #specification of the resource content 指定该资源的内容
restartPolicy: Always #表明该容器一直运行,默认k8s的策略,在此容器退出后,会立即创建一个相同的容器
nodeSelector: #节点选择,先给主机打标签kubectl label nodes kube-node1 zone=node1
zone: node1
containers:
- name: web04-pod #容器的名字
image: web:apache #容器使用的镜像地址
imagePullPolicy: Never #三个选择Always、Never、IfNotPresent,每次启动时检查和更新(从registery)images的策略,
# Always,每次都检查
# Never,每次都不检查(不管本地是否有)
# IfNotPresent,如果本地有就不检查,如果没有就拉取
command: ['sh'] #启动容器的运行命令,将覆盖容器中的Entrypoint,对应Dockefile中的ENTRYPOINT
args: ["$(str)"] #启动容器的命令参数,对应Dockerfile中CMD参数
env: #指定容器中的环境变量
- name: str #变量的名字
value: "/etc/run.sh" #变量的值
resources: #资源管理,请求请见http://blog.csdn.net/liyingke112/article/details/77452630
requests: #容器运行时,最低资源需求,也就是说最少需要多少资源容器才能正常运行
cpu: 0.1 #CPU资源(核数),两种方式,浮点数或者是整数+m,0.1=100m,最少值为0.001核(1m)
memory: 32Mi #内存使用量
limits: #资源限制
cpu: 0.5
memory: 32Mi
ports:
- containerPort: 80 #容器开发对外的端口
name: httpd #名称
protocol: TCP
livenessProbe: #pod内容器健康检查的设置,详情请见http://blog.csdn.net/liyingke112/article/details/77531584
httpGet: #通过httpget检查健康,返回200-399之间,则认为容器正常
path: / #URI地址
port: 80
#host: 127.0.0.1 #主机地址
scheme: HTTP
initialDelaySeconds: 180 #表明第一次检测在容器启动后多长时间后开始
timeoutSeconds: 5 #检测的超时时间
periodSeconds: 15 #检查间隔时间
#也可以用这种方法
#exec: 执行命令的方法进行监测,如果其退出码不为0,则认为容器正常
# command:
# - cat
# - /tmp/health
#也可以用这种方法
#tcpSocket: //通过tcpSocket检查健康
# port: number
lifecycle: #生命周期管理
postStart: #容器运行之前运行的任务
exec:
command:
- 'sh'
- 'yum upgrade -y'
preStop: #容器关闭之前运行的任务
exec:
command: ['service httpd stop']
volumeMounts: #详情请见http://blog.csdn.net/liyingke112/article/details/76577520
- name: volume #挂载设备的名字,与volumes[*].name 需要对应
mountPath: /data #挂载到容器的某个路径下
readOnly: True
volumes: #定义一组挂载设备
- name: volume #定义一个挂载设备的名字
#meptyDir: {}
hostPath:
path: /opt #挂载设备类型为hostPath,路径为宿主机下的/opt,这里设备类型支持很多种
5 k8s 核心技术概念 pod
参考:https://blog.csdn.net/qq_37419449/article/details/122157277
5.1 pod概述
- pod是k8s 系统中可以创建和管理的最小单元
- pod由一个或多个容器组成
- 每个pod都包含一个根容器pause ,通过Pause容器 一个pod中的容器共享网络资源
- pod是短暂的
5.2 pod存在的意义
- 创建容器使用docker,一个docker对应一个容器,一个容器有进程,一个容器运行一个应用程序
- pod是多进程设计,运行多个应用程序
- 一个pod里面多个容器,一个容器里面运行一个应用程序
pod存在为了亲密性应用
共享网络
- 通过Pause容器,把其他业务容器加入到Pause容器里面,让所有业务容器在同一个容器名称空间中,可以实现网络共享。
- 共享存储
- 引入数据卷Volumn,使用数据卷进行持久化存储
5.4 pod拉取镜像策略
spec: #specification of the resource content 指定该资源的内容
containers:
- name: web04-pod #容器的名字
image: web:apache #容器使用的镜像地址
imagePullPolicy: Never #三个选择Always、Never、IfNotPresent,每次启动时检查和更新(从registery)images的策略,
# Always,每次都检查
# Never,每次都不检查(不管本地是否有)
# IfNotPresent,默认值,如果本地有就不检查,如果没有就拉取
5.5 pod资源限制
spec: #specification of the resource content 指定该资源的内容
containers:
resources: #资源管理,请求请见http://blog.csdn.net/liyingke112/article/details/77452630
requests: #调度 容器运行时,最低资源需求,也就是说最少需要多少资源容器才能正常运行
cpu: 0.1 #CPU资源(核数),两种方式,浮点数或者是整数+m,0.1=100m,最少值为0.001核(1m)
memory: 32Mi #内存使用量
limits: #资源限制 最大
cpu: 0.5
memory: 32Mi
5.6 pod重启机制
spec: #specification of the resource content 指定该资源的内容
restartPolicy: Always # Always OnFailure Naver
# Always 当容器终止退出后,总是重启容器,默认策略
# OnFailure 当容器异常退出(退出状态码非0)时,才重启容器
# Naver 当容器终止退出,从不重启容器
5.7 pod健康检查
spec: #specification of the resource content 指定该资源的内容
containers: #pod内容器健康检查的设置,详情请见http://blog.csdn.net/liyingke112/article/details/77531584
livenessProbe: #如果检查失败,将杀死容器,根据Pod的restartPolicy来操作
httpGet: #通过httpget检查健康,返回200-399之间,则认为容器正常
path: / #URI地址
port: 80
#host: 127.0.0.1 #主机地址
scheme: HTTP
initialDelaySeconds: 180 #表明第一次检测在容器启动后多长时间后开始
timeoutSeconds: 5 #检测的超时时间
periodSeconds: 15 #检查间隔时间
#也可以用这种方法
#exec: 执行命令的方法进行监测,如果其退出码不为0,则认为容器正常
# command:
# - cat
# - /tmp/health
#也可以用这种方法
#tcpSocket: //通过tcpSocket检查健康
# port: number
readinessProbe: #如果检查失败,kubernetes会把Pod从service endpoints中剔除
httpGet:
path: /
port: 80
scheme: HTTP
initialDelaySeconds: 120 #容器启动后第一次执行探测是需要等待多少秒。
periodSeconds: 15 #执行探测的频率。默认是10秒,最小1秒。
timeoutSeconds: 5 #探测超时时间。默认1秒,最小1秒。
5.8 pod调度
5.8.1 影响调度的属性
- pod资源对pod调用产生影响,根据requests找到足够node节点进行调度
- 节点选择器标签影响Pod的调度
spec: #specification of the resource content 指定该资源的内容
#影响节点调度
nodeSelector: #节点选择,先给主机打标签 kubectl label nodes kube-node1 zone=node1
zone: node1
containers:
#影响节点调度
resources:
cpu: 0.1 #CPU资源(核数),两种方式,浮点数或者是整数+m,0.1=100m,最少值为0.001核(1m)
memory: 32Mi #内存使用量
5.8.2 节点亲和性影响调度
spec:
containers:
affinity:
nodeAffinity: #和nodeSelector基本差不多
# 硬亲和性 约束条件必须满足
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: node1 # 标签键名
operator: NotIn # label的值不在某个列表中
# In label的值在某个列表中
# Exists 某个 label 存在
# Gt label 的值大于某个值
# Lt label 的值小于某个值
# DoesNotExists 某个 label 不存在
values:
- dev # 标签键值
- test # 标签键值
# 软亲和性 约束条件尝试满足,不保证
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 1 #权重,权重越大越亲和(多个软策略的情况)
preference:
matchExpressions:
- key: node1
operator: In
values:
- prod # 期望是prod
5.8.3 污点和污点容忍
节点亲和性,是pod的一种属性(偏好或硬性要求),它使pod被吸引到一类特定的节点。Taint 则相反,它使节点能够排斥一类特定的 pod
Taint 和 toleration 相互配合,可以用来避免 pod 被分配到不合适的节点上。每个节点上都可以应用一个或多个taint ,这表示对于那些不能容忍这些 taint 的 pod,是不会被该节点接受的。如果将 toleration 应用于 pod上,则表示这些 pod 可以(但不要求)被调度到具有匹配 taint 的节点上 ```shell查看节点污点
kubectl describe node k8snode1 | grep Taints
设置污点 kubectl taint nodes [node] key=value:NoExecute value 可以为空
NoExecute:不会调度,并且还会驱逐Node已有Pod
PreferNoSchedule:尽量不会调度
NoExecute:一点不被调度
kubectl taint nodes k8snode1 check=nck:NoExecute
因为pod是自主式pod,没有控制器控制的pod。去除后就不存在了,如果是Deployment和StatefullSet,它就会在node02上创建,维持副本数
节点说明中,查找 Taints 字段
kubectl describe node k8snode1
去除污点
kubectl taint nodes k8snode1 check=nck:NoExecute-
```yaml
spec:
# key, vaule, effect 要与 Node 上设置的 taint 保持一致
tolerations:
- key: "check" #能容忍的污点key
operator: "Equal" #Equal等于表示key=value , Exists不等于,表示当值不等于下面value正常
value: "nck" #值
effect: "NoExecute" #effect策略
tolerationSeconds: 3600 #原始的pod多久驱逐,注意只有effect: "NoExecute"才能设置,不然报错
6 k8s 核心技术概念 controller
6.1 什么是controller
controller是在集群上管理和运行容器的对象,是一个实体存在的,而pod是一个抽象概念。controller有分跟多种类
- deployment:适合无状态的服务部署
- StatefulSet:适合有状态的服务部署
- DaemonSet:在每一个node上运行一个pod,新加入的node也同样会自动运行一个pod。例如一些典型的应用场景:
- 运行集群存储 daemon,例如在每个Node上运行 glusterd、ceph
- 在每个Node上运行日志收集 daemon,例如 fluentd、 logstash
- 在每个Node上运行监控 daemon,例如 Prometheus Node Exporter
- Job:一次性的执行任务
- Cronjob:周期性的执行任务
6.2 pod和controller关系
- controllers:在集群上管理和运行容器的对象通过label-selector相关联
- 控制器又被称为工作负载,pod通过控制器实现应用的运维,比如伸缩、升级等
6.3 deployment控制器应用场景
- 部署无状态应用
- 管理Pod和ReplicaSet
- 部署,滚动升级等功能
-
6.4 deployment控制器部署应用(yaml)
# 第一步 导出yaml
kubectl create deployment web --image=nginx --dry-run -o yaml >web.yaml
# 第二步 使用yaml部署应用
kubectl apply -f web.yaml
# 第三步 对外发布(暴露对外端口)
kubectl expose deployment web --port=80 --type=NodePort --target-port=80 --name=web1 -o yaml >web1.yaml
kubectl apply -f web1.yaml
6.5 升级回滚与弹性伸缩
初始版本 nginx:1.14 副本数量:2
# 创建应用
kubectl apply -f web.yaml
# 应用升级
kubectl set image deployment web nginx=nginx:1.15
# 查看升级状态
kubectl rollout status deployment web
# 查看升级版本
kubectl rollout history deployment web
# 回滚到上一个版本
kubectl rollout undo deployment web
# 回滚到指定版本
kubectl rollout undo deployment --to-revision=2
# 弹性伸缩
kubectl scale deployment web --replicas=6
6.6 部署有状态应用 StatefulSet
6.6.1 有状态和无状态的区别
无状态
认为所有的pod都是一样的
- 不用考虑顺序的要求
- 不用考虑在哪个node节点上运行
- 可以随意扩容和缩容
有状态
- 每个pod都是独立的,保持pod启动顺序性和唯一性
- 唯一网络标识符,持久存储
- 有序,比如mysql主从
-
6.6.2 常规service和无头服务区别
service:一组Pod访问策略,提供cluster-IP群集之间通讯,还提供负载均衡和服务发现。
- headless service:无头服务, 不需要cluster-IP,直接绑定具体的Pod的IP(当Pod的IP地址是动态变化时,所以常用于绑定DNS访问)
apiVersion: v1
kind: Service
metadata:
name: nginx
labels:
app: nginx
spec:
ports:
- port: 80
name: web
clusterIP: None #无头service
selector:
app: nginx
#分隔符
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: nginx-statefulset
namespace: default
spec:
serviceName: nginx
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
查看pod,有三个pod,每个都是唯一名称,CLUSTER-IP为None表示无头service
6.7 守护式进程DaemonSet
DaemonSet确保集群中每个(部分)node运行一份pod副本,当node加入集群时创建pod,当node离开集群时回收pod。如果删除DaemonSet,其创建的所有pod也被删除,DaemonSet中的pod覆盖整个集群。
使用场景:
- 运行集群存储守护进程,如glusterd、ceph。
- 运行集群日志收集守护进程,如fluentd、logstash。
- 运行节点监控守护进程,如Prometheus Node Exporter, collectd, Datadog agent, New Relic agent, or Ganglia gmond。
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: ds-test
labels:
app: filebeat
spec:
selector:
matchLabels:
app: filebeat
template:
metadata:
labels:
app: filebeat
spec:
containers:
- name: logs
image: nginx
ports:
- containerPort: 80
volumeMounts:
- name: varlog
mountPath: /tmp/log
volumes:
- name: varlog
hostPath:
path: /var/log
6.8 一次性任务 job
打印圆周率2000位
apiVersion: batch/v1
kind: Job
metadata:
name: pi
spec:
template:
spec:
containers:
- name: pi
image: perl
command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"]
restartPolicy: Never
backoffLimit: 4 #表示失败之后再尝试4次
6.9 定时任务 cronjob
每秒钟输出 Hello from the Kubernetes cluster
apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: hello
spec:
schedule: "*/1 * * * *"
jobTemplate:
spec:
template:
spec:
containers:
- name: hello
image: busybox
args:
- /bin/sh
- -c
- date; echo Hello from the Kubernetes cluster
restartPolicy: OnFailure
7 k8s 核心技术概念 service
service 是kubernetes 最核心概念,通过创建service,可以为一组具有相同功能的容器应
用提供一个统一的入口地址,并且将请求负载分发到后端的各个容器应用上。