【k8s】4、资源管理命令-陈述式

一、资源管理介绍

1、资源管理概念

在kubernetes中,所有的内容都抽象为资源,用户需要通过操作资源来管理kubernetes。

//kubernetes的本质就是一个集群系统,用户可以在集群中部署各种服务,起始就是在kubernetes集群中运行一个个容器,并将指定的程序跑在容器中。

kubernetes的最小管理单元是pod而不是容器,所以只能将容器放在pod中,而kubernetes一般也不会直接管理pod,而是通过pod控制器来管理pod的。

Pod可以提供服务之后,就要考虑如何访问Pod,kubernetes提供了service资源实现这个功能。

当然,如果Pod中程序的数据需要持久化,kubernetes还提供了各种存储系统
image-20220924233329499
学习kubernetes的核心,就是学习如何对集群上的Pod、Pod控制器、service、存储等各种资源进行操作。
  • https://gitee.com/link?target=https%3A%2F%2Fwww.json2yaml.com%2Fconvert-yaml-to-json)

1、资源管理方式

命令式对象管理: 直接使用命令去操作kubernetes资源

  • 也叫陈诉式管理方法:通过命名式语句来实现对资源管理。
kubectl run nginx-pod --image=nginx:1.17.1 --port=80

命令式对象配置: 通过命令配置和配置文件去操作kubernetes资源

kubectl create/path -f nginx-pod.yaml

声明式对象配置: 通过apply命令和配置文件去操作kubernetes资源

kubectl apply -f nginx-pod.yaml
类型 操作对象 使用环境 优点 缺点
命令式对象管理 对象 测试 简单 只能操作活动对象,无法审计、跟踪
命令式对象配置 文件 开发 可以审计、跟踪 项目大时,配置文件多
声明式对象配置 目录 开发 支持目录操作 意外情况下难以调试

二、 陈述式对象管理

1、基本概念

  • kubernetes集群管理资源的唯一入口是通过相应的方法调用apiserver的接口。
  • kubectl是官方的CTL命令行工具,用于与apiserver进行通信,将用户在命令行输入的命令,组织并转化为apiserver能识别的信息,进而实现管理k8s各种资源的一种有效途径。

kubectl 命令

  • kubectl 是kubernetes集群的命令行工具,通过它能够对集群本身记性管理,并能够在集群上进行容器化应用安装部署。

kubectl命令语法格式如下

  • kubernetes中所有的内容都抽象为资源,可以通过kubectl api-resources进行查看
kubectl [command] [type] [name] [flags]

command: //指定要对资源执行的操作,例如:create、get、delete

type: //指定资源类型,比如deployment、pod、service

name: //指定资源的名称,名称大小写敏感

flags: //指定额外的可选参数

经常使用的操作命令

  • kubernetes允许对资源进行多种操作,可以通过kubectl --help 进行查看
命令分类 命令 翻译 命令作用
基本命令 create 创建 创建一个资源
edit 编辑 编辑一个资源
get 获取 获取一个资源
patch 更新 更新一个资源
delete 删除 删除一个资源
explain 解释 展示资源文档
运行和调试 run 运行 在集群中运行一个指定的镜像
expose 暴露 暴露资源为service
describe 描述 显示资源内部信息
logs 日志输出容器在pod中的日志 输出容器在 pod 中的日志
attach 缠绕进入运行中的容器 进入运行中的容器
exec 执行容器中的一个命令 执行容器中的一个命令
cp 复制 再pod内外复制文件
rollout 首次展示 管理资源的发布
scale 规模 扩(缩)容pod的数量
autoscale 自动调整 自动调整pod的数量
高级命令 apply rc 通过文件对资源进行配置
label 标签 更新资源上的标签
其它命令 cluster-info 集群信息 显示集群信息
version 版本 显示当前server和client的版本信息

常用的资源类型

资源分类 资源名称 缩写 资源作用
集群级别资源 nodes no 集群组成部分
namespace ns 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 配置

2、基础命令使用

kubectl version
#查看版本信息(服务端和客户端版本都可查看到)

kubectl api-resources
#查看资源对象简写以及版本

