目录
核心资源对象:
namespace:
kubectl get ns
kubectl create ns bdqn
kubectl delete ns bdqn
kubectl create deployment deploy1 -n bdqn
kubectl get ns bdqn
deployment:容器控制器,实现容器高可靠
service:服务,发布pod到外部接口
pod:容器,最小的管理单位,用来容纳一个或多个底层container
Pod的分类
自主式Pod:pod退出,不会自动被创建
控制器管理pod:在控制器的生命周期内,始终维持pod的副本数
镜像获取策略:
imagePullPolicy:
Always
IfNotPresent
Never
容器的重启策略:
restartPolicy:
Always
OnFailure
Never
pod的探针:
LivenessProbe 生存探测
ReadinessProbe 就绪探测
deployment滚动更新和回滚:
kubectl apply -f update2.yaml --record
kubectl rollout undo deployment update --to-revision=1
===================================
ReplicaSet
前边,我们说过Deployment是一种高级的Pod控制器,然后,这种高级Pod控制器,并不是像想象中直接管理后端的Pod,而是又创建了RS这种Pod控制器,然后由RS控制后端的Pod,那么为什么这么做?因为:RS资源并不支持滚动更新策略。
RC: ReplicationController (老一代的Pod控制器)
用于确保由其管控的Pod对象副本数量,能够满足用户期望,多则删除,少则通过模板创建。
特点:
确保Pod资源的对象的数量精准
确保Pod健康运行
弹性伸缩。
同样,它也可以通过yaml或json格式的资源清单来创建。其中spec字段一般嵌套以下字段
replicas: 期望的Pod对象副本数量
selector: 当前控制器匹配Pod对象副本的标签选择器
template: Pod副本的模板
与RC相比而言,RS不仅支持基于等值的标签选择器,而且还支持基于集合的标签选择器。
Labels与selector的关系:
举例:
1) 现在有一个Pod资源,且是拥有2个标签。还有svc资源,selector选择器,仅有一个符合,问:svc资源是否能成功的关联到上述的Pod资源?
```yaml
kind: Pod
apiVersion: v1
metadata:
name: pod1
labels:
test: web
app: httpd
spec:
containers:
- name: pod1
image: httpd
imagePullPolicy: IfNotPresent
---
kind: Service
apiVersion: v1
metadata:
name: test-svc1
spec:
selector:
app: httpd
ports:
- port: 80
```
查看服务是否关联成功:
kubectl describe svc test-svc1
Endpoints: 10.244.1.49:80
2) 现在有一个Pod资源,且是拥有1个标签。还有svc资源,selector选择器,需要2个满足条件,问:svc资源是否能成功的关联到上述的Pod资源?
```yaml
kind: Pod
apiVersion: v1
metadata:
name: pod1
labels:
test: web
spec:
containers:
- name: pod1
image: httpd
imagePullPolicy: IfNotPresent
---
kind: Service
apiVersion: v1
metadata:
name: test-svc1
spec:
selector:
app: httpd
test: web
ports:
- port: 80
通过以上实验,可以得到的结论:
selector我们可以是拥有选择权的,而labels只能够被动的“被选择”。所以,labels必须全部满足selector的要求,才能被匹配。
如果标签有多个,标签选择器选择其中一个,也可以关联成功。相反,如果选择器有多个,那么标签必须完全满足条件,才可以关联成功!
#### 常用标签
标签:解决同类型的资源对象越来越多,为了更好的管理,按照标签分组。
常用标签分类:
release(版本): stable(稳定版)、canary(金丝雀版本)、beta(测试版)
environment(环境变量): dev(开发)、qa(测试)、production(生产)
application(应用): ui、as(application software应用软件)、pc、sc
tier(架构层级): frontend(前端)、backend(后端)、cache(缓存)
partition(分区): customerA(客户A)、customerB(客户B)
track(品控级别): daily(每天)、weekly(每周)
标签要做到:见名知意。
举例:写一个Pod的yaml文件,
```yaml
kind: Pod
apiVersion: v1
metadata:
name: pod-labels
labels:
env: qa
tier: frontend
spec:
containers:
- name: myapp
image: httpd
imagePullPolicy: IfNotPresent
```
//通过--show-labels显示资源对象的标签。
[root@master labels]# kubectl get pod --show-labels
NAME READY STATUS RESTARTS AGE LABELS
pod-labels 1/1 Running 0 3m58s env=qa,tier=frontend
//通过-l 查看仅包含某个标签的资源。
[root@master labels]# kubectl get pod -l env
NAME READY STATUS RESTARTS AGE
pod-labels 1/1 Running 0 5m39s
//给Pod资源添加标签
[root@master labels]# kubectl label pod pod-labels release=v1
pod/pod-labels labeled
[root@master labels]# kubectl get pod pod-labels --show-labels
NAME READY STATUS RESTARTS AGE LABELS
pod-labels 1/1 Running 0 8m33s env=qa,release=v1,tier=frontend
//删除标签
[root@master labels]# kubectl label pod pod-labels release-
pod/pod-labels labeled
//修改标签
[root@master labels]# kubectl label pod pod-labels env=dev --overwrite
标签选择器:标签的查询过滤条件。
基于等值关系的(equality-based):"=","==","!="前边两个都是相等,最后是不等。
基于集合关系(set-based):"in"、"notin"、"exists"三种。
例子:
PodA: app:nginx name:zhangsan age:18
PodB: app:nginx name:lisi age:45
PodC: name:wangwu age:45
```yaml
...selector:
matchLabels:
app: nginx
matchExpressions:
//Pod中有name这个关键字的,并且对应的值是:zhangsan,或者lisi,那么此处会关联到PodA、PodB
- {key: name,operator: In,values: [zhangsan,lisi]}
//所有关键字是age的,并且忽略它的值,都会被选中,此处会关联到PodA、PodB、PodC
- {key: age,operator: Exists,values:}
...
# matchLabels: 指定键值对表示的标签选择器。
# matchExpressions: 基于表达式来指定的标签选择器。选择器列表间为“逻辑与”关系;使用In或者NotIn操作时,其values不强制要求为非空的字符串列表,而使用Exists或DostNotExist时,其values必须为空。
PS: 如果同时设置了matchLabels和matchExpressions,则两组条件为 AND关系,即需要同时满足所有条件才能完成Selector的筛选。
Job,Deployment,Replica Set 和 Daemon Set,也支持基于集合要求.
使用selector标签选择器的逻辑:***
1. 同时指定的多个选择器之间的逻辑关系为“与“操作。
2. 使用空值的标签选择器意味着每个资源对象都将被选择中。
3. 空的标签选择器无法选中任何资源。
RS的资源清单和RC和Deployment并无二致,所以在此不再过多介绍。
------------------------------------------
DaemonSet
它也是一种Pod控制器。
特点:它会在每一个Node节点上都会生成并且只能生成一个Pod资源。
使用场景:如果必须将Pod运行在固定的某个或某几个节点,且要优先于其他Pod的启动。通常情况下,默认会每一个节点都会运行,并且只能运行一个Pod。这种情况推荐使用DaemonSet资源对象。
监控程序:
日志收集程序;
运行一个web服务,在每一个节点都运行一个Pod,查看语法是否正确。
旧版本:
kind: DaemonSet
apiVersion: extensions/v1beta1
metadata:
name: test-ds
spec:
template:
metadata:
labels:
name: test-ds
spec:
containers:
- name: test-ds
image: httpd
imagePullPolicy: IfNotPresent
```
RC、RS、Deployment、DaemonSet。 Pod控制器。--> Controller-manager(维护集群状态,保证Pod处于期望的状态。)
新版本:
[root@master ~]cat ds.yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: ds
spec:
selector:
matchLabels:
name: test-web
template:
metadata:
labels:
name: test-web
spec:
containers:
- name: ds
image: nginx
imagePullPolicy: IfNotPresent
```
需要注意的是:ds也支持滚动更新,它此时的默认更新策略是rollingUpdate。
# kubectl explain ds.spec.updateStrategy.
- OnDelete:这是用于向后兼容的默认更新策略。 使用OnDelete更新策略,在更新DaemonSet模板之后,只有在手动删除旧的DaemonSet窗格时才会创建新的DaemonSet Pod。 这与Kubernetes版本1.5或更早版本中的DaemonSet是一致的。
- RollingUpdate:通过RollingUpdate更新策略,在更新DaemonSet模板后,旧的DaemonSet窗格将被终止,并且将以受控的方式自动创建新的DaemonSet。
更改ds更新策略:
旧版本:
```yaml
kind: DaemonSet
apiVersion: extensions/v1beta1
metadata:
name: ds
spec:
updateStrategy:
type: RollingUpdate
template:
metadata:
labels:
name: test-web
spec:
containers:
- name: ds
image: nginx
imagePullPolicy: IfNotPresent
```
新版本:
自己写
滚动升级,并回滚
综合练习作业:
创建一个新的namespace资源(名称test),且要求以下资源都在此名称空间内运行。
1) 创建一个DaemonSet资源,要求使用自定义镜像v1版本,标签为: test-web,app: httpd两个。
2) 创建svc资源,与上述DS资源关联,并验证关联成功。
3) 上述DS资源,镜像更新为v2版本。
4)创建一个Deployment资源,镜像使用自定义镜像v1版本,replicas:8.问,能否与上述SVC资源关联成功?并用实验的方式验证。
5) 将上述Deployment资源更新为v2版本的镜像,且要求更新过程中最大不可用Pod数量为: 2. 更新过程中Pod总数为12个。