一.Kubectl 基础命令
格式: kubectl [command] [TYPE] [NAME] [FLAGS]
kubectl
是 Kubernetes 的命令行工具,用于管理 Kubernetes 集群。以下是一些常用的 kubectl
命令及其选项:
常用命令
-
获取资源
- 列出所有资源类型(Pods、Deployments、Services 等):
kubectl get all
- 获取特定资源的详细信息:
kubectl api-resources
kubectl get pods
kubectl get deployments
kubectl get services
kubectl get svc
- 获取资源的详细信息:
kubectl describe pod <pod-name>
kubectl describe deployment <deployment-name>
- 查看集群版本
kubectl version
-
创建和应用资源
- 从 YAML 文件创建资源:
kubectl create -f <file.yaml>
- 更新或应用资源:
kubectl apply -f <file.yaml>
- 创建特定资源:
kubectl create deployment <deployment-name> --image=<image>
kubectl create service clusterip <service-name> --tcp=<port>:<target-port>
-
删除资源
删除资源:
kubectl delete pod <pod-name>
kubectl delete deployment <deployment-name>
kubectl delete -f <file.yaml>
-
查看日志
- 查看 Pod 的日志:
kubectl logs <pod-name>
- 查看某个容器的日志(如果 Pod 中有多个容器):
kubectl logs <pod-name> -c <container-name>
-
执行命令
- 在 Pod 中执行命令:
kubectl exec -it <pod-name> -- /bin/bash
-
集群和上下文管理
- 查看当前上下文:
kubectl config current-context
- 列出所有上下文:
kubectl config get-contexts
- 切换上下文:
kubectl config use-context <context-name>
-
滚动更新
- 更新 Deployment:
kubectl rollout restart deployment <deployment-name>
- 查看滚动更新状态:
kubectl rollout status deployment <deployment-name>
-
集群健康检查
- 获取集群状态:
kubectl cluster-info
- 检查节点状态:
kubectl get nodes
常用选项
-n
或--namespace
:指定命名空间。例如:
kubectl get pods -n <namespace>
-o
或--output
:指定输出格式,如json
、yaml
、wide
、name
等。例如:
kubectl get pods -o wide kubectl get pods -o json
--selector
:按标签选择资源。例如:
kubectl get pods --selector=app=<label>
-o wide 或 --output=wide
提供更详细的信息,包含额外的列,如节点 IP、容器状态等。
kubectl get pods -o wide
kubectl get nodes -o wide
-o json
将输出格式化为 JSON 格式。这适合需要机器解析的情况。
kubectl get pod nginx11 -o json
-o yaml
将输出格式化为 YAML 格式。这适合需要人类阅读的详细格式。
kubectl get pod nginx11 -o yaml
kubectl get pod kube-system-sddcd -n kube-system -o yaml
-o name
仅输出对象的名称,适合在脚本中使用。
kubectl get pod -o name
-f
或--filename
:指定文件路径(通常用于创建或更新资源)。例如:
kubectl apply -f <file.yaml>
--context
:指定集群上下文。例如:
kubectl get pods --context=<context-name>
--kubeconfig
:指定 kubeconfig 文件的路径。例如:
kubectl get pods --kubeconfig=<path-to-kubeconfig>
这些是 kubectl
的一些基本命令和选项,可以帮助你管理和操作 Kubernetes 集群。根据需要,你还可以查看 kubectl
的帮助文档,以了解更多详细信息和高级功能:
kubectl --help
二.Kubectl执行yaml文件
yaml文件介绍
在使用 kubectl apply -f 命令执行 YAML 文件时,确保文件格式正确是很重要的。Kubernetes YAML 文件遵循一定的格式规范,下面是 YAML 文件的一些基本结构和格式要求:
基本结构
一个典型的 Kubernetes YAML 文件包含以下部分:
apiVersion: 定义资源的 API 版本。
kind: 资源的类型(如 Pod、Deployment、Service 等)。
metadata: 资源的元数据,如名称、标签等。
spec: 资源的规格定义,具体内容依据资源类型而不同。
示例 YAML 文件
以下是一些常见资源类型的 YAML 文件示例:
1. Pod
apiVersion: v1
kind: Pod
metadata:
name: my-pod
labels:
app: my-app
spec:
containers:
- name: my-container
image: nginx:1.14.2
ports:
- containerPort: 80
2. Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
3. Service
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
selector:
app: nginx
ports:
- protocol: TCP
port: 80
targetPort: 80
type: LoadBalancer
格式要求
缩进: YAML 文件使用空格进行缩进,通常每级缩进两个空格。请不要使用制表符(Tab)进行缩进。
空行: 不建议在文件中使用多余的空行,尽量保持文件的简洁和清晰。
键值对: 键和值之间用冒号 : 隔开,冒号后面需要有一个空格。
列表项: 列表项前面用连字符 - 和一个空格。
多文档文件: 如果在一个文件中定义多个资源,可以使用 — 分隔每个文档。例如:
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: my-container
image: nginx
---
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
ports:
- port: 80
targetPort: 80
验证 YAML 文件
在应用 YAML 文件之前,你可以使用以下命令检查文件的语法是否正确:
kubectl apply --dry-run=client -f your-file.yaml
这个命令不会实际应用资源,只会验证 YAML 文件的格式和语法是否正确。
总结
确保你的 YAML 文件符合上述格式要求,并且每个部分都正确配置。遵循这些规则可以帮助避免在执行 kubectl apply 时遇到格式错误。如果你有任何特定的 YAML 文件或格式问题,可以提供更多细节,以便获得更具体的帮助。
实战示例
编辑yaml文件拉取apline镜像
apiVersion: v1
kind: Pod
metadata:
name: alpine
spec:
containers:
- name: alpine
image: alpine:latest
imagePullPolicy: Never
command: ["/bin/sh"]
args: ["-c","while true; do echo hello; sleep 10; done"]
## imagePul1Policy有三个取值
# Always 每次都下载最新镜像
#Never不会尝试获取镜像,如果镜像已经以某种方式存在本地,kubelet 尝试启动容器;否则,会启动失败
#IfNotPresent 只有当镜像在本地不存在时才会拉取
并 默认镜像拉取策略:
#当你(或控制器)向API服务器提交一个新的Pod时,你的集群会在满足特定条件时设置imagePu11Policy字段
# 如果你省略了
imagePul1Policy字段,并且容器镜像的标签是:latest,imagePul1Policy会自动设置为Always
#如果你省略了imagePul1Policy字段,并且没有指定容器镜像的标签,imagePu11Policy会自动设置为Alweys
#如果你省略了imagePul1Policy字段,并且为容器镜像指定了非:1atest的标签,imagePul1Policy 就会自动设置为IfNotPresent
编辑yaml文件拉取nginx镜像
apiVersion: v1
kind: Pod
metadata:
name: nginx33
spec:
containers:
- name: nginx33
image: harbor.hiuiu.com/basic_image/centos7_filebeat_nginx:2408.u
imagePullPolicy: Never
ports:
- containerPort: 80
command: ["/bin/sh"]
args: ["-c","while true; do echo hello; sleep 10; done"]
进入容器
kubectl exec nginx33 -it bash
#进入容器开启nginx
nginx
exit
真机ping pod
三.管理命名空间
1.列出所有命名空间
要列出集群中所有的命名空间,你可以使用以下命令:
kubectl get namespaces
#简写
kubectl get ns
2.查看特定命名空间的详细信息
如果你想查看某个特定命名空间的详细信息,可以使用 describe 命令:
kubectl describe namespace <namespace-name>
例如,要查看名为 my-namespace 的详细信息,可以运行:
kubectl describe namespace my-namespace
这个命令会显示该命名空间的详细描述,包括其标签、注解和其他相关信息。
3.查看当前上下文中的命名空间
要查看当前上下文中默认使用的命名空间,可以使用:
kubectl config view --minify --output 'jsonpath={..namespace}'
kubectl config view
#查看当前命名空间
这个命令会显示你当前的 Kubernetes 配置文件中,默认的命名空间。如果没有指定,通常默认是 default。
4.查看当前命名空间中的资源
如果你想查看当前命名空间中的资源,可以首先确认当前命名空间(如上所述),然后使用 kubectl get 命令查看特定资源类型。例如:
kubectl get pods
此命令默认会列出当前命名空间中的所有 Pods。
5.切换命名空间
在查看资源时,你可能需要在不同的命名空间之间切换。使用 -n 标志来指定命名空间,例如:
kubectl config set-context --current --namespace=namespace-name
6.创建命名空间
使用 kubectl 命令行工具创建命名空间
你可以使用 kubectl 命令来创建新的命名空间。以下是创建命名空间的基本命令:
kubectl create namespace <namespace-name>
例如,要创建一个名为 my-namespace 的命名空间,可以运行:
kubectl create namespace my-namespace
使用YAML 文件定义命名空间
你还可以通过编写一个 YAML 文件来定义命名空间,然后使用 kubectl 命令应用这个文件。例如,创建一个名为 my-namespace 的 YAML 文件 namespace.yaml,内容如下:
apiVersion: v1
kind: Namespace
metadata:
name: my-namespace
然后运行以下命令来应用这个配置:
kubectl apply -f namespace.yaml
7.删除命名空间
删除命名空间会删除该命名空间中的所有资源。使用以下命令删除命名空间:
kubectl delete namespace <namespace-name>
8.总结
列出所有命名空间:kubectl get namespaces 或 kubectl get ns 查看特定命名空间详细信息:kubectl
describe namespace 查看当前上下文的命名空间:kubectl config view
–minify --output ‘jsonpath={…namespace}’ 查看特定命名空间中的资源:kubectl get -n 命名空间 是 Kubernetes 中用于资源隔离的机制。 可以通过
kubectl create namespace 命令或 YAML 文件来创建命名空间。
命名空间帮助组织和管理集群资源,尤其在多租户环境中非常有用。
Pod常见状态
pod的常见状态:
Unschedulable: #Pod不能被调度,kube-scheduler没有匹配到合适的node节点
PodScheduled: # pod正处于调度中 ,在kube-scheduler刚开始调度的时候,还没有将pod分配到指定的node,在筛选出合适的节点后就会更新etcd数据, 将pod分配到指定的node
Pending: #正在创建Pod但是Pod中的容器还没有全部被创建完成=[处于此状态的Pod应该检查Pod依赖的存储是否有权限挂载等。
Failed: #Pod中有容器启动失败而导致pod工作异常。
Unknown: #由于某种原因无法获得pod的当前状态,通常是由于与pod所在的node节点通信错误。
Initialized:#所有pod中的初始化容器已经完成了
ImagePullBackOff: #Pod所在的node节点下载镜像失败
Running: #Pod内部的容器已经被创建并且启动。
Ready: #表示pod中的容器已经可以提供访问服务
Error: #pod 启动过程中发生错误
NodeLost: #Pod 所在节点失联
Waiting: #Pod 等待启动
Terminating: #Pod 正在被销毁
CrashLoopBackOff: #pod崩溃,但是kubelet正在将它重启
InvalidImageName: #node节点无法解析镜像名称导致的镜像无法下载
ImageInspectError: #无法校验镜像,镜像不完整导致
ErrImageNeverPull: #策略禁止拉取镜像,镜像中心权限是私有等
RegistryUnavailable:#镜像服务器不可用,网络原因或harbor宕机
ErrImagePull: #镜像拉取出错,超时或下载被强制终止
CreateContainerConfigError:#不能创建kubelet使用的容器配置
CreateContainerError: #创建容器失败
RunContainerError: #pod运行失败,容器中没有初始化PID为1的守护进程等
ContainersNotInitialized:#pod没有初始化完毕
ContainersNotReady: #pod没有准备完毕
ContainerCreating: #pod正在创建中
PodInitializing: #pod正在初始化中
DockerDaemonNotReady: #node节点decker服务没有启动
NetworkPluginNotReady: #网络插件没有启动
四.资源限制
应用场景:
通常一个项目使用一个名称空间(命名空间),目的是为了隔离网络环境。
名称的资源限制:
如果命名空间添加资源限制,其后的每一个pod都要添加资源限制内容。
apiVersion: v1
kind: ResourceQuota
metadata:
name: example-quota
namespace: test
spec:
hard:
requests.cpu: "2"
requests.memory: "1Gi"
limits.cpu: "4"
limits.memory: "4Gi"
pods: "10"
pod-资源限制
resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"
删除命名空间
kubectl get pod -n test
如果删除test命名空间,则test命名空间下的所有pod也一并删除。
示例:
名称的资源限制:
如果命名空间添加资源限制,其后的每一个pod都要添加资源限制内容。
apiVersion: v1
kind: ResourceQuota
metadata:
name: example-quota
namespace: test
spec:
hard:
requests.cpu: "2"
requests.memory: "1Gi"
limits.cpu: "4"
limits.memory: "4Gi"
pods: "10"
pod-资源限制
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp-deployment
spec:
replicas: 2
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
spec:
containers:
- name: mycontainer
image: harbor.hiuiu.com/nginx/nginx:1.21.5
imagePullPolicy: Never
ports:
- containerPort: 80
resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"
kubectl config set-context --current --namespace=test
kubectl apply -f re.yaml
kubectl get pod -o wide