kubectl cluster-info
#查看集群信息

source <(kubectl completion bash)
//可以将此条命令放入到环境变量中,每次开机都会执行自动补全命令
#配置kubectl 自动补全
###命令放在/etc/profile 或者/root/.bashrc

journalctl -u kubelet -f
#node节点查看日志

kubectl get pods -w
#持续监听pod的状态信息

image-20220928221417321

image-20220928221531317

image-20220929120454872

3、基本信息查看(kubectl get)

kubectl get <resource> [-o wide|json|yaml] [-n namespace]
#获取资源的相关信息,-o指定输出格式,-n 指定命令空间

//<resource> :可以是具体资源名称,如pods
//nginx-xxx: 也可以是资源类型,如pod,或all(仅展示几种核心资源,并不完整)

案例演示

kubectl get pods
#查看当前默认命令空间(defaults)的pods信息

kubectl get pods -n kube-system
#查看指定的kube-system命名空间的资源

kubectl get pods -owide
#查看默认命名空间的pod详细信息

kubectl get pods -A 或者 kubectl get pods --all-namespace
#查看所有命名空间的pod资源信息

kubecrl get pods -A -owide
#查看所有命名空间下的pod资源信息,并显示详细信息

kubectl get pods --show-labels 
#查看当前默认的命令空间的下的pods的标签类型信息

kubectl get pods --show-labels -A
#查看所有命令空间下的标签信息

kubectl get pods -A -l app
#查看所有命名空间下,仅显示标签为app的资源

kubectl get pods -l app=nginx-ydq
#查看默认命名空间下的标签为nginx-ydq的资源

kubectl get cs
#查看服务组件状态信息

kubectl get nodes 
#查看node节点集群的信息

kubectl get ns
#查看命令空间资源(用于允许不同 命名空间 的 相同类型 的资源 重名的)

kubectl get deployment
#查看deployment的pod控制器

kubectl get all
#查看默认命名空间下的所有资源

kebectl get svc 
#查看service信息

image-20220928233031222

image-20220928233227494

image-20220928233559881

image-20220928233919949

image-20220928234423142

image-20220928234633440

常用命令参数总结

--all-namespace 或 -A   //表示显示所有的命令空间
--show-labels //显示所有标签
-l app //仅显示标签为app的资源
-n  //指定命令空间
-owide //显示详细信息

4、增删等操作

创建pod资源

  • 创建pod资源分为两种,一种为 自主式pod ,一种为 控制器pod
  • **自主式pod ** 创建无法指定副本数量,当pod挂掉后,不会进行重建,可直接删除。
  • 控制器pod 创建可以设置副本数量,且当pod挂掉后,pod控制器会重新创建,要想删除只能删除pod控制器。
kubectl create ns app
#创建命名空间app

kubectl delete ns app
#删除命名空间app

kubectl create deployment nginx-ydq --image=nginx --port=80 --replicas=2 -n kube-public 
#在命名空间kube-public创建副本控制器(deployment)来启动pod,并创建2个副本(pod名称它会随机)
//删除它只能删除的pod控制器,删除控制器后,pod控制器下面的所有pod都会删除
###注意!!!!pod控制器,不能单独创建,基本是和创建pod一起制定创建pod控制器。

kubectl run nginx-ydq2 --image=nginx -n kube-public
#直接创建自主式pod(挂掉后不会重建,没有pod控制器)
//可以直接删除这个pod,它没有pod控制器

kubectl describe deployment nginx-ydq -n kube-public
#查看nginx-ydq的pod控制器的详细信息,

kubectl describe pods 【pod名称】 -n kube-public
#查看某个pod的详细信息

kubectl delete deployment nginx-ydq -n kube-public
#删除pod控制器,(里面所有的pod都会被删除)

kubectl delete pod nginx-ydq2 -n kube-public
#删除自主式pod。

kubectl delete pod 【pod名称】 -n 【命名空间】 --force --grace-period=0
#如pod无法删除,总是处于terminate状态,则要强行删除
//grace-period 表示过度存活期,默认30s,在删除pod之前允许POD慢慢终止其上的容器进程,从而优雅退出,0表示立即终止

