kubectl 命令管理(1)

kubectl 管理

一: 陈述式资源管理方法

陈述式源管理方法:

  1. kubernetes集群管理集群资源的唯一入口是通过相应的方法调用apiserver的接口

  2. kubect1是官方的CTL 命令行工具,用于与apiserver进行通信,将用户在命令行输入的命令,组织并转化为apiserver能识别的信息,进而实现管理k8s各种资源的一种有效途径

  3. kubect1的命令大全

    1. kubectl --help
    2. k8s中文文档: http://docs.kubernetes.org.cn/683.html

4·对资源的增、删、查操作比较方便,但对改的操作就不容易了

1.1 查看版本信息和tab补全

 #查看版本信息
 kubectl  version

image-20211102122644591


#配置kubectl 自动补全
source <(kubectl completion bash)

#将命令写入到/root/.bashrc(root用户。如果是全局写入到/etc/bashrc),开机自动运行
echo 'source <(kubectl completion bash)' >> ~/.bashrc
source ~/.bashrc

image-20211102142356133


#查看资源对象简写
kubectl api-resources

image-20211102142451645


#查看集群信息
kubectl  cluster-info

image-20211102142537199


#动态查看服务日志信息,此命令是centos7 开始有的。-f 表示动态查看
journalctl -u kubelet -f

image-20211102142759862



1.2 基本信息查看

kubectl  get  [-n  namespace]  <resource>  [-o  wide  |  json  |  yaml]

获取资源的相关信息

  • -n指定命名空间,

  • -o指定输出格式

  • resource可以是具体资源名称,如pod nginx-xxx;也可以是资源类型,如pod;或者all (仅展示几种核心资源,并不完整)

  • --all-namespaces或-A :表示显示所有命令空间,

  • --show-labels :显示所有标签

  • -l  app :仅显示标签为app的资源
  • -l  app-nginx :仅显示包含app标签,且值为nginx的资源
#查看master 节点状态(可以简写cs)
[root@master ~]# kubectl get componentstatuses 
NAME                 STATUS    MESSAGE             ERROR
controller-manager   Healthy   ok                  
scheduler            Healthy   ok                  
etcd-0               Healthy   {"health":"true"}  

image-20211102143859459


#查看命名空间(可以简写ns)
[root@master ~]# kubectl get namespaces 
NAME              STATUS   AGE
default           Active   21h   #默认使用default命名空间
kube-node-lease   Active   21h
kube-public       Active   21h
kube-system       Active   21h

#查看defalut命名空间的所有资源(-n default 可以省略)
kubectl get all -n default

命名空间作用:用于允许不同 命名空间的相同类型的资源重名

image-20211102144013910

image-20211102144133152


#创建命名空间  test
kubectl  create ns test

#查看命名空间
kubectl get ns

#删除命名空间test
kubectl delete  ns test

image-20211102144553707


#在命名空间kube-public 中创建副本控制器(deployment)来启动pod(nginx-wx),使用镜像nginx
kubectl create deployment nginx-wx --image=nginx -n kube-public

#查看命名空间kube-public 里的所有资源
kubectl  get all -n kube-public

image-20211102145026513


#描述命名空间kube-public里的deployment 副本控制的详细信息
kubectl describe -n kube-public deployment nginx-wx 

#查看命名空间kube-public 里的pod(nginx-wx....)的详细信息
kubectl get pod -n kube-public nginx-wx-7d5458c6f5-hhjmh

image-20211102145808759

image-20211102150027161


 #查看命名空间kube-public里pod信息(使用pod,pods都可以)
 kubectl  get pods -n kube-public

image-20211102150155176


#master节点上

#查看kube-public命名空间里的pod信息。-o 指定输出方式
[root@master ~]# kubectl get pods -o wide -n kube-public

#kubectl exec 跨主机登录docker 
[root@master ~]# kubectl exec -it -n kube-public nginx-wx-7d5458c6f5-hhjmh bash

#在容器里创建abc.txt
root@nginx-wx-7d5458c6f5-hhjmh:/# touch abc.txt
root@nginx-wx-7d5458c6f5-hhjmh:/# ls
root@nginx-wx-7d5458c6f5-hhjmh:/# exit


#pod所在的node节点上
#找出对应容器的id
[root@node01 ~]# docker ps | grep 'nginx-wx'

#进入容器查看
[root@node01 ~]# docker exec -it d07e bash
root@nginx-wx-7d5458c6f5-hhjmh:/# ls

