使用 kubectl 管理 Kubernetes 容器平台
-
kubectl 概述
- kubectl 是一个用于操作 kubernetes 集群的命令行接口,通过利用 kubectl 的各种命令可以实现各种功能。
- 环境说明(centos7.9):
IP 主机名 角色 内存
192.168.2.30 k8s-master1 master 4G
192.168.2.40 k8s-01 slave1 3G
192.168.2.41 k8s-02 slave2 3G - kubectl 创建和删除一个 pod
命令 说明
run 在集群上运行一个 pod
create 使用文件或者标准输入的方式创建一个 pod
delete 使用文件或者标准输入以及资源名称或者标签选择器来删除某个 podapply 通过文件名或控制台输入,对资源进行配置(推荐)。
- kubectl run 语法
kubectl run 和 docker run 一样,kubectl run 能将一个 pod 运行起来。
语法:
kubectl run PODNAME --image=image [--env="key=value"] [--port=port] - 创建一个 nginx deployment
- kubectl run nginx --image=nginx:latest --image-pull-policy='IfNotPresent' --port=80 --image-pull-policy='IfNotPresent' # 如果本地不存在镜像,那么才从外网下载镜像。 默认值为:imagePullPolicy: Always 一直从外网下载镜像,不使用本地的镜像。
- pods 常见的状态:
1. ContainerCreating #容器创建过程
2. ImagePullBackOff #镜像拉取失败
注:如果 pod 没有正常运行,看到的状态是 ImagePullBackOff,是因为 docker hub 没有连接上,导致镜像没有下载成功,这时,可以在 node 节点上把相关镜像手动上传一下或把 docker 源换成阿里云的。
3. terminating ['tɜ:mɪneɪtɪŋ] #终止 。删除 pod 时的状态
4. Running 正常运行状态 - 使用 kubectl delete 删除创建的对象
删除 pod
语法:kubectl delete pod pod 名字 如果删除pod失败时可以使用 强制删除 --force
-grace-period=0 正常删除pod时,会延迟一定时长才进行删除,缺省未设定的情况下会等待30s中之后删除 - yaml 语法规则
YAML 语言(发音 /ˈjæməl/ )的设计目标,就是方便人类读写。它实质上是一种通用的数据串行化格式。
1. pod 资源 yaml 配置文件常见单词:
kind: 同类,类型 ;
apiVersion API 版本 ;
metadata 元数据 ;
spec: 规格,说明书(定义具体参数) ;
2. yaml 语法的基本语法规则如下:
1、大小写敏感
2、使用缩进表示层级关系
3、缩进时不允许使用 Tab 键,只允许使用空格。
4、缩进的空格数目不重要,只要相同层级的元素左侧对齐即可
5、# 表示注释,从这个字符一直到行尾,都会被解析器忽略。
-
kubectl create 加载 yaml 文件生成 deployment
- 使用 kubectl run 在设定很复杂的需求时,需要非常长的一条语句,也很容易出错,也没法保存。所以更多场景下会使用 yaml 或者 json 文件。
- vim mysql-deployment.yaml kind: Deployment #使用 deployment 创建一个 pod 资源,旧的 k8s 版本可以使用 kind: ReplicationController 来创建pod
apiVersion: apps/v1
metadata:
name: mysql #deployment 的名称,全局唯一
namespace: default
labels:
k8s-app: mysql
spec:
selector:
matchLabels:
k8s-app: mysql
replicas: 1 # Pod 副本期待数量,1 表示只运行一个 pod
template:
metadata:
labels:
k8s-app: mysql
spec:
containers: # Pod 中容器的定义部分
- name: mysql #容器的名称
image: mysql/mysql-server #容器对应的 Docker Image 镜像
imagePullPolicy: IfNotPresent #默认值为:imagePullPolicy: Always 一直从外网,下载镜像,不使用本地的镜像。
#其他镜像下载策略参数说明:
#IfNotPresent :如果本地存在镜像就优先使用本地镜像。这样可以直接使用本地镜像,加快启动速度。
Present [ˈpreznt] 目前;现在
#Never:直接使用本地镜像,不再去外网拉取镜像;如果本地不存在就报异常了
ports:
- containerPort: 3306 #容器暴露的端口号
protocol: TCP
env: #注入到容器的环境变量
- name: MYSQL_ROOT_PASSWORD #设置 mysql root 的密码
value: "hello123"
- 使用 mysql-deployment.yaml 创建和删除 mysql 资源
注:当一个目录下,有多个 yaml 文件的时候,使用 kubectl apply -f 目录 的方式一下全部创建
kubectl apply -f yamls/
扩展:
使用 kubectl create 和 kubectl apply 创建资源对象的区别
kubectl apply -f FILENAME 可多次执行,每次修改 YAML 文件后,使用 apply 可直接部署
kubectl create -f FILENAME 不可多次执行,每次修改 YAML 后,需要先删除资源后才能部署
推荐使用 apply 部署资源对象,delete 删除资源对象。
注意:线上都用 kubectl apply -f file.yaml
- -o wide 参数可以查看更详细的信息
-
总结:get 命令能够确认的信息类别:
deployments (缩写 deploy)
namespaces (缩写 ns)
nodes (缩写 no)
pods (缩写 po)
replicasets (缩写 rs)
services (缩写 svc) -
使用 describe 查看 k8s 中详细信息 describe [dɪˈskraɪb] 描述
-
语法: kubectl describe pod pod 名字
语法: kubectl describe node node 名字
语法: kubectl describe deployment deployment 名字 - 使用 describe 查看 pod 的详细描述信息
kubectl describe pod mysql-76f8866f79-gbrpp
使用 describe 查看 node 的详细描述信息
kubectl describe node k8s-01
使用 describe 查看 deployment 的详细描述信息
kubectl describe deployment mysql
kubectl describe deployments.apps -
kubectl 其他常用命令和参数说明
命令 说明
logs 取得 pod 中容器的 log 信息
exec 在 pod 中执行一条命令
cp 从 pod 拷出或向 pod 拷入文件
attach Attach 附加到一个运行中的 pod 上,实时查看 pod 消息 - kubectl logs 类似于 docker logs,使用 kubectl logs 能够取出 pod 中镜像的 log,也是故障排除时候的重要信息
kubectl logs mysql-76f8866f79-gbrpp
-f 动态查看日志
kubectl logs kube-apiserver-k8s-master1 -n kube-system -f
- kubectl exec exec 命令用于到 pod 中执行一条命令,到 mysql 的镜像中执行 cat /etc/my.cnf 命令
kubectl exec mysql-76f8866f79-gbrpp cat /etc/my.cnf - 使用参数 exec -it ,直接登 pod 上中
kubectl exec -it mysql-76f8866f79-gbrpp bash
exit 退出容器
如果有多个容器 使用 -c 指定进入到 pod 具体容器里 -
推荐写法
kubectl exec -it mysql-76f8866f79-gbrpp -- sh
同样 -c 可以指定进入哪个容器 -
kubectl cp
用于从 pod 中拷出 hosts 文件到物理机的/tmp 下
kubectl cp mysql-76f8866f79-gbrpp:/etc/hosts /tmp/hosts发现报错,查看帮助信息来排错
# Requires that the 'tar' binary is present in your container #发现想要使用 kubectl cp 你的容器实例中必须有 tar 库
# image. If 'tar' is not present, 'kubectl cp' will fail. #如果镜像中 tar 命令不存在,那么 kubectl cp 将失败
在 pod 的容器力安装安装 tar重新 cp
更改 message.log 并拷贝回 pod
-
kubectl attach
kubectl attach 用于取得 pod 中容器的实时信息,可以直接查看容器中以 daemon 形式运行的进程输出,可以持续不断实时的取出消息。像 tail -f /var/log/messages 动态查看日志的作用。
kubectl logs 是一次取出所有消息,像 cat /etc/passwd
attach [əˈtætʃ] 贴上、附上
kubectl attach pod/kube-apiserver-k8s-master1 -n kube-system -
使用 kubectl 管理集群
-
kubectl 相关命令参数如下:
kubectl edit 编辑服务器侧资源
kubectl replace 替换,使用 yaml 配置文件来替换正在运行中的配置参数
kubectl patch 部分更新资源相关信息
kubectl apply 使用文件或者标准输入更改配置信息
kubectl scale 重新设定 Deployment/ReplicaSet/RC/Job 的 size
kubectl autoscale Deployment/ReplicaSet/RC 的自动扩展设定
kubectl cordon 设定 node 不可使用
kubectl uncordon 设定 node 可以使用
kubectl drain 设定 node 进入维护模式 -
vim nginx-deployment.yaml
vim nginx-svc.yaml
注:
nodePort: 31001 #指定是 node 物理机上监控听的端口,后期公网上的机器,可以访问此端口。
targetPort: 80 #nginx pod 的端口号,也就是真正 docker 监听的端口号
port: 3000 #service 服务端口号 、service 集群 IP 监听的端口,K8S 内部各个 service 服务,
使用这个端口号进行通信
需要用到的镜像kubectl apply -f nginx-deployment.yaml
kubectl apply -f nginx-svc.yamlkubectl get svc -owide
注:发现 nginx 容器中的 80 端口已经映射到 node 物理机节点的 31001 端口上了。可以查看到 nginx 服务已经运行在 k8s-01 和 k8s-02 上了。
http://192.168.2.30:31001/ ,http://192.168.2.40:31001/ http://192.168.2.41:31001/都可以访问到。 -
分别查看
echo "I am gf 192.168.2.40" > index.html && kubectl cp index.html nginx-54d66fc654-s6kgs:/usr/share/nginx/html/index.html
-
kubectl edit 修改服务配置
- kubectl get -o 格式化输出,-o 指定输出的消息为 yaml 类型
- 以 yaml 类型查看 nginx 的 service 信息
edit 这条命令用于编辑服务器上的资源。
改端口 31001 为 31111
kubectl edit service nginx
-
注:edit 编辑修改配置文件时,不需要停止服务。改完后立即生效
-
kubectl replace
replace 就是替换,把 nodeport 端口改为 31003
kubectl get service nginx -o yaml > nginx_replace.yaml
vim nginx_replace.yaml
kubectl replace -f nginx_replace.yaml
-
kubectl patch
当修改一部分设定时,使用 patch 很方便。比如:给 pod 换个 image 镜像。
patch [pætʃ] 补丁
查看当前 port 中使用的 nginx 镜像是否能解析 php:发现不支持 PHP,开始打补丁
kubectl patch pod nginx-54d66fc654-ddp2l -p '{"spec":{"containers":[{"name":"nginx","image":"richarvey/nginx-php-fpm:latest"}]}}'
kubectl patch pod nginx-54d66fc654-s6kgs -p '{"spec":{"containers":[{"name":"nginx","image":"richarvey/nginx-php-fpm:latest"}]}}' -
kubectl apply
apply 命令是用来使用文件或者标准输入来更改配置信息
vim nginx-svc.yaml -
kubectl scale
scale [skeɪl] 规模
scale 命令用于横向扩展,是 kubernetes 或者 swarm 这类容器编辑平台的重要功能之一
执行 scale 命令,使用 scale 命令进行横向扩展,将原本为 2 的副本提高到 3。相当于开 3 台 nginx 服务,来处理数据,瞬间提升 3 倍的处理数据的能力。
kubectl scale --current-replicas=2 --replicas=3 deployment/nginx前后对比
-
kubectl autoscale
autoscale 命令用于自动扩展确认,scale 需要手动执行,而 autoscale 则会根据负载进行调解。而这条命令则可以对 Deployment 进行设定,通过最小值和最大值的指定进行设定。
kubectl autoscale deployment nginx --min=3 --max=5
kubectl get horizontalpodautoscalers.autoscalingkubectl edit horizontalpodautoscalers.autoscaling
-
kubectl cordon 与 uncordon
cordon [ˈkɔ:dn] 封锁 警戒线
在实际维护的时候会出现某个 node 坏掉,或者做一些处理,暂时不能让生成的 pod 在此 node 上运行,需要通知 kubernetes 让其不要创建过来,这条命令就是 cordon,uncordon 则是取消这个要求。 - 之前横向扩展到 5 个副本,发现利用 roundrobin 策略,每个 node 上运行起来了一个 pod,是平均分配的。
执行 cordon 命令,设定 k8s-02 上不再运行新的 pod 实例,使用 get node 确认,其状态显示 SchedulingDisabled。kubectl cordon k8s-02
执行 scale 命令,再次执行横向扩展命令,看是否会有 pod 漂到 k8s-02 这台机器上
kubectl scale --replicas=8 deployment/nginx发现后面扩展的没有被调度到 k8s-02 上
使用 uncordon 命令解除对 k8s-02 机器的限制解除限制后成功调度,恢复正常
-
kubectl drain
kubectl drain 命令 [dreɪn] 排水
用于对某个 node 结点进行维护。
drain 两个作用:
1. 设定此 node 不可以使用(cordon)
2. evict 驱逐 pod 到他正常的 node 节点上
evict [ɪˈvɪkt] 驱逐
事前准备,删除没有用的 deploy,节约点硬件资源
执行 drain 命令,让 k8s-01 不可用,并把 k8s-01 上已经运行 pod 驱逐到其他 node 上:
kubectl drain k8s-01 --ignore-daemonsets
注:--ignore-daemonsets --忽略守护进程结果确认
把 k8s-01 上的 pod 删除后,k8s 会根据 replicas 的机制,在清退 pod 和设定 node 时,在其他结点上生成新的 pod。这时就可以对 k8s-01 节点进行维护了,维护好后,重新 uncordon 即可。
-
kubectl apply -f 1.pod/deployment.yaml -o yaml --dry-run
--dry-run 生成 yaml 模版,可选值 Must be "none", "server", or "client".
目录 返回
首页