image-20220929002802460

image-20220929003749446

image-20220929004159780

image-20220929004332308

image-20220929004712759

image-20220929005039565

5、登录pod中的容器

kubectl exec -it 【pod名称】 bash
#可以跨主机登录到指定的pod中的容器中,docker exec只能在容器所在主机上登录

image-20220929005950645

6、扩容缩容pod控制器的pod

可以根据指定的数量,创建或缩小任意的pod的数量。

kubectl scale deployment nginx-ydq --replicas=4 -n kube-public
#扩容

kubectl scale deployment nginx-ydq --replicas=2 -n kube-public 
#缩容

image-20220929010803986

7、标签操作(labels)

kubectl run nginx-ydq --image=nginx 
#创建自主式的pod

kubectl get pods nginx-ydq --show-labels
#查看当前pod的标签

kubectl label pods nginx-ydq verwion=1.0
#给nginx-ydq的pod加上标签信息

kubectl label pods nginx-ydq version=2.0 --overwrite
#更新版本标签

image-20221004165805355

kubectl run nginx-ydq2 --image=nginx
#再创建一个pod

kubectl label pods nginx-ydq2 version=1.0
#打上version=1的标签

kubectl get pods --show-labels
#查看所有节点的标签

kubectl get pods -l version=2.0 
#筛选version=2.0的标签版本

kubectl get pods -l version!=2.0
#筛选version不等于2.0的标签版本

kubectl lable pod nginx-ydq version-
#删除标签

image-20221004171723762

8、简单案例

下面以一个namespace/pod的创建pod和删除简单演示

# 创建一个namespace
kubectl create namespace dev

# 获取namespace
kubectl get ns

# 在此namespace下创建并运行一个nginx的Pod,名称为Pod
kubectl run pod --image=nginx:latest -n dev

# 查看新创建的pod
kubectl get pod -n dev

#查看新创建pod的详细信息
kubectl describe pods pod -n dev

# 删除指定的pod(前面指定删除Pod,后面指定名称)
kubectl delete pod pod -n dev

# 删除指定的namespace
kubectl delete ns dev

image-20220925003547899

image-20220925003751003

image-20220925004109984

image-20220925004320843

三、k8s的ip和端口介绍

1、ip的种类

kubernetes集群中有三种IP地址,分别如下:

  • Node IP: Node节点的IP地址,即物理网卡的IP地址。

  • Pod IP: Pod的IP地址,也就是docker容器的ip地址,此为虚拟IP地址

  • Cluster IP: service的IP地址,此为虚拟IP地址

Node IP

  • 可以时候物理机的IP (也可能是虚拟机的IP)。每个service都会在node节点上开通一个端口,外部可以通过NodeIP:NodePort即可访问Service里的Pod,和我们访问服务器部署的项目一样,IP:端口/项目名

Cluster IP

  • service的IP地址,此为虚拟的ip地址,外部网络无法ping通,只有kubernets集群内部使用。

Cluster IP 是一个虚拟的IP,但更像是一个伪造的IP网络

  • Cluster IP 仅仅作用于 kubernetes service 这个对象,并由kubernetes管理和分配IP地址。
  • Cluster IP无法被ping,他没有一个“实体网络对象”来响应
  • Cluster IP只能结合Service Port组成一个具体的通信端口,单独的Cluster IP不具备通信的基础,并且他们属于Kubernetes集群这样一个封闭的空间。
  • 在不同Service下的pod节点在集群间相互访问可以通过Cluster IP

Pod IP

Pod IP是每个Pod的IP地址,他是Docker Engine根据docker网桥的IP地址段进行分配的,通常是一个虚拟的二层网络

  • 同Service下的pod可以直接根据PodIP相互通信、
  • 不同Service下的pod在集群间pod通信要借助于 cluster ip
  • pod和集群外通信,要借助于node ip

三种IP网络间通信

