目录
1.Kubernetes管理对象
Pod
Kubernetes基本管理单元,每个Pod是一个或多个容器的一组集合。
一个Pod作为一个整体运行在一个节点(node)上。
Pod内的容器共享存储和网络
ReplicationController(简称RC)
Kubernetes需要管理大量的Pod,而显而易见的是通常情况下一个应用不会以单独的一个Pod完成。比较常见的情况是使用大量的Pod组成一个简单应用。管理这些大量的Pod的一个方式就是RC。
RC可以指定Pod的副本数量,并且在其中有Pod故障时可以自动拉起新的Pod,大大简化了管理难度。
ReplicaSet(简称RS)
目前最常用的控制器就是Deployment,创建Deployment时也会自动创建ReplicaSet。
Deployment可以管理一个或多个RS,并且通过RS来管理Pod。
Deployment
目前最常用的控制器就是Deployment,创建Deployment时也会自动创建ReplicaSet
Deployment可以管理一个或多个RS,并且通过RS来管理Pod。
逻辑关系
从小到大的管理逻辑
容器<Pod<ReplicaSet<Deployment
通常情况下
Pod中包含一个容器,或关系特别紧密的几个容器。
一个ReplicaSet中包含多个相同的Pod。
Deployment中包含一个或几个不同的RS
2.创建Deployment
运行一个Deployment
kubectl create deployment mydep --image=nginx
kubectl get deployment
NAME READY UP-TO-DATE AVAILABLE AGE
mydep 1/1 1 1 2m3s
命令行接口 - Kubectl
在Kubernetes中的操作很多都是用kubectl来完成,通过其命令可以管理Deployment,Replicaset,ReplicationController,Pod等,进行操作,扩容,删除等等全生命周期操作。同时可以对管理对象进行查看或者监控资源使用情况。
Kubectl的语法
kubectl [command] [TYPE] [NAME] [flags]
Command:指定你希望进行的操作,如create,get,describe,delete等。
TYPE:指定操作对象的类型,如deployment,RS,Pod等
NAME:指定对象的名字
Flags: 可选的标志位
常用Command:
Create:创建资源
Apply:应用资源的配置变更,也可以代替create创建新的资源
Get:查看资源
Describe:查看资源的详细描述
Delete:删除资源
Yaml文件创建deployment
在前面的样例中,我们使用一行命令创建了Deployment。这是一种简单的形式,大量个性化参数没有定义,后续对该Deployment的升级管理也有诸多问题。在实际使用中,我们更常见的用法是通过一个yaml文件来创建各类资源。
创建一个yaml文件
vi nginx-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:·
containers:
- name: nginx
image: nginx:1.7.9
ports:
- containerPort: 80
apiVersion:版本号,固定为apps/v1,如果使用1.9.0以前版本的kubernetes,填写apps/v1beta2
Kind: 类型,选择创建资源类型,可以填写pod,replicaset等
Metadata:元数据,其中name项指定了名称,label项指定标签。
Spec:deployment规格,其中replicas指定pod副本数量,选择器选择标签匹配为app:nginx
Template:对pod模板的定义,其中至少要定义一个label
Spec:描述pod的规格
Containers:定义容器的属性,在范例中,容器名字是nginx,镜像为nginx:1.7.9,容器输入输出的端口是80端口。
最后注意格式,缩进一般使用两个空格,千万不要使用tab!
使用yaml文件创建Deployment (2)
kubectl create -f nginx-deployment.yaml·
kubectl get deployment
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-deployment 3/3 3 3 114s
3.Deployment升级和弹性伸缩
Deployment弹性伸缩 (1)
容器对比虚拟机,最大的优势在于可以灵活的弹性伸缩,而这一部分工作由kubernetes进行调度
Deployment弹性伸缩 (2)
Deployment弹性伸缩本质是Pod数量增加或减少。
弹性伸缩可以支持自动化部署,并在很短时间内实现数量变更。
弹性伸缩通过修改yaml文件中的replica参数实现。
修改yaml后使用scale命令应用变更完成扩容或减容。
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 5
selector:
matchLabels:
app: nginx
……
升级 (1)
当使用的deployment需要升级时(如软件版本更新),可以使用rolling update功能滚动升级deployment中所有pod。
升级 (2)
已有一个nginx-deployment,让我们查看它现在的状态。
[root@k8s-master]# kubectl get rs
NAME DESIRED CURRENT READY AGE
nginx-deployment-6dd86d77d 3 3 3 11s
[root@k8s-master]# kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-deployment-6dd86d77d-7vlmb 1/1 Running 0 3s
nginx-deployment-6dd86d77d-92cqm 1/1 Running 0 3s
nginx-deployment-6dd86d77d-l6pw8 1/1 Running 0 3s
修改yaml文件
执行rolling-update
……
spec:
containers:
- name: nginx
image: nginx:1.9.1
ports:
- containerPort: 80
升级 (3)
升级后,再次查看状态,会发现replicaset和pod的状态都发生了变化
出现了一个新的replicaset,原有replicaset中无pod
三个pod的名字发生了变更
[root@k8s-master]# kubectl get rs
NAME DESIRED CURRENT READY AGE
nginx-deployment-6dd86d77d 0 0 0 63s
nginx-deployment-784b7cc96d 3 3 3 21s
[root@k8s-master runfile]# kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-deployment-784b7cc96d-4wlnl 1/1 Running 0 9s
nginx-deployment-784b7cc96d-j72jm 1/1 Running 0 12s
nginx-deployment-784b7cc96d-kbx6n 1/1 Running 0 10s
升级 (4)
再次查看该deployment日志,可以发现在滚动更新中系统所做的操作。
Events:
Type Reason Age Message
---- ------ ---- -------
Normal ScalingReplicaSet 50s Scaled up replica set nginx-deployment-784b7cc96d to 1
Normal ScalingReplicaSet 48s Scaled down replica set nginx-deployment-6dd86d77d to 2
Normal ScalingReplicaSet 48s Scaled up replica set nginx-deployment-784b7cc96d to 2
Normal ScalingReplicaSet 47s Scaled down replica set nginx-deployment-6dd86d77d to 1
Normal ScalingReplicaSet 47s Scaled up replica set nginx-deployment-784b7cc96d to 3
Normal ScalingReplicaSet 45s Scaled down replica set nginx-deployment-6dd86d77d to 0
回滚 (1)
使用kubernetes滚动更新后,kubernetes会记录下本次更新,并且保存为一个历史版本,如果更新后出现应用异常,可以通过回滚操作回到之前版本
kubectl apply -f nginx-deployment.v1.yaml –-record
kubectl apply -f nginx-deployment.v2.yaml --record
kubectl apply -f nginx-deployment.v3.yaml --record
回滚 (2)
使用命令查看历史版本
[root@k8s-master]# kubectl rollout history deployment nginx-deployment
deployment.extensions/nginx-deployment
REVISION CHANGE-CAUSE
1 kubectl apply --filename=nginx-deployment.v1.yaml --record=true
2 kubectl apply --filename=nginx-deployment.v2.yaml --record=true
3 kubectl apply --filename=nginx-deployment.v3.yaml --record=true
回滚 (3)
通--revision=命令可以查看某个历史版本的详细信息。
[root@k8s-master]# kubectl rollout history deployment nginx-deployment --revision=2
deployment.extensions/nginx-deployment with revision #2
Pod Template:
Labels: app=nginx
pod-template-hash=59988f74c7
Annotations: kubernetes.io/change-cause: kubectl apply --filename=nginx-deployment.v2.yaml --record=true
Containers:
nginx:
Image: nginx:1.8.1
Port: 80/TCP
Host Port: 0/TCP
Environment: <none>
Mounts: <none>
Volumes: <none>
#使用rollout undo命令回滚到指定版本。
kubectl rollout undo deployment nginx-deployment --to-revision=2