kubectl集群管理命令详解
一、准备工作
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: default
name: myhello-rc # RC名称,全局唯一
labels:
name: myhello-rc
spec:
replicas: 5 # Pod副本期待数量
selector:
name: myhello-rc-pod
template: # pod的定义模板
metadata:
labels:
name: myhello-rc-pod
spec:
containers: # Pod 内容的定义部分
- name: myhello #容器的名称
image: nongtengfei/hello:1.0.0 #容器对应的 Docker Image
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
env: # 注入到容器的环境变量
- name: env1
value: "k8s-env1"
- name: env2
value: "k8s-env2"
通常不会去单独的配置pod,都是通过某一类副本控制器资源去部署pod。原因:如果单独配置pod,当集群升级时需要将当前节点上的所有pod排空,那么会产生问题,因为pod没有任何副本控制器在控制它,集群对他没有预期,当节点排空后,pod将不会被调度和重生。
(2)为RC创建service。
vim myhello-svc.yaml
内容:
apiVersion: v1
kind: Service
metadata:
name: myhello-svc
labels:
name: myhello-svc
spec:
type: NodePort # 对外提供端口
ports:
- port: 80
protocol: TCP
targetPort: 80
name: http
nodePort: 30000
selector:
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-deployment
labels:
name: myapp-deploy
spec:
replicas: 5
selector:
matchLabels:
name: myapp-deploy-pod
template:
metadata:
labels:
name: myapp-deploy-pod
spec:
#nodeSelector:
#nodetype: worker
containers: # Pod 内容的定义部分
- name: myhello #容器的名称
image: nongtengfei/hello:1.0.0 #容器对应的 Docker Image
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
env: # 注入到容器的环境变量
- name: env1
value: "k8s-env1"
- name: env2
value: "k8s-env2"
resources:
requests:
cpu: 100m
- name: myredis #容器的名称
image: redis #容器对应的 Docker Image
imagePullPolicy: IfNotPresent
ports:
- containerPort: 6379
env: # 注入到容器的环境变量
- name: env1
value: "k8s-env1"
- name: env2
value: "k8s-env2"
resources:
requests:
cpu: 100m
(2)为deployment创建service。
vim myapp-svc.yaml
内容:
apiVersion: v1
kind: Service
metadata:
name: myapp-svc
labels:
name: myapp-svc
spec:
type: NodePort # 对外提供端口
ports:
- port: 80
protocol: TCP
targetPort: 80
name: http
nodePort: 30001
selector:
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-ds
namespace: default
labels:
app: myapp-ds
spec:
selector:
matchLabels:
app: myapp-ds
template:
metadata:
labels:
app: myapp-ds
spec:
tolerations:
- key: node-role.kubernetes.io/control-plane
operator: Exists
effect: NoSchedule
containers: # Pod 内容的定义部分
- name: myhello #容器的名称
image: nongtengfei/hello:1.0.0 #容器对应的 Docker Image
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
env: # 注入到容器的环境变量
- name: env1
value: "k8s-env1"
- name: env2
value: "k8s-env2"
(2)为DaemonSet创建service。
vim myapp-ds-svc.yaml
内容:
apiVersion: v1
kind: Service
metadata:
name: myapp-ds-svc
labels:
name: myapp-ds-svc
spec:
type: NodePort # 对外提供端口
ports:
- port: 8080
protocol: TCP
targetPort: 80
name: http
nodePort: 30002
selector:
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: k1
operator: "Equal"
value: v1
effect: NoExecute
tolerationSeconds: 3600
- key: k2
operator: "Exists"
effect: NoSchedule
- effect: NoSchedule
operator: "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: k1
operator: "Equal"
value: v1
effect: NoSchedule
- key: k2
operator: "Exists"
effect: NoExecute