service地址和pod地址在不同网段,service地址为虚拟地址,不配在pod上或主机上,外部访问时,先到Node节点网络,再转到service网络,最后代理给pod网络。

  • Kubernetes在其所有节点上开放一个端口给外部访问(所有节点上都使用相同的端口号), 并将传入的连接转发给作为Service服务对象的pod。这样我们的pod就可以被外部请求访问到
  • k8s暴露服务给外部访问有三种方式,NodePort、LoadBalane、Ingress三种暴露服务的方式,上图是用了NodePort的方式,缺点是服务一旦多起来,NodePort 在每个节点上开启的端口数量会极其庞大,难以维护,

2、port种类

image-20221006085812276

node Port

  • 外部流量访问k8s集群中service入口的一种方式(另一种方式是LoadBalancer),即nodeIP:nodePort是提供给外部流量访问k8s集群中service的入口。

Port

  • k8s集群内部服务之间访问service的入口。即clusterIP:port是service暴露在clusterIP上的端口。比如 mysql容器暴露了3306端口,集群内其他容器通过33306端口访问mysql服务,但是外部流量不能访问mysql服务,因为mysql服务没有配置NodePort。

target Port

  • targetPort是pod上的端口,从port和nodePort上来的流量,经过kube-proxy流入到后端pod的targetPort上,最后进入容器。

containner port

  • 容器内部进程使用的端口。

hostPort

  • 这是一种直接定义Pod网络的方式。hostPort是直接将容器的端口与所调度的节点上的端口路由,这样用户就可以通过宿主机的IP加上来访问Pod了

四、项目生命周期

项目的生命周期: 创建---->发布------>更新------->回滚------->删除

1、创建 (kubectl create)

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

  • 创建一个deployment 或job来管理容器

  • 可使用:kubectl create --help ,来查看详细的用法。

kubectl create deployment nginx --image=nginx:1.14 --port=80 --replicas=3
#启动 nginx 实例,暴露容器端口80,设置副本数3

kubectl get pods
#查看容器

kubectl get all
#查看所有资源

image-20220929212054502

2、发布 (kubectl expose)

将资源暴露为新的srvice

kubectl expose deployment nginx --port=80 --target-port=80 --name=nginx-service --type=NodePort

#为Deployment 的nginx 创建service,并通过service的80端口转发至容器的80端口上,service的名称为nginx-service。类型为NodePort

image-20220929215053541

2.1 service的作用与类型

service的作用

  • kubernetes之所以需要service,一方面是因为Pod的IP不是固定的(Pod可能会重建),另一方面是因为一组实例之间总会有负载均衡的需求。
  • service通过label selector 实现的对一组Pod的访问
  • 对于容器应用而言,kubernetes提供了基于VIP(虚拟IP)的网桥的方式访问service,再由service重定向到相应的Pod。

service的类型

  • cluster IP : 提供一个集群内部的虚拟IP以供Pod访问(service默认类型)

  • NodePort : 在每个Node上打开一个端口以供外部访问,kubernetes将会在每个Node上打开一个端口,并且每个Node的端口都是一样的,通过NodeIP:NodePort的方式。

  • LoadBalancer: 通过外部的负载均衡器来访问,通常在云平台部署LoadBalancer还需要额外的费用。

2.2 k8s端口

端口总结

  • port : 为service在clusterIP上暴露的端口
  • targetport : 对应容器映射在pod上的端口
  • nodeport: 可以通过在k8s集群外部使用的nodeip+nodeport 来访问service
  • containnerport : 容器内部进程使用的端口。

K8s集群内部:

  • 客户端—》clusterIP:port—》通过targetport ----》pod port --》container port

  • 客户端—》nodeIP:nodeport—》通过targetport ----》pod port --》container port

k8s集群外部

  • 客户端–》nodeip:nodeport–》通过targetport ----》pod port --》container port

2.2 相关命令

kubectl get pods,svc -o wide
#查看pod网络状态详细信息和service暴露端口

kubectl get enpoints
#查看关联后端的节点(集群的地址)

kubectl describe svc nginx
#查看service的描述信息

curl
#访问查看

kubectl log 【pod名称】
#查看访问日志

image-20220929220634150

image-20220929220810708

