k8s-kubectl命令详解、Pod创建过程、Pod的生命周期、定制Pod、资源对象文件

集群管理

一、如何管理集群

kubectl是用于管理Kubernetes集群的命令行工具

二、语法格式:

kubectl [command] [TYPE] [NAME] [flags]

command:子命令,如create,get,describe,delete

type:资源类型,可以表示为单数,复数或缩写形式

name:资源的名称,如果省略,则显示所有资源信息

flags:指定可选标志,或附加的参数

三、集群管理命令

|---------------|------------------------|
| 子命令 | 说明 |
| help | 用于查看命令及子命令的帮助信息 |
| cluster-info | 显示集群的相关配置信息 |
| version | 查看服务器及客户端的版本信息 |
| api-resources | 查看当前服务器上所有的资源对象 |
| api-versions | 查看当前服务器上所有资源对象的版本 |
| config | 管理当前节点上kubeconfig的认证信息 |

# 查看当前认证使用的用户及证书
[root@master ~]# kubectl config get-contexts 
CURRENT   NAME                          CLUSTER      AUTHINFO
*         kubernetes-admin@kubernetes   kubernetes   kubernetes-admin
# 使用 view 查看详细配置
[root@master ~]# kubectl config view 
apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: DATA+OMITTED
    server: https://192.168.1.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

四、管理主机授权

为其他主机添加管理权限

[root@harbor ~]# vim /etc/hosts
192.168.1.30    harbor
192.168.1.50    master
192.168.1.51    node-0001
192.168.1.52    node-0002
192.168.1.53    node-0003
192.168.1.54    node-0004
192.168.1.55    node-0005

# 安装集群管理工具kubectl 
[root@harbor ~]# yum install -y kubectl
# 拷贝证书到目标主机
# 证书默认路径:${HOME}/.kube/config
[root@harbor ~]# mkdir -p $HOME/.kube
[root@harbor ~]# rsync -av master:/etc/kubernetes/admin.conf $HOME/.kube/config
# 设置证书的所有者和所属组
[root@harbor ~]# chown $(id -u):$(id -g) $HOME/.kube/config
# 验证管理授权
[root@harbor ~]# kubectl get nodes

五、资源对象概述

什么是资源对象

k8s 中把可以创建或配置的应用和服务称为资源对象

我们在集群中创建的Pod、负载均衡、存储、网络服务等等都是资源对象

如何创建资源对象

简单资源对象可以使用"kubectl"直接创建

高级资源对象需要使用"资源对象文件"创建

查看私有仓库中的镜像

[root@master ~]# curl -sku admin https://harbor:443/v2/library/myos/tags/list | python3 -m json.tool

# 也可以通过浏览器网页查看

创建Pod

使用run创建一个Pod资源对象

kubectl run Pod名称 [选项/参数] --image=镜像名称:标签

# 创建资源对象
[root@master ~]# kubectl run myweb --image=myos:nginx
pod/myweb created

# 查询资源对象
[root@master ~]# kubectl get pods -o wide
NAME    READY   STATUS    RESTARTS   AGE   IP           NODE
myweb   1/1     Running   0          3s    10.244.1.3   node-0001

[root@master ~]# curl http://10.244.1.3
Nginx is running !

六、Pod概述

  • Pod由一个或多个容器组成
  • Pod是Kubernetes中最小的管理元素
  • 同一个Pod共享网络IP及权限
  • 同一个Pod共享主机名称
  • 同一个Pod共享存储设备

Pod创建过程

为什么要使用Pod

  • 服务之间有相关性
  • 启动容器的时候需要初始化或进行相关配置

Pod的生命周期

  • Pod对象自从创建开始至终止的时间范围称为其生命周期
  • 在这段时间中,Pod处在多种不同的状态,并执行相关操作
  • 创建主容器为必需的操作,其它为可选操作(初始化容器、启动后钩子、存活性探测、就绪性探测以及终止前钩子等)

Pod相位状态

Pod的status字段是一个PodStatus的对象,Pod对象总是应该处于其生命进程中以下几个相位(phase)之一:

Pending Pod创建过程中,但他尚未被调度成功

Running Pod中所有容器都已经被创建成功

Completed Pod所有容器都已经成功终止,并不会被重启

Failed Pod中的所有容器中至少有一个容器退出是非0状态

Unknow 无法正常获取到Pod对象的状态信息

