k8s资源清单描述
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 ApiVersion: 资源的版本,官方对每个资源规定了不同的版本,我们需要根据资源的版本进行书写。 一般情况下,资源的版本很少变动,除非在升级过程中,随着功能的增强,版本可能也会微调。 kind: 资源的类型,K8S集群中一切皆资源。 metadata: 资源的元数据信息,包括但不限于: - 资源的名称;(常用) - 资源所属的名称空间;(常用) - 资源的标签;(常用) - 资源的注解;(早期版本常用) - 资源的创建时间; - ... spec: 定义了用户对Pod的期望状态。用户可以做如下操作: - 指定节点调度; - 指定调度的亲和性或反亲和性; - 资源的数据是否进行持久化; - 资源的配置文件是否需要修改; - 资源的容器使用具体的镜像; - 资源的限制 - 资源的认证信息 - 资源的安全信息 - ... status: 资源实际的状态,比如调度到哪个worker节点,实际分配的IP地址,运行周期,重启次数等。 该资源一般不需要人为定义,而是有K8S集群自身维护。
pod资源及资源清单
1.POD资源
kubernetes资源对象操作
资源对象
增
删
改
查
node
kubectl delete node
kubectl get nodes
namespace
kubectl create ns [资源名]
kubectl delete ns [资源名]
kubectl edit ns [资源名]
kubectl get ns
pod
kubectl delete pod [资源名]
kubectl edit pod[资源名]
kubectl get pod
查看集群节点状态
1 2 3 4 5 6 [root@master ~]# kubectl get nodes NAME STATUS ROLES AGE VERSION master Ready master 4d13h v1.19.3 node01 Ready <none> 4d13h v1.19.3 node02 Ready <none> 4d13h v1.19.3 node03 Ready <none> 4d13h v1.19.3
查看名称空间
1 2 3 4 5 6 7 8 [root@master ~]# kubectl get ns NAME STATUS AGE default Active 4d13h kube-flannel Active 4d12h kube-node-lease Active 4d13h kube-public Active 4d13h kube-system Active 4d13h luay Active 4h17m
查看pod (默认default名称空间)
1 2 3 4 [root@master ~]# kubectl get pod NAME READY STATUS RESTARTS AGE nginx-565785f75c-tpjmj 1/1 Running 0 6h8m nginx-pod 1/1 Running 0 5h43m
查看pod (指定名称空间)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 [root@master ~]# kubectl get pods -n luay NAME READY STATUS RESTARTS AGE busybox-pod 2/2 Running 0 3m30s [root@master ~]# kubectl get pod -n luay -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES busybox-pod 2/2 Running 0 4m14s 10.2.2.6 node03 <none> <none> -n 指定命名空间 -o 指定输出方式 json:输出json格式 yaml:输出yaml格式 wide:输出详细信息
2.pod的资源清单
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 [root@master01 ~]# vim nginx.yaml apiVersion: v1 kind: Pod metadata: name: nginx-pod namespace: default spec: containers: - image: nginx:alpine imagePullPolicy: IfNotPresent name: nginx-containers `注释` apiVersion: v1 kind: Pod metadata: name: nginx-pod namespace: default spec: containers: - image: nginx:alpine imagePullPolicy: IfNotPresent name: nginx-containers Always:总是拉取镜像,不管当前机器上是否有该镜像都拉取 nginx:latest Never:从不拉取镜像,需要提前docker pull IfNotPresent:如果镜像不存在,则拉取
pod报错及可能原因
1.ImagePullBackOff
问题原因:
镜像拉取失败。
可能原因:
1.可能是网络问题导致,检查Pod所在节点是否能够正常访问网络;
2.镜像名称写错,也可能会导致这个错误;
3.镜像是私有仓库,镜像无权限拉取;
2.ContainerCreating
问题分析:
容器正在创建阶段,等待容器创建,该过程包含拉取镜像的时间。
3.Pending
问题分析:
任务已经被K8S集群接受,但是未调度到指定节点。
可能原因:
1.当前集群不正常工作,请检查集群状态,比如CNI组件未安装;
2.指定的调度的节点不存在时也会出现这样的问题;
3.端口冲突,无法完成调度;
4.所有节点都被打上污点,且pod没有配置污点容忍也会导致该状态;
4.CrashLoopBackOff
问题分析:
处于该状态,说明Pod内至少有一个容器正在重启。
可能原因:
1.可能是容器的守护进程运行命令结束导致的;
5.Completed
问题分析:
容器正常退出,容器没有被强制中断。
6.Running
问题分析:
至少有一个容器处于正常运行状态。
7.Init:1/2
问题分析:
当前的Pod处于初始化容器阶段,目前已经完成一个初始化容器,正在进行第二个容器初始化。
8.PodInitializing
问题分析:
Pod正处于初始化阶段。
9.ErrImageNeverPull
问题分析:
将镜像下载策略设置为Never,且本地也没有缓存镜像,因此启动容器失败。
10.OutOfcpu
问题分析:
一般情况下是由于CPU资源不足导致的。
11.OutOfmemory
问题分析:
一般情况下是由于内存不足无法分配导致的。
12.NodePorts
问题分析:
当前的worker节点的端口可能存在冲突。
13.RunContainerError
问题分析:
运行容器时出错,可以通过kubectl describe pods <POD_NAME>查看详细的信息。
14.ErrImagePull
问题分析:
拉取镜像是失败。
可能原因:
1.镜像名称写错了;
2.没有访问权限;
15.Terminating
问题分析:
Pod的容器正在删除,此过程可能需要等待一段时间,一般情况下不会超过30s。
16.CreateContainerConfigError
问题分析:
运行容器出错,一般情下,是配置出错。
17.ContainerStatusUnknown
问题分析:
容器重启策略为Nerver,且我们测试时将工作节点的容器直接删除啦。无法获取
资源清单编写案例
基于一个pod部署wordpress
1.编写资源清单
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 [root@master kubernetes]# cat wordpress.yaml apiVersion: v1 kind: Pod metadata: name: wordpress-pod spec: hostNetwork: true containers: - name: db image: mysql:8.0 imagePullPolicy: IfNotPresent env : - name: MYSQL_ALLOW_EMPTY_PASSWORD value: "yes" - name: MYSQL_DATABASE value: wp - name: MYSQL_USER value: wp_usre - name: MYSQL_PASSWORD value: '123' - name: wp image: wordpress:latest imagePullPolicy: IfNotPresent env : - name: WORDPRESS_DB_HOST value: "127.0.0.1" - name: WORDPRESS_DB_NAME value: wp - name: WORDPRESS_DB_USER value: wp_usre - name: WORDPRESS_DB_PASSWORD value: '123'
2.根据资源清单创建pod
1 2 3 [root@master kubernetes]# kubectl apply -f wordpress.yaml `因为使用的宿主机网络名称空间,需保证80端口不被占用`
3.查看pod节点信息
1 2 3 4 5 6 7 8 [root@master kubernetes]# kubectl get pod -o wide NAME READY STATUS RESTARTS AGE IP NODE nginx-565785f75c-tpjmj 1/1 Running 0 8h 10.2.2.2 node03 nginx-pod 1/1 Running 0 8h 10.2.2.3 node03 wordpress-pod 2/2 Running 0 36m 10.0.0.203 node03 浏览器访问10.0.0.203
基于一个pod起wordpress,做持久化
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 [root@master kubernetes]# cat wordpress.yaml apiVersion: v1 kind: Pod metadata: name: wordpress-pod namespace: default labels: app: mysql run: mysql spec: hostNetwork: true volumes: - name: mysql-data hostPath: path: /data/mysql containers: - name: db image: mysql:8.0 imagePullPolicy: IfNotPresent env : - name: MYSQL_ALLOW_EMPTY_PASSWORD value: "yes" - name: MYSQL_DATABASE value: wp - name: MYSQL_USER value: wp_usre - name: MYSQL_PASSWORD value: '123' volumeMounts: - name: mysql-data mountPath: /var/lib/mysql - name: wp image: wordpress:latest imagePullPolicy: IfNotPresent ports: - containerPort: 80 hostPort: 80 env : - name: WORDPRESS_DB_HOST value: "127.0.0.1" - name: WORDPRESS_DB_NAME value: wp - name: WORDPRESS_DB_USER value: wp_usre - name: WORDPRESS_DB_PASSWORD value: '123'
连接pod
1 2 3 4 5 [root@master01 kubernetes]# kubectl exec -it nginx-pod -- /bin/sh [root@master01 kubernetes]# kubectl exec -it nginx-busybox -c busybox-container -- /bin/sh
pod的网络共享
1 2 3 4 5 1.POD内的容器使用Container模式共享根容器的网络 2.容器看到的网络设备信息和根容器完全相同 3.POD内的多个容器可以使用localhost进行网络通讯 4.POD内的多个容器不能绑定相同的端口 5.POD的生命周期和根容器一样,如果根容器退出了,POD就退出了
pod的文件共享
挂载方式hostPath
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 [root@master01 kubernetes]# cat mysql.yaml apiVersion: v1 kind: Pod metadata: name: mysql57-pod namespace: default labels: app: mysql run: mysql spec: volumes: - name: mysql-data hostPath: path: /data/mysql containers: - name: mysql57-container image: mysql:5.7 imagePullPolicy: IfNotPresent env : - name: MYSQL_ROOT_PASSWORD value: '123' - name: MYSQL_DATABASE value: 'wordpress' - name: MYSQL_USER value: 'wp_user' - name: MYSQL_PASSWORD value: '123' args: - --character-set-server=utf8mb4 - --collation-server=utf8mb4_unicode_ci volumeMounts: - name: mysql-data mountPath: /var/lib/mysql
hostPath的type类型
hostPath:
path: string
type : string
type 为空时为默认类型
官方:https://kubernetes.io/docs/concepts/storage/volumes/#hostpath
type类型
说明
“”
为空时 默认
DirectoryOrCreate
目录必须存在,权限必须是755
Directory
目录必须存在
FileOrCreate
文件必须存在,权限必须是644
File
文件必须存在
Socket
挂载socket文件
CharDevice
挂载字符设备文件(键盘,终端…)
BlockDevice
挂载快设备文件(磁盘,U盘,移动硬盘…)
挂载方式emptyDir
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 [root@master01 kubernetes]# cat mysql.yaml apiVersion: v1 kind: Pod metadata: name: mysql57-pod namespace: default labels: app: mysql run: mysql spec: volumes: - name: mysql-data hostPath: path: /data/mysql - name: empty-data emptyDir: {} containers: - name: mysql57-container image: mysql:5.7 imagePullPolicy: IfNotPresent env : - name: MYSQL_ROOT_PASSWORD value: '123' - name: MYSQL_DATABASE value: 'wordpress' - name: MYSQL_USER value: 'wp_user' - name: MYSQL_PASSWORD value: '123' args: - --character-set-server=utf8mb4 - --collation-server=utf8mb4_unicode_ci volumeMounts: - name: empty-data mountPath: /var/lib/mysql [root@master01 kubernetes]# cat busybox.yaml apiVersion: v1 kind: Pod metadata: name: nginx-busybox namespace: default spec: volumes: - name: empty-data emptyDir: {} containers: - name: nginx-container image: nginx:alpine imagePullPolicy: IfNotPresent volumeMounts: - name: empty-data mountPath: /usr/share/nginx/html - name: c7-container image: centos:7 imagePullPolicy: IfNotPresent command : ["/bin/sh" ,"-c" ,"tail -f /etc/hosts" ] volumeMounts: - name: empty-data mountPath: /opt/ html
标签的使用及设置
node节点打标签
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 kubectl get [资源] -n 名称空间 --show-labels [root@master01 ~]# kubectl get nodes --show-labels [root@master01 ~]# kubectl label node node01 MEM=16g [root@master kubernetes]# kubectl get nodes NAME STATUS ROLES AGE VERSION master Ready master 5d15h v1.19.3 node01 Ready None 5d15h v1.19.3 node02 Ready None 5d15h v1.19.3 node03 Ready None 5d15h v1.19.3 [root@master kubernetes]# kubectl label node node01 node-role.kubernetes.io/node= [root@master kubernetes]# kubectl get nodes NAME STATUS ROLES AGE VERSION master Ready master 5d15h v1.19.3 node01 Ready node 5d15h v1.19.3 node02 Ready None 5d15h v1.19.3 node03 Ready None 5d15h v1.19.3 kubectl label node node01 node-role.kubernetes.io/node= 节点名 调用接口 /roles标签名= [root@master kubernetes]# kubectl label node node01 node-role.kubernetes.io/node-
给pod打标签
给pod打标签
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 [root@master kubernetes]# kubectl get pods --show-labels NAME READY STATUS RESTARTS AGE LABELS nginx-565785f75c-tpjmj 1/1 Running 2 33h app=nginx nginx-pod 1/1 Running 2 33h <none> wordpress-pod 2/2 Running 0 2m11s <none> kubectl label 资源类型 资源名 标签 [root@master kubernetes]# kubectl label pod nginx-pod name=nginx 'pod/nginx-pod labeled [root@master kubernetes]# kubectl get pods --show-labels NAME READY STATUS RESTARTS AGE LABELS nginx-565785f75c-tpjmj 1/1 Running 2 33h app=nginx nginx-pod 1/1 Running 2 33h name=nginx
使用资源清单打标签
1 2 3 4 5 6 7 8 9 10 11 12 apiVersion: v1 Kind: Pod metadata: name: nginx-pod namespace: default labels: run: nginx spec: containers: - name: nginx-container image: nginx:alpine imagePullPolicy: IfNotPresent
利用标签,启动pod在指定标签的node上
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 [root@master01 kubernetes]# cat nginx-2.yaml apiVersion: v1 kind: Pod metadata: name: nginx-pod-v2 namespace: default labels: run: nginx spec: nodeSelector: MEM: 16g containers: - name: nginx-container-v2 image: nginx:alpine imagePullPolicy: IfNotPresent
删除pod标签
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 kubectl label [资源] [资源名] [标签名、标签key]- [root@master kubernetes]# kubectl get pods --show-labels NAME READY STATUS RESTARTS AGE LABELS nginx-565785f75c-tpjmj 1/1 Running 2 35h app=nginx,pod-template-hash=565785f75c nginx-pod 1/1 Running 2 34h name=nginx wordpress-pod 2/2 Running 0 39m <none> [root@master kubernetes]# kubectl label pod nginx-pod name- pod/nginx-pod labeled [root@master kubernetes]# kubectl get pods --show-labels NAME READY STATUS RESTARTS AGE LABELS nginx-565785f75c-tpjmj 1/1 Running 2 35h app=nginx,pod-template-hash=565785f75c nginx-pod 1/1 Running 2 34h <none> wordpress-pod 2/2 Running 0 39m <none>
根据标签查找pod
1 2 3 4 5 [root@master kubernetes]# kubectl get pod --show-labels -l app NAME READY STATUS RESTARTS AGE LABELS nginx-565785f75c-tpjmj 1/1 Running 2 35h app=nginx,pod-template-hash=565785f75c
根据标签删除pod
1 [root@master kubernetes]# kubectl delete pod -l app=nginx
kubectl用于排错命令
describe
kubectl describe pod
查看相关 Pod 的详细信息,帮助我们了解 Pod 的状态、配置和运行状况。尤其是Events可以帮助我们做一些故障排查。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 [root@master ~]# kubectl describe pod busybox-pod -n luay ··· Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Scheduled 18m default-scheduler Successfully assigned luay/busybox-pod to node03 Normal Pulled 18m kubelet Container image "busybox" already present on machine Normal Created 18m kubelet Created container busybox-container Normal Started 18m kubelet Started container busybox-container Normal Pulled 18m kubelet Container image "nginx:alpine" already present on machine Normal Created 18m kubelet Created container nginx-container Normal Started 18m kubelet Started container nginx-container [root@master ~]# kubectl describe node master01
logs
kubectl logs 资源名
可以使用kubectl get pod 查看资源名
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 'kubectl logs 资源名称' [root@master ~]# kubectl logs mysql80 [root@master ~]# kubectl logs -f mysql80 [root@master ~]# kubectl logs -f multiple-wordpress -c db 'multiple-wordpress' pod名-c 指定pod里的某一个容器名 '这种情况存在于,杀掉了pod里某个容器,又被kubelet重新拉取了另一个新的容器,-p查看上个容器日志' [root@master ~]# kubectl logs -f mysql80 -p 'mysql80' 容器名 ----待验证[root@master ~]# kubectl logs -f mysql80 --since 5m
cp
将本地的文件拷贝到Pod的容器中
1 2 3 4 5 6 7 8 9 10 11 12 13 14 [root@master ~]# kubectl cp wordpress.yaml mysql80:/tmp 如何查看? [root@master ~]# kubectl exec -it mysql80 --ls /tmp 类似于docker exec kubectl cp wordpress.yaml -c wp multiple-wordpress:/ 'multiple-wordpress' 'wp' 如果有多个容器,则需要使用-c指定容器的名称,若不指定,则默认Pod连接第一个容器
explain
查看指定字段的帮助信息
1 2 3 4 [root@master ~]# kubectl explain pods. [root@master ~]# kubectl explain pods.metadata [root@master ~]# kubectl explain pods.metadata.name [root@master ~]# kubectl explain pods.spec.containers
常见的资源类型
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 <string>: 表示一个字符串。 <Object>: 表示有下级字段。 <[]Object>: 表示数组对象说可以有多个,每个对象的区分使用"-" ,同一个对象数组内的相关字段可以相互交换。 <boolean>: 只有true 和false 两个有效值。 <integer >: 整型,表示的是一个整数。 -required- 表示该字段必须定义,不定义则会报错。