K8S命令&对象配置
一、kubectl命令
1.kubectl概述
kubernetes 集群管理集群资源的唯一入口是通过相应的方法调用 apiserver 的接口
kubectl 是官方的 CLI 命令行工具,用于与 apiserver 进行通信,将用户在命令行输入的命令,组织并转化为 apiserver 能识别的信息,进而实现管理 k8s 各种资源的一种有效途径。
2.资源概述
kubernetes中所有内容都抽象为资源,可以通过一下内容查:
kubectl api-resources

Deployment、Service、Pod 是 k8s 最核心的 3 个资源对象
- Deployment: 最常见的无状态应用的控制器,支持应用的扩缩容、滚动更新等操作
- Service: 为弹性变动且存在生命周期的 Pod 对象提供了一个固定的访问接口,用于服务发现和服务访问
- Pod: 是运行容器以及调度的最小单位。同一个 Pod 可以同时运行多个容器
| 资源分类 | 资源名称 | 缩写 | 资源作用 |
|---|---|---|---|
| 集群级别资源 | nodes | no | 集群组成部分 |
| namespaces | 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 | 配置 |
3.客户端配置kubectl命令
master主机执行kube命令
kubectl get nodes

node主机执行kubectl命令
kubectl get nodes

- 原因:kubectl 会将命令发送给 apiserver 接口,但 apiserver 部署在 master 节点上,因此在 node 节点执行 kubectl 命令时,无法将命令发送给 apiserver。
- 解决思路:告诉 node 节点将 kubectl 命令发送给 master 主机的 apiserver 接口。
- 实现方法:将 master 上的
.kube文件复制到 node 节点上。
执行命令
scp -r $HOME/.kube node1:$HOME/

此时在node节点也能够执行kubectl命令了
4.kubectl常用命令
kubectl 是 kubernetes 集群的命令行工具,通过它能够对集群本身进行管理,并能够在集群上进行容器化应用的安装部署。kubectl 命令的语法如下:
kubectl [command] [type] [name] [flags]
command:指定要对资源执行的操作,例如create、get、delete
type:指定资源类型,比如deployment、pod、service
name:指定资源的名称,名称大小写敏感
flags:指定额外的可选参数
其中kubectl常用命令
| 命令分类 | 命令 | 翻译 | 命令作用 |
|---|---|---|---|
| 基本命令 | 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 的版本 |
示例:
1)示例创建删除查看pod命名空间
kubectl create namescpace dev
kubectl get namespaces
kubectl get ns
1.创建了一个namespaces名字为demo
2.在demo里面添加一个nginx的pod镜像
kubectl run nginx-pod --image=nginx:latest -n demo
![]()
3.查看命名空间的所有pod
# 这个节点的详细信息
kubectl get pods -n demo -o wide
# 这个节点的信息
kubectl get pods -n demo
访问也是能够访问的,在不同节点里面都也是能够访问的
4.查看这个pod节点的详细信息
kube describe pods nginx-pod -n demo

5.删除这个命名空间的指定的pod
kubectl delete pod nginx-pod -n demo
6.删除这个demo
因为pod是依赖于命名空间的,因此删除命名空间的时候会连同命名空间删除

这个命名空间就是用来隔离pod资源的,如果在创建pod的时候没有指定命名空间的话就会默认创建到default里面
2)练习
1. 查询所有的 node 节点的状态
kubectl get nodes

2. 查询所有的 deployment
kubectl get deployments

3. 查询所有的 namespace
kubectl get ns

4. 查询所有的 pods 的详细信息
kubectl get pods -o -wide -A

5. 查询指定 pod 的详细信息
kubectl get pod
还可以用describe查看详细信息
kubectl describe pod nginx-pod -n demo

6. 查询指定 namespace 下面所有的 pod 的信息
kubectl get pods -n default

7. 查询所有 service 的信息

