k8s中的资源清单、Pod生命周期、控制器
1资源清单
格式如下:
apiVersion: group/version #指明api资源属于哪个群组和版本,同一个组可以有多个版本
$ kubectl api-versions #查询命令
kind: #标记创建的资源类型,k8s主要支持以下资源类别
Pod,ReplicaSet,Deployment,StatefulSet,DaemonSet,Job,Cronjob
metadata: #元数据
name: #对象名称
namespace: #对象属于哪个命名空间
labels: #指定资源标签,标签是一种键值数据
spec: #定义目标资源的期望状态
$ kubectl explain pod #查询帮助文档
创建pod目录
[root@server2 ~]# mkdir pod
[root@server2 ~]# cd pod/
[root@server2 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
demo-5b4fc8bb88-h9cvt 1/1 Running 0 94m
demo-5b4fc8bb88-tvw5d 1/1 Running 0 94m
[root@server2 ~]# kubectl delete deployments.apps demo #删掉不用的pod
[root@server2 ~]# kubectl run demo --image=myapp:v1 #重新创建pod,使用镜像为myapp,版本为v1
编写pod.yml文件
apiVersion: v1
kind: Pod
metadata:
name: pod-example
spec:
containers:
- name: myapp
image: myapp:v1
应用yaml文件,创建pod
[root@server2 pod]# kubectl apply -f pod.yaml
pod/pod-example created
[root@server2 pod]# kubectl get pod
NAME READY STATUS RESTARTS AGE
demo 1/1 Running 0 83m
pod-example 1/1 Running 0 11s
查看后发现生成pod-example
删除掉不需要的demo与pod-example。
注意!使用yml文件时一定要先删掉之前的pod再创建
[root@server2 pod]# kubectl delete pod demo
pod "demo" deleted
[root@server2 pod]# kubectl delete pod pod-example
pod "pod-example" deleted
再次编辑yaml文件,容器增加为两个
[root@server2 pod]# vim pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-example
spec:
containers:
- name: myapp
image: myapp:v1
- name: busybox
image: busyboxplus:latest
tty: true
stdin: true
应用后查看,发现有两个容器为ready状态
[root@server2 pod]# kubectl apply -f pod.yaml
pod/pod-example created
[root@server2 pod]# kubectl get pod
NAME READY STATUS RESTARTS AGE
pod-example 2/2 Running 0 28s
查看pod的状态
[root@server2 pod]# kubectl get pod -o wide
进入busybox终端内,-c指定容器 、-i打开输入端口、-t打开伪终端
[root@server2 pod]# kubectl attach pod-example -c busybox -it
If you don't see a command prompt, try pressing enter.
/ # ip addr
/ # curl localhost
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
发现访问localhost成功,而busybox是没有80端口的,可见pod内的资源是共享的,访问到了同一pod内的myapp上的80端口。
删除掉已经存在的pod-example后再次编写文件
[root@server2 pod]# kubectl delete pod pod-example
[root@server2 pod]# vim pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-example
spec:
containers:
- name: myapp
image: myapp:v1
imagePullPolicy: IfNotPresent
#本地存在镜像,则不拉取;本地不存在镜像
- name: busybox
image: busyboxplus:latest
imagePullPolicy: IfNotPresent
tty: true
stdin: true
使用资源清单设定监听端口
[root@server2 pod]# kubectl delete -f pod.yaml
pod "pod-example" deleted
[root@server2 pod]# vim pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-example
spec:
containers:
- name: myapp
image: myapp:v1
imagePullPolicy: IfNotPresent
#指定容器所在主机需要监听的端口号
ports:
- containerPort: 80
hostPort: 80
[root@server2 pod]# kubectl apply -f pod.yaml
pod/pod-example created
服务分到server3上,查看server3上的iptables策略
使用清单锁定IP
[root@server2 pod]# vim pod1.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-example
spec:
hostNetwork: true #使用主机ip
containers:
- name: myapp
image: myapp:v1
[root@server2 pod]# kubectl apply -f pod1.yaml
pod/pod-example created
[root@server2 pod]# kubectl get pod -o wide
使用清单限制内存和CPU
[root@server2 pod]# vi pod1.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-example
spec:
containers:
- name: myapp
image: myapp:v1
imagePullPolicy: IfNotPresent
#如果本地存在镜像,则不拉取
#本地不存在镜像,再拉取
# 限制内存和cpu使用量,requests为最低限制,limit为最高限制
resources:
requests:
cpu: "100m"
memory: "50Mi"
limits:
cpu: "200m"
memory: "100Mi"
[root@server2 pod]# kubectl apply -f pod1.yaml
pod/pod-example created
查看pod-example信息,发现关于内存与cpu的最大最小设置成功
[root@server2 pod]# kubectl describe pod pod-example
容器副本默认为退出后会自动重启, --restart=Never设置不重启,发现busybox容器副本不重启
kubectl run -it busybox --image=busyboxplus --restart=Never
2Pod生命周期
Pod 可以包含多个容器,应用运行在这些容器里面,同时 Pod 也可以有一个或多个先于应用容器启动的 Init 容器。
Init 容器与普通的容器非常像,除了如下两点:
1.它们总是运行到完成。
2.Init 容器必须在 Pod 就绪之前运行完成,每个 Init 容器必须运行成功,下一个才能够运行。
如果 Pod 的 Init 容器失败,Kubernetes 会不断地重启该 Pod,直到 Init 容器成功为止。如果 Pod 对应的 restartPolicy 值为 Never,它不会重新启动。
init初始化容器
初始化包括一些安装过程中应用容器中不存在的工具或服务,定义初始化服务后,必须要添加服务,初始化才能完成。
[root@server2 ~]# vim init.yml
[root@server2 ~]# cat init.yml
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
注释掉其中一个服务,初始化未成功,会不停重启进行初始化。
查看STATUS发现一直处于Init:0/2初始化中
[root@server2 pod]# vim pod1.yaml
[root@server2 pod]# kubectl apply -f pod1.yaml
pod/myapp-pod created
service/mydb created
[root@server2 pod]# kubectl get pod -w
将注释掉的服务打开,再次应用才会初始化成功.
STATUS已经变为running
查看容器解析
探针
探针包括下列三种:
- livenessProbe:存活探针,jiance容器是否正在运行。若运行失败会杀掉失败进程,通过重启策略重新拉起容器并再次进行检测。默认开启。
- readinessProbe:就绪探针,指示容器是否准备好服务请求。
- startupProbe: 指示容器中的应用是否已经启动。
由 kubelet 对容器执行的定期诊断
每次探测都将获得以下三种结果之一:
• 成功:容器通过了诊断。
• 失败:容器未通过诊断。
• 未知:诊断失败,因此不会采取任何行动。
vim svc.yaml
apiVersion: v1
kind: Service
metadata:
name: mysvc
spec:
ports:
- protocol: TCP
port: 80
targetPort: 80
selector:
app: nginx
vim pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-example
labels:
app: myapp
spec:
#hostNetwork: true
#nodeName: server4
#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
拉起容器查看标签
进入容器,添加测试页
kubectl exec pod-example -i -t -- sh
cd /usr/share/nginx/html/
echo www.westos.org > test.html
再次查看发现pod-example已经Ready
访问给定ip,访问到给定内容
重启策略
PodSpec 中有一个 restartPolicy 字段,可能的值为 Always、OnFailure 和Never。默认为 Always。
3控制器
Pod 的分类:
- 自主式 Pod:Pod 退出后不会被创建
- 控制器管理的 Pod:在控制器的生命周期里,始终要维持 Pod 的副本数目
控制器类型:
- Replication Controller和ReplicaSet
- Deployment
- DaemonSet
- StatefulSet
- Job
- CronJob
- HPA全称Horizontal Pod Autoscaler
RS控制器
只控制副本,不能控制其他
[root@server2 pod]# vim rs.yaml
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: replicaset-example
spec:
replicas: 3 #副本数为3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: myapp:v1
[root@server2 pod]# kubectl apply -f rs.yaml
replicaset.apps/replicaset-example configured
[root@server2 pod]# kubectl get pod
查看pod,副本数为3
查看具体ip
修改副本数为6并再次应用
查看标签为app=nginx
将第一个副本的标签改为app=myapp,再次查看标签后发现自动拉起一个副本标签为app=nginx,保持副本总数为6
此时删掉标签为app=myapp的副本,不影响其他六个副本
Deployment控制器
Deployment 为 Pod 和 ReplicaSet 提供了一个申明式的定义方法。
典型的应用场景:
- 用来创建Pod和ReplicaSet
- 滚动更新和回滚
- 扩容和缩容
- 暂停与恢复
[root@server2 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: myapp:v2
[root@server2 pod]# kubectl apply -f deployment.yaml
[root@server2 pod]# kubectl get pod
[root@server2 pod]# kubectl get pod -o wide
[root@server2 pod]# curl 10.244.1.17
修改镜像为v1后
[root@server2 pod]# vim deployment.yaml
image: myapp:v1
[root@server2 pod]# kubectl apply -f deployment.yaml
nginx-deployment-7ccb664b59 0 0 0 9m13s
nginx-deployment-c5fbbb494 3 3 3 5m15s
生成新的RS,同时旧的RS为了方便版本回滚也不会被删除
DaemonSet控制器
每个集群节点都需要创建,保证每个集群节点有且只有一个的操作。
[root@server2 pod]# vim daemonset.yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: daemonset-example
labels:
k8s-app: nginx
spec:
selector:
matchLabels:
name: nginx
template:
metadata:
labels:
name: nginx
spec:
containers:
- name: nginx
image: nginx
[root@server2 pod]# kubectl apply -f daemonset.yaml
[root@server2 pod]# kubectl get pod -o wide
job控制器
运行一次,运行完毕直接回收
[root@server2 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@server2 pod]# kubectl apply -f job.yaml
日志中查看
CronJob控制器
CronJob创建基于时间调度的 Jobs。
一个 CronJob 对象就像 crontab (cron table) 文件中的一行,它用 Cron
格式进行编写,并周期性地在给定的调度时间执行 Job。
[root@server2 pod]# vim cronjob.yaml
apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: cronjob-example
spec:
schedule: "* * * * *"
jobTemplate:
spec:
template:
spec:
containers:
- name: cronjob
image: busyboxplus
args:
- /bin/sh
- -c
- date; echo Hello from k8s cluster
restartPolicy: OnFailure
[root@server2 pod]# kubectl apply -f cronjob.yaml