一:Pod相关控制器列表。
Replicaset:通过对用户期望的pod资源,依照pod资源模板来创建pod
Deployment:建筑在Replicaset之上对pod资源进行操作,支持流动,回滚,作用于无状态应用
Daemonset:在整个系统的每个节点上,指定运行某个pod的一个副本,实现系统集群管理。
statefulset:作用于有状态的应用,每个节点都是有数据的。
二:Replicaset控制器实例:
[root@k8s-master manifests]# kubectl explain rs 查看replicase控制器如何使用
[root@k8s-master deployment]# vim rs-demo.yaml 编辑一个yaml文件
apiVersion: apps/v1 这表示我们创建的控制器属于apps群组v1版本
kind: ReplicaSet 这是我们创建的控制器资源名称。
metadata:
name: myapp
namespace: default
spec:
replicas: 2 期望创建的pod数量
selector: 表示我们挑选的pod的标签,app=myapp,release=canary
matchLabels:
app: myapp
release: canary
template: 创建一个模板,当我们期望的pod的资源少了,以这个模块来创建pod
metadata:
name: myapp-pod
labels: 在这里pod的标签必须与上述控制器挑选的标签保持一至,能多个其他。
app: myapp
release: canary
environment: qa 在模板这里我们可以多加一个标签。
spec:
containers:
- name: myapp-container
image: ikubernetes/myapp:v1
ports:
- containerPort: 80
[root@k8s-master deployment]# kubectl create -f rs-demo.yaml
replicaset.apps/myapp created
[root@k8s-master deployment]# kubectl get rs
NAME DESIRED CURRENT READY AGE
myapp 2 2 2 12s
[root@k8s-master deployment]# kubectl get pods -o wide
myapp-7bn4q 1/1 Running 0 34s 10.244.1.23 k8s-node1 <none> <none>
myapp-g2f5b 1/1 Running 0 34s 10.244.1.24 k8s-node1 <none> <none>
[root@k8s-master deployment]# kubectl get rs
NAME DESIRED CURRENT READY AGE
myapp 2 2 2 12s
[root@k8s-master deployment]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
myapp-7bn4q 1/1 Running 0 34s 10.244.1.23 k8s-node1 <none> <none>
myapp-g2f5b 1/1 Running 0 34s 10.244.1.24 k8s-node1 <none> <none>
在这里的pod名称与我们yaml文件中写的pod名称有区别。这是因为在清单创建的时候会依据pod控制器名称生成一串字母。
[root@k8s-master deployment]# kubectl describe pods myapp-7bn4q 查看其中一个pod的详细信息。
Name: myapp-7bn4q
Namespace: default
Priority: 0
Node: k8s-node1/10.5.100.157
Start Time: Wed, 23 Dec 2020 16:34:17 +0800
Labels: app=myapp
environment=qa
release=canary
Annotations: <none>
Status: Running
IP: 10.244.1.23
IPs:
IP: 10.244.1.23
Controlled By: ReplicaSet/myapp
Containers:
myapp-container:
Container ID: docker://971694c34965e607d6975d5d0f38f580779ab978101479bc7ef311e46e03fa24
Image: ikubernetes/myapp:v1
Image ID: docker-pullable://ikubernetes/myapp@sha256:9c3dc30b5219788b2b8a4b065f548b922a34479577befb54b03330999d30d513
Port: 80/TCP
Host Port: 0/TCP
State: Running
Started: Wed, 23 Dec 2020 16:34:23 +0800
Ready: True
Restart Count: 0
Environment: <none>
Mounts:
/var/run/secrets/kubernetes.io/serviceaccount from default-token-rgbt5 (ro)
Conditions:
Type Status
Initialized True
Ready True
ContainersReady True
PodScheduled True
Volumes:
default-token-rgbt5:
Type: Secret (a volume populated by a Secret)
SecretName: default-token-rgbt5
Optional: false
QoS Class: BestEffort
Node-Selectors: <none>
Tolerations: node.kubernetes.io/not-ready:NoExecute for 300s
node.kubernetes.io/unreachable:NoExecute for 300s
Events: <none>
[root@k8s-master deployment]#
#当我们删除我们其中的一个pod时。
[root@k8s-master deployment]# kubectl get pods --show-labels -l app=myapp,release=canary
NAME READY STATUS RESTARTS AGE LABELS
myapp-7bn4q 1/1 Running 0 97m app=myapp,environment=qa,release=canary
myapp-g2f5b 1/1 Running 0 97m app=myapp,environment=qa,release=canary
[root@k8s-master deployment]#
[root@k8s-master deployment]# kubectl delete pods myapp-7bn4q 删除其中一个pod
pod "myapp-7bn4q" deleted
[root@k8s-master deployment]# kubectl get pods --show-labels -l app=myapp,release=canary 再次查看pod发现又启动了一个pod,因为我们定义控制器期望是两个pod。
NAME READY STATUS RESTARTS AGE LABELS
myapp-96sfg 1/1 Running 0 8s app=myapp,environment=qa,release=canary
myapp-g2f5b 1/1 Running 0 98m app=myapp,environment=qa,release=canary
[root@k8s-master deployment]#
#因为我们yaml文件设置了控制器挑选2个分别带有releas=canary,app=myapp标签的pod,在这里我们将其他的一个pod也打上这两个标签。看看控制器的反应
[root@k8s-master deployment]# kubectl get pods
NAME READY STATUS RESTARTS AGE
myapp-5d587c4d45-nms7x 1/1 Running 1 8d
myapp-5d587c4d45-r4rcc 1/1 Running 1 8d
myapp-5d587c4d45-tt6lv 1/1 Running 1 8d
myapp-96sfg 1/1 Running 0 3m51s
myapp-g2f5b 1/1 Running 0 102m
nginx-deployment-bd4bfb877-xs62q 1/1 Running 1 15d
post 1/1 Running 0 25h
readiness 0/1 Running 0 2d
[root@k8s-master deployment]# kubectl label pods post release=canary app=myapp 我们将post这个pod打上标签,后果控制器会删除一个pod,因为我们上述yaml文件中定义的是2个pod
pod/post labeled
[root@k8s-master deployment]# kubectl get pods
NAME READY STATUS RESTARTS AGE
myapp-5d587c4d45-nms7x 1/1 Running 1 8d
myapp-5d587c4d45-r4rcc 1/1 Running 1 8d
myapp-5d587c4d45-tt6lv 1/1 Running 1 8d
myapp-g2f5b 1/1 Running 0 103m
nginx-deployment-bd4bfb877-xs62q 1/1 Running 1 15d
post 1/1 Running 0 25h
readiness 0/1 Running 0 2d
[root@k8s-master deployment]#
[root@k8s-master deployment]# kubectl edit rs myapp 我们修改控制器的配置清单。我们将容器使用的镜像版本改成myapp/v2,那们已经创建好的pod使用镜像的版本依然是v1,那么我们利用模板再次创建pod时容器的镜像就变为v2了
#实例
[root@k8s-master deployment]# kubectl describe pods myapp-g2f5b 先查看现有的pod使用的镜像版本
Name: myapp-g2f5b
Namespace: default
Priority: 0
Node: k8s-node1/10.5.100.157
Start Time: Wed, 23 Dec 2020 16:34:17 +0800
Labels: app=myapp
environment=qa
release=canary
Annotations: <none>
Status: Running
IP: 10.244.1.24
IPs:
IP: 10.244.1.24
Controlled By: ReplicaSet/myapp
Containers:
myapp-container:
Container ID: docker://11aa211599288f8e8045120377d9a16a7f3c092a6fcd8f831f69700ecc1aa977
Image: ikubernetes/myapp:v1
[root@k8s-master deployment]# kubectl delete pods myapp-g2f5b 我们将这个pod删除
pod "myapp-g2f5b" deleted
[root@k8s-master deployment]# kubectl get pods --show-labels 删除之后,控制器又根据模板重启一个pod
myapp-sd4qd 1/1 Running 0 6s
[root@k8s-master deployment]# kubectl describe pods myapp-sd4qd 查看我们刚才创建的pod,镜像版本发生了变化。
Name: myapp-sd4qd
Namespace: default
Priority: 0
Node: k8s-node1/10.5.100.157
Start Time: Wed, 23 Dec 2020 18:36:58 +0800
Labels: app=myapp
environment=qa
release=canary
Annotations: <none>
Status: Running
IP: 10.244.1.27
IPs:
IP: 10.244.1.27
Controlled By: ReplicaSet/myapp
Containers:
myapp-container:
Container ID: docker://b59caa39383b050f3dba6ff985a03dab9784e85ba44a166355aba10b5aa5d5ba
Image: ikubernetes/myapp:v2
RelicaSet总结:通过对用户期望的pod资源,依照我们定义的模板来创建pod