image-20211102151011861

image-20211102150859926

image-20211102151440399


 #删除(重启)pod资源,由于存在deployment/rc之类的副本控制器,删除pod 也会重新拉起来
 kubectl delete pod -n kube-public  nginx-wx-7d5458c6f5-hhjmh
 
 #若pod始终无法删除(如一值处于terminatin)可以使用此命令强制删除
 kubectl delete pod -n kube-public  nginx-wx-7d5458c6f5-rnhzc --force --grace-period=0
 #grace-period:表示过度存活期。默认时30s。在删除pod之前允许pod慢慢的终止其上的容器进程。0表示立即终止pod
 #--force 表示强制

image-20211102152023638

image-20211102152546386


#使用kubectl scale 进行扩容,缩容; --replicas=4 表示设置副本数为4
kubectl scale deployment -n kube-public  nginx-wx --replicas=4

#设置副本数为2
kubectl scale deployment -n kube-public  nginx-wx --replicas=2

image-20211102152852685

image-20211102153103253


#删除kube-public命名空间的副本控制器 nginx-wx
kubectl  delete deployment -n kube-public nginx-wx 

image-20211102153812978


#获取default命名空间里的资源(如果没有,就使用create命令创建一个)
kubectl get all

#使用logs 查看资源日志
kubectl  logs nginx-deployment-86b9454474-254n2

image-20211102154345808



二: 项目的生命周期

项目生命周期: 创建---> 发布------> 更新------>回滚------->删除


2.1 使用kubectl run 命令创建并允许容器镜像

kubectl   run 命令:

  • 创建并运行一个或多个容器镜像
  • 创建一个deployment 或 job 来管理容器
  • run 命令会在后续版本废弃。可以使用create命令代替
  • kubectl   run   --help 查看命令帮助
#启动nginx实例,暴露容器端口80(暴露在pod上),设置副本数3
kubectl run  -n kube-public  nginx --image=nginx:1.14 --port=80 --replicas=8

#使用-w 选项动态跟踪
kubectl get pods -n kube-public  -w


kubectl get all -n kube-public

image-20211102155505168

image-20211102160729673



2.2 使用kubectl expose命令发布资源

使用kubectl   expose命令,将资源暴露为新的service:

使用 kubectl   expose   --help 获取帮助

kubenetes之所以需要service

  • 一方面因为pod的ip不是固定的(pod可能会重建)

  • 另一方面则是因为一组pod实例之间总会有负载均衡的需求

  • 对于容器而言,kubeletes提供了基于VIP的网桥方式访问service ,再由service 重定向到相应的pod

service的类型:

  • ClusterIP:
    • 提供一个集群内部的虚拟ip,以供pod访问(service的默认类型)
  • NodePort:
    • 在每个Node上打开一个端口以供外部访问,kubernetes将会在每个node上打开一个端口,并在每个node的端口都是一样的,
    • 通过NodeIP:NodePort的方式,kubenetes集群外部的程序可以访问service
  • LoadBalancer:
    • 通过外部的负载均衡器来访问,通常在云平台部署LoadBalancer还需要额外的费用

img


2.2.1 发布 

#为deployment的nginx创建service,并通过service的80端口转发至容器的80端口上,service的名称为nginx-service,类型为NodePort
kubectl expose deployment -n kube-public nginx --port=80 --target-port=80 --name=ngin-service --type=NodePort

#--port 指定node在service上的端口
#--target 指定 容器在pod 上的端口
#--type  指定类型。默认是cluster ip

image-20211102162410442


2.2.2 查看pod网络信息和service暴露端口

#查看pod网络信息和service暴露端口
kubectl get pods,svc -o wide -n kube-public

image-20211102162920783


2.2.3 查看service关联的资源

#通过查看service资源的详细信息里的endpoints信息查看关联的后端节点
kubectl describe service -n kube-public ngin-service 

#直接查看endpoints关联的后端节点
kubectl get endpoints  -n kube-public

image-20211102163123805

image-20211102163341490


2.2.4 在所有的node节点上查看负载均衡端口

yum -y install ipvsadm
ipvsadm -Ln
#在所有node节点都可以看到ClusterIP:80的转发(内部访问)
#以及可以看到对应node节点ip:30754(nodeip使用的端口)的转发(外部访问)

image-20211102163714305

image-20211102164032694

image-20211102164004497



2.3 使用kubectl set 命令更新资源信息

