[云原生2.] Kurbernetes资源管理 ---- (陈述式资源管理方式)

文章目录

  • [1. K8s管理资源的方法类别](#1. K8s管理资源的方法类别)
    • [1.1 陈述式资源管理方式](#1.1 陈述式资源管理方式)
    • [1.2 声明式资源管理方式](#1.2 声明式资源管理方式)
    • [1.3 GUI式资源管理方法](#1.3 GUI式资源管理方法)
  • [2. 陈述式资源管理方式](#2. 陈述式资源管理方式)
    • [2.1 命令行工具 ---- Kubelet](#2.1 命令行工具 ---- Kubelet)
      • [2.1.1 简介](#2.1.1 简介)
      • [2.1.2 特性](#2.1.2 特性)
      • [2.1.3 kubelet拓展命令](#2.1.3 kubelet拓展命令)
      • [2.1.4 kubectl基本语法](#2.1.4 kubectl基本语法)
      • [2.1.5 Kubectl工具的自动补全](#2.1.5 Kubectl工具的自动补全)
    • [2.2 k8s Service 的类型](#2.2 k8s Service 的类型)
      • [2.2.1 NodePort](#2.2.1 NodePort)
      • [2.2.2 ClusterIP](#2.2.2 ClusterIP)
      • [2.2.3 LoadBalancer](#2.2.3 LoadBalancer)
      • [2.2.4 ExternalName](#2.2.4 ExternalName)
    • [2.3 k8s Service 的端点类型](#2.3 k8s Service 的端点类型)
      • [2.3.1 Port](#2.3.1 Port)
      • [2.3.2 NodePort](#2.3.2 NodePort)
      • [2.3.3 TargetPort](#2.3.3 TargetPort)
      • [2.3.4 ContainerPort](#2.3.4 ContainerPort)
  • [3. 陈述式资源管理方式的基础命令](#3. 陈述式资源管理方式的基础命令)
    • [3.1 创建](#3.1 创建)
      • [3.1.1 创建命名空间](#3.1.1 创建命名空间)
      • [3.1.2 create子命令](#3.1.2 create子命令)
      • [3.1.3 run子命令](#3.1.3 run子命令)
    • [3.2 get ---- 查看基本信息](#3.2 get ---- 查看基本信息)
      • [3.2.1 Kubernetes 集群组件的状态](#3.2.1 Kubernetes 集群组件的状态)
      • [3.2.2 命名空间](#3.2.2 命名空间)
      • [3.2.3 Service(服务)](#3.2.3 Service(服务))
      • [3.2.4 pod信息](#3.2.4 pod信息)
      • [3.2.5 Node(节点)列表](#3.2.5 Node(节点)列表)
    • [3.3 describe ---- 查看资源详细信息](#3.3 describe ---- 查看资源详细信息)
    • [3.4 logs ---- 查看日志](#3.4 logs ---- 查看日志)
    • [3.5 delete ---- 删除指定的资源](#3.5 delete ---- 删除指定的资源)
    • [3.6 exec ---- 跨主机登录容器](#3.6 exec ---- 跨主机登录容器)
    • [3.7 scale ---- replicas(副本数)](#3.7 scale ---- replicas(副本数))
  • [4. 项目的生命周期](#4. 项目的生命周期)
    • [4.1 创建-----kubectl create命令](#4.1 创建-----kubectl create命令)
    • [4.2 发布-----kubectl expose命令](#4.2 发布-----kubectl expose命令)
    • [4.3 更新 ----- kubectl set命令](#4.3 更新 ----- kubectl set命令)
    • [4.4 回滚 ----- kubectl rollout 命令](#4.4 回滚 ----- kubectl rollout 命令)

1. K8s管理资源的方法类别

1.1 陈述式资源管理方式

主要依赖命令行工具kubectl进行管理

可理解为使用一条命令和参数选项来实现资源的管理操作

1.2 声明式资源管理方式

主要依赖统一资源配置清单进行管理

可以理解为使用yaml配置文件的定义来实现资源的管理操作

1.3 GUI式资源管理方法

主要依赖图形化操作界面进行管理

2. 陈述式资源管理方式

bash 复制代码
k8s中文文档:http://docs.kubernetes.org.cn/683.html

2.1 命令行工具 ---- Kubelet

2.1.1 简介

kubectl 是官方的CLI命令行工具,用于与 apiserver 进行通信,将用户在命令行输入的命令,组织并转化为 apiserver 能识别的信息,进而实现管理 k8s 各种资源的一种有效途径

2.1.2 特性

  • 优点

    1.可以满足90%以上的使用场景

    2.对资源的增、删、查操作比较容易

  • 缺点

    1.命令冗长,复杂,难以记忆

    2.特定场景下,无法实现管理需求

    3.对资源的修改麻烦,需要patch来使用json串更改。

2.1.3 kubelet拓展命令

bash 复制代码
#kubectl 的命令大全
kubectl --help
        -h 
bash 复制代码
#查看k8s版本信息
kubectl version
bash 复制代码
#查看资源对象简写
kubectl api-resources
bash 复制代码
#查看集群信息
kubectl cluster-info
bash 复制代码
#node节点查看日志
journalctl -u kubectl -f

2.1.4 kubectl基本语法

bash 复制代码
kubectl [command] [Type] [NAME] [flags]
bash 复制代码
command:	子命令	用于操作kubernetes集群资源对象的命令	
TYPE:	资源对象的类型	区分大小写,能以单数,复数或者简写形式表示	
NAME:	资源对象的名称	区分大小写,如果不指定名称,系统则将返回属于TYPE的全部对象的列表	
flags:	子命令的可选参数	

2.1.5 Kubectl工具的自动补全

bash 复制代码
#二进制安装的k8s,kubectl工具没有自动补全功能(其他方式安装的未验证)
#可以使用以下方式开启命令自动补全
vim /etc/bashrc

source <(kubectl completion bash)

2.2 k8s Service 的类型

2.2.1 NodePort

将Service的端口号映射到每个Node的一个端口号上,这样集群中的任意Node都可以作为Service的访问入口地址,即NodeIP:NodePort

每个端口只能是一种服务,端口范围只能是 30000-32767

2.2.2 ClusterIP

默认值,它是Kubernetes系统自动分配的虚拟IP(Cluster IP:Port),只能在集群内部访问

2.2.3 LoadBalancer


LoadBalancerNodePort很相似,目的都是向外部暴露一个端口,区别在于LoadBalancer会在集群的外部再来做一个负载均衡设备,而这个设备需要外部环境支持的,外部服务发送到这个设备上的请求,会被设备负载之后转发到集群中

2.2.4 ExternalName


ExternalName类型的服务用于将集群外的服务定义为Kubernetes的集群的Service,并且通过externalName字段指定外部服务的地址,可以使用域名或IP格式,集群内的客户端应用通过访问这个Service就能访问外部服务了。

2.3 k8s Service 的端点类型

Service是通过标签选择器绑定Pod的标签来关联Pod的端点(Endpoint)。

2.3.1 Port

Service 的ClusterIP 使用的端口

2.3.2 NodePort

在NodePort类型的service定义的端口,在每个node节点上开启的端口,即 nodeIP 使用的端口,默认范围为30000~32767

2.3.3 TargetPort

使用云负载设备和service做映射,外部用户通过云负载设备即可将请求转发到node节点,再通过nodeIP:nodePort访问service并转发给其关联的Pod。

2.3.4 ContainerPort

相当于给一个外部地址做别名,集群内的Pod可以通过这个service访问相关的外部服务。8875

bash 复制代码
K8S集群内部的客户端可以通过  http://clusterIP:port  -->  podIP:containerPort

K8S集群外部的客户端可以通过  http://nodeIP:nodePort -->  podIP:containerPort

3. 陈述式资源管理方式的基础命令

3.1 创建

run为一次性的创建运行,删除后不会自动生成,没有pod控制器。

create创建的,删除后还会自动生成,有pod控制器,拥有副本集控制。

3.1.1 创建命名空间

bash 复制代码
kubectl create ns <name>
bash 复制代码
#示例
kubectl create ns scj

3.1.2 create子命令

bash 复制代码
kubectl create [-n <命名空间>] <资源类型> <资源名称> [选项]
                                                 --image=镜像 
                                                 --replicas=副本数 
                                                 --port=容器端口
bash 复制代码
#示例
kubectl create service <service-name> --tcp=<port>:<target-port>

kubectl create pod <pod-name> --image=<container-image>

kubectl create deployment <deployment-name> --image=<container-image>

3.1.3 run子命令

bash 复制代码
#创建并运行
kubectl run <资源名称> --image=镜像 --replicas=副本数 --port=容器端口

3.2 get ---- 查看基本信息

bash 复制代码
#基本格式
kubectl get <resource> [-o wide|json|yaml] [-n namespace]
bash 复制代码
获取资源的相关信息,-n指定命令空间,-o指定输出格式
resource可以是具体资源名称,如pod nginx- xxx;也可以是资源类型,如pod; 或者all (仅展示几种核心资源,并不完整)

--all-namespaces 或-A :表示显示所有命令空间,
--show-labels :显示所有标签
-l x:仅显示标签为x的资源
-l x=y:仅显示包含x标签,且值为y的资源

3.2.1 Kubernetes 集群组件的状态

bash 复制代码
kubectl get componentstatuses 
kubectl get cs #简写
bash 复制代码
get pods --show-labels
#查看有哪些标签,面试常问

3.2.2 命名空间

命名空间在 Kubernetes 中主要用于隔离和管理资源名称。

每个命名空间具有自己的资源名称空间,保证了资源名称的唯一性。

bash 复制代码
#获取当前集群中所有命名空间的列表

kubectl get namespace 
kubectl get ns #简写
bash 复制代码
#获取命名空间中的所有资源的列表

kubectl get all [-n namespace]
#不指定命名空间,则默认查看default命名空间

3.2.3 Service(服务)

bash 复制代码
kubectl get service
kubectl get svc 

3.2.4 pod信息

bash 复制代码
kubectl get pods [-n namespace] [-o wide|json|yaml]
bash 复制代码
kubectl get pods --all-namespaces -o wide

3.2.5 Node(节点)列表

bash 复制代码
kubectl get nodes

3.3 describe ---- 查看资源详细信息

bash 复制代码
#基本格式
kubectl describe [-n <命名空间>] <资源类型> <资源名称>
bash 复制代码
#示例
#先根据kubectl get pods -A,找到要查看的资源
kubectl describe pod etcd-master01 -n kube-system

3.4 logs ---- 查看日志

bash 复制代码
kubectl logs [-n <命名空间>] <Pod资源名称> [-c 容器名称] [-f] [-p]
#查看Pod容器的日志
选项 对象 功能
-n 命名空间 用于指定 Pod 所属的命名空间,如果不指定命名空间,将默认使用默认命名空间
-c 容器名称,可选的容器参数 用于指定要获取日志的容器名称,如果 Pod 中只有一个容器,可以省略此参数
-f 可选的跟踪参数 用于告诉命令持续输出日志
-p 可选的先前参数 用于获取已经终止的 Pod 的先前日志如果 Pod 重新创建或重新调度,该参数可以用来获取先前的日志
bash 复制代码
#举个例子
kubectl logs -n kube-system  kube-proxy-ggw6p

3.5 delete ---- 删除指定的资源

Pod没有重启的概念,重启的是容器 被自动删除和重新创建

bash 复制代码
#删除命名空间app
kubectl delete [-n <命名空间>] <资源类型> <资源名称>|--all [--force --grace-period=0]
bash 复制代码
#示例
kubectl delete pod nginx-764b95f4c5-7t65m 
bash 复制代码
#若pod无法删除, 总是处于terminate状态, 则要强行删除pod
kubectl delete pod <name> [-n namespace ] --force --grace-period=0

#grace-period表示过渡存活期,默认30s,在删除pod之前允许POD慢慢终止其上的容器进程,从而优雅退出,0表示立即终止pod。

3.6 exec ---- 跨主机登录容器

kubectl exec可以跨主机登录容器,docker exec 只能在容器所在主机上登录。

bash 复制代码
kubectl exec -it [-n <命名空间>] <Pod资源名称> [-c 容器名称] sh|bash
bash 复制代码
#示例
kubectl exec -it  nginx-764b95f4c5-hsj59 sh

3.7 scale ---- replicas(副本数)

用于调整 Kubernetes 集群中 Deployment 或 StatefulSet 对象的副本数量

bash 复制代码
kubectl scale [-n <命名空间>] <deployment|statefulset> <资源名称> --replicas=副本数
bash 复制代码
#增加副本数(扩容)
kubectl scale deployment nginx --replicas=6
bash 复制代码
#减少副本数(缩容)
kubectl scale deployment nginx --replicas=1
bash 复制代码
kubectl scale deployment nginx --replicas=0
#reolicas=0等于清空

4. 项目的生命周期

创建-->发布-->更新-->回滚-->删除

4.1 创建-----kubectl create命令

创建并运行一个或多个容器镜像。

创建一个deploymentjob 来管理容器。

bash 复制代码
kubectl create --help
kubectl create service <svc资源类型> <svc资源名称> --tcp=<clusterIP的端口:容器的端口>
bash 复制代码
#举个例子 
#启动 nginx 实例,暴露容器端口 80,设置副本数 3
kubectl create deployment nginx --image=nginx:1.14 --port=80 --replicas=3

kubectl get pods
kubectl get all

4.2 发布-----kubectl expose命令

将资源暴露为新的 Service。

bash 复制代码
kubectl expose --help
bash 复制代码
kubectl expose [-n <命名空间>] deployment <资源名称> --name <自定义svc资源名称> --type <svc资源类型> --port <clusterIP的端口> --targetPort <容器的端口>
                     ClusterIP|NodePort|LoadBalancer|ExternalName
bash 复制代码
#示例
#为deployment的nginx创建service,
#并通过Service的80端口转发至容器的80端口上
#Service的名称为nginx-service,类型为NodePort
kubectl expose deployment nginx --port=80 --target-port=80 --name=nginx-service --type=NodePort
bash 复制代码
#查看pod网络状态详细信息和 Service暴露的端口
kubectl get pods,svc -o wide


#查看关联后端的节点
kubectl get endpoints

#查看 service 的描述信息
kubectl describe svc nginx
bash 复制代码
curl 10.244.3.3:80
curl 10.244.3.4:80
curl 10.244.4.3:80

curl 192.168.67.100:30724

#在master01操作 查看访问日志
kubectl logs nginx-d9d8cf5c7-6zpc2
kubectl logs nginx-d9d8cf5c7-85rvh 
kubectl logs nginx-d9d8cf5c7-nffcz 

4.3 更新 ----- kubectl set命令

更改现有service的一些信息

bash 复制代码
kubectl set --help
bash 复制代码
#更新 Kubernetes 集群中某个 Deployment 的容器镜像
kubectl set image deployment <deployment资源名称> <容器名>=<镜像名>
#更改 Kubernetes 中服务对象的标签选择器
kubectl set selector service <svc资源名称> '标签key=value'
bash 复制代码
#示例

#查看当前 nginx 的版本号
curl -I http://192.168.67.100:30724
bash 复制代码
#将nginx 版本更新为 1.15 版本
kubectl set image deployment/nginx nginx=nginx:1.15

kubectl get pods,svc -o wide
bash 复制代码
#再次查看nginx版本号
curl -I 192.168.67.100:31134

4.4 回滚 ----- kubectl rollout 命令

bash 复制代码
#查看指定 deployment 资源的历史记录,包括版本号、更新时间和事件
kubectl rollout history deployment <deployment资源名称>

#回滚
kubectl rollout undo deployment <deployment资源名称> [--to-revision=N]
                                                      指定版本回滚

#状态
kubectl rollout status deployment <deployment资源名称>
bash 复制代码
#示例
#查看历史版本
kubectl rollout history deployment/nginx 

#执行回滚到上一个版本
kubectl rollout undo deployment/nginx

#检查回滚状态
kubectl rollout status deployment/nginx
bash 复制代码
#执行回滚到指定版本
kubectl rollout undo deployment/nginx --to-revision=1
相关推荐
甘露寺11 小时前
云原生核心技术解析:Docker vs Kubernetes vs Docker Compose
docker·云原生·kubernetes
Fᴏʀ ʏ꯭ᴏ꯭ᴜ꯭.14 小时前
LVS集群技术
云原生·lvs
5283015 小时前
Kubernetes 高级调度 01
云原生·容器·kubernetes
ocean'18 小时前
网络安全初级第一次作业
云原生·eureka
AKAMAI18 小时前
为何说分布式 AI 推理已成为下一代计算方式
人工智能·云原生·云计算
ikun·19 小时前
Kubernetes 高级调度01
云原生·容器·kubernetes
wenzhangli71 天前
低代码引擎核心技术:OneCode常用动作事件速查手册及注解驱动开发详解
人工智能·低代码·云原生
容器魔方2 天前
持续领跑,华为云连续5年蝉联中国容器软件市场份额第一
云原生·容器·云计算
樽酒ﻬق2 天前
Prometheus Operator:Kubernetes 监控自动化实践
java·算法·云原生·运维开发