k8s常用命令介绍
本文介绍了Kubernetes中Namespace、Pod、Deployment和Service的核心概念及常用命令。Namespace用于资源隔离,提供创建、查看、删除等操作命令;Pod作为最小部署单元,支持日志查看、容器交互等操作;Deployment管理Pod副本集,支持滚动更新、扩缩容和回滚;Service为Pod提供访问策略,包含ClusterIP、NodePort等类型。每个部分都提供
·
一、Namespace(命名空间)
1.1 基本概念
Namespace是Kubernetes中用于资源隔离的逻辑分组机制,它允许在同一个物理集群中创建多个虚拟集群。不同Namespace中的资源名称可以相同,这为多团队、多环境(如dev/staging/prod)共享集群提供了便利。
1.2 常用命令
创建Namespace
# 通过命令行直接创建
kubectl create namespace <namespace-name>
# 通过YAML文件创建
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Namespace
metadata:
name: <namespace-name>
EOF
查看Namespace
# 查看所有Namespace
kubectl get namespaces
# 或简写为
kubectl get ns
# 查看特定Namespace的详细信息
kubectl describe namespace <namespace-name>
删除Namespace
kubectl delete namespace <namespace-name>
在特定Namespace中执行命令
# 查看某Namespace下的所有资源
kubectl get all -n <namespace-name>
# 在特定Namespace中创建资源
kubectl apply -f <file.yaml> -n <namespace-name>
设置默认Namespace
# 查看当前上下文
kubectl config current-context
# 修改当前上下文的默认Namespace
kubectl config set-context --current --namespace=<namespace-name>
二、Pod(容器组)
2.1 基本概念
Pod是Kubernetes中最小的可部署单元,它包含一个或多个紧密关联的容器(通常是一个主容器和多个sidecar容器),共享存储、网络和运行规范。
2.2 常用命令
创建Pod
# 通过命令行直接创建
kubectl run <pod-name> --image=<image-name> --namespace=<namespace-name>
# 通过YAML文件创建
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
name: <pod-name>
namespace: <namespace-name>
spec:
containers:
- name: <container-name>
image: <image-name>
ports:
- containerPort: 80
EOF
查看Pod
# 查看所有Pod
kubectl get pods --all-namespaces
# 或简写为
kubectl get po -A
# 查看特定Namespace中的Pod
kubectl get pods -n <namespace-name>
# 查看Pod详细信息
kubectl describe pod <pod-name> -n <namespace-name>
# 查看Pod日志
kubectl logs <pod-name> -n <namespace-name>
# 查看多容器Pod中特定容器的日志
kubectl logs <pod-name> -c <container-name> -n <namespace-name>
与Pod交互
# 进入Pod中的容器
kubectl exec -it <pod-name> -n <namespace-name> -- /bin/bash
# 在多容器Pod中进入特定容器
kubectl exec -it <pod-name> -c <container-name> -n <namespace-name> -- /bin/bash
# 在Pod中执行命令
kubectl exec <pod-name> -n <namespace-name> -- <command>
删除Pod
kubectl delete pod <pod-name> -n <namespace-name>
调试命令
# 查看Pod的事件
kubectl get events -n <namespace-name>
# 查看Pod的资源使用情况
kubectl top pod <pod-name> -n <namespace-name>
三、Deployment(部署)
3.1 基本概念
Deployment是声明式管理Pod副本集的更高级抽象,它支持滚动更新、回滚、扩缩容等操作,是管理无状态应用的首选方式。
3.2 常用命令
创建Deployment
# 通过命令行创建
kubectl create deployment <deployment-name> --image=<image-name> -n <namespace-name>
# 通过YAML文件创建
cat <<EOF | kubectl apply -f -
apiVersion: apps/v1
kind: Deployment
metadata:
name: <deployment-name>
namespace: <namespace-name>
spec:
replicas: 3
selector:
matchLabels:
app: <app-label>
template:
metadata:
labels:
app: <app-label>
spec:
containers:
- name: <container-name>
image: <image-name>
ports:
- containerPort: 80
EOF
查看Deployment
# 查看所有Deployment
kubectl get deployments -A
# 或简写为
kubectl get deploy -A
# 查看特定Deployment的详细信息
kubectl describe deployment <deployment-name> -n <namespace-name>
# 查看Deployment关联的ReplicaSet
kubectl get replicasets -n <namespace-name>
# 查看Deployment关联的Pod
kubectl get pods -l app=<app-label> -n <namespace-name>
更新Deployment
# 更新镜像
kubectl set image deployment/<deployment-name> <container-name>=<new-image-name> -n <namespace-name>
# 编辑Deployment配置
kubectl edit deployment <deployment-name> -n <namespace-name>
# 应用YAML文件更新
kubectl apply -f <deployment-file.yaml> -n <namespace-name>
扩缩容
# 扩展副本数
kubectl scale deployment <deployment-name> --replicas=5 -n <namespace-name>
# 自动扩缩容(需安装metrics-server)
kubectl autoscale deployment <deployment-name> --min=2 --max=10 --cpu-percent=80 -n <namespace-name>
回滚与历史
# 查看发布历史
kubectl rollout history deployment/<deployment-name> -n <namespace-name>
# 回滚到上一个版本
kubectl rollout undo deployment/<deployment-name> -n <namespace-name>
# 回滚到特定版本
kubectl rollout undo deployment/<deployment-name> --to-revision=2 -n <namespace-name>
删除Deployment
kubectl delete deployment <deployment-name> -n <namespace-name>
四、Service(服务)
4.1 基本概念
Service是定义一组Pod访问策略的抽象,它为Pod提供稳定的IP地址和DNS名称,并实现负载均衡。主要类型包括:
- ClusterIP:默认类型,集群内部访问
- NodePort:通过节点端口暴露服务
- LoadBalancer:通过云提供商的负载均衡器暴露服务
- ExternalName:将服务映射到外部DNS名称
4.2 常用命令
创建Service
# 通过命令行创建
kubectl expose deployment <deployment-name> --type=ClusterIP --port=80 --target-port=8080 -n <namespace-name>
# 通过YAML文件创建
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Service
metadata:
name: <service-name>
namespace: <namespace-name>
spec:
selector:
app: <app-label>
ports:
- protocol: TCP
port: 80
targetPort: 8080
type: ClusterIP
EOF
查看Service
# 查看所有Service
kubectl get services -A
# 或简写为
kubectl get svc -A
# 查看特定Service的详细信息
kubectl describe service <service-name> -n <namespace-name>
# 查看Service的Endpoints(关联的Pod)
kubectl get endpoints <service-name> -n <namespace-name>
测试Service访问
# 在集群内部访问Service
kubectl run curl-test --image=radial/busyboxplus:curl -i --tty --rm
# 然后在容器内执行
curl http://<service-name>.<namespace-name>.svc.cluster.local
# 获取Service的ClusterIP
kubectl get svc <service-name> -n <namespace-name> -o jsonpath='{.spec.clusterIP}'
删除Service
kubectl delete service <service-name> -n <namespace-name>
特殊类型Service
NodePort
# 创建NodePort Service
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Service
metadata:
name: <service-name>
namespace: <namespace-name>
spec:
selector:
app: <app-label>
ports:
- protocol: TCP
port: 80
targetPort: 8080
type: NodePort
EOF
# 查看分配的节点端口
kubectl get svc <service-name> -n <namespace-name> -o jsonpath='{.spec.ports[0].nodePort}'
LoadBalancer
# 创建LoadBalancer Service(需云提供商支持)
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Service
metadata:
name: <service-name>
namespace: <namespace-name>
spec:
selector:
app: <app-label>
ports:
- protocol: TCP
port: 80
targetPort: 8080
type: LoadBalancer
EOF
# 查看外部IP(可能需要等待云提供商分配)
kubectl get svc <service-name> -n <namespace-name> -w
五、Ingress(入口)
5.1 基本概念
Ingress是管理外部访问集群服务的API对象,通常通过HTTP/HTTPS路由提供。它需要与Ingress Controller(如Nginx、Traefik、ALB等)配合使用,实现:
- 基于主机名或路径的路由
- TLS终止
- 负载均衡
- 虚拟主机支持
5.2 常用命令
创建Ingress
# 通过YAML文件创建(需要先安装Ingress Controller)
cat <<EOF | kubectl apply -f -
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: <ingress-name>
namespace: <namespace-name>
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- host: <your-domain.com>
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: <service-name>
port:
number: 80
EOF
# 创建带TLS的Ingress
cat <<EOF | kubectl apply -f -
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: <ingress-name>
namespace: <namespace-name>
spec:
tls:
- hosts:
- <your-domain.com>
secretName: <tls-secret-name>
rules:
- host: <your-domain.com>
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: <service-name>
port:
number: 80
EOF
查看Ingress
# 查看所有Ingress
kubectl get ingress -A
# 或简写为
kubectl get ing -A
# 查看特定Ingress的详细信息
kubectl describe ingress <ingress-name> -n <namespace-name>
管理TLS证书
# 创建TLS Secret(需要已有证书文件)
kubectl create secret tls <tls-secret-name> \
--cert=<path-to-cert.pem> \
--key=<path-to-key.pem> \
-n <namespace-name>
# 查看TLS Secret
kubectl get secret <tls-secret-name> -n <namespace-name> -o yaml
删除Ingress
kubectl delete ingress <ingress-name> -n <namespace-name>
常见Ingress Controller相关命令
Nginx Ingress Controller
# 安装Nginx Ingress Controller(使用Helm)
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm install ingress-nginx ingress-nginx/ingress-nginx -n ingress-nginx --create-namespace
# 查看Ingress Controller Pod
kubectl get pods -n ingress-nginx
# 查看Ingress Controller日志
kubectl logs -l app.kubernetes.io/name=ingress-nginx -n ingress-nginx
测试Ingress
# 获取Ingress Controller的外部IP(可能需要根据部署方式调整)
kubectl get svc ingress-nginx-controller -n ingress-nginx
# 临时添加本地hosts解析(如果使用域名)
echo "$(kubectl get svc ingress-nginx-controller -n ingress-nginx -o jsonpath='{.status.loadBalancer.ingress[0].ip}') <your-domain.com>" | sudo tee -a /etc/hosts
# 测试访问
curl http://<your-domain.com>
六、综合示例
6.1 完整应用部署流程
# 1. 创建Namespace
kubectl create namespace my-app
# 2. 创建Deployment
cat <<EOF | kubectl apply -f -
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
namespace: my-app
spec:
replicas: 3
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
containers:
- name: my-app
image: nginx:1.21
ports:
- containerPort: 80
EOF
# 3. 创建Service
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Service
metadata:
name: my-app
namespace: my-app
spec:
selector:
app: my-app
ports:
- protocol: TCP
port: 80
targetPort: 80
type: ClusterIP
EOF
# 4. 创建Ingress
cat <<EOF | kubectl apply -f -
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-app
namespace: my-app
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- host: my-app.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: my-app
port:
number: 80
EOF
# 5. 验证所有资源
kubectl get all,ingress -n my-app
更多推荐



所有评论(0)