• Kubernetes:(四)常用命令


    目录

    一:资源管理办法

    1.1陈述式资源管理方法

    1.1.1查看版本信息

    1.1.2查看资源对象简写

    1.1.3查看集群信息

    1.1.4master节点查看日志

    1.2基本信息查看

    1.2.1查看master 节点状态

    1.2.2查看命令空间

    1.2.2查看default命令空间的所有资源 

    1.2.3create 创建命名空间 (app)

    1.2.4delete 删除命名空间(app)

    1.2.5在命名空间创建副本控制器启动Pod

    1.2.6查看命名空间kube-public中的pod信息 

    1.2.7重启(删除)pod资源

    1.3扩容缩容

    1.4删除副本控制器

    二:项目的生命周期

    2.1kubectl run——创建命令 

    2.2kubectl expose——发布命令

    2.3kubectl set——更新命令 

    2.3.1获取修改模板

    2.3.2查看当前nginx 的版本号

    2.3.3将nginx 版本更新为1.21版本 

    2.4 kubectl rollout——回滚命令

    2.4.1查看历史版本 

    2.4.2执行回滚到上一个版本

    2.4.3执行回滚到指定版本

    2.4.4检查回滚状态

    2.5kubectl delete——删除命令

    2.6金丝雀发布(Canary Release) 

    三:声明式管理方法:YAML文件 

    3.1yaml 文件简介 

    3.2YAML语法格式 

    3.3yaml文件组成部分 

    3.4查看api资源版本标签 

    3.5编写 nginx-deployment.yaml 资源配置清单

    3.5.1创建资源对象 

    3.5.2查看创建的pod资源 

    3.6创建service服务对外提供访问并测试 

    四:k8s中的port概述 

    4.1创建yaml文件模板

    4.2查看字段帮助信息 

    4.3怎样更轻松的写yaml 

    4.3.1用run命令生成

    4.3.2用get命令导出 

    一:资源管理办法

    1.1陈述式资源管理方法

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

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

    kubectl 的命令大全
            kubectl --help
            k8s中文文档: http://docs.kubernetes.org.cn/683.html

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

    1.1.1查看版本信息

    kubectl version

    1.1.2查看资源对象简写

    kubectl api-resources

    1.1.3查看集群信息

    kubectl cluster-info

    配置kubectl自动补全

    source <(kubectl completion bash)

    注意:此时命令补全功能切换环境后是不生效的,如果要使切换环境后也生效需要配置全局环境变量

    1. vim /etc/bashrc
    2. .....
    3. source <(kubectl completion bash) #在底部添加

    1.1.4master节点查看日志

    1. journalctl -u kubelet -f
    2. 或者直接查看日志
    3. cat /var/log/messages

    1.2基本信息查看

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

    获取资源的相关信息,  -n指定命令空间,  -o指定输出格式

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

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

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

    -l app:仅显示标签为app的资源

    -l app=nginx :仅显示包含app标签, 且值为nginx的资源

    1.2.1查看master 节点状态

    1. kubectl get componentstatuses
    2. kubectl get cs

    1.2.2查看命令空间

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

    1. kubectl get namespace
    2. kubectl get ns

    1.2.2查看default命令空间的所有资源 

    kubectl get all [-n default]

    1.2.3create 创建命名空间 (app)

    1. kubectl create ns app
    2. kubectl get ns

    1.2.4delete 删除命名空间(app)

    1. kubectl delete namespace app
    2. kubectl get ns

    1.2.5在命名空间创建副本控制器启动Pod

    例:在命名空间kube-public 创建副本控制器( deployment) 来启动Pod (nginx-cc)

    kubectl create deployment nginx-cc --image=nginx -n kube-public

    描述某个资源的详细信息

    1. kubectl describe deployment nginx-cc -n kube-public
    2. kubectl describe pod nginx-cc-5d7d5c6b54 -n kube-public

    1.2.6查看命名空间kube-public中的pod信息 

    kubectl get pods -n kube-public

    kubectl exec 登录容器 

    kubectl exec可以跨主机登录容器,docker exec 只能在容器所在主机上登录  

    kubectl exec -it nginx-cc-df5946cf-mwd46 bash -n kube-public

    1.2.7重启(删除)pod资源

    由于存在deployment/rc之类的副本控制器,删除pod也会重新拉起来 

    kubectl delete pod nginx-cc-xxxxx -n kube-public

    若pod无法删除,总是处于terminate状态, 则要强行删除pod  

    1. kubectl delete pod <pod-name> -n <namespace> --force --grace-period=0
    2. #grace-period表示过渡存活期,默认30s,在删除pod之前允许POD慢慢终止其上的容器进程,
    3. 从而优雅退出,0表示立即终止pod

    1.3扩容缩容

    1. kubectl scale deployment nginx-cc --replicas=3 -n kube-public #扩容
    2. kubectl scale deployment nginx-cc --replicas=1 -n kube-public #缩容

    1.4删除副本控制器

    1. kubectl delete deployment nginx-cc -n kube-public
    2. kubectl delete deployment/nginx-cc -n kube-public


    二:项目的生命周期

    过程:

    创建–>发布–>更新–>回滚–>删除

    2.1kubectl run——创建命令 

    • 创建并运行一个或多个容器镜像
    • 创建一个 deployment 或 job 来管理容器
    • kubectl run --help
    1. ##启动 nginx 实例,暴露容器端口80,设置副本数 3
    2. kubectl run nginx --image=nginx:1.14 --port=80 【--replicas=3】
    3. 注:【--replicas=3】 只是用老版本的k8s ,现在的新版本不能使用
    4. kubectl get pods
    5. kubectl get all

    2.2kubectl expose——发布命令

    将资源暴露为新的Service

    kubectl expose --help

    为deployment(无状态部署)的nginx创建service, 并通过Service的80端口转发至容器的80端口上,Service的名称为nginx-service, 类型为NodePort  

    kubectl expose pod nginx --port=80 --target-port=80 --name=nginx-service --type=NodePort

     Kubernetes之所以需要Service, 一方面是因为Pod的IP 不是固定的(Pod可能会重建),另一方面则是因为一组Pod实例之间总会有负载均衡的需求。
    Service通过label Selector实现的对一组的Pod的访问。
    对于容器应用而言,Kubernetes 提供了基于VIP (虚拟IP)的网桥的方式访问 Service, 再由Service 重定向到相应的Pod。
    service的类型:

    1、ClusterIP:提供一个集群内部的虚拟IP以供Pod访问( service默认类型

    2、NodePort:在每个Node.上打开一个端口以供外部访问,Kubernetes将会在每个Node.上打开一个端口并且每个Node的端口都是一样的,通过NodeIp:NodePort的方式Kubernetes集群外部的程序可以访问Service。

    注:每个端口只能是一种服务,端口范围只能是30000-32767

    3、LoadBalancer:通过外部的负载均衡器来访问,通常在云平台部署LoadBalancer还需要额外的费用。

    查看pod网络状态详细信息和Service暴露的端口 

    kubectl get pods,svc -o wide

    查看关联后端的节点 

    kubectl get endpoints

    查看service 的描述信息  

    kubectl describe svc nginx

    2.3kubectl set——更新命令 

    1. 更改现有应用资源一些信息
    2. 查看帮助信息--help
    3. kubectl set --help

    2.3.1获取修改模板

    kubectl set image --help

    2.3.2查看当前nginx 的版本号

    1. curl -I http://192.168.137.20:30299
    2. curl -I http://192.168.137.10:30299

    2.3.3将nginx 版本更新为1.21版本 

    kubectl set image pod/nginx-deployment  nginx=nginx:1.21

    再看nginx 的版本号 

    2.4 kubectl rollout——回滚命令

    对资源进行回滚管理 

    kubectl rollout --help

    2.4.1查看历史版本 

    1. kubectl rollout history deployment/nginx-cc -n kube-public
    2. 示例:
    3. 先创建声明式pod
    4. kubectl create deployment nginx-cc --image=nginx -n kube-public
    5. 查看历史版本
    6. kubectl rollout history deployment/nginx-cc -n kube-public
    7. 修改版本
    8. kubectl set image deployment/nginx-cc nginx=nginx:1.12 -n kube-public

    2.4.2执行回滚到上一个版本

    1. kubectl rollout undo deployment/nginx-cc -n kube-public
    2. ps:创建时忘了暴露端口了 qaq呜呜呜看不到结果

    2.4.3执行回滚到指定版本

    1. kubectl rollout undo deployment/nginx-cc --to-revision=2 -n kube-public
    2. -revision=2:指定的是上方history里面的第几个

    2.4.4检查回滚状态

    kubectl rollout status deployment/nginx-cc -n kube-public

    2.5kubectl delete——删除命令

    1. //删除副本控制器
    2. [root@master ~]# kubectl delete deployment/nginx-cc -n kube-public
    3. deployment.extensions "nginx" deleted
    4. //删除service
    5. [root@master ~]# kubectl delete svc/nginx-service
    6. service "nginx-service" deleted
    7. [root@master ~]# kubectl get all
    8. NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
    9. service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 15h
    10. service/nginx NodePort 10.96.59.53 <none> 80:31670/TCP 15h

    2.6金丝雀发布(Canary Release) 

    Deployment控制器支持自定义控制更新过程中的滚动节奏,如“暂停(pause)”或“继续(resume)”更新操作。比如等待第一批新的Pod资源创建完成后立即暂停更新过程,此时,仅存在一部分新版本的应用,主体部分还是旧的版本。然后,再筛选一小部分的用户请求路由到新版本的Pod应用,继续观察能否稳定地按期望的方式运行。确定没问题之后再继续完成余下的Pod资源滚动更新,否则立即回滚更新操作。这就是所谓的金丝雀发布。

    1. (1)更新deployment的版本,并配置暂停deployment
    2. kubectl set image deployment/nginx nginx=nginx:1.14 && kubectl rollout pause deployment/nginx
    3. kubectl rollout status deployment/nginx
    4. #观察更新状态
    5. (2)监控更新的过程,可以看到已经新增了一个资源,但是并未按照预期的状态去删除一个旧的资源, 就是因为使用了pause暂停命令
    6. kubectl get pods -W
    7. curl [-I] 10.0.0.189
    8. curl [-I] 192.168.111.20:44847
    9. (3)确保更新的pod没问题了,继续更新
    10. kubectl rollout resume deployment/nginx
    11. (4)查看最后的更新情况
    12. kubectl get pods -W
    13. curl [-I] 10.0.0.189
    14. curl [-I] 192.168.111.20:44847

    三:声明式管理方法:YAML文件 

    • 适合于对资源的修改操作
    • 声明式资源管理方法依赖于资源配置清单文件对资源进行管理
    • 资源配置清单文件有两种格式: yaml(人性化,易读),json(易于api接口解析)
    • 对资源的管理,是通过事先定义在统一资源配置清单内,再通过陈述式命令应用到k8s集群里
    • 语法格式: kubectl create/apply/delete -f xxxx. yaml

    3.1yaml 文件简介 

    YAML,即 YAML Ain’t a Markup Language(YAML 不是一种标记语言)的递归缩写。YAML 其实意思是 Yet Another Markup Language(仍是一种标记语言)。它主要强度这种语言是以数据为中心,而不是以标记为中心,而像 XML 语言就使用了大量的标记。

    YAML 可读性高,易于理解,用来表达数据序列化的格式。它的语法和其他高级语言类似,还可以简单表达数组、散列表,标量等数据形态。它使用空白符号缩进和大量依赖外观的特色,特别适合用来表达或编辑数据结构、各种配置文件。

    YAML 配置文件后缀为.yml,例如application.yml

    yaml 和 json 的主要区别:

    • YAML 使用空格缩进,这是 Python 开发人员熟悉的领域。
    • JavaScript 开发人员喜欢 JSON,因为它是 JavaScript 的一个子集,可以直接在 JavaScript 中解释和编写,同时使用简写方式声明 JSON,在使用没有空格的典型变量名时,不需要键中的双引号。
    • 有很多解析器在 YAML 和 JSON 的所有语言中都能很好地工作。
    • 在许多情况下,YAML 的空白格式可以更容易查看,因为格式化需要更人性化的方法。
    • 如果您的编辑器中没有空格可见或缩进线指示符,那么 YAML 的空白虽然更紧凑,更容易查看,但可能难以手动编辑。
    • JSON 的序列化和反序列化要快得多,因为要检查的功能明显少于 YAML,这使得更小更轻的代码能够处理 JSON。
    • 一个常见的误解是 YAML 需要较少的标点符号并且比 JSON 更紧凑,但这完全是错误的。空格是不可见的,所以看起来字符较少,但是如果你计算实际的空格是必要的,以便正确解释 YAML 以及正确的缩进,你会发现 YAML 实际上需要比 JSON 更多的字符。JSON 不使用空格来表示层次结构或分组,并且可以通过删除不必要的空格来轻松展平,以实现更紧凑的传输。

    3.2YAML语法格式 

    Kubernetes支持YAML 和JSON 格式管理资源对象

    JSON格式:主要用于api 接口之间消息的传递

    YAML格式:用于配置和管理,YAML的配置参数格式比较清晰

    语法格式: 

     大小写敏感

    以空格的方式缩进标识层级关系

     

    通常开头缩进两个空格(统一层级对应即可)
    不支持制表符“tab”缩进,只使用空格缩进
    关键词字符后缩进一个空格,比如冒号,逗号后面需要缩进一个字符
    “---”表示YAML格式,一个文件的开始

    支持以“#”表示注释

    3.3yaml文件组成部分 

    • 控制器定义
    • 被控制对象

    字段说明: 

    apiVersionAPI版本
    kind资源类型
    metadata资源元数据
    spec资源规格
    replicas副本数量
    selector标签选择器
    templatePod模板
    metadataPod元数据
    specPod规格
    container容器配置

    3.4查看api资源版本标签 

    K8S---apiVersion对照表:点击这里

    kubectl api-versions

    • 如果是业务场景,一般首选使用 apps/v1(apps/v1 从 v1.9 版本开始提供 API)。
    • 在 k8s v1.16 版本之前使用的是 extensions/v1beta1,extensions/v1beta1 从 v1.20 版本开始不再提供 Ingress 资源。
    • 带有 beta 字样的代表的是测试版本,不用在生产环境中。

    3.5编写 nginx-deployment.yaml 资源配置清单

    1. mkdir /opt/demo
    2. cd /opt/demo/
    3. 参考模板:
    4. vim nginx-deployment.yaml
    5. apiVersion: apps/v1 #指定api版本标签
    6. kind: Deployment #定义资源的类型/角色,deployment 为副本控制器,
    7. 此处资源类型可以是Deployment、Job、 Ingress、 Service等
    8. metadata: #定义资源的元数据信息,比如资源的名称、namespace、标签等信息
    9. name: nginx-deployment #定义资源的名称,在同一个namespace空间中必须是唯一的
    10. labels: #定义资源标签(Pod的标签)
    11. app: nginx
    12. spec: #定义deployment资源需要的参数属性,诸如是否在容器失败时重新启动容器的属性
    13. replicas: 3 #定义副本数量
    14. selector : #定义标签选择器
    15. matchLabels: #定义匹配标签
    16. app: nginx #匹配上面的标签,需与上面的标签定义的app保持一致
    17. template: #定义业务模板,如果有多个副本,所有副本的属性会按照模板的相关配置进行匹配
    18. metadata:
    19. labels:
    20. app: nginx
    21. spec:
    22. containers: #定义容器属性
    23. - name: nginx #定义一个容器名,一个- name: 定义一个容器
    24. image: nginx:1.15.4 #定义容器使用的镜像以及版本
    25. ports:
    26. - containerPort: 80 #定义容器的对外的端口
    1. 实例:
    2. vim nginx-deployment.yaml
    3. apiVersion: apps/v1
    4. kind: Deployment
    5. metadata:
    6. name: nginx-deployment
    7. namespace: kube-public
    8. labels:
    9. name: nginx-deployment
    10. spec:
    11. replicas: 3
    12. selector:
    13. matchLabels:
    14. app: nginx-demo1
    15. template:
    16. metadata:
    17. labels:
    18. app: nginx-demo1
    19. spec:
    20. containers:
    21. - name: nginx
    22. image: nginx:1.15.4
    23. ports:
    24. - name: http
    25. containerPort: 80

    3.5.1创建资源对象 

    1. kubectl create -f nginx-deployment.yaml
    2. 或者
    3. kubectl apply -f nginx-deployment.yaml

    3.5.2查看创建的pod资源 

    1. kubectl get pods -o wide -n kube-public
    2. kubectl get deploy -n kube-public

    3.6创建service服务对外提供访问并测试 

    1. vim nginx-service.yaml
    2. apiVersion: v1
    3. kind: Service
    4. metadata:
    5. name: nginx-demo1
    6. namespace: kube-public
    7. labels:
    8. name: nginx-demo1
    9. spec:
    10. type: NodePort
    11. ports:
    12. - port: 8080
    13. targetPort: 80
    14. nodePort: 31333
    15. selector:
    16. app: nginx-demo1

    1. kubectl apply -f nginx-service.yaml
    2. kubectl get svc -n kube-public

    1. 在浏览器输入 nodeIP: nodePort 即可访问
    2. http://192.168.137.20:31333
    3. http://192.168.137.30:31333


    四:k8s中的port概述 

    ●port
    port是k8s集群内部访问service的端口,即通过clusterIP: port可以从Pod所在的Node. 上访问到service 

    ●nodePort
    nodePort是外部访问k8s集群中service的端口,通过nodeIP: nodePort 可以从外部访问到某个service。

    ●targetPort
    targetPort是Pod的端口,从port或nodePort来的流量经过kube-proxy 反向代理负载均衡转发到后端Pod的targetPort上,最后进入容器。

    ●containerPort
    containerPort是Pod内部容器的端口,targetPort 映射到containerPort

    4.1创建yaml文件模板

    kubectl  run  --dry-run 打印相应的API 对象  而不执行创建

    --dry-run:试运行 

    kubectl run nginx-test --image=nginx --port=80 --replicas=3 --dry-run

    --dry-run 表示试运行,不真正执行命令(测试命令是否正确),即并不会真的创建出 pod 和 deployment 实例,去掉该参数后即可真正执行命令

    查看生成yaml格式 

    使用 --dry-run 试运行可不触发生成命令,然后通过 -o yaml 可实现对其 yaml 资源配置清单的查看

    kubectl run nginx-test --image=nginx --port=80 --replicas=3 --dry-run -o yaml

    查看生成json格式  

    可通过 -o json 查看该命令产生的 json 配置清单 

    kubectl run nginx-test --image=nginx --port=80 --replicas=3 --dry-run -o json

    使用yaml格式导出生成模板,并进行修改以及删除一些不必要的参数 

    kubectl run nginx-test --image=nginx --port=80 --replicas=3 --dry-run -o yaml > nginx-test.yaml

    1. 模板:
    2. vim nginx-test.yaml
    3. apiVersion: apps/v1betal #api 版本改成 api/v1
    4. kind: Deployment
    5. metadata:
    6. creationTimestamp: null #删除
    7. labels:
    8. run: nginx-test
    9. name: nginx-test
    10. spec:
    11. replicas: 3
    12. selector:
    13. matchLabels:
    14. run: nginx-test
    15. strategy: {} #删除
    16. template:
    17. metadata:
    18. creationTimestamp: null #删除
    19. labels:
    20. run: nginx-test
    21. spec:
    22. containers:
    23. - image: nginx
    24. name: nginx-test
    25. ports:
    26. - containerPort: 80
    27. resources: {} #删除
    28. status: {} #删除
    1. 例:
    2. apiVersion: v1
    3. kind: Service
    4. metadata:
    5. labels:
    6. name: nginx-demo2
    7. name: nginx-demo2
    8. namespace: kube-public
    9. spec:
    10. ports:
    11. - port: 8044
    12. protocol: TCP
    13. targetPort: 80
    14. selector:
    15. run: nginx-demo2
    16. type: NodePort

    生成镜像并查看 

    1. kubectl apply -f nginx-test.yaml
    2. kubectl get svc -n kube-public

    将现有的资源生成模板导出 

    1. kubectl get pod/nginx-deployment-6f9f6d866c-w2sdc -o yaml -n kube-public
    2. ###注现在最新版本的kubctl get 不支持 --export 参数

    保存到文件中 

    kubectl get deployment.apps/nginx-deployment -o yaml -n kube-public > my-deploy.yaml

    4.2查看字段帮助信息 

    explain 可一层层的查看相关资源对象的帮助信息 

    1. kubectl explain deployments.spec.template.spec.containers
    2. kubectl explain pods.spec.containers

    4.3怎样更轻松的写yaml 

    4.3.1用run命令生成

    没有相关资源,使用 run 或者 create 命令 --dry-run 选项,后期可以修改yaml文件。

    kubectl run my-deploy --image=nginx --dry-run -o yaml > my-deploy.yaml

    4.3.2用get命令导出 

    已有相关资源,使用 get 命令 【--export 选项 :适用老版本的kubectl】

    kubectl get deploy/nginx-deployment -o=yaml -n kube-public > new.yaml

    yaml文件的学习方法

    (1)多看别人(官方)写的,能读懂
    (2)能照着现场的文件改着用
    (3)遇到不懂的,善用kubectl explain ...命令查看

  • 相关阅读:
    【Linux】gcc/g++ 和 gdb && git工具的基本使用方式
    数据库的三个范式
    php倒叙
    windows下修改PyCharm默认terminal & 在Git Bash中使用conda
    P1807 最长路题解【Floyd】
    服务运营 |文章精选:运筹学视角下的众包竞赛
    一、MyBatis 框架
    使用Wesky.Net.Opentools库,一行代码实现实体类类型转换为Json格式字符串
    矩阵求导公式的数学推导四部曲
    LayUI多文件上传,支持历史上传预览
  • 原文地址:https://blog.csdn.net/ver_mouth__/article/details/126048041