k8s常用命令

集群管理

1. 查看集群节点状态:

1
$kubectl get nodes

2. 查看集群资源使用情况:

1
$kubectl top nodes

3. 查看集群信息:

1
$kubectl cluster-info

4. 获取节点详细信息:

1
$kubectl describe node <node-name>

5. 给节点打标签:

1
$kubectl label nodes <node-name> key=value

6. 取消节点标签:

1
$kubectl label nodes <node-name> key-

7. 查看所有命名空间

1
$kubectl get ns

8. 查看命名空间信息:

1
$kubectl describe namespace <namespace-name>

Pod管理

k8s中最小的可部署的计算单元,用来封装一个或多个紧密相关的容器应用,共享存储和网络。

1. 列出所有Pod:

1
2
$kubectl get pods      #无命名空间情况下
$kubectl get pods -n <namespace> #有命名空间情况下

2. 查看特定Pod的日志:

1
2
3
$kubectl logs <pod-name> -n <namespace>    #打印当前日志
$kubectl logs -f <pod-name> -n <namespace> #持续打印日志
$kubectl logs -f --tail 200 <pod-name> -n <namespace> #持续打印日志且打印200行

3. 运行一个临时的Pod:

1
$kubectl run my-pod --image=nginx

4. 进入正在运行的Pod:

1
2
$kubectl exec -it <pod-name> -n <namespace> -- /bin/bash
$ kubectl exec -it <pod-name> -n <namespace> -- ls /etc/ #不进入pod,直接执行pod中的命令

5. 查看特定Pod的详细信息:

1
$kubectl describe pod <pod-name> -n <namespace>

6. 删除Pod:

1
2
$kubectl delete pod <pod-name> -n <namespace>
$kubectl delete pod <pod-name> -n <namespace> --force --grace-period=0 #强制删除

7. 查看Pod事件:

1
$kubectl describe pod <pod-name> -n <namespace> | grep -i events

Deployment管理

用于管理Pod的声明式更新,自动处理Pod的创建、升级、回滚等,保证预期状态。

1. 列出所有Deployments:

1
2
$kubectl get deployments  
$kubectl get deployments -n <namaspace>

2. 查看特定Deployment的详细信息:

1
$kubectl describe deployment <deployment-name> -n <namespace>

3. 创建Deployment:

1
2
$kubectl create deployment <deployment-name> --image=<container-image>
$kubectl create deployment my-deployment --image=nginx

4. 更新Deployment中的容器镜像:

1
2
$kubectl set image deployment/<deployment-name> <container-name>=<new-container-image> -n <namespace>
$kubectl set image deployment/my-deployment nginx=nginx:latest -n <namespace>

5. 回滚Deployment到上一个版本:

1
$kubectl rollout undo deployment/my-deployment -n <namespace>

6. 查看Deployment的更新历史:

1
$kubectl rollout history deployment <deployment-name> -n <namespace>

7. 回滚到指定版本的Deployment:

1
2
# 假设要回滚到第3次修订版:
$kubectl rollout undo deployment <deployment-name> -n <namespace> --to-revision=3

8. 查看Deployment指定标签下的的Pods状态

1
$kubectl get pods -l app=<deployment-label> -n <namespace>

9. 查看Deployment的事件:

1
$kubectl describe deployment <deployment-name> -n <namespace> | grep -i events

10. 监控Deployment的更新进度:

1
$kubectl rollout status deployment <deployment-name> -n <namespace>

11. 扩大或缩小副本数量:

1
$kubectl scale deployment <deployment-name> -n <namespace> --replicas=5

12. 删除Deployment:

1
$kubectl delete deployment <deployment-name> -n <namespace>

Service管理

定义一种访问Pod的策略和抽象层,提供稳定的访问入口,实现服务发现与负载均衡。

1. 列出所有Services:

1
2
$kubectl get services <-n> <namespace>
$kubectl get services <-n> <namespace> -o wide

2. 查看特定Service的详细信息:

1
$kubectl describe service <service-name> -n <namespace>

3. 创建Service:

可以直接通过命令行或者YAML文件创建:

1
$kubectl create service clusterip my-service --tcp=80:8080

4. 暴露Deployment为Service:

自动创建Service指向Deployment的所有Pods:

1
$kubectl expose deployment <deployment-name> <-n> <namespace> --type=LoadBalancer --port=80 --target-port=8080

5. 编辑Service配置:

1
$kubectl edit service <service-name> -n <namespace>

6. 更改Service类型:

1
$kubectl patch service <service-name> <-n> <namespace> -p '{"spec": {"type": "NodePort"}}'

7. 删除Service:

1
$kubectl delete service <service-name> -n <namespace>

8. 创建ClusterIP类型的service:

ClusterIP为Service分配一个仅集群内部可访问的IP地址。

1
2
# 命令行创建:
$kubectl create service clusterip my-service --tcp=80:8080

基于server.yaml文件创建service

kubectl apply -f server.yaml

1
2
3
4
5
6
7
8
9
10
11
12
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
selector:
app: MyApp
ports:
- protocol: TCP
port: 80
targetPort: 8080
type: ClusterIP

9. 创建NodePort类型的service:

NodePort会在每个节点上开放一个静态端口,供外部访问集群内部的服务。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

# 命令行创建:
kubectl expose deployment my-deployment --type=NodePort --port=80 --target-port=8080

# 基于yaml文件创建:
$kubectl apply -f xxx.yaml

apiVersion: v1
kind: Service
metadata:
name: my-service-nodeport
spec:
selector:
app: MyApp
ports:
- protocol: TCP
port: 80
targetPort: 8080
nodePort: 30080 # 指定节点上的端口
type: NodePort

10. 创建LoadBalancer类型的service:

适用于需要云提供商的负载均衡器来暴露服务的情况。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 命令行创建:
kubectl expose deployment my-deployment --type=LoadBalancer --port=80 --target-port=8080
# 基于yaml文件创建:
apiVersion: v1
kind: Service
metadata:
name: my-service-loadbalancer
spec:
selector:
app: MyApp
ports:
- protocol: TCP
port: 80
targetPort: 8080
type: LoadBalancer

PV/PVC管理

Persistent Volumes (PVs) 提供了持久化的存储资源,PV类型多种多样,支持不同的存储后端,如本地存储、网络存储(如NFS、GlusterFS、Ceph等)。

1. 列出所有PV:

1
$kubectl get pv -n <namespace>

2. 查看PV详细信息:

1
$kubectl describe pv <pv-name> -n <namespace>

3. 创建本地PV:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

apiVersion: v1
kind: PersistentVolume
metadata:
name: local-pv-example
spec:
capacity:
storage: 10Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
storageClassName: local-storage
local:
path: /mnt/data
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- node01 # 指定节点名称

4. 创建NFS PV:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
apiVersion: v1
kind: PersistentVolume
metadata:
name: nfs-pv-example
spec:
capacity:
storage: 10Gi
accessModes:
- ReadWriteMany
persistentVolumeReclaimPolicy: Recycle
storageClassName: nfs
nfs:
server: <nfs-server-ip> # nfs服务ip
path: "/exports/data" # nfs共享目录

5. 列出所有PVC:

1
$kubectl get pvc -n <namespace>

6. 查看PVC详细信息:

1
$kubectl describe pvc <pvc-name> -n <namespace>

7. 创建PVC:

1
2
3
4
5
6
7
8
9
10
11
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: myclaim
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 5Gi
storageClassName: local-storage # 或 nfs,需与PV的storageClassName匹配

ConfigMap管理

用来存储配置数据,如应用的配置文件,以键值对形式挂载到Pod中,方便应用程序读取和分离配置与代码。

1. 创建ConfigMap:

1
2
3
4
#文件名当键,文件内容当值
$kubectl create configmap nginx-config --from-file=./www.conf
#指定某个目录为配置文件目录
$kubectl create configmap ops-metrics-config -n ops-system --from-file=configmap/ops-metrics

2. 查看ConfigMap

1
$kubectl get configmaps -n <namespace>

3. 删除ConfigMap:

1
$kubectl delete configmap  <my-configmap> -n <namespace>