二、对象配置
所谓对象配置就是创建 deployment,service,namespace,pod 等信息,对象配置总共有以下两种方式:
- 命令式配置
- 声明式配置
1.命令式配置
kubectl create deployment nginx --image=nginx:latest # 创建一个deployment并创建pod
kubectl expose deploy nginx --port=80 --target-port=80 --type=NodePort # 创建service
2.声明式配置
声明式配置主要是通过配置文件的方式来运行,类似与我们之前服务编排写的 compose 文件,文件的类型也主要是 yaml 类型
1)模板文件
apiVersion: v1 # 文档的版本
kind: Namespace # 资源对象的类型:deployment, namespace, pod等
metadata: # 元数据,用于描述资源
name: dev # 指定资源的名称
---
apiVersion: v1 # 文档的版本
kind: Pod # 资源对象的类型:deployment, namespace, pod等
metadata:
name: # 名称
namespace: # 使用的命名空间
spec: # 规约,就是创建资源时相关的要求
containers: # 容器信息
- name: # 容器的名称
image: # 容器的镜像
imagePullPolicy: # 镜像拉取策略
command: # 指定容器启动命令
其中拉去镜像的三种方式
| 策略值 | 英文名称 | 核心行为 |
|---|---|---|
| Always | 总是拉取 | 每次启动容器都从仓库拉取,无论本地是否存在 |
| IfNotPresent | 本地不存在时拉取 | 本地有镜像直接使用,无镜像则从仓库拉取(默认策略) |
| Never | 永不拉取 | 仅使用本地已存在镜像,不尝试远程拉取;本地无镜像则启动失败 |
查询资源对应的属性和值
kubectl explain pod.spec.containers

3)练习
需求:使用声明式的方式创建资源,具体的要求如下:
- 创建一个 namespace 名字为 dev
- 创建一个 pod,运行 nginx 的最新版本
- 指定镜像的拉取策略是本地有就使用本地的,没有就从远程拉取
- 指定 nginx 非后台运行
- 指定暴露的端口为 80
- 运行容器之后切换到 /user/share/nginx 目录
# 创建一个存放yml文件的目录
cd
mkdir pods
vim nginx-pod.yml
apiVersion: v1
kind: Namespace
metadata:
name: nginx-ns
---
apiVersion: v1
kind: Pod
metadata:
name: nginxpod
namespace: nginx-ns
spec:
containers:
- name: nginx
image: nginx:latest
imagePullPolicy: IfNotPresent
command:
- nginx
- -g
- 'daemon off;'
ports:
- name: http
containerPort: 80
protocol: TCP
workingDir: /usr/share/nginx
# 执行
kubectl apply -f nginx-pod.yml

删除整个创建的命名空间以及里面的容器

三、案例演示
1.Namespace
Namespace 是 kubernetes 系统中的一种非常重要资源,它的主要作用是用来实现多套环境的资源隔离或者多租户的资源隔离。
默认情况下,kubernetes 集群中的所有的 Pod 都是可以相互访问的。但是在实际中,可能不想让两个 Pod 之间进行互相的访问,那此时就可以将两个 Pod 划分到不同的 namespace 下。kubernetes 通过将集群内部的资源分配到不同的 Namespace 中,可以形成逻辑上的 “组”,以方便不同的组的资源进行隔离使用和管理。
可以通过 kubernetes 的授权机制,将不同的 namespace 交给不同租户进行管理,这样就实现了多租户的资源隔离。此时还能结合 kubernetes 的资源配额机制,限定不同租户能占用的资源,例如 CPU 使用量、内存使用量等等,来实现租户可用资源的管理。

