上一篇:3 kubernetes架构
kubernetes通过各种controller来管理pod的生命周期,根据不同的业务场景,开发了deployment、Replicaset(副本控制器)、daemonset、statefulset、job等多种controller, deployment其实也是一种工作负载资源。
工作负载控制器(Workload Controllers)是K8s的一个抽象概念,用于更高级层次对象,部署和管理Pod。
常用工作负载控制器有:
• Deployment : 无状态应用部署
• StatefulSet : 有状态应用部署
• DaemonSet : 确保所有Node运行同一个Pod
• Job : 一次性任务
• Cronjob : 定时任务
控制器的作用:
1、管理pod对象
2、使用标签与pod绑定
3、控制器实现了Pod的运维,例如滚动更新、伸缩、副本管理、维护Pod状态等。
之前我们是通过命令行创建资源的,K8S更趋向于用yaml文件来创建资源,我们生产环境,大部分操作都是用yaml文件来创建资源的。
了解YAML语法格式:
• 缩进表示层级关系
• 不支持制表符“tab”缩进,使用空格缩进
• 通常开头缩进 2 个空格
• 字符后缩进 1 个空格,如冒号、逗号等
• “---” 表示YAML格式,一个文件的开始
• “#”注释
既然要用YAML配置文件部署应用,现在就很有必要了解一下 Deployment 的配置格式了,其他Controller (比如DaemonSet) 非常类似。
以nginx deployment为例,配置文件如图5-12所示。
apiVersion: apps/v1 # ①
kind: Deployment # ②
metadata: # ③
name: nginx0801
spec: #④
replicas: 1 #⑤
selector:
matchLabels:
app: nginx0801
template: #⑥
metadata: #⑦
labels:
app: nginx0801
spec: #⑧
containers:
- image: nginx
name: nginx
①apiVersion 是当前配置格式的版本。
②kind是要创建的资源类型,这里是Deployment。
③metadata是该资源的元数据,name是必需的元数据项。
④spec部分是该Deployment的规格说明。
⑤replicas 指明副本数量,默认为1。
⑥template 定义Pod的模板,这是配置文件的重要部分。
⑦metadata定义Pod的元数据,至少要定义一个label。label 的key和value可以任
意指定。
⑧spec 描述Pod的规格,此部分定义Pod中每一一个 容器的属性,name 和image是必需的。
deployment的典型使用场景有以下几个。
此nginx.yml是一个最简单的Deployment 配置文件,后面我们学习Kubernetes 各项功能时会逐步丰富这个文件。执行kubectl apply -f nginx0801.yml, 如图所示。
# kubectl get deploy
NAME READY UP-TO-DATE AVAILABLE AGE
nginx0819 10/15 15 10 32m
对上述输出中涉及的数量解释如下。
READY: 准备就绪的pod数量/Pod副本数量的期望值
UP-TO-DATE:最新版本的Pod的副本数量,用于指示在滚动升级的过程中,有多少个Pod副本已经成功升级。
AVAILABLE:当前集群中可用的Pod副本数量,即集群中当前存活的Pod数量。
AGE: deployment生命时间
其实,通过kubectl创建Deployment,Deployment创建ReplicaSet, ReplicaSet再创建pod。
# kubectl get rs
NAME DESIRED CURRENT READY AGE
nginx0819-586b875586 15 15 10 32m
DESIRED:Pod副本数量的期望值
CURRENT:当前Replica的值。
READY: 准备就绪的pod数量。
伸缩是指在线增加或减少Pod的副本数。
Deployment nginx-deployment初始是两个副本,如图所示。
# kubectl apply -f nginx0819.yaml
deployment.apps/nginx0819 created
# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx0819-586b875586-77822 1/1 Running 0 62s 10.255.30.43 k8s21-worker01 > >
nginx0819-586b875586-82z49 1/1 Running 0 62s 10.255.30.6 k8s21-worker01 > >
k8s21-worker01上跑了两个副本。现在修改nginx.yml文件,将副本改成5个,
如图所示。
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx0819
spec:
replicas: 5 #修改副本5
selector:
matchLabels:
app: nginx0819
template:
metadata:
labels:
app: nginx0819
spec:
containers:
- image: nginx
name: nginx
再次执行kubeclt apply -f nginx0819.yaml
# kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx0819-586b875586-77822 1/1 Running 0 4d21h
nginx0819-586b875586-82z49 1/1 Running 0 4d21h
nginx0819-586b875586-8t78j 1/1 Running 0 4d21h
nginx0819-586b875586-qlxzg 1/1 Running 0 4d21h
nginx0819-586b875586-tjv9b 1/1 Running 0 4d21h
另外,可以通过命令行模式修改副本数:
kubectl scale deployment httpd0826 --replicas=5
replicas为副本数。
Task
将deployment 从loadbalancer 扩展至 5 pods
解题:
#以下考试不需要操作
kubectl create deployment loadbalancer --image=nginx --replicas=1
#以下考试操作
kubectl config use-context k8s
kubectl scale deployment loadbalancer --replicas=5