k8s资源管理
一. 资源管理
1. 介绍
-
在kubernetes中,所有的内容都抽象为资源,用户需要通过操作资源来管理kubernetes
-
将资源放在文件中,用文件来管理
-
kubernetes的本质上就是一个集群系统,用户可以在集群中部署各种服务,所谓的部署服务,其实就是在kubernetes集群中运行一个个的容器,并将指定的程序跑在容器中。
- 镜像可以自己做,也可以使用官方的
-
kubernetes的最小管理单元是pod而不是容器,所以只能将容器放在
Pod
中,而kubernetes一般也不会直接管理Pod,而是通过Pod控制器
来管理Pod的。 -
Pod可以提供服务之后,就要考虑如何访问Pod中服务,kubernetes提供了
Service
资源实现这个功能。 -
如果Pod中程序的数据需要持久化,kubernetes还提供了各种
存储
系统。
通过service(相当于暴露端口号)来访问pod(容器)
2. YAML语言介绍
2.1 YAML是一个类似 XML、JSON 的标记性语言。它强调以数据为中心,并不是以标识语言为重点。因而YAML本身的定义比较简单,号称"一种人性化的数据格式语言"。
<wangqing>
<age>15</age>
<address>Wuhan</address>
</wangqing>
wangqing:
age: 15
address: Wuhan
2.2 YAML的语法比较简单,主要有下面几个:
- 大小写敏感
- 使用缩进表示层级关系
- 缩进不允许使用tab,只允许空格( 低版本限制 )
- 缩进的空格数不重要,只要相同层级的元素左对齐即可
- '#'表示注释
2.3 YAML支持以下几种数据类型:
-
纯量:单个的、不可再分的值
-
# 纯量, 就是指的一个简单的值,字符串、布尔值、整数、浮点数、Null、时间、日期 # 1 布尔类型 c1: true (或者True) # 2 整型 c2: 234 # 3 浮点型 c3: 3.14 # 4 null类型 c4: ~ # 使用~表示null # 5 日期类型 c5: 2018-02-17 # 日期必须使用ISO 8601格式,即yyyy-MM-dd # 6 时间类型 c6: 2018-02-17T15:02:31+08:00 # 时间使用ISO 8601格式,时间和日期之间使用T连接,最后使用+代表时区 # 7 字符串类型 c7: wangqing # 简单写法,直接写值 , 如果字符串中间有特殊字符,必须使用双引号或者单引号包裹 c8: line1 line2 # 字符串过多的情况可以拆成多行,每一行会被转化成一个空格
-
对象:键值对的集合,又称为映射(mapping)/ 哈希(hash) / 字典(dictionary)
-
# 对象 # 形式一(推荐): wangqing: age: 15 address: Wuhan # 形式二(了解): wangqing: {age: 15,address: Wuhan}
-
数组:一组按次序排列的值,又称为序列(sequence) / 列表(list)
-
# 数组 # 形式一(推荐): address: - 武昌 - 江夏 # 形式二(了解): address: [武昌,江夏]
-
小提示: 1 书写yaml切记: 后面有内容要加一个空格 2 如果需要将多段yaml配置放在一个文件中,中间要使用---分隔 3 下面是一个yaml转json的网站,可以通过它验证yaml是否书写正确 https://www.json2yaml.com/convert-yaml-to-json
3. 资源管理方式
-
命令式对象管理:直接使用命令去操作kubernetes资源
kubectl run nginx-pod --image=nginx:1.17.1 --port=80
[root@k8s-master ~]# kubectl run myhttpd --image=xiaoyinguhong/httpd:alpine-2012.3 --port=80 pod/myhttpd created [root@k8s-master ~]# kubectl get pods NAME READY STATUS RESTARTS AGE apache-855464645-4zxf2 1/1 Running 1 (86m ago) 12h httpd-86f7c74499-6qmkf 1/1 Running 0 20m //控制器管理的pod myhttpd 1/1 Running 0 14s//自主式管理的pod
-
命令式对象配置:通过命令配置和配置文件去操作kubernetes资源
kubectl create/patch -f nginx-pod.yaml
-
声明式对象配置:通过apply命令和配置文件去操作kubernetes资源
kubectl apply -f nginx-pod.yaml
类型 | 操作对象 | 适用环境 | 优点 | 缺点 |
---|---|---|---|---|
命令式对象管理 | 对象 | 测试 | 简单 | 只能操作活动对象,无法审计、跟踪 |
命令式对象配置 | 文件 | 开发 | 可以审计、跟踪 | 项目大时,配置文件多,操作麻烦 |
声明式对象配置 | 目录 | 开发 | 支持目录操作 | 意外情况下难以调试 |
3.1 命令式对象管理
- kubectl命令
kubectl是kubernetes集群的命令行工具,通过它能够对集群本身进行管理,并能够在集群上进行容器化应用的安装部署。kubectl命令的语法如下:
kubectl [command] [type] [name] [flags]
- comand:指定要对资源执行的操作,例如create、get、delete
- type:指定资源类型,比如deployment、pod、service
- name:指定资源的名称,名称大小写敏感
- flags:指定额外的可选参数
# 查看所有pod
kubectl get pod
# 查看某个pod
kubectl get pod pod_name
# 查看某个pod,以yaml格式展示结果
kubectl get pod pod_name -o yaml
[root@k8s-master ~]# kubectl get pods httpd -o yaml
[root@k8s-master ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
apache-855464645-4zxf2 1/1 Running 1 (104m ago) 12h
httpd 1/1 Running 0 17m
httpd-86f7c74499-6qmkf 1/1 Running 0 37m
myhttpd 1/1 Running 0 18m
//名字叫httpd的pod
[root@k8s-master ~]# kubectl get pods httpd
NAME READY STATUS RESTARTS AGE
httpd 1/1 Running 0 17m
[root@k8s-master ~]#
//名字叫httpd的控制器
[root@k8s-master ~]# kubectl get deployment httpd
NAME READY UP-TO-DATE AVAILABLE AGE
httpd 1/1 1 1 40m
[root@k8s-master ~]#
- 资源类型
kubernetes中所有的内容都抽象为资源,可以通过下面的命令进行查看:
[root@k8s-master ~]# kubectl api-resources
- 经常使用的资源有下面这些:
资源分类 | 资源名称 | 缩写 | 资源作用 |
---|---|---|---|
集群级别资源 | 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 | 配置 |
- 操作
kubernetes允许对资源进行多种操作,可以通过--help查看详细的操作命令
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的版本 |
-
[root@k8s-master ~]# kubectl cluster-info Kubernetes control plane is running at https://192.168.232.128:6443 CoreDNS is running at https://192.168.232.128:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'. [root@k8s-master ~]#
-
以一个namespace / pod的创建和删除简单演示下命令的使用
1.获取namespace
[root@k8s-master ~]# kubectl get ns
NAME STATUS AGE
default Active 21h
kube-flannel Active 21h
kube-node-lease Active 21h
kube-public Active 21h
kube-system Active 21h
2.创建一个namespace(名称空间)
[root@k8s-master ~]# kubectl create ns mushuang
namespace/mushuang created
[root@k8s-master ~]# kubectl get ns
NAME STATUS AGE
default Active 21h
kube-flannel Active 21h
kube-node-lease Active 21h
kube-public Active 21h
kube-system Active 21h
mushuang Active 3s
[root@k8s-master ~]#
3.在此namespace下创建并运行一个nginx的Pod,-n指定名称空间,不指定在默认位置运行
[root@k8s-master ~]# kubectl run pod --image=nginx -n mushuang
pod/pod created
4.查看新创建的pod
[root@k8s-master ~]# kubectl get pods -n mushuang
NAME READY STATUS RESTARTS AGE
pod 1/1 Running 0 19s
[root@k8s-master ~]#
5.
kubectl delete pod pod -n mushuang
前面的pod是对象,后面的pod是名称,-n,指定名称空间
[root@k8s-master ~]# kubectl get pods -n mushuang
NAME READY STATUS RESTARTS AGE
pod 1/1 Running 0 3m45s
[root@k8s-master ~]# kubectl delete pod pod -n mushuang
pod "pod" deleted
[root@k8s-master ~]# kubectl get pods -n mushuang
No resources found in mushuang namespace.
[root@k8s-master ~]#
6.删除指定的pod
[root@k8s-master ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
apache-855464645-4zxf2 1/1 Running 1 (134m ago) 13h
httpd 1/1 Running 0 47m
httpd-86f7c74499-6qmkf 1/1 Running 0 68m
myhttpd 1/1 Running 0 48m
[root@k8s-master ~]# kubectl delete pod myhttpd
pod "myhttpd" deleted
[root@k8s-master ~]#
7.删除指定的控制器,然后pod就删除了
[root@k8s-master ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
apache-855464645-4zxf2 1/1 Running 1 (137m ago) 13h
httpd 1/1 Running 0 50m
httpd-86f7c74499-6qmkf 1/1 Running 0 70m
[root@k8s-master ~]# kubectl get deploy
NAME READY UP-TO-DATE AVAILABLE AGE
apache 1/1 1 1 13h
httpd 1/1 1 1 71m
[root@k8s-master ~]# kubectl delete deploy httpd
deployment.apps "httpd" deleted
[root@k8s-master ~]# kubectl get deploy
NAME READY UP-TO-DATE AVAILABLE AGE
apache 1/1 1 1 13h
[root@k8s-master ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
apache-855464645-4zxf2 1/1 Running 1 (138m ago) 13h
httpd 1/1 Running 0 52m
[root@k8s-master ~]#
3.2 命令式对象配置
- 命令式对象配置就是使用命令配合配置文件一起来操作kubernetes资源。
1. 创建一个nginxpod.yaml,内容如下:
[root@k8s-master ~]# mkdir manifest
[root@k8s-master ~]# cd manifest/
[root@k8s-master manifest]# vi nginxpod.yml
[root@k8s-master manifest]# cat nginxpod.yml
apiVersion: v1 //版本
kind: Namespace //类型
metadata: //原数据
name: dev
---
apiVersion: v1
kind: Pod //类型,自主式pod
metadata:
name: nginxpod
namespace: dev
spec:
containers:
- name: nginx-containers
image: nginx:latest
[root@k8s-master manifest]#
2. 执行create命令,创建资源:
[root@k8s-master manifest]# kubectl create -f nginxpod.yml
namespace/dev created
pod/nginxpod created
3. 执行get命令,查看资源
[root@k8s-master manifest]# kubectl get ns
NAME STATUS AGE
default Active 29h
dev Active 8s
kube-flannel Active 29h
kube-node-lease Active 29h
kube-public Active 29h
kube-system Active 29h
[root@k8s-master manifest]# kubectl get pods -n dev
NAME READY STATUS RESTARTS AGE
nginxpod 1/1 Running 0 18s
[root@k8s-master manifest]#
4. 此时发现创建了两个资源对象,分别是namespace和pod
[root@k8s-master manifest]# kubectl get -f nginxpod.yml
NAME STATUS AGE
namespace/dev Active 117s
NAME READY STATUS RESTARTS AGE
pod/nginxpod 1/1 Running 0 117s
[root@k8s-master manifest]#
5. 执行delete命令,删除资源,发现名称空间没了,po也没了 [root@k8s-master manifest]# kubectl delete -f nginxpod.yml
namespace "dev" deleted
pod "nginxpod" deleted
[root@k8s-master manifest]# kubectl get -f nginxpod.yml
Error from server (NotFound): namespaces "dev" not found
Error from server (NotFound): namespaces "dev" not found
[root@k8s-master manifest]# kubectl get ns
NAME STATUS AGE
default Active 29h
kube-flannel Active 29h
kube-node-lease Active 29h
kube-public Active 29h
kube-system Active 29h
[root@k8s-master manifest]#
-
总结:
-
命令式对象配置的方式操作资源,可以简单的认为:命令 + yaml配置文件(里面是命令需要的各种参数)
-
查看
kubectl explain -h
这个命令 -
[root@k8s-master manifest]# kubectl explain -h [root@k8s-master manifest]# kubectl explain pods/deploy [root@k8s-master manifest]# kubectl explain pods.metadata [root@k8s-master manifest]# kubectl explain deploy.spec selector <Object> -required-//有-required-这个必须给
3.3 声明式对象配置
- 声明式对象配置跟命令式对象配置很相似,但是它只有一个命令apply。
1. 首先执行一次kubectl apply -f yaml文件,发现创建了资源
[root@k8s-master manifest]# kubectl apply -f nginxpod.yml
namespace/dev created
pod/nginxpod created
[root@k8s-master manifest]# kubectl get -f nginxpod.yml
NAME STATUS AGE
namespace/dev Active 10s
NAME READY STATUS RESTARTS AGE
pod/nginxpod 1/1 Running 0 10s
[root@k8s-master manifest]#
2. 再次执行一次kubectl apply -f yaml文件,发现说资源没有变动
[root@k8s-master manifest]# kubectl apply -f nginxpod.yml
namespace/dev unchanged
pod/nginxpod unchanged
[root@k8s-master manifest]#
3. 修改文件,发现再次创建pod,又创建了一个,然后删除,把他们都删了,因为删除了名称空间
[root@k8s-master manifest]# cat nginxpod.yml
apiVersion: v1
kind: Namespace
metadata:
name: dev
---
apiVersion: v1
kind: Pod
metadata:
name: nginx
namespace: dev
spec:
containers:
- name: nginx-containers
image: nginx:latest
[root@k8s-master manifest]#
[root@k8s-master manifest]# kubectl apply -f nginxpod.yml
namespace/dev unchanged
pod/nginx created
[root@k8s-master manifest]# kubectl get -f nginxpod.yml
NAME STATUS AGE
namespace/dev Active 2m40s
NAME READY STATUS RESTARTS AGE
pod/nginx 1/1 Running 0 10s
[root@k8s-master manifest]# kubectl get pods -n dev
NAME READY STATUS RESTARTS AGE
nginx 1/1 Running 0 24s
nginxpod 1/1 Running 0 2m54s
[root@k8s-master manifest]#
发现都删除了
[root@k8s-master manifest]# kubectl delete -f nginxpod.yml
namespace "dev" deleted
pod "nginx" deleted
[root@k8s-master manifest]# kubectl get pods -n dev
No resources found in dev namespace.
[root@k8s-master manifest]#
- 总结:
其实声明式对象配置就是使用apply描述一个资源最终的状态(在yaml中定义状态)
使用apply操作资源:
如果资源不存在,就创建,相当于 kubectl create
如果资源已存在,就更新,相当于 kubectl patch
要起一个容器,在哪个pod上运行,pod是什么类型的pod,pod要跑在哪个名称空间
4. 在普通用户上使用kubectl
1. 在master主机
[root@k8s-master ~]# useradd tom
[root@k8s-master ~]# su - tom
Last login: Wed Sep 7 20:01:26 CST 2022 on pts/2
[tom@k8s-master ~]$ mkdir -p $HOME/.kube
[tom@k8s-master ~]$ ls -a
. .bash_history .bash_profile .kube
.. .bash_logout .bashrc
[tom@k8s-master ~]$
[root@k8s-master ~]# cp -i /etc/kubernetes/admin.conf ~tom/.kube/config
[root@k8s-master ~]# chown -R tom.tom ~tom/.kube/config
[root@k8s-master ~]# ll ~tom/.kube/config
-rw------- 1 tom tom 5643 Sep 7 20:03 /home/tom/.kube/config
[root@k8s-master ~]#
临时将环境变量去掉
[tom@k8s-master ~]$ export KUBECONFIG=
[tom@k8s-master ~]$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master Ready control-plane 30h v1.25.0
k8s-node1 Ready <none> 25h v1.25.0
k8s-node2 Ready <none> 25h v1.25.0
[tom@k8s-master ~]$
2. node1和node2配置相同
[root@k8s-node1 ~]# useradd tom
[root@k8s-node1 ~]# su - tom
[tom@k8s-node1 ~]$ mkdir -p $HOME/.kube
[tom@k8s-node1 ~]$ ls -a
. .. .bash_logout .bash_profile .bashrc .kube
[tom@k8s-node1 ~]$ exit
logout
[root@k8s-node1 ~]# cp -i /etc/kubernetes/admin.conf ~tom/.kube/config
[root@k8s-node1 ~]# chown -R tom.tom ~tom/.kube/config
[tom@k8s-node1 ~]$ export KUBECONFIG=
[tom@k8s-node1 ~]$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master Ready control-plane 30h v1.25.0
k8s-node1 Ready <none> 25h v1.25.0
k8s-node2 Ready <none> 25h v1.25.0
[tom@k8s-node1 ~]$
5. 使用推荐: 三种方式应该怎么用 ?
创建/更新资源 使用声明式对象配置 kubectl apply -f XXX.yaml
删除资源 使用命令式对象配置 kubectl delete -f XXX.yaml
查询资源 使用命令式对象管理 kubectl get(describe) 资源名称
二. k8s
1. k8s架构
1.1 master
- api server:负责接收并处理请求
- scheduler:调度容器创建的请求
- controller:确保已创建的容器处于健康状态
- controller manager:确保后端节点上的控制器处于健康状态
1.2 nodes
- kubelet:与master通信的集群代理
- 容器引擎:docker
2. k8s专业术语
2.1 pod
-
K8s的最小调度逻辑单元
-
pod可以理解为是容器的外壳,它为容器做了一层抽象的封装
-
pod内部主要是用来放容器的
-
pod的特点是可以将多个容器加入到同一个网络名称空间中
-
一个pod中可以包含多个容器
-
同一个pod中的不同容器可以共享存储卷
-
一个pod上无论是有一个容器还是有多个容器,一旦将此pod调度到某node上运行时,这一个pod内的所有容器只能运行在同一个node上
2.2 node
- node是k8s集群中的工作节点,负责运行由master指派的各种任务。而最核心的任务就是以pod形式运行容器
- node可以是任何形式的计算设备,只要此设备上能够有传统意义上的CPU、内存、存储空间,并且能装上k8s的集群代理程序,它都可以作为整个k8s集群一个成员
3. k8s基础概念
3.1 pod分类
-
自主式pod
- 自我管理的pod,创建以后仍然需要提交给apiserver,由apiserver接收以后借助于调度器将其调度至指定的node节点,由node启动此pod
- 如果此pod出现故障,需要重启容器则由kubelet来完成
- 如果node节点故障了,那么此pod将会消失。其无法实现全局调度。所以不推荐使用此种pod
-
控制器管理的pod
- ReplicationController:当启动一个pod时,这个pod如果不够用可以再启一个副本,而后由控制器来管理同一类pod的各种副本与对象。一旦副本少了就会自动增加。采取多退少补的规则,精确符合我们所定义的期望(多的减少,少的增加)。
- 支持滚动更新(一部分,一部分的更新)
-
常见的pod控制器
- ReplicaSet:由一个名叫Deployment的声明式更新的控制器来管理
- Deployment:Deployment只能管理无状态的应用(有状态:容器里面有数据,无状态:容器里面没数据)
- StateFulSet:有状态副本集,可以管理有状态的应用
- DaemonSet:如果需要在每个node上运行一个副本的时候可以DaemonSet
- Job
- Cronjob
- 以上每种控制器都是用来实现一
种特定的应用管理的。
3.2 核心组件
-
hpa
- Deployment还支持二级控制器
- HPA(HorizontalPodAutoscaler,水平pod自动伸缩控制器),自动根据你的要求(定义范围)进行增加和删除
- —般情况下我们可以确保一个node上有2个pod在运行,万一用户访问流量增加,2个pod不足以承载这么多访问量怎么办?此时我们就应该要增加pod资源,那么到底应该加几个?
- HPA控制器可自动监控pod、自动进行扩展。(可以根据自己定义的范围进行自动监控)
-
service
-
服务发现,
-
pod是有生命周期的,一个pod随时都有可能离去,随时都有可能会有其他pod加进来,假如它们提供的是同一种服务,客户端是无法通过固定的手段来访问这些pod的,因为pod本身是不固定的,它们随时可能被替换掉,无论使用主机名还是IP地址,都随时会被替换掉。
-
为了尽可能的降低客户端与pod间协调的复杂度,k8s为每一组提供同类服务的pod和其客广端之间添加了一个中间层,这个中间层是固定的,这个中间层就叫service
-
中间层
- service只要不被删除,其地址与名称皆是固定的,当客户端需要在其配置文件中写上访问某个服务时,它不再需要自动发现,只需要在配置文件中写明service的名称即可,而这个service是个调度器,其不但能够提供一个稳定的访问入口,还可以做反向代理,当service接收到客户端的请求后,会将其代理到后端的pod之上,一旦pod宕机了会立即新建一个pod,这个新建的pod会立即被service关联上,作为service后端的可用pod之一
-
客户端程序访问服务都是通过IP+端口或者主机名+端口的方式来实现的。而service关联后端的pod不是靠它的lP和主机名,而是靠pod的标签选择器。只要创建的pod的label是统一的,无论P地址和主机如何改变,其都能被service所识别。只要pod属于标签选择器,只要其在service的管理范围之内,则具就会被关联到service中,当这个动态的pod关联到service中之后,再进行动态的探测此pod的P地址、端口,再将其作为自己后端可调度的可用服务器主机对象。因此,客户端的请求发送到service,然后由service代理到后端真实的pod中的容器进行响应。
-
service不是一个程序,也不是一个组件,它只是一个iptables的dnat规则
-
service作为k8s的对象,有其自身的名称,而service的名称相当于服务的名称,而这个名称可以被解析。
-
-
addons附件
- dns pod
- 装完k8s后第一件事就需要在k8s集群上部署一个dns pod,以确保各service的名称能够被解析
- 可以动态改变,包括动态创建、动态删除、动态修改
- 比如把service的名称改了,dnspod会自动触发,将dns解析记录中的名称也给改掉;假如我们手动把service的ip地址给改了,改完以后会自动触发,将dns服务中的解析记录给改掉。
- 如此一来,客户端去访问pod资源的时候可以直接访问service的名称,然后由集群中专用的dns服务来负责解析。
- 这种pod是k8s自身的服务就需要用到的pod,所以我们把它称为基础性的系统架构级的pod对象,而且它们也被称为集群附件
- dns pod
三. k8s命令介绍
1. 查看相关命令
#查看kubeadm生成的token
kubeadm token list
kubectl get nodes #查看节点的状态:
kubectl get pod --all-namespaces #查看pod的状态
#--all-namespaces #查看全部namespaces的pod
kubectl get pod --all-namespaces -o wide #查看pod在各个node上面的分布
#-o wide #查看pod的分布情况
kubectl get deployment [nginx-deployment] #查看部署状态
kubectl get deployment --namespace=kube-system #查看系统namespace中的kube-dns组件
kubectl get replicaset #查看部署状态
kubectl get daemonset --namespace=kube-system #查看用daemonset运行的系统组件
kubectl get node --show-labels #查看node的label
kubectl get job --show-all #查看job任务
kubectl get cronjob #查看cronjob任务
kubectl get namespace #查看运行中的namespace
kubectl get pv #查看pv
kubectl get pvc #查看pvc
kubectl get secret [mysecret] #查看存在的secret
kubectl get configmap [myconfigmap] #查看存在的configmap
kubectl describe pod <Pod Name> [--namespace=kube-system] #查看pod的具体运行情况,或者启动日志
kubectl describe deployment #了解deployment的详细信息
kubectl describe replicaset #了解replicaset的详细信息
kubectl describe secret [mysecret] #查看secret条目的key
kubectl describe configmap [myconfigmap] #查看configmap
kubectl logs pod(id) -n kube-system #查看pod日志
kubectl logs myjob-nfkxk #查看job执行的结果
1.1 简单命令示例
查看帮助:kubectl get -h
//查看节点的状态,查看默认空间pod的状态,获取节点信息
[root@k8s-master ~]# kubectl get pods/pod
NAME READY STATUS RESTARTS AGE
nginx-76d6c9b8c-s85j8 1/1 Running 3 (7m44s ago) 157m
//查看所有的节点
[root@k8s-master ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master Ready control-plane 8h v1.25.0
k8s-node1 Ready <none> 177m v1.25.0
k8s-node2 Ready <none> 176m v1.25.0
[root@k8s-master ~]#
//查看名称空间,获取命名空间列表
[root@k8s-master ~]# kubectl get ns/namespaces
NAME STATUS AGE
default Active 8h
kube-flannel Active 7h58m
kube-node-lease Active 8h
kube-public Active 8h
kube-system Active 8h
[root@k8s-master ~]#
//获取【kube-system命名空间】下的pod列表,查看系统名称空间 -n指定访问的空间,查看系统namespace中的kube-dns组件
[root@k8s-master ~]# kubectl get pods -n kube-system
NAME READY STATUS RESTARTS AGE
coredns-c676cc86f-44bsf 1/1 Running 3 (11m ago) 8h
coredns-c676cc86f-fbb7f 1/1 Running 3 (11m ago) 8h
etcd-k8s-master 1/1 Running 3 (11m ago) 8h
kube-apiserver-k8s-master 1/1 Running 3 (11m ago) 8h
kube-controller-manager-k8s-master 1/1 Running 5 (11m ago) 8h
kube-proxy-65lcn 1/1 Running 3 (11m ago) 8h
kube-proxy-lw4z2 1/1 Running 3 (11m ago) 3h
kube-proxy-zskvf 1/1 Running 4 (11m ago) 3h1m
kube-scheduler-k8s-master 1/1 Running 6 (11m ago) 8h
[root@k8s-master ~]#
//查看rc和sercice/svc列表
[root@k8s-master ~]# kubectl get rc,service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 8h
service/nginx NodePort 10.105.183.188 <none> 80:30735/TCP 167m
[root@k8s-master ~]#
// 以ps输出格式列出所有pod,并提供更多信息(如节点名称)
[root@k8s-master ~]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-76d6c9b8c-s85j8 1/1 Running 3 (21m ago) 171m 10.244.2.5 k8s-node2 <none> <none>
[root@k8s-master ~]#
//获取类型为Deployment(控制器)的资源列表 [root@k8s-master ~]# kubectl get deployment
NAME READY UP-TO-DATE AVAILABLE AGE
nginx 1/1 1 1 173m
[root@k8s-master ~]#
2. 创建相关命令
#创建token
kubeadm token create
#获取ca证书sha256编码hash值
openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'
kubectl run httpd-app --image=httpd --replicas=2 #运行俩个pod
#httpd-app #命名为httpd-app
#--image=httpd #镜像名
#replicas=2 #启动俩个pod
#通过配置文件启动
kubectl apply -f nginx.yaml
kubectl apply -f httpd.v1.yml --record
#--record 作用是将当前命令记录到revision记录中,这样就知道每个revison对应的那个配置文件。
#可以通过kubectl rollout history deployment httpd来查看revison历史记录
#创建namespace:
kubectl create namespace weave
kubectl create configmap myconfigmap --from-file=./logging.conf #通过--from-file方式创建configmap
kubectl create secret generic mysecret --from-literal=username=admin --from-literal=password=12345 #通过--from-literal方式创建secret
2.1 创建httpd容器
[root@k8s-master ~]# kubectl create deployment apache --image=httpd
deployment.apps/apache created
[root@k8s-master ~]# kubectl expose deployment apache --port=80 --type=NodePort
service/apache exposed
[root@k8s-master ~]# kubectl get pod,svc
NAME READY STATUS RESTARTS AGE
pod/apache-855464645-4zxf2 0/1 ContainerCreating 0 34s
pod/nginx-76d6c9b8c-s85j8 1/1 Running 3 (38m ago) 3h8m
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/apache NodePort 10.100.81.244 <none> 80:31552/TCP 7s
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 8h
service/nginx NodePort 10.105.183.188 <none> 80:30735/TCP 3h7m
[root@k8s-master ~]#
使用仓库镜像:
[root@k8s-master ~]# kubectl create deployment httpd --image=xiaoyinguhong/httpd:alpine-2012.3
deployment.apps/httpd created
[root@k8s-master ~]# kubectl get deployment
NAME READY UP-TO-DATE AVAILABLE AGE
apache 1/1 1 1 12h
httpd 0/1 1 0 20s
[root@k8s-master ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
apache-855464645-4zxf2 1/1 Running 1 (77m ago) 12h
httpd-86f7c74499-6qmkf 1/1 Running 0 11m
[root@k8s-master ~]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
apache-855464645-4zxf2 1/1 Running 1 (77m ago) 12h 10.244.1.3 k8s-node1 <none> <none>
httpd-86f7c74499-6qmkf 1/1 Running 0 11m 10.244.2.7 k8s-node2 <none> <none>
[root@k8s-master ~]# kubectl get deployment
NAME READY UP-TO-DATE AVAILABLE AGE
apache 1/1 1 1 12h
httpd 1/1 1 1 11m
[root@k8s-master ~]#
3. 删除相关命令
kubectl delete deployment nginx-deployment #删除deployment任务
kubectl delete -f nginx.yml #删除deployment任务
kubectl delete pods <pod> --grace-period=0 --force #删除pod
kubectl delete pvc mypvc1 #删除pvc中的mypvc1
4. 命令详解kubectl
[root@k8s-master ~]# kubectl -h
create 创建,从文件或stdin创建资源
expose 将复制控制器、服务、部署或吊舱作为一个新的Kubernetes服务公开
run 在集群上运行特定镜像
set 为对象设置指定特性
explain 获取资源的文档
get 显示一个或多个资源
edit 编辑服务器上的资源
delete 按文件名、标准输入、资源和名称或按资源和标签选择器删除资源
集群管理命令:
certificate 修改证书资源。
cluster-info 显示集群信息
top 显示资源(CPU/内存)使用情况
cordon 标记节点为不可调度
uncordon 标记节点为可调度
drain 清空节点以准备维护
taint 更新一个或者多个节点上的污点
故障处理和调试命令:
describe 显示特定资源或资源组的详细信息
logs 打印 Pod 中容器的日志
attach 挂接到一个运行中的容器
exec 在某个容器中执行一个命令
port-forward 将一个或多个本地端口转发到某个 Pod
proxy 运行一个指向 Kubernetes API 服务器的代理
cp 从容器中复制文件和目录
auth Inspect authorization
debug Create debugging sessions for troubleshooting workloads and nodes
先进的命令:
diff 区别实际版本和潜在应用版本
apply 通过文件名或标准输入将配置应用到资源
patch 更新资源的字段
replace 用文件名或标准输入替换资源
wait 实验性:在一个或多个资源上等待特定条件
kustomize 从目录或URL构建定制化目标。
Settings Commands:
label 更新某资源上的标签
annotate 更新一个资源的注解
completion 输出指定shell (bash、zsh、fish或powershell)的shell完成代码
Other Commands:
alpha alpha功能的命令
api-resources 打印服务器上支持的API资源
api-versions 在服务器上以“组/版本”的形式打印支持的API版本
config 修改 kubeconfig 文件
version 输出客户端和服务端的版本信息
4.1 delete,删除:
[root@k8s-master ~]# kubectl delete deployment nginx
deployment.apps "nginx" deleted
[root@k8s-master ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
apache-855464645-4zxf2 1/1 Running 1 (23m ago) 11h
[root@k8s-master ~]#