文档,
https://kubernetes.io/zh-cn/docs/reference/kubectl/
https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands#get
kubelet的作用是什么?
在Kubernetes(k8S)中,kubelet是一个核心组件,它负责管理单个计算节点上的容器运行时环境。kubelet的主要功能和作用包括:
- Pod生命周期管理:
- kubelet会接收来自API Server的指令,确保本节点上运行的Pod达到期望的状态。这包括创建、启动、停止或删除Pod中的容器。
- 容器运行时交互:
- 与容器运行时(如Docker、containerd、CRI-O等)进行通信,执行实际的容器操作,例如拉取镜像、创建容器、监控容器状态以及清理不再需要的容器资源。
- 健康检查:
- 监控并报告容器及Pod的健康状况,通过HTTP GET请求、命令执行或者端口检查等方式实现健康检查,并根据结果采取相应行动。
- 资源管理:
- 确保节点上的容器按照其资源配置要求运行,管理和限制CPU、内存、磁盘和网络资源使用情况。
- 卷管理:
- 协调和管理Pod使用的存储卷,包括挂载和卸载持久化存储卷。
- Node状态报告:
- 定期向API Server汇报节点资源使用情况、运行的Pod列表以及节点的总体健康状态。
- 事件生成:
- 当节点上发生重要事件时,kubelet会生成相应的事件消息,这些信息可供集群管理员通过kubectl工具查看,帮助分析和调试问题。
- SyncLoop机制:
- kubelet内部有一个控制循环,即SyncLoop,不断同步本地节点状态与从API Server接收到的期望状态,驱动节点上各种任务的执行。
- PodDisruptionBudget兼容性:
- 遵循PodDisruptionBudget策略,在节点维护或缩容时保证应用的可用性。
1. kubectl安装
bash
# 下载最新版本:
curl -LO https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl
# 下载特定版本:
curl -LO https://storage.googleapis.com/kubernetes-release/release/v1.7.0/bin/linux/amd64/kubectl
# 下载到本地后,对kubectl二进制添加可执行权限:
chmod +x ./kubectl
# 将二进制文件移动到PATH中:
mv ./kubectl /usr/local/bin/kubectl
# 下载最新版本:
curl -LO https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl
# 下载特定版本:
curl -LO https://storage.googleapis.com/kubernetes-release/release/v1.7.0/bin/linux/amd64/kubectl
# 下载到本地后,对kubectl二进制添加可执行权限:
chmod +x ./kubectl
# 将二进制文件移动到PATH中:
mv ./kubectl /usr/local/bin/kubectl
kubectl设置简写
bash
cat >> ~/.bashrc << EOF
alias kg='kubectl get'
alias k='kubectl'
alias kd='kubectl describe pods'
alias ke='kubectl explain'
alias ka='kubectl apply'
EOF
source ~/.bashrc
cat >> ~/.bashrc << EOF
alias kg='kubectl get'
alias k='kubectl'
alias kd='kubectl describe pods'
alias ke='kubectl explain'
alias ka='kubectl apply'
EOF
source ~/.bashrc
bash
kg po #查看default名字空间下的po数量
NAME READY STATUS RESTARTS AGE
busybox 1/1 Running 1 (21d ago) 21d
counter 1/1 Running 5 (62d ago) 134d
http-svc-65b48ffc7b-2dzqt 1/1 Running 6 (62d ago) 138d
http-svc-65b48ffc7b-b6rtz 1/1 Running 5 (62d ago) 138d
http-svc-65b48ffc7b-sqtvt 1/1 Running 5 (62d ago) 138d
nfs-subdir-external-provisioner-796df7c59-gcwc2 1/1 Running 39 (37d ago) 139d
nginx-demo-98c8d48ff-r6wmv 1/1 Running 5 (62d ago) 156d
# 另外说一个技巧,可以通过"kubectl api-resource"查看当前集群中拥有的api-resources,其中第二个栏位“SHORTNAMES”对应相关资源的简写。
k api-resources #实际输出内容较多,这里支截取了精华部分
NAME SHORTNAMES APIVERSION NAMESPACED KIND
bindings v1 true Binding
componentstatuses cs v1 false ComponentStatus
configmaps cm v1 true ConfigMap
endpoints ep v1 true Endpoints
events ev v1 true Event
limitranges limits v1 true LimitRange
namespaces ns v1 false Namespace
nodes no v1 false Node
persistentvolumeclaims pvc v1 true PersistentVolumeClaim
persistentvolumes pv v1 false PersistentVolume
pods po v1 true Pod
podtemplates v1 true PodTemplate
replicationcontrollers rc v1 true ReplicationController
resourcequotas quota v1 true ResourceQuota
secrets v1 true Secret
serviceaccounts sa v1 true ServiceAccount
services svc v1 true Service
# 例如 "kg ns" 就等价于 “kubectl get namespace”
kg ns
NAME STATUS AGE
calico-apiserver Active 156d
calico-system Active 156d
cronjob Active 131d
tigera-operator Active 156d
kg po #查看default名字空间下的po数量
NAME READY STATUS RESTARTS AGE
busybox 1/1 Running 1 (21d ago) 21d
counter 1/1 Running 5 (62d ago) 134d
http-svc-65b48ffc7b-2dzqt 1/1 Running 6 (62d ago) 138d
http-svc-65b48ffc7b-b6rtz 1/1 Running 5 (62d ago) 138d
http-svc-65b48ffc7b-sqtvt 1/1 Running 5 (62d ago) 138d
nfs-subdir-external-provisioner-796df7c59-gcwc2 1/1 Running 39 (37d ago) 139d
nginx-demo-98c8d48ff-r6wmv 1/1 Running 5 (62d ago) 156d
# 另外说一个技巧,可以通过"kubectl api-resource"查看当前集群中拥有的api-resources,其中第二个栏位“SHORTNAMES”对应相关资源的简写。
k api-resources #实际输出内容较多,这里支截取了精华部分
NAME SHORTNAMES APIVERSION NAMESPACED KIND
bindings v1 true Binding
componentstatuses cs v1 false ComponentStatus
configmaps cm v1 true ConfigMap
endpoints ep v1 true Endpoints
events ev v1 true Event
limitranges limits v1 true LimitRange
namespaces ns v1 false Namespace
nodes no v1 false Node
persistentvolumeclaims pvc v1 true PersistentVolumeClaim
persistentvolumes pv v1 false PersistentVolume
pods po v1 true Pod
podtemplates v1 true PodTemplate
replicationcontrollers rc v1 true ReplicationController
resourcequotas quota v1 true ResourceQuota
secrets v1 true Secret
serviceaccounts sa v1 true ServiceAccount
services svc v1 true Service
# 例如 "kg ns" 就等价于 “kubectl get namespace”
kg ns
NAME STATUS AGE
calico-apiserver Active 156d
calico-system Active 156d
cronjob Active 131d
tigera-operator Active 156d
1.1 创建
create apply的区别
create 创建相同的名字的,会创建失败,但apply不会,这个会重新创建
kubectl apply -f和kubectl create -f有什么区别
kubectl create属于Imperative command(祈使式命令),它明确告诉kubectl要创建某个资源或对象;
kubectl apply是Declarative command(声明式命令),apply并不告诉kubectl具体做什么,而是由kubectl根据后面-f中的yaml文件与k8s中对应的object对比,自动探测要进行哪些操作,比如如果object不存在,则create;如果已经存在,则对比差异,update and replace
1.1create
shell
语法,kubectl create -f FILENAME
语法,kubectl create -f FILENAME
deployment
shell
语法,kubectl create deployment NAME --image=image -- [COMMAND] [args...]
例子,
kubectl create deployment my-dep --image=nginx --replicas=3
#指定namespace
kubectl create deployment my-dep --image=nginx --replicas=3 -n namespace_name
#生成yaml 文件
kubectl create deployment my-dep --image=nginx --replicas=3 --dry-run -oyaml
语法,kubectl create deployment NAME --image=image -- [COMMAND] [args...]
例子,
kubectl create deployment my-dep --image=nginx --replicas=3
#指定namespace
kubectl create deployment my-dep --image=nginx --replicas=3 -n namespace_name
#生成yaml 文件
kubectl create deployment my-dep --image=nginx --replicas=3 --dry-run -oyaml
创建模版
bash
#创建deploy
kubectl create deployment nginx-2 --image=10.122.6.81:5000/image/nginx:v1 --dry-run -oyaml
#创建svc
kubectl create service clusterip my-cs --tcp=5678:8080 --dry-run -oyaml
--dir-run #不做创建操作
-oyaml #输出为yaml文件
#如果不会写创建资源命令可以使用-h查看帮助,如
kubectl create deploy -h
kubectl create svc -h
....
#创建deploy
kubectl create deployment nginx-2 --image=10.122.6.81:5000/image/nginx:v1 --dry-run -oyaml
#创建svc
kubectl create service clusterip my-cs --tcp=5678:8080 --dry-run -oyaml
--dir-run #不做创建操作
-oyaml #输出为yaml文件
#如果不会写创建资源命令可以使用-h查看帮助,如
kubectl create deploy -h
kubectl create svc -h
....
1.2apply
bash
语法,kubectl apply (-f FILENAME | -k DIRECTORY)
语法,kubectl apply (-f FILENAME | -k DIRECTORY)
2.删除
2.1 delete
shell
#创建
kubectl create deployment my-dep --image=nginx --replicas=3
#查看
kubectl get pod
#删除,或者delete -f xx.yaml
kubectl delete deployment my-dep
#创建
kubectl create deployment my-dep --image=nginx --replicas=3
#查看
kubectl get pod
#删除,或者delete -f xx.yaml
kubectl delete deployment my-dep
3.查看
3.1describe
shell
# 显示名为 <pod-name> 的 Pod 的详细信息。
kubectl describe nodes <node-name>
或者
kubectl describe nodes/<node-name>
# 显示名为 <pod-name> 的 Pod 的详细信息。
kubectl describe pods/<pod-name>
# 显示由名为 <rc-name> 的副本控制器管理的所有 Pod 的详细信息。
# 记住:副本控制器创建的任何 Pod 都以副本控制器的名称为前缀。
kubectl describe pods <rc-name>
# 描述所有的 Pod
kubectl describe pods
# 显示名为 <pod-name> 的 Pod 的详细信息。
kubectl describe nodes <node-name>
或者
kubectl describe nodes/<node-name>
# 显示名为 <pod-name> 的 Pod 的详细信息。
kubectl describe pods/<pod-name>
# 显示由名为 <rc-name> 的副本控制器管理的所有 Pod 的详细信息。
# 记住:副本控制器创建的任何 Pod 都以副本控制器的名称为前缀。
kubectl describe pods <rc-name>
# 描述所有的 Pod
kubectl describe pods
3.2get
svc
shell
[root@kube-master ~]# kubectl get svc|service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 192.168.0.1 <none> 443/TCP 25h
nginx NodePort 192.168.253.94 <none> 8080:32498/TCP 172m
#查看所有 -A
kubectl get svc -A
[root@kube-master ~]# kubectl get svc|service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 192.168.0.1 <none> 443/TCP 25h
nginx NodePort 192.168.253.94 <none> 8080:32498/TCP 172m
#查看所有 -A
kubectl get svc -A
componentstatuses
shell
[root@kube-master yaml]# kubectl get componentstatuses
Warning: v1 ComponentStatus is deprecated in v1.19+
NAME STATUS MESSAGE ERROR
etcd-0 Healthy {"health":"true","reason":""}
scheduler Healthy ok
controller-manager Healthy ok
#- --port=0 注释(kubeadmin)
[root@kube-master yaml]# kubectl get componentstatuses
Warning: v1 ComponentStatus is deprecated in v1.19+
NAME STATUS MESSAGE ERROR
etcd-0 Healthy {"health":"true","reason":""}
scheduler Healthy ok
controller-manager Healthy ok
#- --port=0 注释(kubeadmin)
bash
#查找资源
kubectl get deployments.apps
#按标签查找资源
kubectl get deployments.apps -l app=redis
#一次查看多个指定的不通类型资源
kubectl get -n kube-system service/xx deployments.apps/xx
#查找一个资源并且输出为yaml文件
kubectl get deployments.apps nginx -oyaml -A
#查看pv并且以容量排序
kubectl get pv --sort-by=spec.capacity.storage
#列出事件(Events),按时间戳排序
kubectl get events --sort-by=.metadata.creationTimestamp -A
-owide #以列表方式查看更详细的信息
-oyaml #以yaml文件格式输出
-A #所有命名空间
--sort-by #排序,以资源中定义的某些信息排序
--show-labels #显示资源的labels
-l #显示匹配标签的资源
#查看一个资源的详细信息
kubectl describe nodes 10.122.6.75
#查找资源
kubectl get deployments.apps
#按标签查找资源
kubectl get deployments.apps -l app=redis
#一次查看多个指定的不通类型资源
kubectl get -n kube-system service/xx deployments.apps/xx
#查找一个资源并且输出为yaml文件
kubectl get deployments.apps nginx -oyaml -A
#查看pv并且以容量排序
kubectl get pv --sort-by=spec.capacity.storage
#列出事件(Events),按时间戳排序
kubectl get events --sort-by=.metadata.creationTimestamp -A
-owide #以列表方式查看更详细的信息
-oyaml #以yaml文件格式输出
-A #所有命名空间
--sort-by #排序,以资源中定义的某些信息排序
--show-labels #显示资源的labels
-l #显示匹配标签的资源
#查看一个资源的详细信息
kubectl describe nodes 10.122.6.75
3.3logs
kubectl logs -f <pod-name>
kubectl logs -f <pod-name>
3.4 查看image
bash
[root@kube-master-01 ~]# kubectl -n kube-system get ds calico-node -oyaml | grep image:
image: registry.cn-zhangjiakou.aliyuncs.com/hsuing/node:v3.28.0
image: registry.cn-zhangjiakou.aliyuncs.com/hsuing/cni:v3.28.0
image: registry.cn-zhangjiakou.aliyuncs.com/hsuing/cni:v3.28.0
image: registry.cn-zhangjiakou.aliyuncs.com/hsuing/node:v3.28.0
[root@kube-master-01 ~]# kubectl -n kube-system get ds calico-node -oyaml | grep image:
image: registry.cn-zhangjiakou.aliyuncs.com/hsuing/node:v3.28.0
image: registry.cn-zhangjiakou.aliyuncs.com/hsuing/cni:v3.28.0
image: registry.cn-zhangjiakou.aliyuncs.com/hsuing/cni:v3.28.0
image: registry.cn-zhangjiakou.aliyuncs.com/hsuing/node:v3.28.0
4.操作Pod
shell
# 从 Pod <pod-name> 中获取运行 'date' 的输出。默认情况下,输出来自第一个容器。
kubectl exec <pod-name> -- date
# 运行输出 'date' 获取在 Pod <pod-name> 中容器 <container-name> 的输出。
kubectl exec <pod-name> -c <container-name> -- date
# 获取一个交互 TTY 并在 Pod <pod-name> 中运行 /bin/bash。默认情况下,输出来自第一个容器。
kubectl exec -ti <pod-name> -- /bin/bash
# 从 Pod <pod-name> 中获取运行 'date' 的输出。默认情况下,输出来自第一个容器。
kubectl exec <pod-name> -- date
# 运行输出 'date' 获取在 Pod <pod-name> 中容器 <container-name> 的输出。
kubectl exec <pod-name> -c <container-name> -- date
# 获取一个交互 TTY 并在 Pod <pod-name> 中运行 /bin/bash。默认情况下,输出来自第一个容器。
kubectl exec -ti <pod-name> -- /bin/bash
5.格式化输出
要以特定格式将详细信息输出到终端窗口,将 -o
(或者 --output
)参数添加到支持的 kubectl
命令中
bash
#输出集群中运行着的所有镜像
kubectl get pods -A -o=custom-columns='IMAGES:spec.containers[*].image'
#获取deploy的名称与副本数,单个
kubectl get deployment -A -o jsonpath='{.metadata.name}{"\t"}{.spec.replicas}{"\n"}'
#获取deploy的名称与副本数,列表
kubectl get deployment -A -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.spec.replicas}{"\n"}'
#输出集群中运行着的所有镜像
kubectl get pods -A -o=custom-columns='IMAGES:spec.containers[*].image'
#获取deploy的名称与副本数,单个
kubectl get deployment -A -o jsonpath='{.metadata.name}{"\t"}{.spec.replicas}{"\n"}'
#获取deploy的名称与副本数,列表
kubectl get deployment -A -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.spec.replicas}{"\n"}'
jsonpath说明:
- {range .items[*]}:循环列表
- {"\t"}:制表符
- {"\n"}:换行
6. config
bash
# 查看所有的集群,因为你的 .kubeconfig 文件中可能包含多个上下文
kubectl config view -o jsonpath='{"Cluster name\tServer\n"}{range .clusters[*]}{.name}{"\t"}{.cluster.server}{"\n"}{end}'
# 指向引用该集群名称的 API 服务器
kubectl config view -o jsonpath="{.clusters[?(@.name==\"$CLUSTER_NAME\")].cluster.server}"
#获取token
kubectl get secret default-token -o jsonpath='{.data.token}' | base64 --decode
# 使用令牌玩转 API
curl -X GET $APISERVER/api --header "Authorization: Bearer $TOKEN" --insecure
# 查看所有的集群,因为你的 .kubeconfig 文件中可能包含多个上下文
kubectl config view -o jsonpath='{"Cluster name\tServer\n"}{range .clusters[*]}{.name}{"\t"}{.cluster.server}{"\n"}{end}'
# 指向引用该集群名称的 API 服务器
kubectl config view -o jsonpath="{.clusters[?(@.name==\"$CLUSTER_NAME\")].cluster.server}"
#获取token
kubectl get secret default-token -o jsonpath='{.data.token}' | base64 --decode
# 使用令牌玩转 API
curl -X GET $APISERVER/api --header "Authorization: Bearer $TOKEN" --insecure
7. 集群管理命令
语法格式:
kubectl [command] [TYPE] [NAME] [flags]
command: 子命令,如create、get、describe、delete
type: 资源类型,可以表示单数,复数或缩写形式
name: 资源的名称,如果省略,泽显示所有资源信息
flags: 指定可选标志,或附加的参数
语法格式:
kubectl [command] [TYPE] [NAME] [flags]
command: 子命令,如create、get、describe、delete
type: 资源类型,可以表示单数,复数或缩写形式
name: 资源的名称,如果省略,泽显示所有资源信息
flags: 指定可选标志,或附加的参数
子命令 | 说明 |
---|---|
help | 用于查看命令及子命令的帮助信息 |
cluster-info | 显示集群的相关配置信息 |
version | 查看服务器及客户端的版本信息 |
api-resources | 查看当前服务器上所有的资源对象 |
api-versions | 查看当前服务器上所有资源对象的版本 |
config | 管理当前节点上kubeconfig 的认证信息 |
bash
#查看集群健康情况
kubectl get cs
#集群核心组件运行情况
kubectl cluster-info
#查看表空间名
kubectl get namespaces
#查看版本
kubectl version
#查看API
kubectl api-versions
#查看事件
kubectl get events
#获取全部节点
kubectl get nodes
#删除节点
kubectl delete node k8s2
#查看集群健康情况
kubectl get cs
#集群核心组件运行情况
kubectl cluster-info
#查看表空间名
kubectl get namespaces
#查看版本
kubectl version
#查看API
kubectl api-versions
#查看事件
kubectl get events
#获取全部节点
kubectl get nodes
#删除节点
kubectl delete node k8s2
8. 命名空间
8.1 获取
bash
[root@master ~]# kubectl get ns # 简写
[root@master ~]# kubectl get namespaces # 全写
[root@master ~]# kubectl -n 命名空间 get pods # 查看命名空间中的资源对象
[root@master ~]# kubectl get ns # 简写
[root@master ~]# kubectl get namespaces # 全写
[root@master ~]# kubectl -n 命名空间 get pods # 查看命名空间中的资源对象
8.2 创建
bash
[root@master ~]# kubectl create ns your_namespace # 简写, 其中:your_namespace 为你自己的命名空间名称
[root@master ~]# kubectl create namespace your_namespace # 全写, 其中:your_namespace 为你自己的命名空间名称
[root@master ~]# kubectl create ns your_namespace # 简写, 其中:your_namespace 为你自己的命名空间名称
[root@master ~]# kubectl create namespace your_namespace # 全写, 其中:your_namespace 为你自己的命名空间名称
8.3 删除
bash
[root@master ~]# kubectl delete namespace your_namespace # 简写, 其中:your_namespace 为你自己的命名空间名称
[root@master ~]# kubectl delete namespace your_namespace # 全写, 其中:your_namespace 为你自己的命名空间名称
[root@master ~]# kubectl delete namespace your_namespace # 简写, 其中:your_namespace 为你自己的命名空间名称
[root@master ~]# kubectl delete namespace your_namespace # 全写, 其中:your_namespace 为你自己的命名空间名称
8.4 查看
bash
[root@master ~]# kubectl describe ns your_namespace
[root@master ~]# kubectl describe ns your_namespace