客户端命令kubectl
语法结构:kubectl 命令 类型 名称 参数
当名称为空时,代表查看所有
基础命令
部署metrics-server
metrics-server可以查看资源(CPU、内存、存储)使用
创建metrics-server资源
wget https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml -O metrics-server-components.yaml
#修改镜像源
sed -i 's/registry.k8s.io\/metrics-server/registry.cn-hangzhou.aliyuncs.com\/google_containers/g' metrics-server-components.yaml
vim metrics-server-components.yaml
#添加
#metrics-server v0.8.0 版本后,安全要求较高,默认情况下必须配置 --kubelet-insecuretls,否则无法从 kubelet 拉取指标,导致探针失败。
spec:
containers:
- args:
- --cert-dir=/tmp
- --secure-port=10250
- --kubelet-insecure-tls #添加这一行
- --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname
- --kubelet-use-node-status-port
- --metric-resolution=15s
image: registry.cn-hangzhou.aliyuncs.com/google_containers/metrics-server:v0.8.0
#部署
kubectl apply -f metrics-server-components.yaml
长时间出现以下情况说明出现问题
kubectl describe pod metrics-server-57999c5cf7-hgrk2 -n kube-system
可以看到时calico出现了问题
当出现calico卡死的情况时,执行下面的命令(一般只在虚拟机环境中出现)
kubectl rollout restart daemonset calico-node -n kube-system
显示1/1 running代表成功
使用kubectl top 查看资源
kubectl top pod -n kube-system
kubectl top node -n kube-system
部署命令
集群管理命令
故障诊断和调试命令
高级命令
设置命令
其他命令
集群Node管理
# 查看集群信息
kubectl cluster-info
# 查看集群节点信息
kubectl get nodes
# 查看集群节点详细信息
kubectl get nodes -o wide
查看节点描述详细信息
kubectl describe node master
worker node节点管理集群
使用kubeadm安装如果想在node节点管理就会报错
[root@node1 ~]# kubectl get nodes
解决方法:只要把master上的管理文件/etc/kubernetes/admin.conf拷贝到node节点的 $HOME/.kube/config就可以让node节点也可以实现kubectl命令管理
重点需要(kubectl命令,指向api-server节点及证书)
# 在node节点的用户家目录创建.kube目录
[root@node1 ~]# mkdir /root/.kube
# 在master节点把admin.conf文件复制到node节点
[root@master ~]# scp /etc/kubernetes/admin.conf node1:/root/.kube/config
# 在node节点验证
[root@node1 ~]# kubectl get nodes
dashboard界面
下载安装
wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.6.1/aio/deploy/recommended.yaml
修改文件
vim recommended.yaml
应用修改后配置
kubectl apply -f recommended.yaml
查看Pod状态
kubectl get pods -n kubernetes-dashboard
查看Service暴露端口
kubectl get svc -n kubernetes-dashboard
访问dashboard界面
https://192.168.18.128:30001/ (注意是https)
创建访问令牌(Token)
配置管理员账户
创建rbac.yaml文件,内容如下:
vim rbac.yaml
#写入
apiVersion: v1
kind: ServiceAccount
metadata:
name: dashboard-admin
namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: dashboard-admin
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: dashboard-admin
namespace: kube-system
应用配置并获取Token
kubectl apply -f rbac.yaml
获取token,k8s1.22版本引入,默认有效期1小时,每次执行命令会生成新token,旧token会自动消失
kubectl create token dashboard-admin --namespace kube-system
将token复制下来粘贴到浏览器中
完成部署
节点标签(label)
kubernetes集群由大量节点组成,可将节点打上对应的标签,然后通过标签进行筛选及查看,更好的进 行资源对象的相关选择与匹配。
查看节点标签信息
显示的标签以键值对形式出现,键名=值
kubectl get nodes --show-labels
设置节点标签信息
# 为节点node2打一个region=nanjing的标签
kubectl label node node2 region=nanjing
查看所有带region的标签
kubectl get nodes -L region
多维度标签
设置多维度标签,用于不同的需要区分的场景
#如把node1标签为上海,南区机房,测试环境,AI业务
kubectl label node node1 region=shanghai zone=south env=test bussiness=AI
查找zone=south的节点(键值对用小写l;键名用大写L)
kubectl get nodes -l zone=south
标签的修改(overwrite:使用复写功能)
kubectl label nodes node1 zone=west --overwrite=true
标签删除
使用key加一个减号的写法来取消标签
kubectl label node node1 bussiness-
标签选择器
用于筛选匹配特定标签的资源,主要分两类:
-
等值匹配(Equality-based)
精确匹配键值: app=nginx (匹配 app 值为 nginx 的资源)
排除匹配: env!=dev (排除 env=dev 的资源) 。
-
集合匹配(Set-based)
key in (value1, value2) :匹配值在集合中的资源(如 env in (prod, staging) )
key notin (value1) :排除指定值(如 tier notin (backend) )
存在性检查: key (仅检查键是否存在) 。
# 在node1和node2上创建一个新标签
kubectl label node node1 os=centos7
kubectl label node node2 os=centos8
# 排除os标签为centos7的
kubectl get node -l os!=centos7
# 匹配值在集合中的资源
kubectl get nodes -l "os in(centos7,centos8)"
YAML声明式文件
YAML:仍是一种标记语言,但为了强调这种语言以数据做为中心,而不是以标记语言为重点。是一个可读性高,用来表达数据序列的格式。
基本语法
-
低版本(1.0、2.0)缩进时不允许使用Tab键,只允许使用空格
-
缩进的空格数目不重要,只要相同层级的元素左侧对齐即可
-
#标识注释,从这个字符一直到行尾,都会被解释器忽略
数据结构
-
对象:键值对的集合,又称为映射(mapping)/哈希(hashes)/字典(dictionary)
-
数组:一组按次序排列的值,又称为序列(sequence)/列表(list)
-
纯量(scalars):单个的、不可再分的值
对象类型:对象的一组键值对,使用冒号结构表示
name: demisse
age: 24
Yaml 也允许另一种写法,将所有键值对写成一个行内对象
hash: { name: demisse,age: 24 }
数组类型:一组连词线开头的行,构成一个数组
game
- csgo
- starrail
- arknights
数组也可以采用行内表示法
game: [csgo,starrail,arknights]
复合结构:对象和数组可以结合使用,形成复合结构
纯量:纯量是最基本的、不可再分的值。以下数据类型都属于纯量
1 字符串 布尔值 整数 浮点数 Null
2 时间 日期
#数值直接以字面量的形式表示
number: 3.14
#布尔值用true和fa1se表示
isSet: true
#null用 ~ 表示
parent: ~
#时间采用 ISO8601 格式
iso8601:2025-7-11t20:00:00.10-05:00
#日期采用复合 iso8601 格式的年、月、日表示
date: 1990-07-10
#YAML 允许使用两个感叹号,强制转换数据类型
e: !!str 123
f: !!str true
字符串
字符串默认不使用引号表示
str: hello
如果字符串之中包含空格或特殊字符,需要放在引号之中
str: 'hello world'
单引号和双引号都可以使用,双引号不会对特殊字符转义
s1: '你好\n世界'
s2: "你好\n世界"
单引号之中如果还有单引号,必须连续使用两个单引号转义
str: 'let''s go'
字符串可以写成多行,从第二行开始,必须有一个单空格缩进。换行符会被转为 空格
str: 第一行
第二行
第三行
多行字符串可以使用|保留换行符,也可以使用>折叠换行(配置文件场景)
names: |
tom
jerry
jack
YAML资源对象描述方法
在kubernetes中,一般使用yaml格式的文件来创建符合我们预期期望的pod,这样的yaml文件称为资源 清单文件。
案例说明
查阅使用手册说明
kubectl explain
创建namespace
vim ns.yaml
#写入
apiVersion: v1
kind: Namespace
metadata:
name: web-test
创建pod资源
该配置包含Deployment和Service两部分。Deployment创建2个Tomcat Pod副本(使用官方镜像), Service通过NodePort类型将容器8080端口映射到主机30080端口,并通过8888服务端口暴露。访问方 式::
vim tomcat.yaml
#写入
apiVersion: v1
kind: ConfigMap
metadata:
name: tomcat-web-content
data:
index.html: |
<html><body><h1>Hello Tomcat!</h1></body></html>
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: tomcat-test
spec:
replicas: 2
selector:
matchLabels:
app: tomcat # 必须与template.metadata.labels完全匹配
template:
metadata:
labels:
app: tomcat # 必须与selector.matchLabels一致
spec:
securityContext:
runAsUser: 1000
fsGroup: 1000
containers:
- name: tomcat
image: tomcat:9.0.85-jdk11
imagePullPolicy: IfNotPresent
ports:
- containerPort: 8080
volumeMounts:
- name: tomcat-content
mountPath: /usr/local/tomcat/webapps/ROOT/index.html
subPath: index.html
volumes:
- name: tomcat-content
configMap:
name: tomcat-web-content
---
apiVersion: v1
kind: Service
metadata:
name: tomcat-service
spec:
type: NodePort
selector:
app: tomcat # 需与Pod标签匹配
ports:
#cluster-IP端口
- port: 80
#pod端口
targetPort: 8080
#对外访问端口
nodePort: 30080
创建资源
kubectl apply -f tomcat.yaml
查看资源
kubectl get deployment,pod,svc
在内部和外部分别测试访问
命名空间(Namespace)
作用
-
Namespace是对一组资源和对象的抽象集合。
-
常见的 pod,service,deployment 等都是属于某一个namespace的(默认是 default)。
-
不是所有资源都属于namespace,如nodes,persistent volume,namespace 等资源则不属于任 何namespace。
查看namespace
kubectl get namespaces
#namespaces可简写为ns
-
所有未指定Namespace的对象都会被默认分配在default命名空间
-
kube-public命名空间下的资源可以被所有人访问
-
所有由Kubernetes系统创建的资源都处于kube-system命名空间
查看namespace中的资源
使用kubectl get all --namespace=命名空间名称 可以查看此命名空间下的所有资源
kubectl get all --namespace=kube-system
查看所有pod资源
kubectl get pods -A
# A指所有命名空间
创建namespace
命令创建
kubectl create namespace web123
kubectl get ns
YAML文件创建
-
k8s中几乎所有的资源都可以通这YAML编排来创建
-
可以使用
kubectl edit 资源类型 资源名
编辑资源的YAML语法
kubectl edit namespaces web123
也可使用kubectl get 资源类型 资源名 -o yaml
来查看
kubectl get ns web123 -o yaml
- 还可通过 kubectl explain 资源类型 来查看语法文档
查看namespace相关语法参数
kubectl explain namespace
查看namespace下级metadata的相关语法参数
kubectl explain namespace.metadata
查看namespace下级metadata再下级name的相关语法参数
kubectl explain namespace.metadata.name
编写创建namespace的YAML文件
vim create_web2.yaml
#写入
apiVersion: v1 #api版本
kind: Namespace #类型为namespace
metadata: #定义namespace的元数据属性
name: web2 #定义name为web2
使用 kubctl apply -f 应用YAML文件
kubectl apply -f create_web2.yaml
删除namespace
注意:
-
删除一个namespace会自动删除所有属于该namespace的资源(类似MySQL中drop库会删除库里 的所有表一样,请慎重操作)
-
default,kube-system,kube-public命名空间不可删除
命令删除
kubectl delete namespaces web123
YAML文件删除
kubectl delete -f web123.yaml