Pod管理命令

核心管理命令

系统中的核心服务都是运行在Pod中

|------------|-------------|--------------|
| 子命令 | 说明 | 备注 |
| run/create | 创建资源对象 | 可输出资源文件模板 |
| get | 查看资源对象的状态信息 | 可选参数:-o 显示格式 |
| describe | 查询资源对象的属性信息 | |
| logs | 查看容器的报错信息 | 可选参数:-c 容器名称 |

kubectl get 语法格式:

kebectl get 资源对象 [资源名称] [选项/参数]

常用参数:

-o name 只显示名字

-o wide 显示更加的详细信息

-o yaml 以yaml语法格式显示资源对象

-o json 以json语法格式显示资源对象

查看命名空间
[root@master ~]# kubectl get namespaces 
NAME              STATUS   AGE
default           Active   39h
kube-node-lease   Active   39h
kube-public       Active   39h
kube-system       Active   39h
查看命名空间中的资源对象
[root@master ~]# kubectl -n kube-system get pods
NAME                             READY   STATUS    RESTARTS      AGE
etcd-master                      1/1     Running   0             39h
kube-apiserver-master            1/1     Running   0             39h
kube-controller-manager-master   1/1     Running   0             39h
kube-scheduler-master            1/1     Running   0             39h
... ...
系统命名空间
  • default默认的命名空间,不声明命名空间的Pod都在这里
  • kube-node-lease为高可用提供心跳监视的命名空间
  • kube-public公共数据,所有用户都可以读取它
  • kube-system系统服务对象所使用的命名空间

k8s系统核心服务都运行在kube-system名称空间中

kubectl describe语法格式:

kubectl describe 资源类型 [资源名称] [选项/参数]

Events下是事务日志,常用于排错

常用管理命令

|--------|------------------|--------------|
| exec | 在某一个容器内执行特定的命令 | 可选参数:-c 容器名称 |
| cp | 在容器和宿主机之间拷贝文件或目录 | 可选参数:-c 容器名称 |
| delete | 删除资源对象 | 可选参数:-f 文件名称 |

kubectl exec

在容器内执行命令

kubectl exec [选项/参数] Pod名称 -- 操作命令

常用参数

-it 分配交互式终端

# 执行非交互命令
[root@master ~]# kubectl exec myweb -- ls

# 执行交互命令
[root@master ~]# kubectl exec -it myweb -- /bin/bash
[root@myweb html]#  # 这里可以交互式操作Pod了
kubectl cp

拷贝文件/目录

kubectl cp [选项/参数] 原文件 目标文件

路径格式:[Pod名称:绝对路径]

