1. kubectl 命令介绍
1.1. 基本语法
kubectl [command] [TYPE] [NAME] [flags]
# command
## 子命令,用于操作资源对象,例如create、get、describe、delete等
# TYPE
## 资源类型,区分大小写,并且可以简写,例如下述三个命令效果相同
kubectl get pods xxx
kubectl get pod xxx
kubectl get po xxx
# NAME
## 具体的资源名,区分大小写,如果不指定具体的资源NAME,则默认返回全部,并且在一条命令里指定多个资源操作
kubectl get pod xxx yyy zzz
kubectl get pod/xxx deployment/aaa
kubectl apply -f 1.yaml -f 2.yaml
# 了解:
kubectl create -f 1.yaml # 只能用于创建新资源,如果资源已存在create -f会报错
kubectl apply -f 1.yaml # 创建或更新,所以推荐使用apply -f
# flags
## 可选参数,例如
kubectl get pods xxx -o wide
kubectl get pods xxx -o yaml
ShellScript1.2. 常用用法
1.2.1. 查看
# 查看帮助文档
kubectl --help
kubectl apply --help # 查看二级帮助文档
kubectl api-resources # 查看资源类型
# 示例
kubectl get deploy,pods -o wide -n 某个名称空间 # -n可以直接跟在kubectl后
kubectl get deploy,pods -o wide -A # -A不能直接跟在kubectl后,要往后放,代表查看所有名称空间,
kubectl get deploy 具体的deploy名 -o yaml
kubectl logs -f pod名
kubectl describe node node01
# 关于describe的结果示例:
# Controlled By 指明此 Pod 是由 ReplicaSet/xxx 创建。Events 记录了 Pod 的启动过程。如果操作失败(比如 image 不存在),也能在这里查看到原因
ShellScript1.2.2. 增加
# 基于yaml创建
kubectl apply -f 1.yaml
# 直接用命令创建,
# 例如:启动临时容器,用于测试,exit退出后则删除
kubectl run -i --tty --image busybox:1.27 egon-test --restart=Never --rm sh
ShellScript1.2.3. 改
# 修改副本
kubectl scale deployment xxx --replicas=0
# 在线编辑
kubectl edit deployment xxx
ShellScript1.2.4. 删
kubectl delete deloyment xxx
kubectl delete pods,services -l <label-key>=<label-value> # 删除带有标签<label-key>=<label-value>的pod和svc
# 查出标签:kubectl get pods --show-labels
kubectl delete -f 1.yaml
ShellScript1.2.5. 进入pod内部
kubectl exec -ti pod名字 bash
# 拷贝文件
kubectl cp pod名:/etc/fstab /tmp/a.txt # pod内文件拷贝到本机,必须指定文件名
kubectl cp /tmp/a.txt pod名:/tmp # 本机拷贝到pod内
ShellScript1.3. kubectl 插件
为了支持拓展kubectl功能,k8s1.8开始引入插件机制,1.14版之后达到稳定,为kubectl定制插件非常简单
1、创建一个可执行文件,文件名必须以kubectl-开头,该文件就是kubectl的插件
# 文件名kubectl-hello,注意必须以kubectl-开头
#!/bin/bash
echo "hello world"
# 添加可执行权限
chmod +x kubectl-hello
ShellScript2、将插件放到$PATH下,例如/usr/local/bin
mv ./kubectl-hello /usr/local/bin
ShellScript3、然后就可以执行kubectl 来运行自定义插件
kubectl hello # 插件名需要去掉kubectl-前缀
# 想删除插件的话直接删就行
rm -rf /usr/local/bin/kubectl-hello
ShellScript我们可以将复杂的kubectl命令定制成插件以便使用,例如查看当前上下文环境(context)的用户名
1、创建文件kubectl-whoami,将常规命令写入
#!/bin/bash
kubectl config view --template='{{ range .contexts }}{{ if eq .name "'$(kubectl config current-context)'" }}Current user: {{ printf "%s\n" .context.user }}{{ end }}{{ end }}'
ShellScript2、添加可执行权限
chmod +x ./kubectl-whoami
ShellScript3、拷贝到环境变量$PATH路径下
cp ./kubectl-whoami /usr/local/bin/
ShellScript4、执行
kubectl whoami
ShellScript5、查看所有插件
kubectl plugin list
ShellScript2. 创建与删除资源
K8S 的资源有 Pod、Service、Volume、Namespace、ReplicaSet、Deployment、StatefulSet、DaemonSet、Job 等等。分类如下表:
类别 | 名称 |
工作负载型资源对象 | Pod Replicaset ReplicationController Deployments StatefulSets Daemonset Job CronJob |
服务发现及负载均衡 | Service Ingress |
配置与存储 | Volume、Persistent Volume、CSl 、 configmap、 secret |
集群资源 | Namespace Node Role ClusterRole RoleBinding ClusterRoleBinding |
元数据资源 | HPA PodTemplate LimitRang |
2.1. K8S创建资源的两种方式
(1)用kubectl命令直接创建,在命令行中通过参数指定资源的属性。此方式简单直观,比较适合临时测试或实验使用。
# 该命令只能创建pod,创建了一个名为pod-test的pod资源
[root@master01 ~]# kubectl run pod-test --image=nginx:1.8.1
# 也可以启用临时容器进行测试
[root@master01 ~]# kubectl run alpine --rm -ti --image=alpine -- /bin/sh # exit退出后则删除
[root@master01 ~]# kubectl run net-test --image=alpine sleep 36000
# 若非测试,不推荐使用kubectl run,因为该命令只创建pod,该pod没有被管理,一旦挂掉了就挂掉了
# 我们还是建议使用kubectl create来创建控制器pod,pod会被控制器管理起来,死掉了也看可以被控制器重启
kubectl create deployment web --image=nginx:1.14
ShellScript(2)通过yaml配置文件和kubectl create创建。在配置文件中描述了应用的信息和需要达到的预期状态。
kubectl apply -f nginx-deployment.yaml
kubectl create -f nginx-deployment.yaml
ShellScriptyaml文件简介
vim nginx-deployment.yaml # 使用yaml的方式进行创建应用
apiVersion: apps/v1 # apiVersion是当前配置格式的版本
kind: Deployment # kind是要创建的资源类型,这里是Deploymnet
metadata: # metadata是该资源的元数据,name是必须的元数据项
name: nginx-deployment
labels:
app: nginx
spec: # spec部分是该Deployment的规则说明
replicas: 3 # relicas指定副本数量,默认为1,可以设置多个以达到负载均衡的效果
selector:
matchLabels:
app: nginx
template: # template定义Pod的模板,这是配置的重要部分
metadata: # metadata定义Pod的元数据,至少要指定一个label,label的key和value可以任意指定
labels:
app: nginx
spec: # spec描述的是Pod的规则,此部分定义pod中每一个容器的属性,name和image是必需的
containers:
- name: nginx
image: nginx:1.18 # 镜像地址
ports:
- containerPort: 80
ShellScript3. 水平扩缩
kubectl create deployment web --image=nginx:1.14 # 创建一个名为web的deployment资源,不要着急回车执行,我们通常用下一条命令生成yaml文件后再应用yaml文件
kubectl create deployment web --image=nginx:1.14 --dry-run -o yaml > web.yaml
kubectl apply -f web.yaml
kubectl get deployment
kubectl get pods #获取pod信息
kubectl get pods -o wide #查看pod运行在哪个节点上
kubectl get deploy,pods -o wide # 一起查看
kubectl get pods -o wide -n 名称空间名字 # 查看某个名称空间下的pods
kubectl -f web.yaml # 增加web.yaml中的replicas完成扩容
kubectl -f web.yaml # 减少web.yaml中的replicas完成缩容
kubectl scale deploy web --replicas=10 # 扩容的偷懒做法
kubectl scale deploy web --replicas=1 # 缩容的偷懒做法
ShellScript4. 节点污点(哪些物理节点不被调度)
kubectl get nodes
# kubectl describe node k8s-master-01:这部分命令用于描述名为 k8s-master-01 的节点,显示该节点的详细信息,包括容量、资源使用情况、标签、注解等。
# grep Taints:grep 是一个用于在文本中搜索指定模式的命令。在这里,grep Taints 用于过滤出包含关键词 "Taints" 的信息,以便查看节点上的污点(Taints)信息。
kubectl describe node k8s-master-01 | grep Taints
kubectl describe node k8s-node-01 | grep Taints
kubectl describe node k8s-node-02 | grep Taints
# 调度方式
## NoSchedule:一定不被调度
## PreferNoSchedule:尽量不被调度(也有被调度的几率)
## NoExecute:不会调度,并且还会驱逐Node已有Pod
# 打污点
kubectl taint nodes 10.1.1.104 node-role.kubernetes.io/control-plane:NoSchedule
# 去掉污点
kubectl taint nodes 10.1.1.104 node-role.kubernetes.io/control-plane:NoSchedule-
kubectl taint nodes 10.1.1.104 node-role.kubernetes.io/master:NoExecute
kubectl taint nodes 10.1.1.104 node-role.kubernetes.io/master:NoExecute-
ShellScript