2024年k8s最新版本使用教程
- 3. YAML语言入门
- 3.1 基本语法规则
- 3.2 支持的数据结构
- 3.3 其他语法
- 4 资源管理
- 4.1 k8s资源查询
- 4.2 资源操作命令
- 4.3 资源操作方式
- 4.3.1 命令行方式
- 4.3.2 YAML文件方式
- 5 Namespace
- 5.1 查看命名空间
- 5.2 创建命名空间
- 5.3 删除命名空间
- 5.4 命名空间资源限额
- 6 Pod
- 6.1 创建pods
- 6.2 查看pods
- 6.3 删除pods
- 6.4 资源清单
- 7 Label标签
- 7.1 标签操作
- 7.2 分组管理
- 8 Pod控制器
- 8.1 Pod控制器概念
- 8.2 Pod控制器种类
- 8.3 ReplicaSet
- 8.3.1 常见操作
- 8.3.2 资源清单
- 8.3.3 pod数量固定
- 8.3.4 pod数量扩缩容
- 8.3.5 pod镜像更改
- 8.4 Deployment
- 8.4.1 常见操作
- 8.4.2 资源清单
- 8.4.3 pod镜像更改
- 8.4.4 pod镜像更改操作
- 8.5 HPA控制器
- 8.5.1 自动扩缩容
- 8.5.2 指标API可用安装
- 8.6 DaemonSet
- 8.6.1 资源清单
- 8.7 Job控制器
- 8.7.1 资源清单
- 8.8 CronJob
- 8.8.1 资源清单
如果需要K8S安装观看2024年k8s最新版本安装教程博客
3. YAML语言入门
YAML是一门简洁的非标记语言,常用来做配置文件,文件后缀是yaml。
3.1 基本语法规则
key: value键值对方式(:与value之间有空格)
name: buddha
key书写区分大小写
name: buddha
Name: buddha
使用缩进表示层级关系(缩进只能用空格,没有规定需要多少个空格,相同层级左对齐即可;不能用tab键替代空格键,除非编辑器内认可的tab键;)
person:
name: buddha
age: 18
支持单行注释,#
是单号注释符
# 下面是开发环境配置
name: buddha
---
和...
配合使用,如下就相当于写了两个配置文件
---
name: buddha
age: 18
...
---
name: jack
age: 12
...
3.2 支持的数据结构
字面量,单个、不能再分的值。date(日期、时间)、boolean、number(整数、浮点数)、null(~)、string(字符串一般不用引号,双引号特殊字符会转义,单引号不会转义处理)
name: buddha
age: 18
flag: true
remark: ~
day: 2024-01-01
对象,键值对的集合
# 行内写法,k与v之间可以不加空格
o: {k1: v1,k2: v2,k3: v3}
# 一般写法
o:
k1: v1
k2: v2
k3: v3
数组,一组按次序排列的值
k: [v1,v2,v3]
k:
- v1
- v2
- v3
3.3 其他语法
允许使用两个感叹号,强制转换数据类型
a: !!str 123
b: !!str true
多行字符串可以使用|
保留换行符,也可以使用>
折叠换行
this: |
Foo
Bar
that: >
Foo
Bar
可以用这个网站检验yaml文件书写是否正确
https://www.json2yaml.com/convert-yaml-to-json
4 资源管理
4.1 k8s资源查询
在k8s中,所有内容都抽象为资源进行管理。通过kubectl api-resources
命令查看k8s有哪些资源。
常用资源有:
资源分类 | 资源名称 | 资源名称简写 | 说明 |
---|---|---|---|
集群级别资源 | nodes | no | 集群节点 |
namespaces | ns | 命名空间 | |
pod资源 | pods | po | 容器运行在pod里面 |
pod控制器资源 | replicationcontrollers | rc | 控制pod资源 |
replicasets | rs | ||
deployments | deploy | ||
daemonsets | ds | ||
jobs | |||
cronjobs | cj | ||
horizontalpodautoscalers | hpa | ||
statefulsets | sts | ||
服务发现资源 | services | svc | 统一pod对外接口 |
ingress | ing | ||
存储资源 | volumeattachments | 存储 | |
persistentvolumes | pv | ||
persistentvolumeclaims | pvc | ||
配置资源 | configmaps | cm | 配置 |
secrets | 配置 |
4.2 资源操作命令
k8s对资源如何操作,可以通过kubectl --help
命令获取帮助信息
常用操作有:
操作分类 | 命令 | 说明 |
---|---|---|
基本命令 | create | 创建资源 |
edit | 编辑资源 | |
patch | 更新资源 | |
get | 获取资源 | |
delete | 删除资源 | |
explain | 展示资源文档 | |
运行和调试 | run | 运行一个pod |
expose | 暴露资源为Service | |
describe | 显示资源内部信息 | |
logs | 输出容器在pod中的日志 | |
attach | 进入运行中的容器 | |
exec | 执行容器中的一个命令 | |
cp | 在pod内外复制文件 | |
rollout | 管理资源的发布 | |
scale | 扩(缩)容pod的数量 | |
autoscale | 自动调整pod的数量 | |
其他 | apply | 通过文件对资源进行配置 |
label | 更新资源上的标签 | |
cluster-info | 显示集群信息 | |
version | 显示当前Server和Client的版本 |
4.3 资源操作方式
4.3.1 命令行方式
语法:
kubectl [command] [type] [name] [flags]
说明:
command,要对资源执行的操作,例如create、get、delete
type,资源类型,比如deployment、pod、service
name,资源名称
flags,额外可选参数
示例:
# kubectl [command] [type]
kubectl get pod
# kubectl [command] [type] [name]
kubectl get pod nginx-pod
# kubectl [command] [type] [name] [flags]
kubectl get pod nginx-pod -o yaml
4.3.2 YAML文件方式
创建nginx-pod.yaml文件
---
apiVersion: v1
kind: Namespace
metadata:
name: prod
...
---
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
namespace: prod
spec:
containers:
- name: nginx-container
image: nginx:latest
...
# 执行create命令,创建资源
kubectl create -f nginx-pod.yaml
# 使用apply操作资源,如果资源不存在,就创建;如果资源已存在,就更新
[root@k8s-master ~]# kubectl apply -f nginx-pod.yaml
namespace/prod created
pod/nginx-pod created
[root@k8s-master ~]# kubectl apply -f nginx-pod.yaml
namespace/prod unchanged
pod/nginx-pod unchanged
[root@k8s-master ~]# kubectl create -f nginx-pod.yaml
namespace/prod created
pod/nginx-pod created
[root@k8s-master ~]# kubectl get -f nginx-pod.yaml
NAME STATUS AGE
namespace/prod Active 21s
NAME READY STATUS RESTARTS AGE
pod/nginx-pod 1/1 Running 0 21s
小结:
# 创建/更新资源
kubectl apply -f xxx.yaml
# 删除资源
kubectl delete -f xxx.yaml
# 查看资源
kubectl get -f xxx.yaml
kubectl describe -f xxx.yaml
5 Namespace
k8s的命名空间(Namespace)可以将集群的资源进行逻辑上的划分和隔离。
作用:
- 隔离和资源划分:命名空间允许将集群资源进行逻辑上的划分和隔离。
- 多租户支持:通过使用命名空间,可以在同一个Kubernetes集群中支持多个租户或团队。
- 访问控制和权限管理:命名空间提供了一种在集群中实施访问控制和权限管理的机制。
- 资源管理和监控:通过将相关的资源放置在同一个命名空间下,可以更方便地进行资源管理和监控。
5.1 查看命名空间
资源查看命名空间
[root@k8s-master ~]# kubectl api-resources | grep Namespace
NAME SHORTNAMES APIVERSION NAMESPACED KIND
namespaces ns v1 false Namespace
命名空间查看命令
常用命令
# 查看所有的命名空间
kubectl get ns
# 查看某个命名空间
kubectl get ns 命名空间名称
# 查看某个命名空间详情
kubectl describe ns 命名空间名称
# 查看命名空间指定格式输出
# 常见wide、json、yaml格式
kubectl get ns -o yaml
kubectl get ns 命名空间名称 -o yaml
示例:
[root@k8s-master ~]# kubectl get ns
NAME STATUS AGE
default Active 3d3h
kube-node-lease Active 3d3h
kube-public Active 3d3h
kube-system Active 3d3h
[root@k8s-master ~]# kubectl get ns default
NAME STATUS AGE
default Active 3d3h
[root@k8s-master ~]# kubectl describe ns default
Name: default
Labels: kubernetes.io/metadata.name=default
Annotations: <none>
Status: Active
No resource quota.
No LimitRange resource.
[root@k8s-master ~]# kubectl describe ns default
Name: default
Labels: kubernetes.io/metadata.name=default
Annotations: <none>
Status: Active
No resource quota.
No LimitRange resource.
[root@k8s-master ~]# kubectl get ns default -o yaml
apiVersion: v1
kind: Namespace
metadata:
creationTimestamp: "2023-12-18T07:51:02Z"
labels:
kubernetes.io/metadata.name: default
name: default
resourceVersion: "45"
uid: e88e80f3-8a34-46c1-9978-41014cd3a179
spec:
finalizers:
- kubernetes
status:
phase: Active
5.2 创建命名空间
kubectl create ns 命名空间名称
kubectl create -f 文件名.yaml
kubectl apply -f 文件名.yaml
示例:
[root@k8s-master ~]# kubectl create ns dev
namespace/dev created
# ns-dev.yaml
# create dev namespace yaml
apiVersion: v1
kind: Namespace
metadata:
name: dev
[root@k8s-master ~]# kubectl apply -f ns-dev.yaml
namespace/dev created
5.3 删除命名空间
kubectl delete ns 命名空间名称
kubectl delete -f 文件名.yaml
示例:
[root@k8s-master ~]# kubectl delete ns dev
namespace "dev" deleted
[root@k8s-master ~]# kubectl delete -f ns-dev.yaml
namespace "dev" deleted
5.4 命名空间资源限额
通过ResourceQuota,可以对Namespace资源(包括CPU、内存、存储等)使用限制。编写YAML文件时,可以采用kubectl explain 资源类型或资源类型.属性获得帮助信息。
备注:如果命名空间做了限制,那么对应pod也要做资源限制
示例:
apiVersion: v1
kind: Namespace
metadata:
name: dev
---
apiVersion: v1
kind: ResourceQuota
metadata:
name: uat-quota
namespace: dev
spec:
hard:
requests.cpu: 2
requests.memory: 2Gi
limits.cpu: 2
limits.memory: 2Gi
[root@k8s-master ~]# kubectl apply -f ns-dev.yaml
namespace/dev created
resourcequota/uat-quota created
[root@k8s-master ~]# kubectl get -f ns-dev.yaml
NAME STATUS AGE
namespace/dev Active 7m35s
NAME AGE REQUEST LIMIT
resourcequota/uat-quota 7m35s requests.cpu: 0/2, requests.memory: 0/2Gi limits.cpu: 0/2, limits.memory: 0/2Gi
配置含义说明:
资源名称 | 说明 |
---|---|
limits.cpu | 所有非终止状态的 Pod,其 CPU 限额总量不能超过该值 |
limits.memory | 所有非终止状态的 Pod,其内存限额总量不能超过该值 |
requests.cpu | 所有非终止状态的 Pod,其 CPU 需求总量不能超过该值 |
requests.memory | 所有非终止状态的 Pod,其内存需求总量不能超过该值 |
hugepages- | 对于所有非终止状态的 Pod,针对指定尺寸的巨页请求总数不能超过此值 |
cpu | 与 requests.cpu 相同 |
memory | 与 requests.memory 相同 |
6 Pod
程序运行在容器中,容器运行在pod中,pod属于某个命名空间
[root@k8s-master ~]# kubectl api-resources | grep Pod
pods po v1 true Pod
6.1 创建pods
语法:
kubectl run NAME --image=image [--env="key=value"] [--port=port] [--dry-run=server|client]
[--overrides=inline-json] [--command] -- [COMMAND] [args...] [options]
kubectl apply -f 文件名.yaml
kubectl create -f 文件名.yaml
示例:
[root@k8s-master ~]# kubectl run nginx-test --image=nginx --port=80 -n dev
pod/nginx-test created
6.2 查看pods
[root@k8s-master ~]# kubectl get pods -n dev
NAME READY STATUS RESTARTS AGE
nginx-test 1/1 Running 0 26s
[root@k8s-master ~]# kubectl get pods nginx-test -n dev
NAME READY STATUS RESTARTS AGE
nginx-test 1/1 Running 0 108s
[root@k8s-master ~]# kubectl get pods -o wide -n dev
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-test 1/1 Running 0 51s 10.244.36.80 k8s-node1 <none> <none>
[root@k8s-master ~]# kubectl describe pods nginx-test -n dev
略
[root@k8s-master ~]# kubectl get pods -o wide -n dev
略
# 在k8s各个节点上都可以访问nginx-test pod里面的nginx服务
[root@k8s-master ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master Ready control-plane 3d20h v1.28.2
k8s-node1 Ready <none> 3d19h v1.28.2
k8s-node2 Ready <none> 3d19h v1.28.2
k8s-node3 Ready <none> 3d19h v1.28.2
[root@k8s-master ~]# curl 10.244.36.80:80
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
[root@k8s-node1 ~]# curl 10.244.36.80:80
略
[root@k8s-node2 ~]# curl 10.244.36.80:80
略
[root@k8s-node3 ~]# curl 10.244.36.80:80
略
6.3 删除pods
[root@k8s-master ~]# kubectl delete pods nginx-test
pod "nginx-test" deleted
6.4 资源清单
apiVersion: v1 #必选,版本号,例如v1
kind: Pod #必选,资源类型,例如 Pod
metadata: #必选,元数据
name: string #必选,Pod名称
namespace: string #Pod所属的命名空间,默认为"default"
labels: #自定义标签列表
name: string
spec: #必选,Pod中容器的详细定义
containers: #必选,Pod中容器列表
- name: string #必选,容器名称
image: string #必选,容器的镜像名称
imagePullPolicy: [ Always|Never|IfNotPresent ] #获取镜像的策略
command: [string] #容器的启动命令列表,如不指定,使用打包时使用的启动命令
args: [string] #容器的启动命令参数列表
workingDir: string #容器的工作目录
volumeMounts: #挂载到容器内部的存储卷配置
- name: string #引用pod定义的共享存储卷的名称,需用volumes[]部分定义的的卷名
mountPath: string #存储卷在容器内mount的绝对路径,应少于512字符
readOnly: boolean #是否为只读模式
ports: #需要暴露的端口库号列表
- name: string #端口的名称
containerPort: int #容器需要监听的端口号
hostPort: int #容器所在主机需要监听的端口号,默认与Container相同
protocol: string #端口协议,支持TCP和UDP,默认TCP
env: #容器运行前需设置的环境变量列表
- name: string #环境变量名称
value: string #环境变量的值
resources: #资源限制和请求的设置
limits: #资源限制的设置
cpu: string #Cpu的限制,单位为core数,将用于docker run --cpu-shares参数
memory: string #内存限制,单位可以为Mib/Gib,将用于docker run --memory参数
requests: #资源请求的设置
cpu: string #Cpu请求,容器启动的初始可用数量
memory: string #内存请求,容器启动的初始可用数量
lifecycle: #生命周期钩子
postStart: #容器启动后立即执行此钩子,如果执行失败,会根据重启策略进行重启
preStop: #容器终止前执行此钩子,无论结果如何,容器都会终止
livenessProbe: #对Pod内各容器健康检查的设置,当探测无响应几次后将自动重启该容器
exec: #对Pod容器内检查方式设置为exec方式
command: [string] #exec方式需要制定的命令或脚本
httpGet: #对Pod内个容器健康检查方法设置为HttpGet,需要制定Path、port
path: string
port: number
host: string
scheme: string
HttpHeaders:
- name: string
value: string
tcpSocket: #对Pod内个容器健康检查方式设置为tcpSocket方式
port: number
initialDelaySeconds: 0 #容器启动完成后首次探测的时间,单位为秒
timeoutSeconds: 0 #对容器健康检查探测等待响应的超时时间,单位秒,默认1秒
periodSeconds: 0 #对容器监控检查的定期探测时间设置,单位秒,默认10秒一次
successThreshold: 0
failureThreshold: 0
securityContext:
privileged: false
restartPolicy: [Always | Never | OnFailure] #Pod的重启策略
nodeName: <string> #设置NodeName表示将该Pod调度到指定到名称的node节点上
nodeSelector: obeject #设置NodeSelector表示将该Pod调度到包含这个label的node上
imagePullSecrets: #Pull镜像时使用的secret名称,以key:secretkey格式指定
- name: string
hostNetwork: false #是否使用主机网络模式,默认为false,如果设置为true,表示使用宿主机网络
volumes: #在该pod上定义共享存储卷列表
- name: string #共享存储卷名称 (volumes类型有很多种)
emptyDir: {} #类型为emtyDir的存储卷,与Pod同生命周期的一个临时目录。为空值
hostPath: string #类型为hostPath的存储卷,表示挂载Pod所在宿主机的目录
path: string #Pod所在宿主机的目录,将被用于同期中mount的目录
secret: #类型为secret的存储卷,挂载集群与定义的secret对象到容器内部
scretname: string
items:
- key: string
path: string
configMap: #类型为configMap的存储卷,挂载预定义的configMap对象到容器内部
name: string
items:
- key: string
path: string
7 Label标签
label标签的意思,给资源添加标签,实现对资源进行分类分组
标签是以键值对(key: value 或 key=value)添加到资源上(node、pods、pods控制器、service等)
一个标签可以添加到多个资源上;一个资源也可以添加多个标签
常见标签:
版本标签:version: “1.0”
环境标签:env: dev
7.1 标签操作
语法:
kubectl label [--overwrite] (-f FILENAME | TYPE NAME) KEY_1=VAL_1 ... KEY_N=VAL_N
[--resource-version=version] [options]
示例:
1、前提工作
[root@k8s-master ~]# kubectl run nginx-pod --image=nginx --port=80 -n dev
pod/nginx-pod created
[root@k8s-master ~]# kubectl get pods -n dev
NAME READY STATUS RESTARTS AGE
nginx-pod 1/1 Running 0 19s
2、添加标签
[root@k8s-master ~]# kubectl label Pod nginx-pod env=dev version=1.0 -n dev
pod/nginx-pod labeled
3、更新标签
[root@k8s-master ~]# kubectl label --overwrite Pod nginx-pod version=2.0 -n dev
pod/nginx-pod labeled
4、查看标签
[root@k8s-master ~]# kubectl get pods nginx-pod -n dev --show-labels
NAME READY STATUS RESTARTS AGE LABELS
nginx-pod 1/1 Running 0 7m26s env=dev,run=nginx-pod,version=2.0
5、删除标签
[root@k8s-master ~]# kubectl label Pod nginx-pod version- -n dev
pod/nginx-pod unlabeled
# 验证标签是否删除
[root@k8s-master ~]# kubectl get pods nginx-pod -n dev --show-labels
NAME READY STATUS RESTARTS AGE LABELS
nginx-pod 1/1 Running 0 9m18s env=dev,run=nginx-pod
6、添加、更新、删除标签也都可以在文件中实施
# nginx-pod.yaml文件
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
namespace: dev
labels:
env: dev
version: "2.0"
spec:
containers:
- name: nginx-container
image: nginx:latest
[root@k8s-master ~]# kubectl apply -f nginx-pod.yaml
pod/nginx-pod created
[root@k8s-master ~]# kubectl get pods -n dev --show-labels
NAME READY STATUS RESTARTS AGE LABELS
nginx-pod 1/1 Running 0 25s env=dev,version=2.0
7.2 分组管理
Label Selector选择器通过一个过滤的语法进行查找到对应标签的资源
匹配规则:
-
key=value:这类是直接匹配
-
key!=value:匹配标签中没有key=value的资源
-
key in (A,B):匹配所有具有key=A和key=B标签的资源
-
key not in (A):匹配所有不具有标签A的资源
-
多个条件匹配,用逗号隔开
示例:
[root@k8s-master ~]# kubectl get pods -n dev --show-labels
NAME READY STATUS RESTARTS AGE LABELS
nginx-pod 1/1 Running 0 19m env=dev,version=2.0
[root@k8s-master ~]# kubectl get pods -l env=dev -n dev
NAME READY STATUS RESTARTS AGE
nginx-pod 1/1 Running 0 19m
[root@k8s-master ~]# kubectl get pods -l env!=dev -n dev
No resources found in dev namespace.
[root@k8s-master ~]# kubectl get pods -l env=dev,version=2.0 -n dev
NAME READY STATUS RESTARTS AGE
nginx-pod 1/1 Running 0 21m
selector: # 选择器,通过它指定该控制器管理哪些pod
matchLabels: # Labels匹配规则
app: nginx-pod
matchExpressions: # Expressions匹配规则
- { key: app, operator: In, values: [ nginx-pod ] }
通过类似上面这种方式实现资源的互相绑定,这个是后话。
8 Pod控制器
Pod是k8s最小管理单元,在k8s中,按照pods的创建方式分为两类:
-
自主式pod:kubectl run直接创建,这种pods删除后就没有了,也不会重建
-
控制器创建的pods:通过控制器创建的pods,直接删除pods会自动新建,得直接删除控制器才行
8.1 Pod控制器概念
Pod控制器是管理pod的中间层,通过Pod控制器,按照控制器的策略,维护pods
8.2 Pod控制器种类
在k8s中,有很多类型的Pod控制器,每种都有自己的适合的场景,常见的Pod控制器有下面这些:
kind | 名称 | 简称 | apiVersion | 说明 | 备注 |
---|---|---|---|---|---|
ReplicationController | replicationcontrollers | rc | v1 | 比较原始的pod控制器,由ReplicaSet替代 | 废弃 |
ReplicaSet | replicasets | rs | apps/v1 | pod数量固定,支持pod数量扩缩容,镜像升级 | |
Deployment | deployments | deploy | apps/v1 | 控制ReplicaSet操作Pod,并支持滚动升级、回退版本 | |
HorizontalPodAutoscaler | horizontalpodautoscalers | hpa | autoscaling/v2 | 根据集群负载自动调整Pod数量,实现削峰填谷 | |
DaemonSet | daemonsets | ds | apps/v1 | 指定节点运行一个Pod,用于守护进程任务 | |
Job | jobs | batch/v1 | 完成一次性任务 | ||
CronJob | cronjobs | cj | batch/v1 | 定时任务,不需要持续后台运行 | |
StatefulSet | statefulsets | sts | apps/v1 | 管理有状态应用 |
8.3 ReplicaSet
pod数量固定,支持pod数量扩缩容,镜像升级
8.3.1 常见操作
# 查
kubectl get replicasets -n 命名空间
kubectl get replicasets -n 命名空间 -o wide/json/yaml
kubectl get replicasets rs控制器名 -n 命名空间 -o wide/json/yaml
kubectl describe replicasets rs控制器名 -n 命名空间
# 建
kubectl create/apply -f 文件名.yaml
# 编辑
kubectl edit replicasets rs控制器名 -n 命名空间
kubectl apply -f 文件名.yaml
kubectl set SUBCOMMAND [options]
# SUBCOMMAND选项,可以通过类似kubectl set image --help帮助信息
env Update environment variables on a pod template
image Update the image of a pod template
resources 使用 Pod 模板更新对象的资源请求/限制
selector 为资源设置选择器
serviceaccount Update the service account of a resource
subject Update the user, group, or service account in a role binding or cluster role
# 删除
kubectl delete -f 文件名.yaml
kubectl delete replicasets rs控制器名 -n 命名空间
8.3.2 资源清单
apiVersion: apps/v1 # 版本号
kind: ReplicaSet # 类型
metadata: # 元数据
name: # rs名称
namespace: # 所属命名空间
labels: # 标签
controller: rs
spec: # 详情描述
replicas: 3 # 副本数量
selector: # 选择器,通过它指定该控制器管理哪些pod
matchLabels: # Labels匹配规则
app: nginx-pod
matchExpressions: # Expressions匹配规则
- { key: app, operator: In, values: [ nginx-pod ] }
template: # 模板,当副本数量不足时,会根据下面的模板创建pod副本
metadata:
labels:
app: nginx-pod
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
示例:
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: rs-nginx
namespace: dev
labels:
controller: rs-nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx-pod
matchExpressions:
- { key: app, operator: In, values: [ nginx-pod ] }
template:
metadata:
labels:
app: nginx-pod
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
[root@k8s-master ~]# kubectl get replicasets -n dev
NAME DESIRED CURRENT READY AGE
rs-nginx 3 3 3 3m50s
[root@k8s-master ~]# kubectl get pods -n dev
NAME READY STATUS RESTARTS AGE
rs-nginx-4znwr 1/1 Running 0 3m56s
rs-nginx-6g6t2 1/1 Running 0 3m56s
rs-nginx-6rtm2 1/1 Running 0 3m56s
[root@k8s-master ~]# kubectl get pods -o wide -n dev
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
rs-nginx-4znwr 1/1 Running 0 6m50s 10.244.36.81 k8s-node1 <none> <none>
rs-nginx-6g6t2 1/1 Running 0 6m50s 10.244.169.135 k8s-node2 <none> <none>
rs-nginx-6rtm2 1/1 Running 0 6m50s 10.244.107.199 k8s-node3 <none> <none>
8.3.3 pod数量固定
ReplicaSet管理的pod数量保持稳定,假如删除一个pod,马上又会重新启动一个pod
示例:
[root@k8s-master ~]# kubectl delete pods rs-nginx-4znwr -n dev
pod "rs-nginx-4znwr" deleted
[root@k8s-master ~]# kubectl get pods -n dev
NAME READY STATUS RESTARTS AGE
rs-nginx-6g6t2 1/1 Running 0 8m33s
rs-nginx-6rtm2 1/1 Running 0 8m33s
rs-nginx-ss8kw 0/1 ContainerCreating 0 6s
[root@k8s-master ~]# kubectl get pods -n dev
NAME READY STATUS RESTARTS AGE
rs-nginx-6g6t2 1/1 Running 0 8m48s
rs-nginx-6rtm2 1/1 Running 0 8m48s
rs-nginx-ss8kw 1/1 Running 0 21s
8.3.4 pod数量扩缩容
ReplicaSet管理的pod数量可以进行扩缩容,增加pod数量,或者减少pod数量
示例:
1、查看replicasets名称
[root@k8s-master ~]# kubectl get replicasets -n dev
NAME DESIRED CURRENT READY AGE
rs-nginx 3 3 3 16m
2、方式一修改pod数量
# 修改数量为5
[root@k8s-master ~]# kubectl edit replicasets rs-nginx -n dev
replicaset.apps/rs-nginx edited
3、方式一修改pod数量是否生效
[root@k8s-master ~]# kubectl get replicasets -n dev
NAME DESIRED CURRENT READY AGE
rs-nginx 5 5 4 18m
4、方式二修改pod数量
# 修改数量为4
[root@k8s-master ~]# kubectl scale replicasets rs-nginx --replicas=4 -n dev
replicaset.apps/rs-nginx scaled
5、方式二修改pod数量是否生效
[root@k8s-master ~]# kubectl scale replicasets rs-nginx --replicas=4 -n dev
replicaset.apps/rs-nginx scaled
6、方式三修改pod数量
# # 修改数量为6
[root@k8s-master ~]# vim controller-rs-nginx.yaml
[root@k8s-master ~]# kubectl apply -f controller-rs-nginx.yaml
replicaset.apps/rs-nginx configured
7、方式三修改pod数量是否生效
[root@k8s-master ~]# kubectl get replicasets -n dev
NAME DESIRED CURRENT READY AGE
rs-nginx 6 6 4 24m
8.3.5 pod镜像更改
ReplicaSet管理的pod容器镜像进行更改
示例:
1、查看replicasets的镜像
[root@k8s-master ~]# kubectl get replicasets -n dev -o wide
NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR
rs-nginx 3 3 0 6s nginx nginx:1.13.0 app=nginx-pod,app in (nginx-pod)
2、方式一修改容器镜像
# 修改容器镜像为nginx:1.15.0
[root@k8s-master ~]# kubectl edit replicasets rs-nginx -n dev
replicaset.apps/rs-nginx edited
3、方式一修改容器镜像验证
[root@k8s-master ~]# kubectl get replicasets -n dev -o wide
NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR
rs-nginx 3 3 3 3m13s nginx nginx:1.15.0 app=nginx-pod,app in (nginx-pod)
4、方式二修改容器镜像
# 修改容器镜像为nginx:1.15.5
[root@k8s-master ~]# vim controller-rs-nginx.yaml
[root@k8s-master ~]# kubectl apply -f controller-rs-nginx.yaml
replicaset.apps/rs-nginx configured
5、方式二修改容器镜像验证
[root@k8s-master ~]# kubectl get replicasets -n dev -o wide
NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR
rs-nginx 3 3 3 12m nginx nginx:1.15.5 app=nginx-pod,app in (nginx-pod)
6、方式三修改容器镜像
# 修改容器镜像为nginx:1.23.0
[root@k8s-master ~]# kubectl set image replicasets rs-nginx nginx=nginx:1.23.0 -n dev
replicaset.apps/rs-nginx image updated
7、方式三修改容器镜像验证
[root@k8s-master ~]# kubectl get replicasets -n dev -o wide
NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR
rs-nginx 3 3 3 14m nginx nginx:1.23.0 app=nginx-pod,app in (nginx-pod)
注意:上面方式只是把ReplicaSet控制器容器镜像版本给更改了,但是现有pod容器镜像并不会发生改变,得一个个删掉现有的,重新生成的才是新镜像版本
[root@k8s-master ~]# kubectl delete pods rs-nginx-5gsxg -n dev
pod "rs-nginx-5gsxg" deleted
[root@k8s-master ~]# kubectl get pods -n dev
NAME READY STATUS RESTARTS AGE
rs-nginx-2s5wm 0/1 ContainerCreating 0 8s
rs-nginx-jjfbq 1/1 Running 0 26m
rs-nginx-tk4th 1/1 Running 0 26m
[root@k8s-master ~]# kubectl get pods -n dev
NAME READY STATUS RESTARTS AGE
rs-nginx-2s5wm 1/1 Running 0 6m30s
rs-nginx-jjfbq 1/1 Running 0 32m
rs-nginx-tk4th 1/1 Running 0 32m
8.4 Deployment
控制ReplicaSet操作Pod,就是控制器ReplicaSet该有的功能,控制器Deployment都实现。并在pod镜像方面做了升级,pod会自动更换镜像、暂停更换、继续更换、回滚操作
8.4.1 常见操作
# 查
kubectl get deployments -n 命名空间
kubectl get deployments -n 命名空间 -o wide/json/yaml
kubectl get deployments deploy控制器名 -n 命名空间 -o wide/json/yaml
kubectl describe deployments deploy控制器名 -n 命名空间
# 建
kubectl create/apply -f 文件名.yaml
# 编辑
kubectl edit deployments deploy控制器名 -n 命名空间
kubectl apply -f 文件名.yaml
kubectl set SUBCOMMAND [options]
# SUBCOMMAND选项,可以通过类似kubectl set image --help帮助信息
env Update environment variables on a pod template
image Update the image of a pod template
resources 使用 Pod 模板更新对象的资源请求/限制
selector 为资源设置选择器
serviceaccount Update the service account of a resource
subject Update the user, group, or service account in a role binding or cluster role
# 删除
kubectl delete -f 文件名.yaml
kubectl delete deployments deploy控制器名 -n 命名空间
8.4.2 资源清单
apiVersion: apps/v1 # 版本号
kind: Deployment # 类型
metadata: # 元数据
name: # rs名称
namespace: # 所属命名空间
labels: # 标签
controller: deploy
spec: # 详情描述
replicas: 3 # 副本数量
revisionHistoryLimit: 3 # 保留历史版本
paused: false # 暂停部署,默认是false
progressDeadlineSeconds: 600 # 部署超时时间(s),默认是600
strategy: # 策略
type: RollingUpdate # 滚动更新策略
rollingUpdate: # 滚动更新
maxSurge: 30% # 最大额外可以存在的副本数,可以为百分比,也可以为整数
maxUnavailable: 30% # 最大不可用状态的 Pod 的最大值,可以为百分比,也可以为整数
selector: # 选择器,通过它指定该控制器管理哪些pod
matchLabels: # Labels匹配规则
app: nginx-pod
matchExpressions: # Expressions匹配规则
- { key: app, operator: In, values: [ nginx-pod ] }
template: # 模板,当副本数量不足时,会根据下面的模板创建pod副本
metadata:
labels:
app: nginx-pod
spec:
containers:
- name: nginx
image: nginx:1.30.1
ports:
- containerPort: 80
8.4.3 pod镜像更改
Deployment控制器的容器镜像修改也同ReplicaSet控制器修改容器镜像方法相同,但是pod的容器镜像不需要手动删除,会根据策略进行自动版本更新。
spec.strategy.type有两个值:
- RollingUpdate:滚动更新,就是杀死一部分,就启动一部分,在更新过程中,存在两个版本Pod
- Recreate:在创建出新的Pod之前会先杀掉所有已存在的Pod
spec.strategy.rollingUpdate.maxSurge:用来指定在升级过程中不可用Pod的最大数量,默认为25%
spec.strategy.rollingUpdate.maxSurge:用来指定在升级过程中可以超过期望的Pod的最大数量,默认为25%
示例:
apiVersion: apps/v1
kind: Deployment
metadata:
name: deploy-nginx
namespace: dev
labels:
controller: deploy
spec:
replicas: 3
revisionHistoryLimit: 3
paused: false
progressDeadlineSeconds: 600
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 30%
maxUnavailable: 30%
selector:
matchLabels:
app: nginx-pod
matchExpressions:
- { key: app, operator: In, values: [ nginx-pod ] }
template:
metadata:
labels:
app: nginx-pod
spec:
containers:
- name: nginx
image: nginx:1.15.5
ports:
- containerPort: 80
[root@k8s-master ~]# kubectl apply -f controller-deploy-nginx.yaml
deployment.apps/deploy-nginx created
[root@k8s-master ~]# kubectl get deployment -n dev -o wide
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
deploy-nginx 3/3 3 3 103s nginx nginx:1.15.5 app=nginx-pod,app in (nginx-pod)
[root@k8s-master ~]# kubectl get pods -n dev
NAME READY STATUS RESTARTS AGE
deploy-nginx-677f59dd8-2m9ph 1/1 Running 0 83s
deploy-nginx-677f59dd8-c5rbk 1/1 Running 0 83s
deploy-nginx-677f59dd8-t64bl 1/1 Running 0 83s
1、容器镜像版本更改
容器镜像版本更改方式参照ReplicaSet控制器方式
[root@k8s-master ~]# kubectl set image deployment deploy-nginx nginx=nginx:1.23.0 -n dev
deployment.apps/deploy-nginx image updated
2、容器镜像版本更改验证
[root@k8s-master ~]# kubectl get deployment -n dev -o wide
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
deploy-nginx 3/3 2 3 3m1s nginx nginx:1.23.0 app=nginx-pod,app in (nginx-pod)
3、观看pods情况,是会进行镜像自动更新
[root@k8s-master ~]# kubectl get pods -n dev
NAME READY STATUS RESTARTS AGE
deploy-nginx-677f59dd8-2m9ph 1/1 Running 0 3m12s
deploy-nginx-677f59dd8-t64bl 1/1 Running 0 3m12s
deploy-nginx-7cd566d98b-6sthc 0/1 ContainerCreating 0 12s
deploy-nginx-7cd566d98b-ztl65 1/1 Running 0 14s
[root@k8s-master ~]# kubectl get pods -n dev
NAME READY STATUS RESTARTS AGE
deploy-nginx-7cd566d98b-6sthc 1/1 Running 0 2m35s
deploy-nginx-7cd566d98b-sxkn5 1/1 Running 0 101s
deploy-nginx-7cd566d98b-ztl65 1/1 Running 0 2m37s
[root@k8s-master ~]# kubectl describe pods deploy-nginx-7cd566d98b-6sthc -n dev
略
8.4.4 pod镜像更改操作
pod镜像也可以称为pod版本,通过kubectl rollout --help
可知以下常见操作
kubectl rollout SUBCOMMAND [options]
# SUBCOMMAND
status 显示上线的状态
history 显示pod容器镜像(版本)更改记录
pause 暂停pod容器镜像(版本)更改操作
resume 继续已经暂停的pod容器镜像(版本)更改操作
restart 重启pod容器镜像(版本)更改操作
undo 默认回滚到上一次更改pod容器镜像(版本)更改记录(使用--to-revision指定回滚版本)
1、查看pod镜像(版本)更换情况
kubectl rollout status deployments deploy控制器名 -n 命名空间
示例:
[root@k8s-master ~]# kubectl rollout status deploy deploy-nginx -n dev
deployment "deploy-nginx" successfully rolled out
2、查看pod镜像(版本)更换历史
kubectl rollout history deployments deploy控制器名 -n 命名空间
示例:
[root@k8s-master ~]# kubectl rollout history deploy deploy-nginx -n dev
deployment.apps/deploy-nginx
REVISION CHANGE-CAUSE
1 <none>
2 <none>
3、暂停pod镜像(版本)更换操作
滚动更新是逐个替换,更新是需要一个时间段,暂停更换,就是维持目前pod容器镜像版本现状
kubectl rollout pause deployments deploy控制器名 -n 命名空间
4、暂停继续更换pod镜像(版本)
kubectl rollout resume deployments deploy控制器名 -n 命名空间
5、重启更改pod镜像(版本)
kubectl rollout restart deployments deploy控制器名 -n 命名空间
6、回滚操作
# 默认回滚到上一个版本
kubectl rollout undo deployments deploy控制器名 -n 命名空间
# 回滚到1的版本
kubectl rollout undo deployments deploy控制器名 --to-revision=1 -n 命名空间
8.5 HPA控制器
kubectl scale [--resource-version=version] [--current-replicas=count] --replicas=COUNT (-f
FILENAME | TYPE NAME) [options]
kubectl scale
可以实现pod数量的更改,实际生产环境中,希望实现自动扩缩容。
[root@k8s-master ~]# kubectl api-resources | grep Horizontal
horizontalpodautoscalers hpa autoscaling/v2 true HorizontalPodAutoscaler
8.5.1 自动扩缩容
文档地址:https://kubernetes.io/zh-cn/docs/tasks/run-application/horizontal-pod-autoscale-walkthrough/#autoscaling-on-multiple-metrics-and-custom-metrics
示例:
# hpa-nginx.yaml 文件
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: hpa-nginx
namespace: dev
labels:
controller: hpa
spec:
scaleTargetRef: # 指定要控制的信息
apiVersion: apps/v1
kind: Deployment
name: deploy-nginx
minReplicas: 1 # 最小pod数量
maxReplicas: 10 # 最大pod数量
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 50
# 执行
[root@k8s-master ~]# kubectl apply -f hpa-nginx.yaml
horizontalpodautoscaler.autoscaling/hpa-nginx created
# 查看发现内存查看
[root@k8s-master ~]# kubectl get hpa -n dev
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
hpa-nginx Deployment/deploy-nginx <unknown>/50% 1 10 3 6m4s
# 查看内存、cpu使用情况,发现指标API不可用
[root@k8s-master ~]# kubectl top node
error: Metrics API not available
8.5.2 指标API可用安装
kubectl top
命令可用,则需要安装Metrics API
# 下载最新版本high-availability-1.21+.yaml
[root@k8s-master ~]# https://521github.com/kubernetes-sigs/metrics-server/releases/latest/download/high-availability-1.21+.yaml
略
# 改下面三处内容
hostNetwork: true
- --kubelet-insecure-tls
image: registry.aliyuncs.com/google_containers/metrics-server:v0.6.4
[root@k8s-master ~]# kubectl apply -f high-availability-1.21+.yaml
[root@k8s-master ~]# kubectl top nodes
NAME CPU(cores) CPU% MEMORY(bytes) MEMORY%
k8s-master 193m 4% 1641Mi 44%
k8s-node1 68m 3% 755Mi 20%
k8s-node2 70m 3% 651Mi 37%
k8s-node3 70m 3% 559Mi 32%
[root@k8s-master ~]# kubectl top pods -n dev
NAME CPU(cores) MEMORY(bytes)
deploy-nginx-7cd566d98b-6sthc 0m 1Mi
deploy-nginx-7cd566d98b-sxkn5 0m 1Mi
deploy-nginx-7cd566d98b-ztl65 0m 7Mi
[root@k8s-master ~]# kubectl top --help
Display resource (CPU/memory) usage.
The top command allows you to see the resource consumption for nodes or pods.
This command requires Metrics Server to be correctly configured and working on the server.
Available Commands:
node Display resource (CPU/memory) usage of nodes
pod Display resource (CPU/memory) usage of pods
Usage:
kubectl top [flags] [options]
Use "kubectl top <command> --help" for more information about a given command.
Use "kubectl options" for a list of global command-line options (applies to all commands).
常用命令:
# 查看所有节点cpu、内存情况
kubectl top nodes
# 查看某个节点cpu、内存情况
kubectl top nodes 节点ip/节点域名
# 查看某个命名空间所有pods的cpu、内存情况
kubectl top pods -n 命名空间名称
# 查看某个命名空间某个pods的cpu、内存情况
kubectl top pods pods名称 -n 命名空间名称
8.6 DaemonSet
[root@k8s-master ~]# kubectl api-resources | grep DaemonSet
daemonsets ds apps/v1 true DaemonSet
节点级别的控制器,常用来日志收集、节点监控,会随着节点添加新增一个pod,节点移走减少一个pod
DaemonSet控制器生成的pods也支持使用kubectl rollout
回滚操作、暂停、暂停继续、重启等操作。
8.6.1 资源清单
apiVersion: apps/v1 # 版本号
kind: DaemonSet # 类型
metadata: # 元数据
name: # ds控制器称
namespace: # 所属命名空间
labels: #标签
controller: daemonset
spec: # 详情描述
revisionHistoryLimit: 3 # 保留历史版本
updateStrategy: # 更新策略
type: RollingUpdate # 滚动更新策略
rollingUpdate: # 滚动更新
maxUnavailable: 1 # 最大不可用状态的 Pod 的最大值,可以为百分比,也可以为整数
selector: # 选择器,通过它指定该控制器管理哪些pod
matchLabels: # Labels匹配规则
app: nginx-pod
matchExpressions: # Expressions匹配规则
- { key: app, operator: In, values: [ nginx-pod ] }
template: # 模板,当副本数量不足时,会根据下面的模板创建pod副本
metadata:
labels:
app: nginx-pod
spec:
containers:
- name: nginx-containers
image: nginx:latest
ports:
- containerPort: 80
示例:
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: ds-nginx
namespace: dev
spec:
selector:
matchLabels:
app: nginx-pod
template:
metadata:
labels:
app: nginx-pod
spec:
containers:
- name: nginx
image: nginx:latest
[root@k8s-master ~]# kubectl apply -f ds-nginx.yaml
daemonset.apps/ds-nginx created
[root@k8s-master ~]# kubectl get pods -n dev -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
ds-nginx-d7dtp 1/1 Running 0 75s 10.244.36.94 k8s-node1 <none> <none>
ds-nginx-fwlrk 1/1 Running 0 75s 10.244.169.146 k8s-node2 <none> <none>
ds-nginx-pjqxb 1/1 Running 0 75s 10.244.107.210 k8s-node3 <none> <none>
8.7 Job控制器
[root@k8s-master ~]# kubectl api-resources | grep Job
jobs batch/v1 true Job
运行一次就结束pods的控制器
8.7.1 资源清单
apiVersion: batch/v1 # 版本号
kind: Job # 类型
metadata: # 元数据
name: # Job控制器名称
namespace: # 所属命名空间
labels: #标签
controller: job
spec: # 详情描述
completions: 1 # 指定job需要成功运行Pods的次数。默认值: 1
parallelism: 1 # 指定job在任一时刻应该并发运行Pods的数量。默认值: 1
activeDeadlineSeconds: 30 # 指定job可运行的时间期限,超过时间还未结束,系统将会尝试进行终止。
backoffLimit: 6 # 指定job失败后进行重试的次数。默认是6
manualSelector: true # 是否可以使用selector选择器选择pod,默认是false
selector: # 选择器,通过它指定该控制器管理哪些pod
matchLabels: # Labels匹配规则
app: counter-pod
matchExpressions: # Expressions匹配规则
- { key: app, operator: In, values: [ counter-pod ] }
template: # 模板,当副本数量不足时,会根据下面的模板创建pod副本
metadata:
labels:
app: counter-pod
spec:
restartPolicy: Never # 重启策略只能设置为Never或者OnFailure
containers:
- name: counter
image: busybox:latest
command: [ "bin/sh","-c","for i in {1..10}; do echo $i;sleep 2;done" ]
关于重启策略设置的说明:
如果指定为OnFailure,则job会在pod出现故障时重启容器,而不是创建pod,failed次数不变
如果指定为Never,则job会在pod出现故障时创建新的pod,并且故障pod不会消失,也不会重启,failed次数加1
如果指定为Always的话,就意味着一直重启,意味着job任务会重复去执行了,当然不对,所以不能设置为Always
8.8 CronJob
[root@k8s-master ~]# kubectl api-resources | grep CronJob
cronjobs cj batch/v1 true CronJob
执行类似定时任务的pods的控制器
8.8.1 资源清单
apiVersion: batch/v1 # 版本号
kind: CronJob # 类型
metadata: # 元数据
name: # CronJob控制器名称
namespace: # 所属命名空间
labels: #标签
controller: cronjob
spec: # 详情描述
schedule: # cron格式的作业调度运行时间点,用于控制任务在什么时间执行
concurrencyPolicy: # 并发执行策略,用于定义前一次作业运行尚未完成时是否以及如何运行后一次的作业
failedJobHistoryLimit: # 为失败的任务执行保留的历史记录数,默认为1
successfulJobHistoryLimit: # 为成功的任务执行保留的历史记录数,默认为3
startingDeadlineSeconds: # 启动作业错误的超时时长
jobTemplate: # job控制器模板,用于为cronjob控制器生成job对象;下面其实就是job的定义
metadata:
spec:
completions: 1
parallelism: 1
activeDeadlineSeconds: 30
backoffLimit: 6
manualSelector: true
selector:
matchLabels:
app: counter-pod
matchExpressions: # 规则
- { key: app, operator: In, values: [ counter-pod ] }
template:
metadata:
labels:
app: counter-pod
spec:
restartPolicy: Never
containers:
- name: counter
image: busybox:latest
command: [ "bin/sh","-c","for i in 1 2 3 4 5 6 7 8 9; do echo $i;sleep 20;done" ]
需要重点解释的几个选项:
schedule: cron表达式,用于指定任务的执行时间
*/1 * * * *
<分钟> <小时> <日> <月份> <星期>
分钟 值从 0 到 59.
小时 值从 0 到 23.
日 值从 1 到 31.
月 值从 1 到 12.
星期 值从 0 到 6, 0 代表星期日
多个时间可以用逗号隔开; 范围可以用连字符给出;*可以作为通配符; /表示每...
concurrencyPolicy:
Allow: 允许Jobs并发运行(默认)
Forbid: 禁止并发运行,如果上一次运行尚未完成,则跳过下一次运行
Replace: 替换,取消当前正在运行的作业并用新作业替换它