Pod管理、资源清单、pod生命周期、控制器
一、pod管理
1.创建Pod应用
- Pod是可以创建和管理Kubernetes计算的最小可部署单元,一个Pod代表着集群中运行的一个进程,每个pod都有一个唯一的ip。
[root@server4 ~]# kubectl run demo --image=myapp:v1 ##创建一个pod应用,nginx是名字,myapp是景象
#--replicas=2 扩容参数 --record 记录参数
pod/demo created
[root@server4 ~]# kubectl get pod -n default #查看指定namespace的节点
NAME READY STATUS RESTARTS AGE
demo-5b4fc8bb88-7qp65 1/1 Running 0 9m51s
demo-5b4fc8bb88-sl7j6 1/1 Running 0 9m52s
[root@server4 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
demo 1/1 Running 0 13s
[root@server4 ~]# kubectl get pod -o wide ##查看节点的具体信息
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
demo 1/1 Running 0 52s 10.244.1.2 server2 <none> <none>
[root@server4 ~]# cat /var/run/flannel/subnet.env
FLANNEL_NETWORK=10.244.0.0/16
FLANNEL_SUBNET=10.244.0.1/24
FLANNEL_MTU=1450
FLANNEL_IPMASQ=true
[root@server4 ~]# curl 10.244.1.2
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
[root@server4 ~]#
[root@server4 ~]# kubectl delete pod demo
pod "demo" deleted
[root@server4 ~]#
[root@server4 ~]# kubectl get pod
No resources found in default namespace
##deployment(控制器)
[root@server4 ~]# kubectl create deployment demo --image=myapp:v1 --replicas=2 ##生成一个新的deployment控制器的pod,删除之后会自动重新生成不同id的pod
deployment.apps/demo created
[root@server4 ~]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
demo-5b4fc8bb88-bd9hm 1/1 Running 0 12s 10.244.1.4 server2 <none> <none>
demo-5b4fc8bb88-t8vsf 1/1 Running 0 12s 10.244.1.3 server2 <none> <none>
[root@server4 ~]# curl 10.244.1.4
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
[root@server4 ~]# curl 10.244.1.4
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
2.删除后,会重新拉取
[root@server4 ~]# kubectl delete pod nginx ##删除pod
pod "nginx" deleted
[root@server4 ~]# kubectl describe pod demo ##查看详细描述
[root@server4 ~]# kubectl logs demo ##查看日志
[root@server4 ~]# kubectl delete deployment nginx ##彻底删除deployment
[root@server4 ~]# kubectl get pod ##删除成功
[root@server4 ~]# kubectl get all
NAME READY STATUS RESTARTS AGE
pod/demo-5b4fc8bb88-bd9hm 1/1 Running 0 95s
pod/demo-5b4fc8bb88-t8vsf 1/1 Running 0 95s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 47h
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/demo 2/2 2 2 95s
NAME DESIRED CURRENT READY AGE
replicaset.apps/demo-5b4fc8bb88 2 2 2 95s
[root@server4 ~]# kubectl delete pod demo-5b4fc8bb88-bd9hm #删除
pod "demo-5b4fc8bb88-bd9hm" deleted ##生成新的id的pod
[root@server4 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
demo-5b4fc8bb88-6skrw 1/1 Running 0 72s
demo-5b4fc8bb88-t8vsf 1/1 Running 0 3m42s
3.负载均衡
[root@server4 ~]# kubectl expose deployment demo --port=80 --target-port=80 #80端口的暴露
service/demo exposed
[root@server4 ~]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
demo ClusterIP 10.97.29.222 <none> 80/TCP 6s
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 47h
[root@server4 ~]# curl 10.97.29.222
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
[root@server4 ~]# curl 10.97.29.222
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
[root@server4 ~]# curl 10.97.29.222/hostname.html
demo-5b4fc8bb88-sl7j6
[root@server4 ~]# curl 10.97.29.222/hostname.html
demo-5b4fc8bb88-ttqpj
4.更新回滚
## 更新镜像
[root@server4 ~]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
demo-5b4fc8bb88-6skrw 1/1 Running 0 4m39s 10.244.1.5 server2 <none> <none>
demo-5b4fc8bb88-t8vsf 1/1 Running 0 7m9s 10.244.1.3 server2 <none> <none>
[root@server4 ~]# kubectl set image deployment demo myapp=myapp:v2
deployment.apps/demo image updated
[root@server4 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
demo-7bd47bddfc-bhs5z 1/1 Running 0 9s
demo-7bd47bddfc-wbmjq 1/1 Running 0 7s
[root@server4 ~]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
demo-7bd47bddfc-bhs5z 1/1 Running 0 19s 10.244.1.6 server2 <none> <none>
demo-7bd47bddfc-wbmjq 1/1 Running 0 17s 10.244.1.7 server2 <none> <none>
[root@server4 ~]# kubectl rollout history deployment demo
deployment.apps/demo
REVISION CHANGE-CAUSE
1 <none>
2 <none>
[root@server4 ~]# curl 10.244.1.6
Hello MyApp | Version: v2 | <a href="hostname.html">Pod Name</a>
[root@server4 ~]#
## 回滚
[root@server4 ~]# kubectl rollout undo deployment demo --to-revision=1
deployment.apps/demo rolled back
[root@server4 ~]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
demo-5b4fc8bb88-7qp65 1/1 Running 0 6s 10.244.1.9 server2 <none> <none>
demo-5b4fc8bb88-sl7j6 1/1 Running 0 7s 10.244.1.8 server2 <none> <none>
demo-7bd47bddfc-bhs5z 0/1 Terminating 0 4m21s 10.244.1.6 server2 <none> <none>
demo-7bd47bddfc-wbmjq 0/1 Terminating 0 4m19s 10.244.1.7 server2 <none> <none>
[root@server4 ~]# curl 10.244.1.9
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
[root@server4 ~]#
5.Pod的扩容与缩容
[root@server4 ~]# kubectl scale deployment demo --replicas=6 #扩容
deployment.apps/demo scaled
[root@server4 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
demo-5b4fc8bb88-4pgfj 1/1 Running 0 8s
demo-5b4fc8bb88-7qp65 1/1 Running 0 16m
demo-5b4fc8bb88-8bxwg 1/1 Running 0 8s
demo-5b4fc8bb88-cd64p 1/1 Running 0 8s
demo-5b4fc8bb88-sl7j6 1/1 Running 0 16m
demo-5b4fc8bb88-ttqpj 1/1 Running 0 8s
[root@server4 ~]# kubectl scale deployment demo --replicas=2 #缩容
deployment.apps/demo scaled
[root@server4 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
demo-5b4fc8bb88-4pgfj 0/1 Terminating 0 15s
demo-5b4fc8bb88-7qp65 0/1 Terminating 0 17m
demo-5b4fc8bb88-8bxwg 0/1 Terminating 0 15s
demo-5b4fc8bb88-cd64p 0/1 Terminating 0 15s
demo-5b4fc8bb88-sl7j6 1/1 Running 0 17m
demo-5b4fc8bb88-ttqpj 1/1 Running 0 15s
[root@server4 ~]#
二、资源清单
## 方法一:书写时候的查找方法,可以之直接通过explain一步一步查找参数内容用法
[root@server4~]# kubectl explain pod ##查看pod所有参数,-required-带有required是必须存在的参数
[root@server4 ~]# kubectl explain pod.apiVersion ##查看api对应需要添加的参数
## 方法二: 直接打开一个已经有的deployment,然后生成相应的yaml文件,进行参考
[root@server4 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
demo 1/1 Running 0 3h51m
[root@server4 ~]# kubectl get pod demo -o yaml ##生成一个yaml文件
[root@server4 ~]# vim pod.yaml ##编写yml文件,可用性较高
[root@server4 ~]# cat pod.yaml
apiVersion: apps/v1
kind: Deployment ##设置为deployment
metadata:
name: nginx
namespace: default ##设置命名空间
spec:
replicas: 1
selector:
matchLabels:
run: nginx
template: ##模板
metadata:
labels: ##标签
run: nginx
spec:
#nodeSelector: ##指定运行节点的俩种方法(方法一)
# kubernetes.io/hostname: server4
#nodeName: server3 ##指定运行节点的俩种方法(方法二)
#hostNetwork: true ##可以通过直接访问节点ip的方式访问,[root@westos Desktop]# curl 172.25.13.4
containers:
- name: nginx
image: myapp:v1
imagePullPolicy: IfNotPresent
resources: ##资源限制
requests:
cpu: 100m
memeory: 100Mi
limits:
cpu: 0.5
memory: 512Mi
#- name: busyboxplus
# image: busyboxplus
# imagePullPolicy: IfNotPresent ##本地有镜像,优先本地拉取,没有就需要联网拉取
# stdin: true ##stdin和tty是为了保证交互式,相当于执行参数-it
# tty: true
[root@server4 ~]# kubectl apply -f pod.yaml ##deployment使用apply,会自动更新修改内容
## $ kubectl create -f demo.yaml ##不是deployment使用create,不会自动更新修改内容
deployment.apps/nginx created
三、Pod生命周期
[root@server4 pod]# vim init.yaml
apiVersion: v1
kind: Pod
metadata:
name: myapp-pod
labels:
app: myapp
spec:
containers:
- name: myapp-container
image: busyboxplus
command: ['sh', '-c', 'echo The app is running! && sleep 3600']
initContainers:
- name: init-myservice
image: busyboxplus
command: ['sh', '-c', "until nslookup myservice.default.svc.cluster.local; do echo waiting for myservice; sleep 2; done"]
- name: init-mydb
image: busyboxplus
command: ['sh', '-c', "until nslookup mydb.default.svc.cluster.local; do echo waiting for mydb; sleep 2; done"]
---
apiVersion: v1
kind: Service
metadata:
name: myservice
spec:
ports:
- protocol: TCP
port: 80
targetPort: 9376
---
apiVersion: v1
kind: Service
metadata:
name: mydb
spec:
ports:
- protocol: TCP
port: 80
targetPort: 9377
[root@server4 pod]# kubectl apply -f init.yaml
pod/myapp-pod created
service/myservice created
service/mydb created
[root@server4 pod]# kubectl get pod
NAME READY STATUS RESTARTS AGE
myapp-pod 0/1 Init:ErrImagePull 0 13s
pod-example 1/1 Running 0 126m
[root@server4 pod]# kubectl delete -f init.yaml
pod "myapp-pod" deleted
service "myservice" deleted
service "mydb" deleted
[root@server4 pod]#
[root@server4 pod]# vim pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-example
labels:
app: myapp
spec:
#hostNetwork: true
#nodeName: server3
#imagePullSecrets:
containers:
- name: myapp
image: myapp:v1
imagePullPolicy: IfNotPresent
resources:
requests:
cpu: "100m"
memory: "50Mi"
limits:
cpu: "200m"
memory: "100Mi"
livenessProbe:
tcpSocket:
port: 80
initialDelaySeconds: 1
periodSeconds: 3
timeoutSeconds: 1
readinessProbe:
httpGet:
path: /test.html
port: 80
initialDelaySeconds: 1
periodSeconds: 3
timeoutSeconds: 1
[root@server4 pod]# kubectl apply -f pod.yaml
pod/pod-example created
[root@server4 pod]# kubectl get pod
NAME READY STATUS RESTARTS AGE
pod-example 0/1 Running 0 7s
[root@server4 pod]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod-example 0/1 Running 0 20s 10.244.1.17 server2 <none> <none>
[root@server4 pod]# kubectl get pod -w
NAME READY STATUS RESTARTS AGE
pod-example 0/1 Running 0 38s
四、控制器
-
Pod 的分类:
自主式 Pod:Pod 退出后不会被创建
控制器管理的 Pod:在控制器的生命周期里,始终要维持 Pod 的副本数目 -
控制器类型:
Replication Controller和ReplicaSet
Deployment
DaemonSet
StatefulSet
Job
CronJob
HPA全称Horizontal Pod Autoscaler
1.ReplicaSet控制器
Replication Controller和ReplicaSet
ReplicaSet 是下一代的 Replication Controller,官方推荐使用ReplicaSet。
ReplicaSet 和 Replication Controller 的唯一区别是选择器的支持,
ReplicaSet 支持新的基于集合的选择器需求。
ReplicaSet 确保任何时间都有指定数量的 Pod 副本在运行。
虽然 ReplicaSets 可以独立使用,但今天它主要被Deployments 用作协调 Pod 创建、删除和更新的机制。
[root@server4 pod]# cat rs.yaml
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: replicaset-example
spec:
replicas: 6
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: myapp:v1
[root@server4 pod]# kubectl apply -f rs.yaml
replicaset.apps/replicaset-example created
[root@server4 pod]# kubectl get pod
[root@server4 pod]# kubectl get pod -o wide
[root@server4 pod]# kubectl get pod --show-labels
2.Deployment控制器
Deployment 为 Pod 和 ReplicaSet 提供了一个申明式的定义方法。
典型的应用场景:
用来创建Pod和ReplicaSet
滚动更新和回滚
扩容和缩容
暂停与恢复
[root@server4 pod]# vim 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
[root@server4 pod]# kubectl apply -f deployment.yaml
deployment.apps/nginx-deployment created
[root@server4 pod]# kubectl get pod
[root@server4 pod]# kubectl get pod --show-labels
[root@server4 pod]# vim deployment.yaml
spec:
replicas: 6
selector:
matchLabels:
[root@server4 pod]# kubectl apply -f deployment.yaml
deployment.apps/nginx-deployment configured
[root@server4 pod]# kubectl get pod
3.cronjob
Cron Job 创建基于时间调度的 Jobs。
一个 CronJob 对象就像 crontab (cron table) 文件中的一行,它用 Cron 格式进行编写,并周期性地在给定的调度时间执行 Job。
## 导入镜像
[root@server4 pod]# lftp 172.25.15.250
lftp 172.25.15.250:~> cd pub/images/
lftp 172.25.15.250:/pub/images> get perl.tar #下载镜像
881826816 bytes transferred in 5 seconds (174.44M/s)
lftp 172.25.15.250:/pub/images> exit
[root@server4 pod]# docker load -i perl.tar #导入镜像到本地
e2c6ff462357: Loading layer 119.3MB/119.3MB
26270c5e25fa: Loading layer 17.18MB/17.18MB
a42439ce9650: Loading layer 17.87MB/17.87MB
5d5962699bd5: Loading layer 150MB/150MB
651326e9f1ca: Loading layer 520.7MB/520.7MB
1f761580d1f6: Loading layer 3.584kB/3.584kB
11a4a76d22d2: Loading layer 56.71MB/56.71MB
Loaded image: perl:latest
[root@server4 pod]# docker tag perl:latest reg.westos.org/library/perl:latest #打标签
[root@server4 pod]# docker push reg.westos.org/library/perl:latest #上传到网络仓库
[root@server4 pod]# vim job.yaml
apiVersion: batch/v1
kind: Job
metadata:
name: pi
spec:
template:
spec:
containers:
- name: pi
image: perl
command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"]
restartPolicy: Never
backoffLimit: 4
[root@server4 pod]# kubectl apply -f job.yaml
job.batch/pi created
[root@server4 pod]# kubectl get pod
[root@server4 pod]# vim cronjob.yaml
apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: cronjob-example
spec:
schedule: "* * * * *"
jobTemplate:
spec:
template:
spec:
containers:
- name: cronjob
image: busybox
args:
- /bin/sh
- -c
- date; echo Hello from k8s cluster
restartPolicy: OnFailure
[root@server4 pod]# kubectl apply -f cronjob.yaml
Warning: batch/v1beta1 CronJob is deprecated in v1.21+, unavailable in v1.25+; use batch/v1 CronJob
cronjob.batch/cronjob-example unchanged
[root@server4 pod]# kubectl get cronjob
NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE
cronjob-example * * * * * False 0 19s 35s