image-20220929221133915

3、更新 (kubectl set)

http://www.lanxinbase.com/?p=2553

更改现有应用资源一些信息

  • 可以使用kubectl set --help 进行查看命令使用方法
  • 使用 kubectl set image --help ,查看修改的模板
curl -I 20.0.0.55:32179
curl -I 20.0.0.56:32179
#查看当前nginx的版本号
image-20220929231147580
kubectl set image deployment/nginx nginx=nginx:1.15
#将nginx版本更新为1.15版本(更新的过程中,不会影响使用,因是滚动更新)

kubectl get pods -w
#监听nginx版本,由于使用的是滚动更新方式,所以会先生成一个新的pod,然后删除一个旧的pod,往后一次类推

kubectl get pods -o wide
#查看更新好后的pod的ip会改变

image-20220929232441363

image-20220929232609514

curl -I 20.0.0.55:32179
curl -I 20.0.0.56:32179
#再查看nginx的版本号

image-20220929232646955

4、回滚 (kubectl rollout)

对资源进行回滚管理

  • 使用kubectl rollout ,可进行查看帮助信息

4.1 回滚到上一个版本

kubectl rollout history deployment/nginx
#查看历史版本

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

kubectl get pods -o wide
#查看新创建pod

curl -I 20.0.0.55:32179
#查看当前nginx的版本

image-20220930000553942

4.2 回滚到指定的版本

kubectl rollout history deployment/nginx
#查看历史版本

kubectl rollout undo deployment/nginx --to-revision=2
#回滚到revison2,也就是1.15版本

kubectl get pods -owide
#查看pod的ip变化

curl -I 20.0.0.55:32179
#查看当前nginx的版本

kubectl rollout status deployment/nginx
#查看回滚状态

image-20220930001148181

image-20220930001232489

5、删除 (kubectl delete)

kubectl delete deployment/nginx
#删除pod控制器(相当与命令: kubectl delete deployment nginx)

kubectl delete svc/nginx-service
#删除指定svc端口

image-20220930001449289

6、金丝雀发布(Canary Release)

  • Deployment 控制器支持自定义控制更新过程中的滚动节奏, 如“暂停(pause)”或“继续(resume)”更新操作, 比如等待第一批新的pod资源创建完成后立即暂停更新过程, 此时,仅存在一部分新版本的应用,主体部分还是旧版本。

  • 然后, 再筛选一小部分的用户请求路由到新版本的pod应用,继续观察能否稳定的按期望的方式运行。确定没问题之后在继续完成余下的pod资源滚动更新,否则立即回滚更新操作,这就是所谓的金丝雀发布。

  • 简单理解:就是只更新一小部分的pod用来试运行,运行一段时间没问题了,再进行滚动更新。否则进行回滚

//当前所有的pod版本为1.14版本

kubectl set image deployment/nginx nginx=nginx:1.15 && kubectl rollout pause deployment/nginx
#更新deployment的版本,并配置暂停deployment的更新

kubectl rollout status deployment/nginx
#查看更新状态

kubectl get pods -owide
#可以看到已经新增了一个资源,但是并未按照预期的状态去删除一个旧的资源,就是因为使用了pause暂停命令

curl -I 
#查看版本信息

kubectl rollout resume deployment/nginx
#确保更新的pod没问题了,继续更新

kubectl get pods -w
#查看最后的更新情况

curl -I 
#查看版本信息

image-20220930004928947

image-20220930005257549

//如果在进行灰度发布时,想要新版本和旧版本进行隔离,让客户端只能访问到后台新版本pod。

可以使用以下命令进行新创一个service端口,
kubectl expose deployment nginx-new --port=80 --tager-port=80 --type=NodePort
#重新生成一个service

kubectl edit svc nginx-new
#修改service的后台标签信息

//然后此时,通过新生成的service的ip地址,访问时,只能访问到新的版本。
//相当于游戏的公测版本,单独发布。
kuvectl get pods --show-labels
#查看pod的标签信息

image-20220930094713903

猜你喜欢

转载自blog.csdn.net/m0_57515995/article/details/127956547