kubectl  set :

  • 跟新现有资源的一些信息
  • kubectl   set   --help 获取帮助信息

2.3.1 获取当前nginx的版本号

curl -I http://192.168.23.12:30754
curl -I http://192.168.23.13:30754

image-20211102170045948


2.3.2 将版本跟新为1.15

#查看所有资源信息,找到deployment的资源名
kubectl get all -n kube-public

#查看相应deployment资源里的容器名
kubectl describe deployment.apps/nginx -n kube-public

#使用kubectl set image ,将nginx版本升级为1.15.
#nginx=nginx:1.15  表示容器nginx使用镜像nginx:1.15
kubectl set -n kube-public image deployment.apps/nginx nginx=nginx:1.15

#动态跟踪
kubectl get pod -n kube-public -w

#如果升级失败,可能时因为网络问题。可以先在node 节点上,将对应的镜像拉去下来

image-20211102171609773

image-20211102172702365


curl -I http://192.168.23.12:30754
curl -I http://192.168.23.13:30754

image-20211102172835364



2.4 使用kubectl rollout 对资源进行回滚

kubectl  rollout

  • 对资源进行回滚
  • kubectl  rollout  --help 查看帮助文档
#查看历史版本
kubectl rollout history -n kube-public deployment nginx 

image-20211102173217562


#执行回滚到上一个版本
kubectl rollout undo -n kube-public deployment nginx

#检查回滚状态
 kubectl rollout status -n kube-public deployment nginx

image-20211102173405938


curl -I http://192.168.23.12:30754
curl -I http://192.168.23.13:30754

image-20211102173452888



2.5 使用kubectl delete删除资源

#删除副本控制器
kubectl delete -n kube-public deployments.apps nginx

#删除service
kubectl delete -n kube-public service/ngin-service

image-20211102173922460


三: 金丝雀发布(Canary Release)

3.1 什么是金丝雀发布

金丝雀发布,又称灰度发布

Deployment控制器支持自定义控制更新过程中的滚动节奏,如"暂停(pause) "或“继续(resume)"更新操作。比如等待第一批新的Pod资源创建完成后立即暂停更新过程,此时,仅存在一部分新版本的应用,主体部分还是旧的版本。

然后,再筛选一小部分的用户请求路由到新版本的Pod应用,继续观察能否稳定地按期望的方式运行。确定没问题之后再继续完成余下的Pod资源滚动更新,否则立即回滚更新操作。这就是所谓的金丝雀发布。



3.2 配置deployment使用金丝雀发布

3.2.1 发布nginx服务

#使用nginx1.14版本镜像创建3个pod
kubectl run  -n kube-public  nginx --image=nginx:1.14 --port=80 --replicas=3

#发布服务
kubectl expose deployment -n kube-public nginx --port=80 --target-port=80 --name=ngin-service --type=NodePort

#获取服务的pod和service 信息
kubectl  get pod,svc -n kube-public

#f范围cluster ip 或者nodeip:nodeport 3次,查看nginx的版本都是1.14.2
curl -I 10.1.216.211

image-20211103142658035

image-20211103142754237


3.2.1 更新deployment版本,并配置暂停deploymen

#另开一个master 终端,观察
kubectl get pods -n kube-public  -w

#在第一个master终端将nginx升级到1.15.1 ,并配置藏听
kubectl set image -n kube-public deployment.apps/nginx nginx=nginx:1.15 && \
kubectl rollout -n kube-public pause deployment/nginx

#切换到第二个master终端查看

#查看运行的pod(此时有四个pod在运行)
kubectl get pods -n kube-public

image-20211103143351635

image-20211103143444842

image-20211103143559762


3.2.2 访问测试,查看版本号

#访问cluster ip 4 次。查看nginx的版本号
curl -I 10.1.216.211

image-20211103143827631

image-20211103143855045


3.2.3 在确保更新的pod没有问题后,继续更新

#让deployment 继续更新
kubectl rollout -n kube-public resume deployment nginx

#使用clusterip 访问,查看nginx的版本号
curl -I 10.1.216.211

image-20211103144244463


3.2.4 查看最后的更新情况

#查看pod 数量。发现回到了3个
kubectl  get pods -n kube-public 

#访问3 次以上,查看版本号
curl -I 10.1.216.211

image-20211103144624021



posted @ 2021-11-02 21:10  知己一语  阅读(183)  评论(0编辑  收藏  举报