> 文章列表 > 【云原生】k8s集群命令行工具kubectl之集群管理命令

【云原生】k8s集群命令行工具kubectl之集群管理命令

【云原生】k8s集群命令行工具kubectl之集群管理命令

kubectl集群管理命令详解

  • 一、准备工作
    • 1.1、Replication Controller
    • 1.2、Deployment
    • 1.3、DaemonSet
    • 1.4、查看创建的svc和pod
    • 1.5、kubectl 命令自动补全设置
  • 二、集群管理命令
    • 2.1、top
    • 2.2、cordon
    • 2.3、uncordon
    • 2.4、drain
    • 2.5、taint

一、准备工作

Kubernetes提供的集群控制平面(master节点)与Kubernetes APIServer通信的命令行工具——kubectl。kubectl默认配置文件目录$HOME/.kube/config。可以通过 --kubeconfig 参数来指定kubectl的配置文件。

以下操作如果已经做过了,就可以跳过。

1.1、Replication Controller

(1)创建myhello-rc.yaml并写入如下内容:

vim myhello-rc.yaml

内容:

apiVersion: v1
kind: ReplicationController # 副本控制器 RC
metadata:namespace: defaultname: myhello-rc # RC名称,全局唯一labels:name: myhello-rc
spec:replicas: 5 # Pod副本期待数量selector:name: myhello-rc-podtemplate: # pod的定义模板metadata:labels:name: myhello-rc-podspec:containers: # Pod 内容的定义部分- name: myhello #容器的名称image: nongtengfei/hello:1.0.0 #容器对应的 Docker ImageimagePullPolicy: IfNotPresentports:- containerPort: 80env: # 注入到容器的环境变量- name: env1value: "k8s-env1"- name: env2value: "k8s-env2"

通常不会去单独的配置pod,都是通过某一类副本控制器资源去部署pod。原因:如果单独配置pod,当集群升级时需要将当前节点上的所有pod排空,那么会产生问题,因为pod没有任何副本控制器在控制它,集群对他没有预期,当节点排空后,pod将不会被调度和重生。

(2)为RC创建service。

vim myhello-svc.yaml

内容:

apiVersion: v1
kind: Service
metadata:name: myhello-svclabels:name: myhello-svc
spec:type: NodePort # 对外提供端口ports:- port: 80protocol: TCPtargetPort: 80name: httpnodePort: 30000selector:name: myhello-rc-pod

(3)应用配置。

kubectl apply -f myhello-svc.yaml -f myhello-rc.yaml

1.2、Deployment

(1)创建myapp-deployment.yaml并写入如下内容:

vim myapp-deployment.yaml

内容:

apiVersion: apps/v1
kind: Deployment
metadata:name: myapp-deploymentlabels:name: myapp-deploy
spec:replicas: 5selector:matchLabels:name: myapp-deploy-podtemplate:metadata:labels:name: myapp-deploy-podspec:#nodeSelector:#nodetype: workercontainers: # Pod 内容的定义部分- name: myhello #容器的名称image: nongtengfei/hello:1.0.0 #容器对应的 Docker ImageimagePullPolicy: IfNotPresentports:- containerPort: 80env: # 注入到容器的环境变量- name: env1value: "k8s-env1"- name: env2value: "k8s-env2"resources:requests:cpu: 100m- name: myredis #容器的名称image: redis #容器对应的 Docker ImageimagePullPolicy: IfNotPresentports:- containerPort: 6379env: # 注入到容器的环境变量- name: env1value: "k8s-env1"- name: env2value: "k8s-env2"resources:requests:cpu: 100m

(2)为deployment创建service。

vim myapp-svc.yaml

内容:

apiVersion: v1
kind: Service
metadata:name: myapp-svclabels:name: myapp-svc
spec:type: NodePort # 对外提供端口ports:- port: 80protocol: TCPtargetPort: 80name: httpnodePort: 30001selector:name: myapp-deploy-pod

(3)应用配置。

kubectl apply -f myapp-svc.yaml -f myapp-deployment.yaml

1.3、DaemonSet

(1)创建myapp-deployment.yaml并写入如下内容:

vim myapp-ds.yaml

内容:

apiVersion: apps/v1
kind: DaemonSet
metadata:name: myapp-dsnamespace: defaultlabels:app: myapp-ds
spec:selector:matchLabels:app: myapp-dstemplate:metadata:labels:app: myapp-dsspec:tolerations:- key: node-role.kubernetes.io/control-planeoperator: Existseffect: NoSchedulecontainers: # Pod 内容的定义部分- name: myhello #容器的名称image: nongtengfei/hello:1.0.0 #容器对应的 Docker ImageimagePullPolicy: IfNotPresentports:- containerPort: 80env: # 注入到容器的环境变量- name: env1value: "k8s-env1"- name: env2value: "k8s-env2"

(2)为DaemonSet创建service。

vim myapp-ds-svc.yaml

内容:

apiVersion: v1
kind: Service
metadata:name: myapp-ds-svclabels:name: myapp-ds-svc
spec:type: NodePort # 对外提供端口ports:- port: 8080protocol: TCPtargetPort: 80name: httpnodePort: 30002selector:app: myapp-ds

(3)应用配置:

kubectl apply -f myapp-ds-svc.yaml -f myapp-ds.yaml

1.4、查看创建的svc和pod

