一、K8s 集群管理常用命令

kubectl 命令是使用 Kubernetes API 与 Kubernetes 集群的控制面进行通信的命令行工具。

kubectl 语法格式

kubectl [command] [TYPE] [NAME] [flags]
  • command:指定要对一个或多个资源执行的操作
  • type:指定资源类型,不区分大小写, 可以指定单数、复数或缩写形式。
  • name:指定资源的名称。名称区分大小写。 如果省略名称,则显示所有资源的详细信息。
  • flags:指定可选的参数。

信息管理常用命令

  • help:查看命令及子命令的帮助信息
  • cluster-info:查看集群相关的配置信息
  • api-resources:查看当前服务器上所有的资源对象
  • api-versions:查看当前服务器上所有资源对象的版本
  • config:管理当前节点上的认证信息
# 查看帮助命令信息
kubectl help version
Print the client and server version information for the current context.

Examples:
  # Print the client and server versions for the current context
  kubectl version
... ...

# 查看集群状态信息
kubectl cluster-info 
Kubernetes control plane is running at https://192.168.88.50:6443
CoreDNS is running at https://192.168.88.50:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
... ...

# 查看资源对象类型
kubectl api-resources 
NAME             SHORTNAMES     APIVERSION      NAMESPACED      KIND
bindings                        v1              true            Binding
endpoints        ep             v1              true            Endpoints
events           ev             v1              true            Event
... ...

# 查看资源对象版本
kubectl api-versions 
admissionregistration.k8s.io/v1
apiextensions.k8s.io/v1
apiregistration.k8s.io/v1
apps/v1
... ...

config 命令

# 查看当前认证使用的用户及证书
kubectl config get-contexts 
CURRENT   NAME                          CLUSTER      AUTHINFO
*         kubernetes-admin@kubernetes   kubernetes   kubernetes-admin
# 使用view查看详细配置
kubectl config view 
apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: DATA+OMITTED
    server: https://192.168.88.50:6443
  name: kubernetes
contexts:
- context:
    cluster: kubernetes
    user: kubernetes-admin
  name: kubernetes-admin@kubernetes
current-context: kubernetes-admin@kubernetes
kind: Config
preferences: {}
users:
- name: kubernetes-admin
  user:
    client-certificate-data: REDACTED
    client-key-data: REDACTED

集群管理授权

# 为其他主机添加管理权限,如Harbor主机
# 配置本地域名解析
vim /etc/hosts
192.168.88.240  harbor
192.168.88.10   master
192.168.88.11   node1
192.168.88.12   node2

dnf makecache
# 安装集群管理命令
dnf install -y kubectl
# 证书默认路径:$HOME/.kube/config
mkdir -p $HOME/.kube
# 拷贝证书到目标主机
rsync -av master:/etc/kubernetes/admin.conf $HOME/.kube/config
# 设置证书的属主和属组
chown $(id -u):$(id -g) $HOME/.kube/config
# 查看节点状态
kubectl get nodes
NAME        STATUS   ROLES           AGE   VERSION
master      Ready    control-plane   24h   v1.32.2
node1       Ready    <none>          22h   v1.32.2
node2       Ready    <none>          22h   v1.32.2
node3       Ready    <none>          22h   v1.32.2

二、Pod 资源对象的使用

Pod 资源对象的创建

