
kubernetes(k8s) 是一个全新的基于容器技术的分布式架构领先方案是谷歌严格保密十几年的秘密武器----Borg系统的一个开源版本于2014年9月发布第一个版本2015年7月发布第一个正式版本。kubernetes的本质是一组服务器集群它可以在集群的每个节点上运行特定的程序来对节点中的容器进行管理。目的是实现资源管理的自动化主要提供了如下的主要功能自我修复一旦某一个容器崩溃能够在1秒中左右迅速启动新的容器弹性伸缩可以根据需要自动对集群中正在运行的容器数量进行调整服务发现服务可以通过自动发现的形式找到它所依赖的服务负载均衡如果一个服务起动了多个容器能够自动实现请求的负载均衡版本回退如果发现新发布的程序版本有问题可以立即回退到原来的版本存储编排可以根据容器自身的需求自动创建存储卷一、环境准备集群连通校验人话讲解检查自己电脑能不能连上公司K8s集群查看集群所有节点状态确认集群正常。常用kubectl命令# 查看集群版本kubectl version# 查看集群所有节点最常用kubectl get nodes# 查看集群详细信息kubectl cluster-info无YAML配置直接执行命令即可。二、Kubectl 通用基础命令人话讲解K8s 所有资源通用增删改查语法记住这一套所有资源都能用。常用kubectl命令# 查看所有资源简写kubectl get all# 查看某类资源基础信息kubectl get 资源类型# 查看某类资源详细信息kubectl get 资源类型-owide# 查看资源详细描述排错神器kubectl describe 资源类型 资源名# 通过YAML创建/更新资源kubectl apply-f文件名.yaml# 删除资源# 方式1按名称删除kubectl delete 资源类型 资源名# 方式2通过YAML删除kubectl delete-f文件名.yaml# 强制删除资源卡死时用kubectl delete 资源类型 资源名 --grace-period0--force三、Pod 基础操作K8s最小单元人话讲解Pod是K8s最小运行单元一个Pod里可以跑1~多个容器等同于Docker容器的封装工作中几乎不裸用Pod只做调试。常用kubectl命令# 查看所有Pod默认当前命名空间kubectl get pods kubectl get pods-owide# 临时运行一个测试Pod用完即删kubectl run nginx-test--imagenginx:alpine# 删除临时Podkubectl delete pod nginx-test完整可执行YAMLpod.yamlapiVersion:v1kind:Podmetadata:name:nginx-podlabels:app:nginxspec:containers:-name:nginximage:nginx:alpineports:-containerPort:80执行部署kubectl apply-fpod.yaml四、Deployment 业务部署上班最常用人话讲解生产绝对不用裸Pod全部用Deployment管理应用自动维持副本数量、Pod挂了自动重启、支持版本发布和回滚业务项目全靠它部署。常用kubectl命令# 查看所有Deploymentkubectl get deploy kubectl get deploy-owide# 命令行快速创建Deploymentkubectl create deployment nginx-dep--imagenginx:alpine--replicas2# 删除Deploymentkubectl delete deployment nginx-dep完整可执行YAMLdeployment.yamlapiVersion:apps/v1kind:Deploymentmetadata:name:nginx-deploylabels:app:nginxspec:# 副本数量replicas:2selector:matchLabels:app:nginxtemplate:metadata:labels:app:nginxspec:containers:-name:nginximage:nginx:alpineports:-containerPort:80执行部署kubectl apply-fdeployment.yaml五、Service 服务暴露端口转发人话讲解相当于Docker端口映射把Deployment内部应用暴露出去供内部/外部访问常用两种ClusterIP仅集群内部访问微服务互调NodePort宿主机端口外部可直接访问常用kubectl命令# 查看所有Servicekubectl get svc1. ClusterIP 内部访问 YAMLsvc-clusterip.yamlapiVersion:v1kind:Servicemetadata:name:nginx-svcspec:selector:app:nginxports:-port:80targetPort:80type:ClusterIP2. NodePort 外部访问 YAMLsvc-nodeport.yamlapiVersion:v1kind:Servicemetadata:name:nginx-nodeport-svcspec:selector:app:nginxports:-port:80targetPort:80nodePort:30080type:NodePort执行部署kubectl apply-fsvc-clusterip.yaml六、ConfigMap Secret 配置中心人话讲解不用把配置、密码写死在镜像里ConfigMap存放普通配置、配置文件、环境变量Secret存放密码、密钥、敏感信息常用kubectl命令# 查看配置kubectl get cm kubectl get secret1. ConfigMap 最简YAMLconfigmap.yamlapiVersion:v1kind:ConfigMapmetadata:name:app-configdata:app.env:|SPRING_PROFILES_ACTIVEprod DB_HOST192.168.1.1002. Secret 最简YAMLsecret.yamlapiVersion:v1kind:Secretmetadata:name:app-secrettype:Opaquedata:# 值需要base64编码 示例root 编码后 cm9vdAdb-user:cm9vdAdb-pwd:MTIzNDU2部署kubectl apply-fconfigmap.yaml kubectl apply-fsecret.yaml七、日志排查线上查错必用人话讲解等同于docker logs看应用控制台日志排查报错、启动失败、程序异常。常用kubectl命令# 查看Pod日志kubectl logs pod名称# 实时滚动日志最常用kubectl logs-fpod名称# Pod里有多个容器时指定容器看日志kubectl logs-fpod名称-c容器名# 查看上一次崩溃的Pod日志kubectl logs-ppod名称八、进入Pod容器内部人话讲解等同于docker exec -it进容器内部改配置、测网络、查文件、调试问题。常用kubectl命令# 进入Pod交互式终端通用kubectlexec-itpod名称 -- /bin/sh# nginx/ubuntu 用bashkubectlexec-itpod名称 -- /bin/bash# 进入Deployment管理的Pod任意一个副本kubectlexec-itdeployment/nginx-deploy -- /bin/sh九、应用扩容 缩容人话讲解业务流量大就加副本流量小就减副本不用改YAML一条命令搞定。常用kubectl命令# 命令行直接扩容到3个副本kubectl scale deployment nginx-deploy--replicas3# 缩容到1个副本kubectl scale deployment nginx-deploy--replicas1十、应用发布 版本回滚人话讲解更新镜像版本上线上线出问题一键回滚到上一个稳定版本生产高频操作。常用kubectl命令# 更新镜像版本发布新版本kubectlsetimage deployment/nginx-deploynginxnginx:stable# 查看发布历史版本kubectl rollouthistorydeployment nginx-deploy# 一键回滚到上一版本kubectl rollout undo deployment nginx-deploy# 回滚到指定版本kubectl rollout undo deployment nginx-deploy --to-revision1十一、命名空间 Namespace人话讲解用来隔离环境dev开发、test测试、prod生产不同环境资源互不干扰。常用kubectl命令# 查看所有命名空间kubectl get ns# 创建命名空间kubectl create namespace dev# 切换操作的命名空间kubectl config set-context--current--namespacedev# 删除命名空间会删掉里面所有资源kubectl delete ns dev命名空间YAMLns.yamlapiVersion:v1kind:Namespacemetadata:name:test十二、日常排错万能操作人话讲解Pod异常、启动失败、镜像拉不取、一直Pending用下面命令一套排查。常用kubectl命令# 1. 看Pod状态kubectl get pods-owide# 2. 详细排查原因排错第一神器kubectl describe pod pod名称# 3. 看集群事件查报错根源kubectl get events--sort.lastTimestamp# 4. 强制重建Podkubectl rollout restart deployment nginx-deploy十三、k8s 的 容器运行时目前 Kubernetes (K8s) 社区和主流发行版使用的标准容器运行时是containerd而不是 Docker。这个变化是 K8s 发展的一个重要里程碑。简单来说K8s 在 v1.20 版本正式宣布弃用对 Docker 的直接支持并在 v1.24 版本中彻底移除了相关的适配代码即 Dockershim。 为什么会有这个变化这背后主要是架构演进的原因Docker 的构成我们常说的 “Docker” 其实是一个完整的容器平台它不仅包含了负责运行容器的底层引擎containerd还集成了镜像构建、Docker CLI、Docker Compose 等许多上层功能。K8s 的需求Kubernetes 作为一个容器编排系统它只需要一个符合标准的、轻量级的底层容器运行时来负责拉取镜像和运行容器即可。Docker 中的很多其他功能对 K8s 来说是冗余的。引入 CRI 标准为了能与多种容器运行时如 containerd, CRI-O 等对接K8s 定义了CRI (Container Runtime Interface)标准接口。containerd 作为一个独立的、成熟的、且原生支持 CRI 的项目自然成为了接替 Docker 的最佳选择。 这对我们有什么影响对开发者几乎没有影响。你仍然可以使用 Docker 来编写Dockerfile和构建镜像。构建出的镜像完全兼容 containerd。对运维人员在搭建和维护 K8s 集群时需要在节点上安装和配置 containerd或 CRI-O作为运行时而不是 Docker Engine。你看到的节点运行时版本信息会是containerd://...。如果 还是想 让 docker 成为 k8s 的 容器运行时 怎么办Docker 本身Docker Engine并不直接符合 CRI 标准。1. 核心区别Docker vs. containerd你可以把 Docker 想象成一个**“全家桶”**它包含Docker CLI你敲命令的终端工具。Dockerd (Daemon)负责管理镜像、容器、网络的大管家。containerd真正负责运行容器的底层核心这就是 Docker 和 K8s 都能用的部分。runC真正调用 Linux 内核接口来创建进程的工具。关键点在于containerd天生就支持 CRI 标准可以直接和 K8s 对话。Docker Engine (Dockerd)它是为了给人类使用的提供丰富的 CLI 命令、Docker Compose 等它的设计初衷并不是为了直接被机器K8s调用所以它原生不支持 CRI 接口。2. 那为什么以前 K8s 能用 Docker在 Kubernetes v1.24 之前K8s 为了能使用 Docker在代码里内置了一个“翻译官”叫做Dockershim。流程是这样的K8s -Dockershim (翻译)- Docker Engine - containerd。因为 Docker 实在太流行了K8s 不得不专门写代码来兼容它。3. 为什么现在说“Docker 不支持 CRI”随着 K8s 的发展官方觉得维护这个“翻译官”Dockershim太累了而且多一层翻译就多一层性能损耗。所以在 v1.24 版本中K8s彻底删除了 Dockershim。这意味着K8s 不再认识 Docker Engine 了。如果你强行要在 K8s 里用 Docker Engine你必须额外安装一个叫cri-dockerd的第三方插件让它来充当以前的“翻译官”角色。