暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

K8S和docker初探

心在远方AND走在路上 2021-10-14
524
一、K8S和docker的作用
Kubernetes的名字来自希腊语,意思是“舵手” 或 “领航员”。K8s是将8个字母“ubernete”替换为“8”的缩写。k8s主要用于部署容器化应用程序的编排工具;Kubernetes是容器集群管理系统,是一个开源的平台,可以实现容器集群的自动化部署、自动扩缩容、维护等功能。
docker 是一个开源项目,这个项目旨在通过把应用程序打包为可移植的、自给自足的容器(引用语);docker一次构建可放在任何地方就可以运行,不需要进行任何改变DocKer 就类似于一个容器。这个容器就好像咱们常用的虚拟机一样,当我们虚拟机里面安装过VS、SQL、浏览器 ...... 之后咱们就把虚拟机镜像备份下来、等到下一次需要重新搭一个环境的时候,就可以省去很多事情了,直接把备份的虚拟机运行起来,该有的就都有了,省去了很多事情。
在用docker的情况下,可以直接把项目发布在docker容器上面进行测试,当项目需要正式上线的时候我们直接可以把做好的docker 镜像部署上去就行了,如果测试的好,就不必担心项目上正式版本的时候再出现什么问题了,(比如说 咱们的confing 配置信息很多项目都是什么测试环境地址,正式环境地址的,但是用过docker之后就一个就行了)docker可以在 云、windows、linux 等环境上进行部署,就单说这一点就省去很多项目上的费用、还有项目部署上线的风险,不必每次项目上线都留守一堆人才等着项目报错.

K8S好处:
传统的应用部署方式是通过插件或脚本来安装应用。这样做的缺点是应用的运行、配置、管理、所有生存周期将与当前操作系统绑定,这样做并不利于应用的升级更新/回滚等操作,当然也可以通过创建虚机的方式来实现某些功能,但是虚拟机非常重,并不利于可移植性。
新的方式是通过部署容器方式实现,每个容器之间互相隔离,每个容器有自己的文件系统 ,容器之间进程不会相互影响,能区分计算资源。相对于虚拟机,容器能快速部署,由于容器与底层设施、机器文件系统解耦的,所以它能在不同云、不同版本操作系统间进行迁移。
容器占用资源少、部署快,每个应用可以被打包成一个容器镜像,每个应用与容器成一对一关系也使容器有更大优势,使用容器可以在build或release 的阶段,为应用创建容器镜像,因为每个应用不需要与其余的应用堆栈组合,也不依赖于生产环境基础结构,这使得从研发到测试、生产能提供一致环境。类似地,容器比虚机轻量、更“透明”,这更便于监控和管理。最后,

容器优势总结:
  1. 快速创建/部署应用:

    与VM虚拟机相比,容器镜像的创建更加容易。

  2. 持续开发、集成和部署:

    提供可靠且频繁的容器镜像构建/部署,并使用快速和简单的回滚(由于镜像不可变性)。

  3. 开发和运行相分离:

    在build或者release阶段创建容器镜像,使得应用和基础设施解耦。

  4. 开发,测试和生产环境一致性:

    在本地或外网(生产环境)运行的一致性。

  5. 云平台或其他操作系统:

    可以在 Ubuntu、RHEL、 CoreOS、on-prem、Google Container Engine或其它任何环境中运行。

  6. Loosely coupled,分布式,弹性,微服务化:应用程序分为更小的、独立的部件,可以动态部署和管理。

  7. 资源隔离

  8. 资源利用:高效

    Kubernetes能提供一个以“容器为中心的基础架构”,满足在生产环境中运行应用的一些常见需求,如:
  1. 多个进程(作为容器运行)协同工作。(Pod)

  2. 存储系统挂载

  3. Distributing secrets

  4. 应用健康检测

  5. 应用实例的复制

  6. Pod自动伸缩/扩展

  7. Naming and discovering

  8. 负载均衡

  9. 滚动更新

  10. 资源监控

  11. 日志访问

  12. 调试应用程序

  13. 提供认证和授权

