企业运维实战--k8s学习笔记2.pod管理、构建资源清单、pod生命周期详解、控制器详解
豌豆荚–pod简单管理
Pod好似一个豌豆荚,里面包含着一个或多个容器 。
本节通过命令学习管理pod。
创建pod应用,指定镜像为myapp:v1
kubectl run nginx --image=myapp:v1
查看节点信息
kubectl get pod
查看pod节点详细信息
kubectl describe pod nginx
获取节点和服务版本信息,并查看附加信息
kubectl get pod -o wide
配置分配网络信息所在目录查看
cd /var/run/flannel/
cat subnet.env
通过访问pod节点,测试
curl 10.244.1.2
删除pod节点
kubectl delete pod nginx
kubectl get pod
创建service,定义一个微服务。
一个服务的多个pod逻辑合集,此时pod可以通过service的名称访问后端的两个容器。
kubectl create deployment demo --image=myapp:v1 --replicas=2
kubectl get pod
kubectl get pod -o wide
查看节点所信息
kubectl get all
删除任意一个pod节点会自动补充副本
kubectl delete pod demo-5b4fc8bb88-jqlw5
kubectl get pod
暴露端口,使得外部可以访问到pod副本
kubectl expose deployment demo --port=80 --target-port=80
kubectl get all
测试通过ip访问容器,可以看到已经负载均衡了
curl 10.105.30.70/hostname.html
后端节点Endpoints信息查看
查看svc节点信息
kubectl describe svc demo
Pod扩容
kubectl scale --replicas=6 deployment demo
kubectl get pod
kubectl describe svc demo
缩容
kubectl scale --replicas=2 deployment demo
kubectl get pod
kubectl describe svc demo
更新pod镜像
kubectl set image deployment demo myapp=myapp:v2
kubectl get pod
查看更新版本
curl 10.244.1.12
更新后以前的rs不会消失,为了方便回滚
kubectl get all
查看版本迭代历史信息
kubectl rollout history deployment demo
回滚
kubectl rollout undo deployment demo --to-revision=1
kubectl get pod -o wide
curl 10.244.1.14
查看rs信息
kubectl get rs
资源清单构建与应用
在我们的日常工作中,可能要重复简历或者对pod节点进行操作,如果一直使用命令行来实现的话是不高效的工作方法。
资源清单就好比shell脚本一样,会按照你的清单执行命令,相比较命令行更加方便,也易于修改。
编辑清单,文件格式为.yaml
vim pod.yaml
cat pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-example
spec:
containers:
- name: myapp
image: myapp:v1
此处的清单作用为创建名为pod-example的pod,选取镜像为myapp:v1
执行后,查看pod信息
kubectl apply -f pod.yaml
kubectl get pod
使用资源清单创建一个pod节点,包含myapp容器和busybox容器
cat pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-example
spec:
containers:
- name: myapp
image: myapp:v1
# busybox需要打开输入端口并为其分配伪终端
- name: busybox
image: busyboxplus:latest
tty: true
stdin: true
kubectl describe pod pod-example
kubectl get pod -o wide
可以看到,pod-example中有两个容器处于READY状态。
进入busybox终端,-c指定容器 -i打开输入端口 -t打开伪终端
kubectl attach pod-example -c busybox -i -t #进入busybox终端 -c指定容器 -i打开输入端口 -t打开伪终端
终端内访问localhost
curl localhost
我们知道,localhost是访问本地标准80端口的一个域名,而busybox自身是不带localhost的访问的,但是此时我们却可以访问到pod另一个容器myapp的内容,说明pod节点内二者资源共享。
退出后可继续进入,pod节点会重启。
使用资源清单设定监听端口
apiVersion: v1
kind: Pod
metadata:
name: pod-example
spec:
#hostNetwork: true
#nodeName: server4
#imagePullSecrets:
containers:
- name: myapp
image: myapp:v1
#指定容器所在主机需要监听的端口号,设置了hostPort同一台主机无法启动该容器的相同副本,因为主机的端口号不能相同,会写到iptables中
ports:
- containerPort: 80
hostPort: 80
按照清单拉起容器
kubectl apply -f pod.yaml
kubectl get pod -o wide
可以看到节点分配到了server3上,server3中查看iptables策略
iptables -t nat -nL |grep :80
使用清单锁定IP(与主机共享)
apiVersion: v1
kind: Pod
metadata:
name: pod-example
spec:
hostNetwork: true #直接锁定为与主机共用ip
containers:
- name: myapp
image: myapp:v1
kubectl get pod -o wide #查看podip
server3中查看端口
使用清单限制内存和CPU
apiVersion: v1
kind: Pod
metadata:
name: pod-example
spec:
#hostNetwork: true
#nodeName: server4
#imagePullSecrets:
containers:
- name: myapp
image: myapp:v1
imagePullPolicy: IfNotPresent ##如果本地存在镜像,则不拉取;本地不存在镜像,再拉取;默认会一直拉取镜像
# 限制内存和cpu使用量,requests为最低限制,limit为最高限制
resources:
requests:
cpu: "100m"
memory: "50Mi"
limits:
cpu: "200m"
memory: "100Mi"
kubectl apply -f pod.yaml
kubectl describe pod pod-example
默认容器副本退出后会自动重启,这里可以设置不重启
kubectl run -it busybox --image=busyboxplus --restart=Never
使用后退出,该节点显示已完成,且不会自动重启
kubectl describe pod busybox
大致总结资源清单用法及各条语句的含义:
apiVersion: v1
kind: Pod
metadata:
name: pod-example
spec:
#hostNetwork: true #
#nodeName: server4 #锁定pod节点
#imagePullSecrets:
containers:
- name: myapp
image: westos/game2048:latest
imagePullPolicy: IfNotPresent ##如果本地存在镜像,则不拉取;本地不存在镜像,再拉取;默认会一直拉取镜像
# 限制内存和cpu使用量,requests为最低限制,limit为最高限制
resources:
requests:
cpu: "100m"
memory: "50Mi"
limits:
cpu: "200m"
memory: "100Mi"
#ports:
# - containerPort: 80
# hostPort: 80 #指定容器所在主机需要监听的端口号,设置了hostPort同一台主机无法启动该容器的相同副本,因为主机的端口号不能相同,会写到iptables中
# - name: busybox
# image: busyboxplus:latest
# imagePullPolicy: IfNotPresent #如果本地存在镜像,则不拉取;本地不存在镜像,再拉取;默认会一直拉取镜像
# tty: true
# stdin: true
标签:后续会学
Pod生命周期
Pod生命周期图:
Pod中可以包含多个容器。
在容器环境初始化完成之后,pod也可以有一个或多个先于容器启动的Init初始化容器。初始化容器之后,容器运行,在运行的过程做包含多个探针对容器进行探测监控。包括livenessProbe存活探针,readinessProbe:就绪探针等。
init初始化容器
初始化容器,在容器运行之前进行初始化,故初始化容器不包括readiness就绪探针。
初始化可以包括一些安装过程中应用容器中不存在的实用工具或服务,定义初始化服务后,必须要添加服务,初始化才能完成。
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
首先,注释掉一个服务,初始化未成功,会不停重启进行初始化。
添加所有完整的初始化服务之后,才会初始化成功,拉起容器。
查看容器解析:
探针
livenessProbe:存活探针,指示容器是否正在运行。如果为运行会杀掉失败进程,受到重启策略影响重新拉起容器进行检测。默认开启。
readinessProbe:就绪探针,指示容器是否准备好服务请求。
startupProbe: 指示容器中的应用是否已经启动。
注意:当存活和就绪探针同时存在,但只有存活探针通过时,容器会运行,但只能内部运行,无法对外访问。只有两个探针都运行成功,才可以对外访问。
探针只会有三种结果反馈:
成功:容器通过诊断
失败:容器未通过诊断
未知:诊断过程失败,不会采取行动。
添加标签,通过标签将svc和pod联系起来,供外网访问。
cat 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
拉起容器后查看标签
访问后依然失败,因为容器的nginx中没有test.html
进入容器,添加测试页
kubectl exec pod-example -i -t -- sh
cd /usr/share/nginx/html/
echo www.westos.org > test.html
查看pod-example已READY
kubectl get pod -w
访问给定IP
kubectl get pod -o wide
curl 10.244.1.25/test.html
重启策略:
默认pod中副本down到后会重启,表现在PodSpec中有一个restartPolicy字段。
控制器
ReplicaSet–rs控制器
rs控制器:控制副本,确定任何时间都有指定数量的Pod副本在运行,根据标签匹配。
vim rs.yaml
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: nginx
拉起容器,查看节点
kubectl apply -f rs.yaml
kubectl get pod
查看扩展信息和rs信息
kubectl get pod -o wide
kubectl get rs
查看节点标签
kubectl get pod --show-labels
覆盖节点标签,但不会影响原来的集群
kubectl label pod replicaset-example-9b9gz app=myapp --overwrite
kubectl get pod --show-labels
kubectl get rs
删除节点不影响原来的rs控制器建立的容器
kubectl delete pod replicaset-example-9b9gz
kubectl get pod
回收所有节点
kubectl delete -f rs.yaml
deployments控制器
deployments控制器:用来创建pod和ReplicaSet,依靠标签显示,相比较rs可更新容器,可扩容,可暂停和恢复。
根据rs来方便回滚,一个版本对应一个rs
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
拉起容器,查看节点
kubectl apply -f deployment.yaml
kubectl get pod
kubectl get all
可以看到rs和deployment都已创建
查看标签
kubectl get pod --show-labels
修改yaml文件,更新容器
vim deployment.yaml
kubectl apply -f deployment.yaml
查看更新过程
kubectl get pod
kubectl get pod --show-labels
查看rs,旧的rs不会被删掉,方便回滚。
所以一个rs节点对应一个版本。
kubectl get rs
DaemonSet控制器
每个集群节点都需要创建,保证每个集群节点有且只有一个的操作。
cat daemonset.yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: daemonset-example
labels:
k8s-app: zabbix-agent
spec:
selector:
matchLabels:
name: zabbix-agent
template:
metadata:
labels:
name: zabbix-agent
spec:
containers:
- name: zabbix-agent
image: zabbix/zabbix-agent
Job控制器
运行一次,运行完毕直接回收
测试:计算Pi
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
计算结果位于日志中。
定时job
cat 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