k8s基础命令
pod基础概念Pod是kubernetes中最小的资源管理组件,Pod也是最小化运行容器化应用的资源对象。一个Pod代表着集群中运行的一个进程。kubernetes中其他大多数组件都是围绕着Pod来进行支撑和扩展Pod功能的,例如,用于管理Pod运行的StatefulSet和Deployment等控制器对象,用于暴露Pod应用的Service和Ingress对象,为Pod提供存储的Persiste
pod基础概念
Pod是kubernetes中最小的资源管理组件,Pod也是最小化运行容器化应用的资源对象。一个Pod代表着集群中运行的一个进程。kubernetes
中其他大多数组件都是围绕着Pod来进行支撑和扩展Pod功能的,例如,用于管理Pod运行的StatefulSet和Deployment等控制器对象,用于
暴露Pod应用的Service和Ingress对象,为Pod提供存储的PersistentVolume存储资源对象等
使用方式:
- 一个Pod中运行一个容器。“每个Pod中一个容器”的模式是最常见的用法;在这种使用方式中,你可以把Pod想象成是单个容器的封装,kuberentes管理的是Pod而不是直接管理容器。
- 在一个Pod中同时运行多个容器。一个Pod中也可以同时封装几个需要紧密耦合互相协作的容器,它们之间共享资源。这些在同一个Pod中的容器可以互相协作成为一个service单位,比如一个容器共享文件,另一个“sidecar"容器来更新这些文件。Pod将这些容器的存储资源作为一个实体来管理
一个Pod下的容器必须运行于同一节点上。现代容器技术建议一个容器只运行一个进程,该进程在容器中PID命令空间中的进程号为1,可直接接收并处理信号,进程终止时容器生命周期也就结束了。若想在容器内运行多个进程,需要有一个类似Linux操作系统init进程的管控类进程,以树状结构完成多进程的生命周期管理。运行于各自容器内的进程无法直接完成网络想信,这是由于容器间的隔离机制导致,k8s中的Pod资源抽象正是解决此类问题,Pod对象是一组容器的集合,这些容器共享Network、UTS及IPC命令空间,因此具有相同的域名、主机名和网络接口,并可通过IPC直接通信
Pod资源中针对各容器提供网络命令空间等共享机制的是底层基础容器pause,基础容器(也可称为父容器)pause就是为了管理Pod容器间的共字操作,这个父容器需要能够准确地知道如何去创建共享运行环境的容器,还能管理这些容器的生命周期。为了实现这个父容器的构想,kubernetes中,用pause容器来作为一个Pod中所有容器的父容器。这个pause容器有两个核心的功能,一是它提供整个Pod的Linux命名空间的基础。二来启用PID命名空间,它在每个Pod中都作为PID为1进程(init进程) ,并回收僵尸进程
pod分类
自主式Pod
这种Pod本身是不能自我修复的,当Pod被创建后(不论是由你直接创建还是被其他Controller),都会被Kuberentes调度到集群的Node上。直到Pod的进程终止、被删掉、因为缺少资源而被驱逐、或者Node故障之前这个Pod都会一直保持在那个Node上。Pod不会自愈。如果Pod运行的Node故障,或者是调度器本身故障,这个Pod就会被删除。同样的,如果Pod所在Node缺少资源或者Pod处于维护状态,Pod也会被驱
逐
控制器管理的Pod
Kubernetes使用更高级的称为Controller的抽象层,来管理Pod实例。Controller可 以创建和管理多个Pod,提供副本管理、滚动升级和集群级别的自愈能力。例如,如果一个Node故障,Controller就能自动将该节点上的Pod调度到其他健康的Node上。虽然可以直接使用Pod,但是在Kubernetes中通常是使用Controller来管理Pod的每个Pod都有一个特殊的被称为“根容器”的Pause容器。Pause容器对应的镜像属于Kubernetes平台的一部分,除了Pause容器,每个Pod还包含一个或者多个紧密相关的用户业务容器
k8s核心组件
k8s架构图
- etcd 保存了整个集群的状态;
- API Server 提供了资源操作的唯一入口,并提供认证、授权、访问控制、API 注册和发现等机制;
- Controller Manager 负责维护集群的状态,比如故障检测、自动扩展、滚动更新等;
- Scheduler 负责资源的调度,按照预定的调度策略将 Pod 调度到相应的机器上;
- Kubelet 负责维护容器的生命周期,同时也负责 Volume(CVI)和网络(CNI)的管理;
- Container Runtime 负责镜像管理以及 Pod 和容器的真正运行(CRI);
- Kube-proxy 负责为 Service 提供 cluster 内部的服务发现和负载均衡;
Pod
Pod 是 Kubernetes 的一个最小调度以及资源单元。用户可以通过 Kubernetes 的 Pod API 生产一个 Pod,让 Kubernetes 对这个 Pod 进行调度,也就是把它放在某一个 Kubernetes 管理的节点上运行起来。一个 Pod 简单来说是对一组容器的抽象,它里面会包含一个或多个容器。
Volume
卷,用来管理k8s存储,是用来申明在Pod中的容器可以访问文件的目录,一个卷可以被挂载在Pod中一个或者多个容器的指定路径下面。一个Volume可以支持多种后端的存储,比如ceph,GlusterFS。
Volume的生命周期和Pod生命周期绑定,无法解决数据持久化存储的问题,如果想要数据能够持久化,需要将Pod和卷的生命周期分离,因此引入持久卷(PV)。
Deployment
Deployment 是在 Pod 这个抽象上更为上层的一个抽象,它可以定义一组 Pod 的副本数目、以及这个 Pod 的版本。一般大家用 Deployment 这个抽象来做应用的真正的管理,而 Pod 是组成 Deployment 最小的单元。
Kubernetes 是通过 Controller,也就是我们刚才提到的控制器去维护 Deployment 中 Pod 的数目,它也会去帮助 Deployment 自动恢复失败的 Pod。
Namespace
Namespace 是用来做一个集群内部的逻辑隔离的,它包括鉴权、资源管理等。Kubernetes 的每个资源,比如刚才讲的 Pod、Deployment、Service 都属于一个 Namespace,同一个 Namespace 中的资源需要命名的唯一性,不同的 Namespace 中的资源可以重名。
kubectl常用命令
get (列出所有的pod)
[root@master ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-6799fc88d8-f6kcg 0/1 Pending 0 12m
//列出所有pod并提供详细信息
[root@master ~]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-6799fc88d8-f6kcg 0/1 Pending 0 12m <none> <none> <none> <none>
//指定列出某个pod的信息
[root@master ~]# kubectl get deployment nginx
NAME READY UP-TO-DATE AVAILABLE AGE
nginx 0/1 1 0 13m
//以JSON输出格式列出单个 Pod
[root@master ~]# kubectl get -o json pod nginx-6799fc88d8-f6kcg
{
"apiVersion": "v1",
"kind": "Pod",
"metadata": {
"creationTimestamp": "2021-12-19T11:19:41Z",
"generateName": "nginx-6799fc88d8-",
"labels": {
"app": "nginx",
"pod-template-hash": "6799fc88d8"
},
"managedFields": [
{
"apiVersion": "v1",
"fieldsType": "FieldsV1",
"fieldsV1": {
"f:metadata": {
"f:generateName": {},
"f:labels": {
".": {},
"f:app": {},
"f:pod-template-hash": {}
},
"f:ownerReferences": {
".": {},
"k:{\"uid\":\"4f9058eb-59c8-4168-bd80-6413e2b3f945\"}": {
".": {},
"f:apiVersion": {},
"f:blockOwnerDeletion": {},
"f:controller": {},
"f:kind": {},
"f:name": {},
"f:uid": {}
}
}
},
"f:spec": {
"f:containers": {
"k:{\"name\":\"nginx\"}": {
".": {},
"f:image": {},
"f:imagePullPolicy": {},
"f:name": {},
"f:resources": {},
"f:terminationMessagePath": {},
"f:terminationMessagePolicy": {}
}
},
"f:dnsPolicy": {},
"f:enableServiceLinks": {},
"f:restartPolicy": {},
"f:schedulerName": {},
"f:securityContext": {},
"f:terminationGracePeriodSeconds": {}
}
},
"manager": "kube-controller-manager",
"operation": "Update",
"time": "2021-12-19T11:19:41Z"
},
{
"apiVersion": "v1",
"fieldsType": "FieldsV1",
"fieldsV1": {
"f:status": {
"f:conditions": {
".": {},
"k:{\"type\":\"PodScheduled\"}": {
".": {},
"f:lastProbeTime": {},
"f:lastTransitionTime": {},
"f:message": {},
"f:reason": {},
"f:status": {},
"f:type": {}
}
}
}
},
"manager": "kube-scheduler",
"operation": "Update",
"time": "2021-12-19T11:19:41Z"
}
],
"name": "nginx-6799fc88d8-f6kcg",
"namespace": "default",
"ownerReferences": [
{
"apiVersion": "apps/v1",
"blockOwnerDeletion": true,
"controller": true,
"kind": "ReplicaSet",
"name": "nginx-6799fc88d8",
"uid": "4f9058eb-59c8-4168-bd80-6413e2b3f945"
}
],
"resourceVersion": "1607",
"uid": "6b047ec2-9e5d-4ab5-874c-47205ac5ce48"
},
"spec": {
"containers": [
{
"image": "nginx",
"imagePullPolicy": "Always",
"name": "nginx",
"resources": {},
"terminationMessagePath": "/dev/termination-log",
"terminationMessagePolicy": "File",
"volumeMounts": [
{
"mountPath": "/var/run/secrets/kubernetes.io/serviceaccount",
"name": "default-token-4lktd",
"readOnly": true
}
]
}
],
"dnsPolicy": "ClusterFirst",
"enableServiceLinks": true,
"preemptionPolicy": "PreemptLowerPriority",
"priority": 0,
"restartPolicy": "Always",
"schedulerName": "default-scheduler",
"securityContext": {},
"serviceAccount": "default",
"serviceAccountName": "default",
"terminationGracePeriodSeconds": 30,
"tolerations": [
{
"effect": "NoExecute",
"key": "node.kubernetes.io/not-ready",
"operator": "Exists",
"tolerationSeconds": 300
},
{
"effect": "NoExecute",
"key": "node.kubernetes.io/unreachable",
"operator": "Exists",
"tolerationSeconds": 300
}
],
"volumes": [
{
"name": "default-token-4lktd",
"secret": {
"defaultMode": 420,
"secretName": "default-token-4lktd"
}
}
]
},
"status": {
"conditions": [
{
"lastProbeTime": null,
"lastTransitionTime": "2021-12-19T11:19:41Z",
"message": "0/3 nodes are available: 1 node(s) had taint {node-role.kubernetes.io/master: }, that the pod didn't tolerate, 2 node(s) had taint {node.kubernetes.io/not-ready: }, that the pod didn't tolerate.",
"reason": "Unschedulable",
"status": "False",
"type": "PodScheduled"
}
],
"phase": "Pending",
"qosClass": "BestEffort"
}
}
create(创建pod)
//创建一个deployment类型叫test1的pod
[root@master ~]# kubectl create deployment test1 --image nginx
deployment.apps/test1 created
//查看
[root@master ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-6799fc88d8-f6kcg 0/1 Pending 0 17m
test1-6d5588f8cc-m2jrv 0/1 Pending 0 40s
//创建一个名为test2的pod,并执行sleep 600命令
[root@master ~]# kubectl create deployment test2 --image busybox -- sleep 600
deployment.apps/test2 created
//查看
[root@master ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-6799fc88d8-f6kcg 0/1 Pending 0 18m
test1-6d5588f8cc-m2jrv 0/1 Pending 0 104s
test2-84c4957768-wbts8 0/1 Pending 0 3s
//创建3个名为testweb的pod(名字中不能含有符号)
[root@master ~]# kubectl create deployment testweb --image nginx --replicas 3
deployment.apps/testweb created
//查看
[root@master ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-6799fc88d8-f6kcg 0/1 Pending 0 19m
test1-6d5588f8cc-m2jrv 0/1 Pending 0 3m10s
test2-84c4957768-wbts8 0/1 Pending 0 89s
testweb-56744c9b58-8fgdn 0/1 Pending 0 3s
testweb-56744c9b58-d8nq7 0/1 Pending 0 3s
testweb-56744c9b58-lc8cl 0/1 Pending 0 3s
run(运行pod)
//以nginx镜像为基础,运行一个名为test3的pod,若没有,就创建
[root@master ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-6799fc88d8-f6kcg 0/1 Pending 0 19m
test1-6d5588f8cc-m2jrv 0/1 Pending 0 3m10s
test2-84c4957768-wbts8 0/1 Pending 0 89s
testweb-56744c9b58-8fgdn 0/1 Pending 0 3s
testweb-56744c9b58-d8nq7 0/1 Pending 0 3s
testweb-56744c9b58-lc8cl 0/1 Pending 0 3s
[root@master ~]# kubectl run test3 --image nginx
pod/test3 created
[root@master ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-6799fc88d8-f6kcg 0/1 Pending 0 21m
test1-6d5588f8cc-m2jrv 0/1 Pending 0 4m45s
test2-84c4957768-wbts8 0/1 Pending 0 3m4s
test3 0/1 Pending 0 2s
testweb-56744c9b58-8fgdn 0/1 Pending 0 98s
testweb-56744c9b58-d8nq7 0/1 Pending 0 98s
testweb-56744c9b58-lc8cl 0/1 Pending 0 98s
//创建一个带有标签“test=nginx”的pod
[root@master ~]# kubectl run nginx --image nginx --labels "test=nginx"
pod/nginx created
[root@master ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx 0/1 Pending 0 3s
nginx-6799fc88d8-f6kcg 0/1 Pending 0 23m
delete(删除pod)
-f 强制删除
-l 指定标签pod删除
//单个指定删除
[root@master ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
busybox 0/1 Pending 0 13m
nginx 0/1 Pending 0 14m
nginx-6799fc88d8-f6kcg 0/1 Pending 0 37m
test1-6d5588f8cc-m2jrv 0/1 Pending 0 21m
test2-84c4957768-wbts8 0/1 Pending 0 19m
test3 0/1 Pending 0 16m
[root@master ~]# kubectl delete deployment b2
deployment.apps "test3" deleted
[root@master ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
busybox 0/1 Pending 0 13m
nginx 0/1 Pending 0 14m
nginx-6799fc88d8-f6kcg 0/1 Pending 0 37m
test1-6d5588f8cc-m2jrv 0/1 Pending 0 21m
test2-84c4957768-wbts8 0/1 Pending 0 19m
//全部删除
[root@master ~]# kubectl delete deployment --all
deployment.apps "nginx" deleted
deployment.apps "test1" deleted
deployment.apps "test2" deleted
[root@master ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
//删除带有指定标签的
[root@master ~]# kubectl run test --image nginx --labels "app=nginx"
pod/test created
[root@master ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
busybox 0/1 Pending 0 17m
nginx 0/1 Pending 0 18m
test 0/1 Pending 0 1s
[root@master ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
busybox 0/1 Pending 0 17m
nginx 0/1 Pending 0 18m
scale
//将名为“nginx”的pod集缩放到 3
[root@master ~]# kubectl scale --replicas 3 deployment/nginx
deployment.apps/nginx scaled
[root@master ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-6799fc88d8-f6kcg 1/1 Pending 0 15s
nginx-6799fc88d8-r3s69 1/1 Pending 0 15s
nginx-6799fc88d8-r5s8s 1/1 Pending 0 26h
//如果名为nginx当前大小的部署为 3,则将 mysql 扩展到 4
[root@master ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-6799fc88d8-f6kcg 1/1 Pending 0 12m
nginx-6799fc88d8-r3s69 1/1 Pending 0 12m
nginx-6799fc88d8-r5s8s 1/1 Pending 0 26h
[root@master ~]# kubectl scale --current-replicas 3 --replicas 4 deployment/nginx
deployment.apps/nginx scaled
[root@master ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-6799fc88d8-rsod8 1/1 Pending 0 33s
nginx-6799fc88d8-f6kcg 1/1 Pending 0 12m
nginx-6799fc88d8-r3s69 1/1 Pending 0 12m
nginx-6799fc88d8-r5s8s 1/1 Pending 0 26h
autoscale
自动扩展
- min:最少扩展
- max:最大扩展
- percent:百分比
[root@master ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx 1/1 Running 0 28m
nginx-6799fc88d8-rsod8 1/1 Pending 0 9m
nginx-6799fc88d8-f6kcg 1/1 Pending 0 12m
nginx-6799fc88d8-r3s69 1/1 Pending 0 12m
nginx-6799fc88d8-r5s8s 1/1 Pending 0 26h
[root@master ~]# kubectl autoscale --min 1 --max 5 --cpu-percent 50 deploy/nginx
horizontalpodautoscaler.autoscaling/nginx autoscaled
[root@master ~]# kubectl get hpa
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
nginx Deployment/nginx <unknown>/50% 1 5 0 9s
[root@master ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx 1/1 Running 0 28m
nginx-6799fc88d8-rsod8 1/1 Pending 0 9m
nginx-6799fc88d8-f6kcg 1/1 Pending 0 12m
nginx-6799fc88d8-r3s69 1/1 Pending 0 12m
nginx-6799fc88d8-r5s8s 1/1 Pending 0 26h
kubectl cp
把本机文件复制传输到指定pod的容器
[root@master ~]# ls
anaconda-ks.cfg init kube-flannel.yml
[root@master ~]# kubectl cp /root/anaconda-ks.cfg web:/opt/
[root@master ~]# kubectl exec web -- ls /opt/
anaconda-ks.cfg
更多推荐
所有评论(0)