基础操作
文章目录
- 基础操作
- 一、创建Kubernetes对象
- 1.使用指令式命令创建Deployment
- 2.使用指令式对象配置创建Deployment
- 3.使用声明式对象配置创建Deployment
- 二、操作对象的标签
- 1.为对象添加标签
- 2.修改对象的标签
- 3.删除对象标签
- 4.操作具有指定标签的对象
- 三、操作名称空间
- 四、kubectl常用命令
一、创建Kubernetes对象
在master节点操作
1.使用指令式命令创建Deployment
kubectl create deployment nginx --image nginx:1.14.2
//基于nginx镜像创建deployment
kubectl get deployment //查看该deployment是否创建成功,可以发现存在了一个副本
kubectl get pod //查看pod进行验证
kubectl delete deployment nginx //删除对象
kubectl get deployment //再次验证
kubectl get pod
为什么创建deployment后会默认生成pod
因为当你创建一个Deployment时,实际上是告诉Kubernetes(一个容器编排平台)你需要运行多少个实例(副本)的应用程序
k8s为了去运行应用程序 会默认生成pod以运行
2.使用指令式对象配置创建Deployment
vi nginx-deployment.yaml
# 必需字段,声明对象使用的API版本
apiVersion: apps/v1
# 必需字段,声明要创建的对象的类别
kind: Deployment
# 必需字段,定义对象的元信息,包括对象名称、使用的标签等
metadata:
name: nginx-deployment
# 必需字段,声明对象的期望状态,如使用的镜像、副本数等
spec:
selector:
matchLabels:
app: nginx
replicas: 3 # 运行3个与该模板匹配的Pod
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
kubectl create -f nginx-deployment.yaml //基于yaml配置文件创建Deployment
kubectl get deployment //按照yaml文件的定义,创建了3个副本的deployment和pod
kubectl get pod
kubectl delete -f nginx-deployment.yaml //基于配置文件删除deployment
kubectl get deployment
kubectl get pod
可以看到在我删除deployment后 pod不会马上被删除
这是因为 Pod 的生命周期中,Kubernetes 会先发送一个 SIGTERM 信号给 Pod 中的容器,通知它们开始优雅地退出,然后等待一段时间,最后才会发送 SIGKILL 信号强制销毁 Pod
3.使用声明式对象配置创建Deployment
vi nginx-deployment.yaml
# 必需字段,声明对象使用的API版本
apiVersion: apps/v1
# 必需字段,声明要创建的对象的类别
kind: Deployment
# 必需字段,定义对象的元信息,包括对象名称、使用的标签等
metadata:
name: nginx-deployment
# 必需字段,声明对象的期望状态,如使用的镜像、副本数等
spec:
selector:
matchLabels:
app: nginx
replicas: 4 # 运行4个与该模板匹配的Pod
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
kubectl apply -f nginx-deployment.yaml //应用修改后的配置
kubectl get deployment
kubectl get pod
kubectl delete -f nginx-deployment.yaml
kubectl get deployment
kubectl get pod
kubectl create即(指令式命令)和kubectl apply(声明式命令)的区别在于前者只能创建对象,而后者可以创建和更新对象。如果对象已经启动并运行,并且在yaml配置文件中做了更改,此时使用kubectl create命令将失败,但使用kubectl apply命令则会更新对象。kubectl apply只能创建或更新对象,不能删除对象,删除对象使用kubectl delete。
二、操作对象的标签
1.为对象添加标签
kubectl run nginx-a --image=nginx -l app=nginx //创建名为nginx-a的Pod并为其添加标签app=nginx
vi nginx-label.yaml //编写Pod配置文件nginx-label.yaml
apiVersion: v1
kind: Pod
metadata:
name: nginx-b
labels: # 为Pod设置两个Label
app: nginx
env: prod
spec:
containers:
- name: nginx
image: nginx
//此配置文件定义名为nginx-b的Pod并为其添加两个标签app=nginx、env=pod。
kubectl create -f nginx-label.yaml //基于配置文件创建pod
kubectl get pod --show-labels //添加标签后,查看pod的标签带上选项,可以发现标签
kubectl label pod nginx-a env=test version=0.9 //对于现有的pod,可以直接使用kubectl label添加标签
kubectl get pod -L env,version //可以通过-L选项来查询指定键的标签
2.修改对象的标签
对于对象的现有标签,使用kubectl label命令加上–overwrite选项即可修改
kubectl label pod nginx-a env=debug --overwrite
kubectl get pod nginx-a --show-labels
3.删除对象标签
使用kubectl label命令时在标签键后面加一个减号即可删除对象的指定标签
kubectl label pod nginx-a version-
kubectl get pod nginx-a --show-labels
4.操作具有指定标签的对象
可以通过-l选项来筛选具有指定标签的对象
kubectl delete pod -l app=nginx
kubectl get pod
三、操作名称空间
名称空间是什么:
名称空间(Namespace)用于将集群中的资源划分为逻辑组,以便更好地管理和隔离不同的项目
例如,你可以在一个名称空间中有一个名为 "my-app" 的服务,而在另一个名称空间中也有一个名为 "my-app" 的服务,它们可以独立运行,不会相互干扰。
kubectl get namespaces //查看集群中所有名称空间列表
NAME STATUS AGE
default Active 54m //默认名称空间
kube-node-lease Active 54m //用于与各节点相关的租约对象
kube-public Active 54m //主要由集群使用
kube-system Active 54m //系统创建对象所用的名称空间
vi test-ns.yaml //可以通过编写配置文件创建名称空间
apiVersion: v1
kind: Namespace
metadata:
name: test-ns
kubectl create -f test-ns.yaml //执行基于yaml文件创建名称空间
kubectl create namespace test2 //也可以通过命令直接创建名称空间
kubectl get namespaces
//如果不明确指定,将操作默认的名称空间default。需要在特定的名称空间操作时,可以在kubectl命令中通过-n(或--namespace)选项指定。
kubectl create -f nginx-deployment.yaml -n test1 //基于nginx的yaml文件在test1中创建
kubectl get deployment -n test1 //查看该deployment及其关联的pod
kubectl delete -f nginx-deployment.yaml -n test1 //删除也需要指定名称空间
四、kubectl常用命令
1. 查询资源
(1) 通用查询
kubectl get [type] [name] [flags]
示例:
列出所有 Pod:
kubectl get pods
查看某个命名空间的所有 Pod:
kubectl get pods -n <namespace>
查看所有命名空间的 Pod:
kubectl get pods --all-namespaces
查看某个 Deployment:
kubectl get deployment <deployment-name>
(2) 详细描述资源
kubectl describe [type] [name]
示例:
查看 Pod 的详细信息:
kubectl describe pod <pod-name>
(3) 使用 JSONPath 查询特定字段
kubectl get [type] -o jsonpath='{path}'
示例:
获取某命名空间的服务列表:
kubectl get service -n my-namespace -o jsonpath='{.items[*].metadata.name}'
2. 创建资源
(1) 从 YAML 文件创建
kubectl create -f [filename]
示例:
从 nginx-deployment.yaml 文件创建资源:
kubectl create -f nginx-deployment.yaml
(2) 直接在命令行创建
kubectl create [type] [name]
创建单个 Pod:
kubectl create deployment nginx --image=nginx
(3) 使用自动扩容
kubectl autoscale deployment <deployment-name> --min=<min> --max=<max>
自动扩展 Deployment 名为 foo,最小 2,最大 10:
kubectl autoscale deployment foo --min=2 --max=10
3. 更新资源
(1) 使用 YAML 文件更新
kubectl apply -f [filename]
示例:
更新 Deployment:
kubectl apply -f deployment.yaml
(2) 滚动更新镜像版本
kubectl set image deployment/<deployment-name> <container-name>=<new-image>
示例:
更新 Deployment 的镜像:
kubectl set image deployment/frontend www=image:v2
(3) 强制替换资源
kubectl replace --force -f [filename]
示例:
强制替换 Pod 资源:
kubectl replace --force -f ./pod.json
4. 删除资源
kubectl delete [type] [name] [flags]
示例:
删除某个命名空间的 Pod:
kubectl delete pod <pod-name> -n <namespace>
立即强制删除 Pod:
kubectl delete pod <pod-name> --grace-period=0 --force
5. 与运行时交互
(1) 查看日志
kubectl logs [pod-name] [-c container-name] [--previous]
示例:
查看某个 Pod 的日志:
kubectl logs my-pod
(2) 执行命令
kubectl exec [pod-name] [-c container-name] -- [command]
示例:
在容器内执行 ls 命令:
kubectl exec my-pod -c my-container -- ls /
(3) 转发端口
kubectl port-forward [pod-name] [local-port]:[remote-port]
示例:
将本地端口 5000 转发到 Pod 的端口 6000:
kubectl port-forward my-pod 5000:6000
6. 其他常用操作
(1) 进入上下文或命名空间
kubectl config use-context <context-name>
kubectl config set-context --current --namespace=<namespace>
示例:
切换到默认命名空间 default:
kubectl config set-context --current --namespace=default
(2) 查看集群信息
kubectl cluster-info
kubectl top pod
kubectl top node
示例:
查看集群节点的资源使用情况:
kubectl top node
(3) 探索 API 资源
kubectl api-resources
示例:
列出所有支持的资源类型:
kubectl api-resources