kbuernetes在集群启动后,会默认创建结果namespace
kubectl get namespace
NAME STATUS AGE
default Active 45h # 所有未指定Namespace的对象都会被分配在default命名空间
kube-flannel Active 17h # flannel插件创建的命名空间
kube-node-lease Active 45h # 集群节点之间的心跳维护,v1.13开始引入
kube-public Active 45h # 此命名空间下的资源可以被所有人访问(包括未认证用户)
kube-system Active 45h # 所有由Kubernetes系统创建的资源都处于这个命名空间
1)查看namespace资源的具体操作
# 1.查看所有的ns 命令:kubectl get ns
kubectl get ns
# 2.查看指定的ns 命令:kubectl get ns ns的名字
kubectl get ns demo
# 3.指定输出格式 命令:kubectl get ns ns名称 -o 参数歌手
# 其中常见的参数格式有很多常见的就有json,yaml, wide
kubectl get ns demo -o yaml
# 4.查看命名空间的详情
kubectl describe pod demo-pod
2)创建namespace
kubectl get ns demo
3)删除namespace
kubectl delete ns demo
4)配置方式
首先准备一个yaml文件:ns-demo.yaml
apiVersion: v1
kind: Namespace
metadata:
name: ns-demo
执行命令就能够创建
2.Pod
Pod是kubernetes集群进行管理的最小单元,程序要运行必须部署在容器中,而容器必须存在于Pod中。
Pod可以认为是容器的封装,一个Pod中可以存在一个或者多个容器。

1)创建pod
通常情况下pod是不会单独创建pod的,一般都是创建一个deployment
kubectl run nginx-pod --image=nginx:latest --port=80 -n demo
2)查看pod的信息
# 查看pod信息
kubectl get pod nginx-pod -n demo
# 查看详细的pod信息
kubectl describe pod nginx-pod -n demo -o wide
# 查看所有pod的信息
kubectl get pods --all-namespaces
kubectl get pods -A
3)访问pod
# 先查询到pod的信息,在访问pod
kubectl get pods -n demo -o wide

4)删除指定的pod
# 删除pod节点里面的nginxpod
kubectl delete pod nginxpod -n demo
5)配置操作
创建一个nginx.yml文件
apiVersion: v1
kind: Pod
metadata:
name: nginx
namespace: dev
spec:
containers:
- image: nginx:latest
name: nginx
ports:
- name: nginx-port
containerPort: 80
protocol: TCP
执行文件里面的操作
kubectl apply -f nginx.yml
kubectl delete -f nginx.yml
3.Label
Label 是 kubernetes 系统中的一个重要概念。它的作用就是在资源上添加标识,用来对它们进行区分和选择。
Label特点
1.一个 Label 会以
key/value键值对的形式附加到各种对象上,如 Node、Pod、Service 等等2.一个资源对象可以定义任意数量的 Label,同一个 Label 也可以被添加到任意数量的资源对象上去
3.Label 通常在资源对象定义时确定,当然也可以在对象创建后动态添加或者删除
可以通过 Label 实现资源的多维度分组,以便灵活、方便地进行资源分配、调度、配置、部署等管理工作。
常见的标签
- 版本标签:
"version":"release","version":"stable"... - 环境标签:
"environment":"dev","environment":"test","environment":"pro" - 架构标签:
"tier":"frontend","tier":"backend"
当前有两种 Label Selector:
1.基于等式的 Label Selector
name = slave: 选择所有包含 Label 中 key="name" 且 value="slave" 的对象
env != production: 选择所有包括 Label 中的 key="env" 且 value 不等于 "production" 的对象
2.基于集合的Label Selector
name in (master, slave): 选择所有包含 Label 中的 key="name" 且 value="master" 或 "slave" 的对象
name not in (frontend): 选择所有包含 Label 中的 key="name" 且 value 不等于 "frontend" 的对象
3.多种组合选择
标签的选择条件可以使用多个,此时将多个 Label Selector 进行组合,使用逗号,进行分隔即可。例如:
name=slave,env!=production
name not in (frontend),env!=production
1)常用命令
# 为pod资源打标签
[root@master001 ~]# kubectl label pod nginx-pod version=1.0 -n dev
pod/nginx-pod labeled
# 为pod资源更新标签
[root@master001 ~]# kubectl label pod nginx-pod version=2.0 -n dev --overwrite
pod/nginx-pod labeled
# 查看标签
[root@master001 ~]# kubectl get pod nginx-pod -n dev --show-labels
NAME READY STATUS RESTARTS AGE LABELS
nginx-pod 1/1 Running 0 10m version=2.0
# 筛选标签
[root@master001 ~]# kubectl get pod -n dev -l version=2.0 --show-labels
NAME READY STATUS RESTARTS AGE LABELS
nginx-pod 1/1 Running 0 17m version=2.0
[root@master001 ~]# kubectl get pod -n dev -l version!=2.0 --show-labels
No resources found in dev namespace.
# 删除标签
[root@master01 pods]# kubectl label pod nginx-pod -n dev env-
pod/nginx-pod unlabeled
[root@master01 pods]# kubectl get pod nginx-pod -n dev --show-labels
NAME READY STATUS RESTARTS AGE LABELS
nginx-pod 1/1 Running 0 4m52s version=2.0
2)配置方式
# 创建xml文件或者yaml文件 vim label-pod.xml
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
namespace: nginx-ns
labels:
env: "por"
version: "1.0"
spec:
containers:
- image: nginx:latest
name: nginx-container
ports:
- name: nginx-port
containerPort: 80
protocol: TCP
###########################
执行文件:
kubectl apply -f label-pod.xml
执行过后查看

