Kubernetes 的资源管理方式
集群架构
Docker 是每一个节点(包括 Master 节点和 Node 节点)的运行时环境。
kubelet 负责控制所有容器的启动和停止等,保证每个节点(包括 Master 节点和 Node 节点)正常工作,并且帮助 Node 节点和 Master 节点进行交互。
Master 节点的关键组件:
- kubelet(监工):所有节点必备的。控制当前节点所有 Pod 的生命周期以及与 api-server 交互等工作。
- kube-api-server:负责接收所有请求。集群内对集群的任何修改都是通过命令行、UI 将请求发给 api-server 才能执行的。api-server 是整个集群操作对内、对外的唯一入口,不包含我们后来部署应用暴露端口的方式。
- kube-proxy:整个节点的网络流量负责。
- cri:容器运行时环境(如:Docker 、Podman 等)。
Node 节点的关键组件:
- kubelet(监工):所有节点必备的。控制当前节点所有 Pod 的生命周期以及与 api-server 交互等工作。
- kube-proxy:整个节点的网络流量负责。
- cri:容器运行时环境(如:Docker 、Podman 等)。
资源管理方式
① 命令式对象管理:直接通过命令去操作 Kubernetes 的资源。
kubectl run nginx-pod --image=nginx:1.17.1 --port=80
② 命令式对象配置:通过命令配置和配置文件去操作 Kubernetes 的资源。
kubectl create/patch/delete -f nginx-pod.yaml
③ 声明式对象配置:通过 apply 命令和配置文件去操作 Kubernetes 的资源。
kubectl apply -f nginx-pod.yaml
类型 | 操作 | 适用场景 | 优点 | 缺点 |
命令式对象管理 | 对象 | 测试 | 简单 | 只能操作活动对象,无法审计、跟踪 |
命令式对象配置 | 文件 | 开发 | 可以审计、跟踪 | 项目大的时候,配置文件多,操作麻烦 |
声明式对象配置 | 目录 | 开发 | 支持目录操作 | 意外情况下难以调试 |
命令式对象管理
kubectl 命令
- kubectl 是 Kubernetes 集群的命令行工具,通过它能够对集群本身进行管理,并能够在集群上进行容器化应用的安装和部署。
参数:
- command:指定要对资源执行的操作,如:create、get 、delete 等。
- type:指定资源的类型,如:deployment 、pod 、service 等。
- name:指定资源的名称,名称大小写敏感。
- flags:指定额外的可选参数。
[root@k8s-master ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx-65c4bffcb6-f9b55 1/1 Running 0 81m
[root@k8s-master ~]# kubectl get pod nginx-65c4bffcb6-f9b55 -o yaml
apiVersion: v1
kind: Pod
metadata:
annotations:
cni.projectcalico.org/containerID: c1ccb59bf2b30c580de0ee177f1eb122047ce0b066df816b434c559c0b89c094
cni.projectcalico.org/podIP: 10.244.169.129/32
cni.projectcalico.org/podIPs: 10.244.169.129/32
creationTimestamp: "2024-12-27T10:04:42Z"
generateName: nginx-65c4bffcb6-
labels:
app: nginx
pod-template-hash: 65c4bffcb6
name: nginx-65c4bffcb6-f9b55
namespace: default
ownerReferences:
- apiVersion: apps/v1
blockOwnerDeletion: true
controller: true
kind: ReplicaSet
name: nginx-65c4bffcb6
uid: c04281de-fdb0-4f23-8309-8c4adb140977
resourceVersion: "9026"
uid: 4a282996-80b5-4cc8-85a1-1ccd0c22a090
spec:
containers:
- image: nginx:1.14-alpine
imagePullPolicy: IfNotPresent
name: nginx
resources: {}
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
volumeMounts:
- mountPath: /var/run/secrets/kubernetes.io/serviceaccount
name: kube-api-access-mz6pk
readOnly: true
dnsPolicy: ClusterFirst
enableServiceLinks: true
nodeName: k8s-node2
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: kube-api-access-mz6pk
projected:
defaultMode: 420
sources:
- serviceAccountToken:
expirationSeconds: 3607
path: token
- configMap:
items:
- key: ca.crt
path: ca.crt
name: kube-root-ca.crt
- downwardAPI:
items:
- fieldRef:
apiVersion: v1
fieldPath: metadata.namespace
path: namespace
status:
conditions:
- lastProbeTime: null
lastTransitionTime: "2024-12-27T10:04:42Z"
status: "True"
type: Initialized
- lastProbeTime: null
lastTransitionTime: "2024-12-27T10:04:58Z"
status: "True"
type: Ready
- lastProbeTime: null
lastTransitionTime: "2024-12-27T10:04:58Z"
status: "True"
type: ContainersReady
- lastProbeTime: null
lastTransitionTime: "2024-12-27T10:04:42Z"
status: "True"
type: PodScheduled
containerStatuses:
- containerID: docker://d10a9daced59d3ab91e06aed7456808c727d450fdbb7b21be5180957f37e16ba
image: nginx:1.14-alpine
imageID: docker-pullable://nginx@sha256:485b610fefec7ff6c463ced9623314a04ed67e3945b9c08d7e53a47f6d108dc7
lastState: {}
name: nginx
ready: true
restartCount: 0
started: true
state:
running:
startedAt: "2024-12-27T10:04:57Z"
hostIP: 192.168.58.233
phase: Running
podIP: 10.244.169.129
podIPs:
- ip: 10.244.169.129
qosClass: BestEffort
startTime: "2024-12-27T10:04:42Z"
- 基本命令:
命令 | 翻译 | 命令作用 |
create | 创建 | 创建一个资源 |
edit | 编辑 | 编辑一个资源 |
get | 获取 | 获取一个资源 |
patch | 更新 | 更新一个资源 |
delete | 删除 | 删除一个资源 |
explain | 解释 | 展示资源文档 |
- 运行和调试:
命令 | 翻译 | 命令作用 |
run | 运行 | 在集群中运行一个指定的镜像 |
expose | 暴露 | 暴露资源为 Service |
describe | 描述 | 显示资源内部信息 |
logs | 日志 | 输出容器在 Pod 中的日志 |
attach | 缠绕 | 进入运行中的容器 |
exec | 执行 | 执行容器中的一个命令 |
cp | 复制 | 在 Pod 内外复制文件 |
rollout | 首次展示 | 管理资源的发布 |
scale | 规模 | 扩(缩)容 Pod 的数量 |
autoscale | 自动调整 | 自动调整 Pod 的数量 |
- 高级命令:
命令 | 翻译 | 命令作用 |
apply | 应用 | 通过文件对资源进行配置 |
label | 标签 | 更新资源上的标签 |
- 其他命令:
命令 | 翻译 | 命令作用 |
cluster-info | 集群信息 | 显示集群信息 |
version | 版本 | 显示当前 Client 和 Server 的版本 |
资源类型(type)
- Kubernetes 中所有的内容都抽象为资源,可以通过下面的命令进行查看:
[root@k8s-master ~]# kubectl api-resources
- 经常使用的资源如下所示:
- 集群级别资源:
资源名称 | 缩写 | 资源作用 |
nodes | no | 集群组成部分 |
namespaces | ns | 隔离 Pod |
- Pod资源:
资源名称 | 缩写 | 资源作用 |
Pods | po | 装载容器 |
- Pod资源控制器:
资源名称 | 缩写 | 资源作用 |
replicationcontrollers | rc | 控制 Pod 资源 |
replicasets | rs | 控制 Pod 资源 |
deployments | deploy | 控制 Pod 资源 |
daemonsets | ds | 控制 Pod 资源 |
jobs | 控制 Pod 资源 | |
cronjobs | cj | 控制 Pod 资源 |
horizontalpodautoscalers | hpa | 控制 Pod 资源 |
statefulsets | sts | 控制 Pod 资源 |
- 服务发现资源:
资源名称 | 缩写 | 资源作用 |
services | svc | 统一 Pod 对外接口 |
ingress | ing | 统一 Pod 对外接口 |
- 存储资源:
资源名称 | 缩写 | 资源作用 |
volumeattachments | 存储 | |
persistentvolumes | pv | 存储 |
persistentvolumeclaims | pvc | 存储 |
- 配置资源:
资源名称 | 缩写 | 资源作用 |
configmaps | cm | 配置 |
secrets | 配置 |
查看,创建,删除名称空间
[root@k8s-master ~]# kubectl get ns
NAME STATUS AGE
default Active 46h
kube-node-lease Active 46h
kube-public Active 46h
kube-system Active 46h
[root@k8s-master ~]# kubectl create ns dev
namespace/dev created
[root@k8s-master ~]# kubectl get ns
NAME STATUS AGE
default Active 46h
dev Active 2s
kube-node-lease Active 46h
kube-public Active 46h
kube-system Active 46h
[root@k8s-master ~]# kubectl delete ns dev
namespace "dev" deleted
[root@k8s-master ~]# kubectl get ns
NAME STATUS AGE
default Active 46h
kube-node-lease Active 46h
kube-public Active 46h
kube-system Active 46h