二、k8s和docker命令
K8S常用命令
    查看k8s支持的全部命令:kubectl -h查看指定command的支持参数:
    例:
    kubectl label -h【查看命令】
    1.查看namespace:
    kubectl get ns
    2.在非master节点上执行命令:
    kubectl get po -s master节点ip端口号
    3.查看当前注册的node节点及节点状态:
    kubectl get nodes
    4.查看node结点的标签:
    kubectl get nodes --show-labels
    5.查看namespace为test下所有的pods的运行节点:
    kubectl get po -n test -o wide
    6.按selector名来查找pod:
    kubectl get pod --selector name=redis
    7.查看namespace为test下的所有资源(不包含ingresses):
    kubectl get all -n test
    8.查看namespace为test下的ingresses:
    kubectl get ingresses -n test
    【删除命令】
    1.删除pod:
    kubectl delete pod master节点ip端口号 -n 应用环境名称
    2.强制删除namespace 
    kubectl -s (master节点ip端口号) delete pod 应用版本号 --force --grace-period=0 -n 应用环境名称
    【标签】
    为某个node节点添加gw标签(如nodexx):
    kubectl label nodes nodexx gw=yes
    2.修改某个node节点的gw标签值:
    kubectl label nodes nodexx gw=no --overwrite
    3.删除某个node节点的gw标签:
    kubectl label nodes nodexx gw-node
    【节点调度】
    1.将某一node节点设置为不可调度:
    kubectl cordon nodexx
    2.将运行在node节点上的pod驱离:
    kubectl drain nodexx
    3.将某一node节点恢复为可调度:
    kubectl uncordon nodexx
    【服务发布错误排查】
    1.查看pod名称:
    kubectl get po -n test
    2.查看该pod的详细情况:
    master节点:
    kubectl describe po 应用版本号 -n 应用环境名称查看各环境版本详细 
    其他节点:
    kubectl -s (master节点ip端口号) describe po  应用环境名称 -n  |grep Image:|awk -F : '{print $2}'
    docker命令
      查看容器:
      docker ps|grep 容器对应字符号
      关闭容器:
      docker kill docker进程号
      进入容器:
      docker exec -it docker进程号/bin/bash
      重启docker:
      1)、systemctl restart docker
      2)、docker restart 容器ID
      重启子网:systemctl restart flannel
      zookeeper 的使用:容器内重启
      进入 app/tomcat/bin 重启 restart.sh
      状态:status.sh


      docker 常用命令
        docker pull ${CONTAINER NAME}                    #拉取镜像
        docker images #查看本地所有镜像
        docker ps #查看所有正在运行的容器,加-q返回id
        docker ps -a #查看所有容器,加-q返回id
        docker rm ${IMAGE NAME/ID}                      #删除镜像
        docker rm ${CONTAINER NAME/ID}                   #删除容器
        docker save ${IMAGE NAME} > ${FILE NAME}.tar     #将镜像保存成文件
        docker load < ${FILE NAME}.tar                   #从文件加载镜像
        docker start ${CONTAINER NAME/ID}                #运行一个以前运行过的容器
        docker stop ${CONTAINER NAME/ID}                 #停止一个正在运行的容器
        docker logs ${CONTAINER NAME/ID}                 #显示运行容器的日志
        docker run...                                    #运行一个容器    -
        -name ${container name}                          #设置容器名称    
        -p ${host port}:${container port}                 #映射主机和容器内的端口    
        -e ${env name}=${env value}                       #添加环境变量    
        -d                                                #后台运行    
        -v ${host folder path}:${container folder path}   #将主机目录挂在到容器内
        高级命令
        # Advance use 
        docker ps -f "status=exited"                                   #显示所有退出的容器
        docker ps -a -q                                                #显示所有容器id
        docker ps -f "status=exited" -q                                #显示所有退出容器的id
        docker restart $(docker ps -q)                                 #重启所有正在运行的容器
        docker stop $(docker ps -a -q)                                 #停止所有容器
        docker rm $(docker ps -a -q)                                   #删除所有容器
        docker rm $(docker ps -f "status=exited" -q)                   #删除所有退出的容器
        docker rm $(docker stop $(docker ps -a -q))                    #停止并删除所有容器
        docker start $(docker ps -a -q)                                #启动所有容器
        docker rmi $(docker images -a -q)                              #删除所有镜像
        docker exec -it ${CONTAINER NAME/ID} /bin/bash                 #进入容器内
        docker exec -it ${CONTAINER NAME/ID} ping ${CONTAINER NAME/ID#一个容器ping另外一个容器
        docker top ${CONTAINER NAME/ID}                                #显示一个容器的top信息
        docker stats                                                   #显示容器统计信息(正在运行)    
        docker stats -a                                            #显示所有容器的统计信息(包括没有运行的)    
        docker stats -a --no-stream                                #显示所有容器的统计信息(包括没有运行的) ,只显示一次    
        docker stats --no-stream | sort -k8 -h                     #统计容器信息并以使用流量作为倒序
        docker system       
        docker system df           #显示硬盘占用      
        docker system events       #显示容器的实时事件      
        docker system info         #显示系统信息      
        docker system prune        #清理文件
        日常问题记录
        1、Kubernetes 的节点和 Pod 有什么区别?
        节点是计算机,而 Pod 是容器运行于其中的东西
        2、k8s命名空间是什么?
        命名空间是 Pod 中的虚拟集群。这种抽象可以使你将多个虚拟集保留在多个环境中以此来进行隔离。
        3、容器是什么?
        a)精简的操作系统镜像
        b)在受限的操作系统环境中运行的应用程序
        如果你可以叫得出使用 Docker 以外的其他容器的编排软件(例如你最喜欢的公共云的容器服务),则可以得到加分。
        华为的GDE技术中台使用的就是K8S
        4、常见发音
        ubernete:油板呢特
        exec  :一个热可

        kubectl :枯白个筹


        文章转载自心在远方AND走在路上,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

        评论