k8s 常用操作

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
ShellScript

1.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 不存在),也能在这里查看到原因
ShellScript

1.2.2. 增加

# 基于yaml创建
kubectl apply -f 1.yaml

# 直接用命令创建,
# 例如:启动临时容器,用于测试,exit退出后则删除
kubectl run -i --tty --image busybox:1.27 egon-test --restart=Never --rm sh
ShellScript

1.2.3. 改

# 修改副本
kubectl scale deployment xxx --replicas=0

# 在线编辑
kubectl edit deployment xxx
ShellScript

1.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
ShellScript

1.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内
ShellScript

1.3. kubectl 插件

为了支持拓展kubectl功能,k8s1.8开始引入插件机制,1.14版之后达到稳定,为kubectl定制插件非常简单

1、创建一个可执行文件,文件名必须以kubectl-开头,该文件就是kubectl的插件

# 文件名kubectl-hello,注意必须以kubectl-开头

#!/bin/bash
echo "hello world"

# 添加可执行权限
chmod +x kubectl-hello
ShellScript

2、将插件放到$PATH下,例如/usr/local/bin

 mv ./kubectl-hello /usr/local/bin
ShellScript

3、然后就可以执行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 }}'
ShellScript

2、添加可执行权限

chmod +x ./kubectl-whoami
ShellScript

3、拷贝到环境变量$PATH路径下

cp ./kubectl-whoami /usr/local/bin/
ShellScript

4、执行

kubectl whoami
ShellScript

5、查看所有插件

kubectl plugin list
ShellScript

2. 创建与删除资源

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
ShellScript

yaml文件简介

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
ShellScript

3. 水平扩缩

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  # 缩容的偷懒做法
ShellScript

4. 节点污点(哪些物理节点不被调度)

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

5. pod调度策略