昨日内容回顾:
- Pod资源的管理常用命令
- kubectl create
- kubectl apply
- kubectl delete
- kubectl get
- kubectl describe
- kubectl exec
- kubectl explain
- kubectl logs
- kubectl cp
- kubectl label
- kubectl api-resource
- Pod的资源清单
apiVersion: v1
kind: Pod
metadata:
name:
labels:
spec:
hostNetwork:
nodeName:
containers:
- name:
image:
command:
args:
stdin:
Q1:为什么stdin不能阻塞容器呢?
stdin: true只是为容器分配一个标准输入,这对于COMMAND为shell类型的命令是好使的。
Q2: 如果一个Pod启动失败,请说一下你的排查思路?
describe ---> Container ---> Status ...
---> Event ----> ...
command:
exec:
Q3: 一个Pod容器处于RUNING状态,而且hostnetwork是true,但是无法访问业务,请说明排查思路?
logs ...
exec ...
[[email protected] po]# cat 06-pods-resources-limits.yaml
kind: Pod
apiVersion: v1
metadata:
name: oldboyedu-linux82-resources
spec:
containers:
- name: linux82-resources
# image: jasonyin2020/oldboyedu-linux-tools:v0.1
image: k8s151.oldboyedu.com:5000/oldboyedu-linux/stress:v0.1
stdin: true
# 配置容器的资源限制
resources:
# 指定资源的上限,换句话说,就是限制使用资源的最大上限。
# 最大资源上限不能超过worker节点的物理资源。
limits:
# 限制内存
# 测试命令:
# stress -m 8 --vm-bytes 20971520 --vm-keep
# memory: 200Mi
memory: 4Gi
# 指定期望资源,若所有节点无法满足期望资源,则无法完成调度.
# requests必须小于或等于limits资源限制
requests:
# memory: 100Mi
memory: 2Gi
[[email protected] po]#
[[email protected] po]# cat 08-pods-env.yaml
kind: Pod
apiVersion: v1
metadata:
name: oldboyedu-linux82-env
spec:
nodeName: k8s153.oldboyedu.com
containers:
- name: linux82-env
image: k8s151.oldboyedu.com:5000/oldboyedu-linux/stress:v0.1
stdin: true
resources:
limits:
memory: 4Gi
requests:
memory: 2Gi
imagePullPolicy: Always
# 向容器传递环境变量
env:
# 变量名称
- name: SCHOOL
# 变量的值
value: OLDBOYEDU
- name: CLASS
value: linux82
- name: game
image: jasonyin2020/oldboyedu-games:v0.3
env:
- name: oldboyedu-linux
value: linux82
- name: oldboyedu-linux82-2022-pod-name
# 值引用Pod的字段,通常情况下用于在Pod内获取pod信息!
valueFrom:
# 字段引用
fieldRef:
# 字段的路径
fieldPath: metadata.name
- name: oldboyedu-linux82-2022-pod-ip
valueFrom:
fieldRef:
fieldPath: status.podIP
- name: oldboyedu-linux82-2022-nodename
valueFrom:
fieldRef:
fieldPath: spec.nodeName
[[email protected] po]#
Pod重启策略:
[[email protected] po]# cat 09-pods-restartPolicy.yaml
kind: Pod
apiVersion: v1
metadata:
name: oldboyedu-restartpolicy-onfailure-001
labels:
apps: myweb
spec:
nodeName: k8s152.oldboyedu.com
# Pod的spec中包含一个restartPolicy字段,其可能取值包括 Always、OnFailure和Never。默认值是Always。
# Always:
# 容器退出时,始终重启容器(即创建新容器),默认策略。
# Never:
# 容器退出时,不重启容器(即不创建新容器)。
# OnFailure:
# 当容器异常退出时(kill -9时容器的退出码非0,貌似是137),重启容器(即创建新容器)。
# 当容器正常退出(任务运行正常结束)不重启容器。
restartPolicy: OnFailure
containers:
- name: myweb
image: k8s151.oldboyedu.com:5000/oldboyedu-linux/stress:v0.1
imagePullPolicy: Always
command:
- "sleep"
- "10"
---
kind: Pod
apiVersion: v1
metadata:
name: oldboyedu-restartpolicy-never-001
labels:
apps: myweb
spec:
nodeName: k8s152.oldboyedu.com
restartPolicy: Never
containers:
- name: myweb
image: k8s151.oldboyedu.com:5000/oldboyedu-linux/stress:v0.1
imagePullPolicy: Always
command:
- "sleep"
- "10"
---
kind: Pod
apiVersion: v1
metadata:
name: oldboyedu-restartpolicy-always-001
labels:
apps: myweb
spec:
nodeName: k8s152.oldboyedu.com
restartPolicy: Always
containers:
- name: myweb
image: k8s151.oldboyedu.com:5000/oldboyedu-linux/stress:v0.1
imagePullPolicy: Always
command:
- "sleep"
- "10"
[[email protected] po]#
namespaces简介:
名称空间是用来隔离K8S集群的资源。我们通常使用名称空间对企业业务进行逻辑上划分。
K8S集群一切皆资源,有的资源是不支持名称空间的,我们将其称为全局资源,而支持名称空间的资源我们称之为局部资源。
我们可以通过"kubectl api-resources"命令来判断一个资源是否支持名称空间。
温馨提示:
(1)在同一个名称空间下,同一个资源类型是不能出现重名的;
(2)在不同的名称空间下,相同的资源类型是能出现同名的;
名称空间的基本管理:
增:
响应式API:
kubectl create ns oldboyedu
删:(删除名称空间后,该名称空间下的所有资源都会被随之删除!生成环境中慎用!!!)
kubectl delete ns oldboyedu
删除oldboyedu名称空间。
kubectl -n oldboyedu delete pods test
删除oldboyedu名称空间下名为test的Pod资源。
改:
略。
查
kubectl get ns
查看现有的名称空间。
kubectl get pods -n oldboyedu
查看oldboyedu名称空间下的pods资源。
kubectl get pods -A
查看所有名称空间下的pods。
参考案例:
[[email protected] po]# cat 10-pods-namespace.yaml
apiVersion: v1
kind: Namespace
metadata:
name: oldboyedu
labels:
address: oldboyedu
hobby: linux
---
kind: Pod
apiVersion: v1
metadata:
name: oldboyedu-namespace
# 指定名称空间,若不指定,则默认使用default名称空间
namespace: oldboyedu
labels:
apps: myweb
spec:
nodeName: k8s152.oldboyedu.com
restartPolicy: OnFailure
containers:
- name: myweb
image: k8s151.oldboyedu.com:5000/oldboyedu-linux/stress:v0.1
imagePullPolicy: Always
command:
- "sleep"
- "10"
[[email protected] po]#
什么是emptyDir:
是一个临时存储卷,与Pod的生命周期绑定到一起,如果Pod被删除了,这意味着数据也被随之删除。
emptyDir作用:
(1)可以实现持久化;
(2)同一个Pod的多个容器可以实现数据共享,多个不同的Pod之间不能进行数据通信;
(3)随着Pod的生命周期而存在,当我们删除Pod时,其数据也会被随之删除;
emptyDir的应用场景:
(1)临时缓存空间,比如基于磁盘的归并排序;
(2)为较耗时计算任务提供检查点,以便任务能方便的从崩溃前状态恢复执行;
(3)存储Web访问日志及错误日志等信息;
emptyDir优缺点:
优点:
(1)可以实现同一个Pod内多个容器之间数据共享;
(2)当Pod内的某个容器被强制删除时,数据并不会丢失,因为Pod没有删除;
缺点:
(1)当Pod被删除时,数据也会被随之删除;
(2)不同的Pod之间无法实现数据共享;
参考链接:
https://kubernetes.io/docs/concepts/storage/volumes#emptydir
温馨提示:
1)启动pods后,使用emptyDir其数据存储在"/var/lib/kubelet/pods"路径下对应的POD_ID目录哟!
/var/lib/kubelet/pods/${POD_ID}/volumes/kubernetes.io~empty-dir/
2)可以尝试验证上一步找到的目录,并探讨为什么Pod删除其数据会被随之删除的真正原因,见视频。
参考案例:
[[email protected] po]# cat 12-pods-wordpress-emptyDir.yaml
apiVersion: v1
kind: Namespace
metadata:
name: oldboyedu
labels:
school: oldboyedu
class: linux82
---
kind: Pod
apiVersion: v1
metadata:
name: oldboyedu-linux82-wordpress-emptydir-003
namespace: oldboyedu
labels:
app: wordpress
spec:
hostNetwork: true
# 定义存储卷
volumes:
# 存储卷的名称
- name: mysql-db
# 存储卷的类型
emptyDir: {}
- name: wordpres-data
emptyDir: {}
containers:
- name: mysql
image: k8s151.oldboyedu.com:5000/oldboyedu-db/mysql:5.7
env:
- name: MYSQL_ROOT_PASSWORD
value: "123"
- name: MYSQL_DATABASE
value: wordpress
- name: MYSQL_USER
value: linux82
- name: MYSQL_PASSWORD
value: oldboyedu
# 指定使用的存储卷信息
volumeMounts:
# 指定存储卷的名称,这个名称必须在volumes字段中有定义哟!
- name: mysql-db
# 指定容器的挂载点
mountPath: /var/lib/mysql/
- name: wordpress
image: k8s151.oldboyedu.com:5000/oldboyedu-wordpress/wordpress
env:
- name: WORDPRESS_DB_HOST
value: 127.0.0.1
- name: WORDPRESS_DB_USER
value: linux82
- name: WORDPRESS_DB_PASSWORD
value: oldboyedu
volumeMounts:
- name: wordpres-data
mountPath: /var/www/html
# 如果两个容器指定了相同的存储卷,则可以实现数据的共享!
- name: mysql-db
mountPath: /oldboyedu-linux82-db
[[email protected] po]#
对应的是hostPath存储卷案例:
hotsPath数据卷:
挂载Node文件系统(Pod所在节点)上文件或者目录到Pod中的容器。如果Pod删除了,宿主机的数据并不会被删除。
应用场景:
Pod中容器需要访问宿主机文件。
hotsPath优缺点:
优点:
(1)可以实现同一个Pod不同容器之间的数据共享;
(2)可以实现同一个Node节点不同Pod之间的数据共享;
缺点:
无法满足跨节点Pod之间的数据共享。
推荐阅读:
https://kubernetes.io/docs/concepts/storage/volumes/#hostpath
参考案例:
[[email protected] po]# cat 13-pods-hostPath.yaml
kind: Pod
apiVersion: v1
metadata:
name: oldboyedu-hostpath-001
namespace: oldboyedu
labels:
apps: myweb
spec:
nodeName: k8s152.oldboyedu.com
restartPolicy: OnFailure
volumes:
- name: data01
emptyDir: {}
- name: data02
hostPath:
path: /linux82-oldboyedu-2022
containers:
- name: c1
image: k8s151.oldboyedu.com:5000/oldboyedu-linux/stress:v0.1
imagePullPolicy: Always
command:
- "sleep"
- "3600"
volumeMounts:
- name: data02
mountPath: /111111
- name: c2
image: k8s151.oldboyedu.com:5000/oldboyedu-linux/stress:v0.1
imagePullPolicy: Always
command:
- "sleep"
- "7200"
volumeMounts:
- name: data02
mountPath: /222222222
[[email protected] po]#
[[email protected] po]#
[[email protected] po]# cat 14-pods-hostPath.yaml
kind: Pod
apiVersion: v1
metadata:
name: oldboyedu-hostpath-002
namespace: oldboyedu
labels:
apps: myweb
spec:
nodeName: k8s152.oldboyedu.com
restartPolicy: OnFailure
volumes:
- name: data01
hostPath:
path: /linux82-oldboyedu-2022
containers:
- name: c1
image: k8s151.oldboyedu.com:5000/oldboyedu-linux/stress:v0.1
imagePullPolicy: Always
command:
- "sleep"
- "3600"
volumeMounts:
- name: data01
mountPath: /111111
---
kind: Pod
apiVersion: v1
metadata:
name: oldboyedu-hostpath-003
namespace: oldboyedu
labels:
apps: myweb
spec:
nodeName: k8s152.oldboyedu.com
restartPolicy: OnFailure
volumes:
- name: data02
hostPath:
path: /linux82-oldboyedu-2022
containers:
- name: c1
image: k8s151.oldboyedu.com:5000/oldboyedu-linux/stress:v0.1
imagePullPolicy: Always
command:
- "sleep"
- "3600"
volumeMounts:
- name: data02
mountPath: /22222222
[[email protected] po]#
NFS数据卷:
提供对NFS挂载支持,可以自动将NFS共享路径挂载到Pod中。
NFS:
英文全称为"Network File System"(网络文件系统),是由SUN公司研制的UNIX表示层协议(presentation layer protocol),能使使用者访问网络上别处的文件就像在使用自己的计算机一样。
NFS是一个主流的文件共享服务器,但存在单点故障,我们需要对数据进行备份哟,如果有必要可以使用分布式文件系统哈。
推荐阅读:
https://kubernetes.io/docs/concepts/storage/volumes/#nfs
部署nfs:
(1)所有节点安装nfs相关软件包
yum -y install nfs-utils
(2)k8s151节点设置共享目录
mkdir -pv /oldboyedu/data/kubernetes
cat > /etc/exports <<'EOF'
/oldboyedu/data/kubernetes *(rw,no_root_squash)
EOF
(3)配置nfs服务开机自启动
systemctl enable --now nfs
(4)服务端检查NFS挂载信息,如上图所示。
exportfs
(5)客户端节点手动挂载测试
mount -t nfs k8s151.oldboyedu.com:/oldboyedu/data/kubernetes /mnt/
umount /mnt
[[email protected] po]# cat 15-pods-nfs.yaml
kind: Pod
apiVersion: v1
metadata:
name: oldboyedu-nfs-001
namespace: oldboyedu
labels:
apps: myweb
spec:
nodeName: k8s152.oldboyedu.com
restartPolicy: OnFailure
volumes:
- name: linux82-nfs
nfs:
server: k8s151.oldboyedu.com
path: /oldboyedu/data/kubernetes
containers:
- name: c1
image: k8s151.oldboyedu.com:5000/oldboyedu-linux/stress:v0.1
imagePullPolicy: Always
command:
- "sleep"
- "3600"
volumeMounts:
- name: linux82-nfs
mountPath: /111
---
kind: Pod
apiVersion: v1
metadata:
name: oldboyedu-nfs-002
namespace: oldboyedu
labels:
apps: myweb
spec:
nodeName: k8s153.oldboyedu.com
restartPolicy: OnFailure
volumes:
- name: nfs
nfs:
server: k8s151.oldboyedu.com
path: /oldboyedu/data/kubernetes
containers:
- name: c1
image: k8s151.oldboyedu.com:5000/oldboyedu-linux/stress:v0.1
imagePullPolicy: Always
command:
- "sleep"
- "3600"
volumeMounts:
- name: nfs
mountPath: /222
[[email protected] po]#
今日内容回顾:
- 资源限制:
resources:
limit:
指定资源的使用上限。
requests:
指定容器期望的资源。
- 镜像下载策略:
- Never:
如果有镜像,则尝试启动。
如果本地没有镜像,不会尝试从远程仓库拉取镜像。
- Always:
如果本地没有镜像,则直接拉取
如果本地有镜像,则拿本地的镜像摘要信息和远程仓库的摘要信息进行对比,若比较结果一致,则直接使用本地缓存。反之,则拉取远程仓库的镜像,并删除本地缓存。
- IfNotPresent
如果本地没有镜像,则直接拉取
如果本地有镜像,则直接使用。
- Pod重启策略:
- Never:
当Pod内的容器退出时,始终不重新创建容器。
- Always:
当Pod内的容器退出时,始终重新创建容器。
- OnFailure:
当Pod内的容器非正常退出时,始终重新创建容器。若正常退出,则不重启。
- 环境变量:
env:
- name:
变量名称。
- value:
变量的值。
- valueFrom:
值的引用...(cm,secret会继续补充...)
- 数据持久化,常用的存储卷:
- emptyDir:
临时存储卷,可以实现同一个Pod内不同容器的数据共享和持久化。
当Pod删除时,数据也会被随之删除。
- hostPath:
主机存储卷,可以实现同一个worker节点不同Pod实现数据共享和持久化。
当Pod删除时,数据不会丢失。
- nfs:
实现不同的worker节点的Pod实现数据共享和持久化。
当删除Pod时,数据不会丢失。
nfs存在单点故障,因此生产环境中需要做备份和同步。也可以使用ceph来替代(后期讲解)。
- 名称空间: namespace
用于隔离K8S集群资源,资源是否支持名称空间使用"kubectl api-resource"
常见报错:
ErrImageNeverPull:
报错原因:
本地没有镜像,而且不会去远程仓库拉取。
解决方案:
要么手动下载镜像,要么修改镜像策略。
OutOfmemory:
报错原因:
调度的节点没有足够的内存空间啦。
解决方案:
请参考是否使用request字段占用内存大小?