# 与容器进行文件或目录传输
[root@master ~]# kubectl cp myweb:/etc/yum.repos.d /root/aaa
tar: Removing leading `/' from member names
[root@master ~]# tree /root/aaa
/root/aaa
├── local.repo
├── Rocky-AppStream.repo
├── Rocky-BaseOS.repo
......

[root@master ~]# kubectl -n work cp /etc/passwd myhttp:/root/mima
[root@master ~]# kubectl -n work exec myweb -- ls /root/
mima
kubectl delete

集群中所有资源均可使用 delete 命令删除

kubectl delete [选项/参数] 资源类型 资源名称

# 删除一个Pod
[root@master ~]# kubectl delete pods myweb 
pod "myweb" deleted

# 删除 work 名称空间下所有 Pod 对象
[root@master ~]# kubectl -n work delete pods --all
pod "myhttp" deleted

# 删除名称空间
[root@master ~]# kubectl delete namespaces work 
namespace "work" deleted

资源对象管理

一、资源对象文件

什么是资源对象

  • Kubernetes对象是"目标性记录"
  • Kubernetes使用这些对象去表示整个集群的状态

什么是资源对象文件

创建kubernetes对象时,必须提供资源对象的一些基本信息(例如:资源的对象的名字),以及描述描述描述该对象的期望状态特征(规约),如果我们在文件中使用Yaml的语法格式描述了上面的信息,这个文件就是资源对象文件

为什么要使用资源对象文件

  • 命令无法持久化,没有历史记录,不方便重现
  • 服务众多,多个容器之间有关联性,管理不方便
  • 很多高级的复杂的功能靠简单的命令方式无法实现,这些都需要使用资源文件描述

资源对象文件可以做什么

可以创建、删除、变更、管理资源对象

示例:

---                        # Yaml文件起始标志
kind: Pod                  # 创建资源的类型
apiVersion: v1             # 资源对应的版本
metadata:                  # 属性信息,元数据
  name: myweb              # 属性信息,资源的名称
spec:                      # 资源的特性描述(规约)
  containers:              # 容器资源特征描述
  - name: webserver    
    image: myos:nginx
status: {}                 # 资源状态,运行后自动生成

命名规范

  • 当你与指定的 API 对象进行交互时,使用大写驼峰式命名法,也被称为帕斯卡拼写法(PascalCase)
  • 不要将 API 对象的名称切分成多个单词

数组嵌套:

Json数据:

{

"ports":

[ {"name":"xx","Port":80}, {"name":"hh","Port":443} ]

}

Yaml语法格式

ports:
- name: xx
  Port: 80
- name: hh
  Port: 443

什么是静态Pod

  • 静态Pod是由kubelet守护进程直接管理的Pod,不需要API服务器监管。与由控制面管理的POd不同

  • kubelet监视每个静态Pod(在它崩溃之后重新启动)

  • 静态Pod永远都会绑定到一个指定节点上的kubelet

  • 静态Pod的spec不能引用其它API对象

  • 静态Pod配置路径:/var/lib/kubelet/config.yaml

  • staticPodPath:/etc/kubernetes/mainfests

    创建静态Pod

    [root@node-0003 ~]# vim /etc/kubernetes/mainfests/myweb.yaml

    kind: Pod
    apiVersion: v1
    metadata:
    name: myweb
    spec:
    containers:
    - name: webserver
    image: myos:nginx

    在master查看

    [root@master ~]# kubectl get pods -o wide
    ......

    删除静态Pod

    在master上使用kubectl delete pod
    kubelet会自动重建Pod
    删除资源文件才能彻底删除Pod
    rm -f /etc/kubernetes/mainfests/myweb.yaml

二、管理资源对象

|--------|----------------|-----------------|
| 子命令 | 说明 | 备注 |
| create | 创建文件中定义的资源 | 支持指令式和资源对象文件配置 |
| apply | 创建(更新)文件中定义的资源 | 只支持资源对象文件(声明式) |
| delete | 删除文件中定义的资源 | 可支持指令式和资源对象文件配置 |

# 创建资源对象
[root@master ~]# kubectl create -f myweb.yaml 
pod/myweb created
# 不能更新,重复执行会报错
[root@master ~]# kubectl create -f myweb.yaml 
Error from server (AlreadyExists): error when creating "myweb.yaml": pods "myweb" already exists

# 使用资源对象文件删除
[root@master ~]# kubectl delete -f myhttp.yaml
pod "myhttp" deleted
[root@master ~]# kubectl get pods
No resources found in default namespace.

# 创建资源对象
[root@master ~]# kubectl apply -f myweb.yaml 
pod/myweb created
# 更新资源对象
[root@master ~]# kubectl apply -f myweb.yaml 
pod/myweb configured
# 删除资源对象
[root@master ~]# kubectl delete -f myweb.yaml 
pod "myweb" deleted

# 拓展提高
# 与 kubectl apply -f myweb.yaml 功能相同
[root@master ~]# cat myweb.yaml |kubectl apply -f -  
相关推荐
Rainbond云原生10 分钟前
Rainbond 助力城建智控,从传统开发到敏捷开发转型
云原生·kubernetes·开源·云计算
onejson29 分钟前
docker 进入容器运行命令
容器
是芽芽哩!1 小时前
【Kubernetes】常见面试题汇总(四十七)
云原生·容器·kubernetes
楼下创了电瓶车2 小时前
ubuntu20.04系统安装zookeeper简单教程
分布式·zookeeper·云原生
是芽芽哩!2 小时前
【Kubernetes】常见面试题汇总(四十)
云原生·容器·kubernetes
图灵追慕者2 小时前
如何查看NVIDIA Container Toolkit是否配置成功
spring cloud·云原生·eureka
大宇进阶之路2 小时前
离线安装docker
运维·docker·容器
sam_文刀2 小时前
Docker面试-24年
docker·云原生
0.0-03 小时前
Docker的入门详解
运维·docker·容器
sj11637394033 小时前
docker-compose安装gitlab
docker·容器·gitlab