# 上传镜像到master主机
rsync -av /linux-soft/s4/public/myimg.tar.xz 192.168.88.50:/root/
# 导入镜像
docker load -i myimg.tar.xz
# 上传镜像到library项目
for img in $(docker images --format '{{.Repository}}:{{.Tag}}');do
    [[ "${img}" =~ ^"harbor:443/".+ ]] && continue
    docker tag ${img} harbor:443/library/${img##*/}
    docker push harbor:443/library/${img##*/}
    docker rmi ${img} harbor:443/library/${img##*/}
done

# 创建 Pod 资源对象
kubectl run web --image httpd:2.4
pod/web created

# 查询资源对象 -o:指定显示格式 wide:显示更多信息
kubectl get pods -o wide
NAME   READY   STATUS    RESTARTS   AGE   IP               NODE
web    1/1     Running   0          97s   10.244.166.129   node1

# 访问验证
curl http://10.244.166.129
Welcome to The Apache.

Pod 资源对象的创建过程

在这里插入图片描述
Pod 的创建过程涉及多个 Kubernetes 组件之间的协作,主要包括以下步骤:

  1. 用户提交请求‌:用户通过 kubectl 命令行工具或 API 服务器提交 Pod 的资源清单文件。
  2. API Server 接收并存储‌:API Server 验证请求参数后,将 Pod 的信息写入到 etcd 中。
  3. 调度器介入‌:Scheduler 监听到新的 Pod 被创建,根据资源需求和节点状态进行调度,决定将 Pod 分配到哪个节点上,并更新 etcd 中的信息。
  4. 节点上的 kubelet 处理‌:节点上的 kubelet 监听到被调度的 Pod 后,开始调用容器运行时来创建和启动 Pod 中的容器。
  5. 状态更新‌:一旦容器启动成功,kubelet 会将 Pod 的状态信息更新回 API Server,最终反映在 etcd 中。

此外,对于静态 Pod,其创建方式有所不同。静态 Pod 是由 kubelet 直接管理的,不需要 API Server 的监管。kubelet 会定期扫描指定目录下的 YAML/JSON 文件以创建或删除静态 Pod。

Pod 资源对象的状态

Pod 在其生命周期中会经历不同的状态(Phase),以下是 Pod 的五种主要状态:

  • Pending(挂起)‌:Pod 已被 Kubernetes 系统接受,但尚未被调度到节点上运行。此阶段可能包括等待调度和下载镜像的时间。
  • Running(运行中)‌:Pod 已被调度到某个节点,并且其中的所有容器都已创建并正在运行或处于启动/重启过程中。
  • Completed(成功)‌:Pod 中的所有容器均已成功终止,并且不会再被重启。
  • Failed(失败)‌:Pod 中至少有一个容器以非零状态退出,表示容器运行失败。
  • Unknown(未知)‌:Kubernetes 无法获取 Pod 的状态信息,通常是因为与节点通信出现问题。

Pod 管理的常用命令

  • run:创建 Pod 资源对象,创建即运行,没有停止的概念
  • get:查看资源对象的状态信息,常用参数:-o 显示格式
  • create:创建资源对象,不能创建 Pod
  • describe:查询资源对象的属性信息
  • logs:查看容器的日志,常用参数: -c 容器名称
  • exec:在某个容器内执行特定的命令,可选参数: -c 容器名称
  • cp :在容器和宿主机之间拷贝文件或目录,可选参数:-c 容器名称
  • delete:删除资源对象 可选参数:-l 标签

get 命令

# 查看Pod资源对象的运行状态
kubectl get pods
NAME   READY   STATUS    RESTARTS   AGE
web    1/1     Running   0          5m10s

# 只查看资源对象的名字
kubectl get pods -o name
pod/web

# 查看资源对象运行节点的信息
kubectl get pods -o wide
NAME   READY   STATUS    RESTARTS   AGE     IP               NODE
web    1/1     Running   0          6m19s   10.244.166.129   node1

# 查看资源对象详细信息,Yaml/Json 格式
kubectl get pod myweb -o yaml
apiVersion: v1
kind: Pod
metadata:
  name: web
... ...

# 查看命名空间
kubectl get namespaces 
NAME              STATUS   AGE
default           Active   2d22h
kube-node-lease   Active   2d22h
kube-public       Active   2d22h
kube-system       Active   2d22h

# 查看系统命名空间中的Pod信息
kubectl -n kube-system get pods
NAME                             READY   STATUS    RESTARTS      AGE
etcd-master                      1/1     Running   0             2d22h
kube-apiserver-master            1/1     Running   0             2d22h
kube-controller-manager-master   1/1     Running   0             2d22h
kube-scheduler-master            1/1     Running   0             2d22h
... ...

create 与 run 命令

# 创建命名空间资源对象
kubectl create namespace work
namespace/work created

# 查看命名空间
kubectl get namespaces 
NAME              STATUS   AGE
default           Active   2d22h
kube-node-lease   Active   2d22h
kube-public       Active   2d22h
kube-system       Active   2d22h
work              Active   10s

# 在命名空间work下创建Pod
kubectl -n work run web --image nginx:1.27.5
pod/web created

# 查询命名空间work下的Pod信息
kubectl -n work get pods -o wide
NAME   READY   STATUS    RESTARTS   AGE   IP               NODE
web    1/1     Running   0          19s   10.244.104.1   node2

# 访问验证
curl http://10.244.104.1
Nginx is running !

describe 与 logs 命令

# 查看资源对象的配置信息
kubectl -n work describe pod web
Name:             web
Namespace:        work
Priority:         0
Service Account:  default
Node:             node2/192.168.88.12
... ...
Events:
  Type    Reason     Age   From               Message
  ----    ------     ----  ----               -------
  Normal  Scheduled  63s   default-scheduler  Successfully assigned work/web to node2
  Normal  Pulling    62s   kubelet            Pulling image "nginx:1.27.5"
  Normal  Pulled     60s   kubelet            Successfully pulled image "nginx:1.27.5" ......
  Normal  Created    60s   kubelet            Created container: web
  Normal  Started    60s   kubelet            Started container web

# 查看命名空间work的配置信息
kubectl describe namespaces work
Name:         work
Labels:       kubernetes.io/metadata.name=work
Annotations:  <none>
Status:       Active
No resource quota.
No LimitRange resource.

# 查看容器日志
kubectl -n work logs web
# 不写就是默认的default命名空间
kubectl logs web

exec 命令

# 在容器内执行命令
kubectl exec -it web -- ls
index.html  info.php
# --:选项终止符
kubectl exec -it web -- bash
pwd
/var/www/html
ifconfig eth0
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1450
        inet 10.244.166.129  netmask 255.255.255.0  broadcast 10.244.166.255
        ether 3a:32:78:59:ed:25  txqueuelen 0  (Ethernet)
... ...

cp 命令

# 与容器进行文件或目录传输
kubectl -n default cp web:/var/www ./www
tar: Removing leading `/' from member names
# 将宿主机的文件拷贝到容器中
kubectl -n work cp www/html/info.php web:/root/
kubectl -n work exec -it web -- ls
info.php

delete 命令

# 删除资源对象
kubectl delete pods web 
pod "web" deleted
# 删除命名空间work下所有 Pod 对象
kubectl -n work delete pods --all
pod "web" deleted
# 删除命名空间
kubectl delete namespaces work
namespace "work" deleted

更多推荐