4.deployment
在kubernetes中,Pod是最小的控制单元,但是kubernetes很少直接控制Pod,一般都是通过Pod控制器来完成的。Pod控制器用于pod的管理,确保pod资源符合预期的状态,当pod的资源出现故障时,会尝试进行重启或重建pod。
在kubernetes中Pod控制器的种类有很多这里使用Deployment。

1)常用命令
# 命令格式:kubectl create deployment 名称 [参数]
# --image 指定pod的镜像
# --port 指定端口
# --replicas 指定创建pod数量
# --namespace 指定namespace
kubectl create deployment nginx --image=nginx:latest --port=80 --replicas=3 -n nginx-ns
# deployment.apps/nginx created
# 查看创建的Pod
kubectl get pod -n dev
# NAME READY STATUS RESTARTS AGE
# nginx-8d545c96d-58vnf 1/1 Running 0 20s
# nginx-8d545c96d-7q2bf 1/1 Running 0 20s
# nginx-8d545c96d-x2mmc 1/1 Running 0 20s
# 查看deployment的信息
kubectl get deploy -n dev
# NAME READY UP-TO-DATE AVAILABLE AGE
# nginx 3/3 3 3 43s
# UP-TO-DATE: 成功升级的副本数量
# AVAILABLE: 可用副本的数量
kubectl get deploy -n dev -o wide
# NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
# nginx 3/3 3 3 67s nginx nginx:latest app=nginx
2)配置方式
创建一个Deploy-nginx.yml文件
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
namespace: nginx-ns
spec:
replicas: 3
selector:
matchLabels:
run: nginx
template:
metadata:
labels:
run: nginx
spec:
containers:
- image: nginx:latest
name: nginx
ports:
- containerPort: 80
protocol: TCP
同样直接用kubectl apply命令执行就可以了
5.Service
1)创建集群内部可访问的Service
kubectl expose deploy nginx --name=nginx-svc --port=80 --target-port=80 -n nginx-ns

此时用curl加ip地址就能够访问到nginx服务
2)创建集群外部可以访问到的nginx服务
kubectl expose deploy nginx --name=nginx-svc --port=80 --target-port=80 --type=NodePort -n nginx-ns
执行命令之后会随机给你分配一个端口
直接粘贴到游览器即可访问
3)删除Service
kubectl delete svc nginx-svc -n nginx-ns
## service "nginx-svc" deleted
4)配置方式
同样创建yml文件
apiVersion: v1
kind: Service
metadata:
name: nginx-svc
namespace: nginx-ns
spec:
clusterIP: 10.101.67.27
ports:
- port: 80
protocol: TCP
targetPort: 80
selector:
run: nginx
type: NodePort
同样用kubectl apply执行即可创建

6.进入pod容器的方式
# 查询命名空间中创建的容器名
kubectl describe pod -n nginx-ns

这就是自定义的容器名,查询到了直接进入容器
kubectl exec -it nginx-64b7c758f4-22cx7 -c nginx /bin/bash -n nginx-ns
此时进入容器就可以修改源码以及执行操作等等

更多推荐


所有评论(0)