一、命令式对象管理
1、命名空间管理
命名空间用于集群资源隔离,不同 namespace 资源相互隔离。
bash
# 查看命名空间
kubectl get namespaces
# 创建命名空间
kubectl create namespace timinglee
# 删除命名空间(会删除该命名空间下全部资源)
kubectl delete namespaces timinglee
2、Pod 基础管理
Pod 是 k8s 最小调度单元,一个 Pod 可以包含一个或多个容器。
bash
# 查看pod,-o wide显示节点、IP信息
kubectl get pods -o wide
# 创建pod
kubectl run lee --image nginx:latest
# 删除pod
kubectl delete pods lee
# 删除default命名空间下所有pod
kubectl delete pods --all
Pod 异常排查
镜像不存在会出现ImagePullBackOff状态
bash
# 查看pod详细事件,定位报错
kubectl describe pods error
常见报错:Failed to pull image xxx:not found,代表镜像仓库找不到对应镜像,检查镜像名称、镜像仓库地址。
二、kubectl 核心命令实操
bash
kubectl patch deployments.apps webcluster -p '{"spec":{"replicas":1}}'
前置准备:上传镜像到私有 Harbor 仓库
bash
docker load -i myapp.tar.gz
docker tag timinglee/myapp:v1 reg.timinglee.org/library/myapp:v1
docker push reg.timinglee.org/library/myapp:v1
docker tag timinglee/myapp:v2 reg.timinglee.org/library/myapp:v2
docker push reg.timinglee.org/library/myapp:v2
1、create:命令式创建资源
bash
# 创建deployment,2副本
kubectl create deployment webcluster --replicas 2 --image myapp:v1
# 查看deployment
kubectl get deployments.apps
# 删除deployment
kubectl delete deployments.apps webcluster
2、edit:直接编辑在线资源 yaml
直接修改集群中运行的资源配置,保存立即生效
bash
kubectl create deployment webcluster --image myapp:v1
# 修改副本数replicas
kubectl edit deployments.apps webcluster
3、patch:补丁方式修改资源
不需要完整 yaml,只提交需要修改的字段
bash
kubectl patch deployments.apps webcluster -p '{"spec":{"replicas":1}}'
4、expose:创建 Service 暴露应用
bash
# 创建ClusterIP类型service,端口80,后端容器80
kubectl expose deployment webcluster --port 80 --target-port 80
# 查看service
kubectl get service
# 查看service详细信息,查看Endpoints后端pod列表
kubectl describe svc webcluster
# 集群内访问服务
curl 10.97.61.108/hostname.html
5、logs:查看容器日志
bash
kubectl logs pods/webcluster-77c87d9946-gh9v7
6、attach:连接容器标准输出
bash
kubectl attach pods/testpod -it
7、exec:进入容器执行命令(最常用)
bash
# 进入pod容器,多容器需要 -c 指定容器名
kubectl exec -it pods/testpod -c testpod -- /bin/bash
8、cp:宿主机与 pod 容器之间拷贝文件
bash
# 容器文件下载到宿主机
kubectl cp testpod:/usr/share/nginx/html/index.html /mnt/test
# 宿主机文件上传到容器
kubectl cp /mnt/index.html testpod:/usr/share/nginx/html/index.html
9、rollout:版本滚动管理
bash
# 查看发布状态
kubectl rollout status deployment webcluster
# 重启deployment,全部pod重建
kubectl rollout restart deployment webcluster
10、scale:扩缩副本数量
bash
# 扩容到4个副本
kubectl scale deployment webcluster --replicas 4
# 缩容到1个副本
kubectl scale deployment webcluster --replicas 1
11、label:管理资源标签
标签是 k8s 筛选资源的核心
bash
# 显示标签
kubectl get pods --show-labels
# 添加标签
kubectl label pods webcluster-9787d97f6-zl6q2 app=webcluster
# 删除标签,标签名后加减号
kubectl label pods webcluster-9787d97f6-zl6q2 app-
三、Deployment 控制器版本更替(滚动更新 & 回滚)
前提 harbor 仓库 library 项目存在
myapp:v1、myapp:v2镜像
1)编写 yaml 创建 deployment
bash
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: webcluster
name: webcluster
spec:
replicas: 2
selector:
matchLabels:
app: webcluster
template:
metadata:
labels:
app: webcluster
spec:
containers:
- image: myapp:v1
name: myapp
bash
# 导出yaml方式
kubectl create deployment webcluster --image myapp:v1 --replicas 2 --dry-run=client -o yaml > webcluster.yml
kubectl apply -f webcluster.yml
# 暴露为NodePort,外部可以访问
kubectl expose deployment webcluster --port 80 --target-port 80 --type NodePort
# 查看版本历史
kubectl rollout history deployment webcluster
2)业务版本升级
bash
# 修改镜像版本为v2
kubectl set image deployments webcluster myapp=myapp:v2
# 记录更新原因,写入revision历史
kubectl annotate deployment webcluster kubernetes.io/change-cause="myappv2" --overwrite
3)版本回退
bash
# 回退到指定revision版本
kubectl rollout undo deployment webcluster --to-revision=1
四、YAML 声明式编写 Pod
1、Pod 多容器
一个 Pod 运行多个容器,pod 内容器共享网络,可以 127.0.0.1 互相访问
bash
apiVersion: v1
kind: Pod
metadata:
labels:
run: testpod
name: testpod
spec:
containers:
- image: myapp:v1
name: myapp1
- image: busyboxplus:latest
name: busybox
command:
- /bin/sh
- -c
- sleep 10000
2、hostPort 节点端口映射
将容器端口映射到宿主机节点端口
bash
apiVersion: v1
kind: Pod
metadata:
labels:
run: testpod
name: testpod
spec:
containers:
- image: myapp:v1
name: myapp1
ports:
- name: http
containerPort: 80
hostPort: 80
protocol: TCP
3、环境变量 env 注入
bash
apiVersion: v1
kind: Pod
metadata:
labels:
run: mysql
name: mysql
spec:
containers:
- image: mysql:8.0
name: mysql8
env:
- name: MYSQL_ROOT_PASSWORD
value: lee
4、nodeSelector 指定调度节点
根据节点标签,强制 pod 调度到指定节点
bash
spec:
nodeSelector:
kubernetes.io/hostname: k8s-node2
5、hostNetwork 共享宿主机网络
Pod 直接复用节点网络栈,PodIP = 节点 IP
bash
apiVersion: v1
kind: Pod
metadata:
labels:
run: testpod
name: testpod
spec:
hostNetwork: true
containers:
- image: busybox:latest
name: busybox
command:
- /bin/sh
- -c
- sleep 10000
6、Pod QoS 资源优先级
集群节点资源不足时,k8s 会驱逐低优先级 Pod
| QoS 类型 | 配置说明 | 优先级 |
|---|---|---|
| BestEffort | 不配置 requests、limits | 最低,优先被驱逐 |
| Burstable | requests≠limits | 中等 |
| Guaranteed | requests=limits | 最高,最后驱逐 |
示例 Burstable:
bash
resources:
limits:
cpu: 700m
memory: 200M
requests:
cpu: 500m
memory: 100M
示例 Guaranteed:
bash
resources:
limits:
cpu: 500m
memory: 100M
requests:
cpu: 500m
memory: 100M
7、restartPolicy 容器重启策略
Always:容器退出永远重启,Deployment 默认策略OnFailure:异常退出(非 0 退出码)才重启Never:无论什么退出,绝不重启
bash
spec:
restartPolicy: OnFailure
五、Pod 生命周期与探针
1、init 容器
Init 容器会在业务容器启动前顺序执行,init 容器全部执行完成后才启动业务容器。常用于等待依赖服务、初始化配置。
bash
apiVersion: v1
kind: Pod
metadata:
labels:
run: webserver
name: webserver
spec:
initContainers:
- name: busybox
image: busybox:latest
command:
- /bin/sh
- -c
- "until test -e /testfile;do echo wating for myservice; sleep 2;done"
containers:
- image: myapp:v1
name: webserver
restartPolicy: Always
2、livenessProbe 存活探针
检测容器是否正常运行,如果探针失败,k8s 直接重启容器。 示例 tcpSocket 探测 80 端口:
bash
containers:
- image: myapp:v1
name: testpod
livenessProbe:
tcpSocket:
port: 80
initialDelaySeconds: 3 # 启动后等待3s开始探测
periodSeconds: 1 # 探测间隔
timeoutSeconds: 1 # 探测超时时间
3、readinessProbe 就绪探针
检测业务是否就绪,探针失败会将 pod 从 service 的 endpoints 摘除,不再接收流量;不会重启 Pod。
bash
containers:
- image: myapp:v1
name: webserver
readinessProbe:
httpGet:
path: /index.html
port: 80
initialDelaySeconds: 3
periodSeconds: 2
timeoutSeconds: 1
两者区别总结: liveness:容器挂掉,直接重启容器;readiness:业务没准备好,摘掉流量,不重启。