$ kubectl get svc
NAME           TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
kubernetes     ClusterIP   10.96.0.1       <none>        443/TCP          45h
myapp-ds-svc   NodePort    10.96.41.180    <none>        8080:30002/TCP   4m3s
myapp-svc      NodePort    10.98.20.127    <none>        80:30001/TCP     6m32s
myhello-svc    NodePort    10.106.252.61   <none>        80:30000/TCP     14m
$ kubectl get pod
NAME                                READY   STATUS    RESTARTS   AGE
myapp-deployment-5659dbddd8-l6m87   0/2     Pending   0          6m41s
myapp-deployment-5659dbddd8-lxxls   0/2     Pending   0          6m41s
myapp-deployment-5659dbddd8-pqqlx   0/2     Pending   0          6m41s
myapp-deployment-5659dbddd8-xb8xp   0/2     Pending   0          6m41s
myapp-deployment-5659dbddd8-zjgsx   0/2     Pending   0          6m41s
myapp-ds-2zqf9                      1/1     Running   0          2m43s
myhello-rc-2tjmr                    0/1     Pending   0          12m
myhello-rc-44ksd                    0/1     Pending   0          12m
myhello-rc-86g79                    0/1     Pending   0          12m
myhello-rc-df225                    0/1     Pending   0          12m
myhello-rc-lfbzb                    0/1     Pending   0          12m

这里只建立了一个节点,所有只有一个pod。

1.5、kubectl 命令自动补全设置

# 安装自动补全插件
sudo apt-get install -y bash-completion
# 添加.bashrc文件内容
echo "source <(kubectl completion bash)" >> ~/.bashrc
# 加载最新的.bashrc
source ~/.bashrc

二、集群管理命令

2.1、top

显示节点或pod的资源(cpu/memory)使用情况,必须安装metrics server。

# 显示所有node资源使用情况
kubectl top node
# 显示某个node(k8s-master1)资源显示情况
kubectl top node k8s-master1
# 显示label 为nodetype=master 的节点资源使用情况
kubectl top node -l nodetype=master# 显示所有pod 资源使用情况
kubectl top pod
# 显示所有容器资源使用情况
kubectl top pod --containers
# 显示label 为name=myapp-deploy-pod 的pod资源使用情况
kubectl top pod -l name=myapp-deploy-pod

2.2、cordon

标记节点为不可调度。

# 将节点设置为不可调度
kubectl cordon <nodename>

2.3、uncordon

标记节点为可调度的。

# 将节点设置为可调度
kubectl uncordon <nodename>

2.4、drain

腾空节点,准备维护。该操作会自动将节点设置为不可调度状态。

# 腾空指定节点,包括未声明控制器的POD,忽略守护守护进程POD
kubectl drain <nodename> --force --ignore-daemonsets
# 指定宽限期,即pod正常结束的实践,若超过该时间将会被强制杀死
kubectl drain <nodename> --force --ignore-daemonsets --grace-period=60

2.5、taint

更新一个或多个节点污点。污点(taint)和 容忍度(toleration)相互配合,可以用来避免pod被分配到不合适的节点。污点格式:key=value:effect,key和value用户自定义,effect取值范围为:NoSchedule, PreferNoSchedule 或 NoExecute。
NoSchedule 表示Kubernetes不会将pod调度到该节点,但是已经在该节点上运行的pod不受影响。
PreferNoSchedule 表示Kubernetes会尽量避免将pod调度到该节点,但不是强制的NoExecute 表示Kubernetes不会将pod调度到该节点并且会将该节点上的pod驱逐。

2.5.1、污点设置。

# 添加污点key=key1,effect=NoSchedule
kubectl taint node k8s-node1 key1:NoSchedule
# 添加污点 key=key1,value=value1,effect=PreferNoSchedule
kubectl taint node k8s-node1 key1=value1:PreferNoSchedule
# 添加污点 key=key1,value=value1,effect=NoExecute
kubectl taint node k8s-node1 key1=value1:NoExecute
# 修改已存在的污点
kubectl taint node k8s-node1 --overwrite key1=v1:NoSchedule
# 删除污点
kubectl taint node k8s-node1 key1=v1:NoSchedulekubectl taint node k8s-node1 key1-

2.5.2、容忍度使用

节点设置污点后,根据情况会出现pod不被调度到该节点或者从该节点上驱逐等情况。若pod想继续在有污点的节点上运行,则必须设置容忍度,容忍节点所有污点。tolerations 字段设置pod容忍度。

tolerations:
- key: k1operator: "Equal"value: v1effect: NoExecutetolerationSeconds: 3600
- key: k2operator: "Exists"effect: NoSchedule
- effect: NoScheduleoperator: "Exists"

容忍度与污点通过key、value、effect三个字段来匹配。operator 表示匹配规则,Equal 表示 容忍度与污点key、value、effect必须相等,才能容忍该污点;Exists 表示容忍度与任意的key、value、effect都匹配。
以上配置解读:
第一条:容忍key值为k1且value值为v1且effect值为NoExecute的污点,容忍时间为3600秒,超时后将被驱逐出该节点;
第二条:容忍key值为k2且effect值为NoExecute的污点;
第三条:容忍effect值为NoExecute的污点。

(1)污点设置。和label设置差不多。

kubectl taint node k8s-node1 k1=v1:NoSchedule
kubectl taint node k8s-node1 k2=v2:NoExecute

(2)pod 容忍度设置。

# pod 容忍度设置
tolerations:
- key: k1operator: "Equal"value: v1
effect: NoSchedule
- key: k2operator: "Exists"effect: NoExecute

【云原生】k8s集群命令行工具kubectl之集群管理命令