资源管理命令-陈述式

资源管理介绍

资源管理概念

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

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

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

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

当然,如果Pod中程序的数据需要持久化,kubernetes还提供了各种存储系统

学习kubernetes的核心,就是学习如何对集群上的Pod、Pod控制器、service、存储等各种资源进行操作。

复制代码
https://gitee.com/link?target=https%3A%2F%2Fwww.json2yaml.com%2Fconvert-yaml-to-json)

资源管理方式

命令式对象管理: 直接使用命令去操作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

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

陈述式对象管理

基本概念

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 进行查看

常用的资源类型

基础命令使用

复制代码
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的状态信息

基本信息查看(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信息

常用命令参数总结

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

增删等操作

创建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表示立即终止

登录pod中的容器

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

扩容缩容pod控制器的pod

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

复制代码
kubectl scale deployment nginx-ydq --replicas=4 -n kube-public
#扩容

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

标签操作(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
#更新版本标签

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-
#删除标签

简单案例

下面以一个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

k8s的ip和端口介绍

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 在每个节点上开启的端口数量会极其庞大,难以维护

port种类

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了

项目生命周期

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

创建 (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
    #查看所有资源

发布 (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
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还需要额外的费用。

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

相关命令
复制代码
kubectl get pods,svc -o wide
#查看pod网络状态详细信息和service暴露端口

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

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

curl
#访问查看

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

更新 (kubectl set)

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

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

  • 可以使用kubectl set --help 进行查看命令使用方法

  • 使用 kubectl set image --help ,查看修改的模板

    curl -I 20.0.0.50:32179
    curl -I 20.0.0.60:32179
    #查看当前nginx的版本号

    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会改变

回滚 (kubectl rollout)

对资源进行回滚管理

  • 使用kubectl rollout ,可进行查看帮助信息
回滚到上一个版本
复制代码
kubectl rollout history deployment/nginx
#查看历史版本

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

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

curl -I 20.0.0.50:32179
#查看当前nginx的版本
回滚到指定的版本
复制代码
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.50:32179
#查看当前nginx的版本

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

删除 (kubectl delete)

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

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

金丝雀发布(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 
#查看版本信息

//如果在进行灰度发布时,想要新版本和旧版本进行隔离,让客户端只能访问到后台新版本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的标签信息
相关推荐
ShirleyWang0121 天前
让headlamp控制台能访问
linux·服务器·python·k8s·k3s
spider_xcxc1 天前
K8s 部署学习笔记
docker·容器·kubernetes·云计算·k8s
ShirleyWang0121 天前
Day02 K3s NGF(Nginx Gateway Fabric)单 Worker 环境网关更新与故障处置 SOP
linux·服务器·python·k8s·k3s
ShirleyWang0121 天前
DAY01 K3s 私有化部署排障复盘与 SOP
linux·服务器·k8s·k3s·企业部署
XUHUOJUN5 天前
AKS 不是安装在 Windows Server 上,而是运行在 Windows Server 之上的 Azure 平台能力
windows·架构·k8s·azure local·azure stack
Geek-Chow5 天前
Connecting kubectl to a Private EKS Cluster Over an Internal Domain
kubernetes·k8s·aws
spider_xcxc7 天前
Docker Compose 容器通信详解:同一个 Compose 文件才能互通吗?
docker·容器·k8s·容器化·容器网络
欢醉12 天前
k8s调用服务异常cannot allocate memory
kubernetes·k8s
万里侯15 天前
GitOps 漂移检测:集群里改了配置,Git 还以为一切正常
微服务·容器·k8s
spider_xcxc16 天前
云上网络基石(阿里云):深入解读阿里云VPC及其应用生态
网络·阿里云·云计算·k8s·运维开发·虚拟化