1.Kubernetes介绍
主要为自动化部署、扩展和管理容器应用,提供了资源调度部署管理、服务发现、扩容缩容、监控等一整套功能。(开源的容器集群管理系统,go语言,也叫k8s)
用途:自动化容器的部署和复制;随着扩展或收缩容量规模;将容器组织成组,并且提供容器间的负载均衡;很容易地升级应用程序容器的新版本;提供容器弹性 容器失效就替代它
(优势:容器编排、轻量级、开源、弹性伸缩、负载均衡)
2.K8s主要功能
数据卷:pod中容器间数据共享,可使用数据卷
应用程序健康检查:容器内服务可能进程堵塞无法处理请求,可设置监控检查策略保证应用健壮性
复制应用程序实例:控制器维护pod副本数量,保证一pod或一组同类pod始终可用
弹性伸缩:根据设定的指标(CPU利用率)自动缩放pod副本数
服务发现:使用环境变量或DNS服务插件保证容器中程序发现pod入口访问地址
负载均衡:一组pod副本分配一个私有的集群IP地址,负载均衡转发请求到后端容器。在集群内部其他pod可通过这个cluster IP访问应用
滚动更新:更新服务不中断,一次更新一个pod,而不是同时删除整个服务
服务编排:通过文件描述部署服务,使得应用程序部署变得更高效
资源监控:Node节点组件集成cadvisor资源收集工具,可通过heapster汇总整个集群节点资源数据,然后存储到influxdb时序数据库,再由grafana展示
提供认证和授权:支持角色访问(RBAC)认证授权等策略
3.基本对象概念
Pod:最小部署单元、一组容器的集合、一个Pod中的容器共享网络命名空间(短暂的)
Controllers:更高级层次对象,部署和管理Pod
ReplicaSet : 确保预期的Pod副本数量 Deployment : 无状态应用部署
StatefulSet : 有状态应用部署 DaemonSet : 确保所有Node运行同一个Pod
Job : 一次性任务 Cronjob : 定时任务
Service:防止Pod失联、定义一组Pod的访问策略
Label:标签,附加到某个资源上,用于关联对象、查询和筛选
Namespaces:命名空间,将对象逻辑上隔离
Annotations:注释
4.系统架构及组件功能
master组件:(不跑任务)
Apiserver:集群统一入口,所有对象资源的增删改查和监听操作都交给APIserver处理后在提交给etcd存储
Controller-manager:集群中常规后台任务处理,一个资源对应一控制器,管理控制器
Scheduler:根据调度算法为新创建的pod选择一个node节点
Etcd:键值对数据库,保存集群中重要信息(持久化),如:pod/service等对象信息
node组件:(工作节点)
Kebelet:master在node节点的agent,管理本机运行容器的生命周期,如:创建容器、pod挂载数据卷。
Kube-proxy:node节点上实现pod网络代理,维护网络规则和四层负载均衡工作
Docker/rocket/rkt:容器引擎,运行容器
coreDNS:可以为集群中SVC创建一个域名/IP的对应关系解析
Dashboard:给k8s集群提供一个B/S结构访问体系
Ingress controller:官方只能实现四层代码,ingresss可实现7层代理
Promethedus:提供k8s集群监控
ELK:K8s集群日志统一分析平台
5.K8S集群部署
(1)minikube方式安装:需要先安装docker,kubectl get node //查看节点信息
(2)云平台搭建
(3)裸机搭建
主节点安装:docker/kubectl(集群命令行交互工具)/kubeadm(集群初始化工具)
worker节点安装:docker/kubelet(管理pod和容器)/kube-proxy(网络代理,负责网络相关工作)
kubenetes安装:(1 master + 2 node节点 centos7系统) //master不会跑任务
(1)设置主机名解析:3台主机配置 /etc/hosts
(2)关闭selinux和关闭防火墙
(3)添加k8s安装源(3台)+docker安装源(3台)
(4)安装所需组件:yum -y install kublet kubadm kubectl docker-ce(3台)并启动kubelet/docker
(5)修改docker配置/etc/docker
(6)主节点:
kubeadm初始化集群:kubeadm init --image-repository=registry.aliyuncs.com/google_containers
复制授权文件,以便 kubectl 可以有权限访问集群
(7)工作节点:
工作节点加入集群:kubeadm join 172.16.32.10:6443 --token xxx --discovery-token-ca-cert-hash xxx
(8)主节点:
安装网络插件,否则 node 是 NotReady 状态(主节点跑)
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
kubectl get node 查看
//集群安装完成
部署应用到集群中 ***yaml转json:https://tools.fun/json2yaml.html
命令行创建:kubectl run testapp --image=ccr.ccs.tencentyun.com/k8s-tutorial/test-k8s:v1
yaml创建:kubectl apply -f pod.yaml
(Deployment管理 //kubectl get deployment )
kubectl get pod -o wide //查看pod运行的IP,在哪个节点运行
Deployment通过 label 关联起来 Pods
6.kubectl管理工具
设置集群项中名为kubernetes的apiserver地址与根证书:
kubectl config set-cluster kubernetes --server=https://192.168.1.195:6443 --certificate-authority=ca.pem
设置用户项中cluster-admin用户证书认证字段:
kubectl config set-credentials cluster-admin --certificate-authority=ca.pem --client-key=admin-key.pem --client-certificate=admin.pem
设置环境项中名为default的默认集群和用户
kubectl config set-context default --cluster=kubernetes --user=cluster-admin
设置默认环境项为default: kubectl config use-context default
7.k8s网络类型
Node Network: 与外部网络接口
Service Network: ipvs规则当中的网络、路由提供调度
Pod Network(flannel network): 节点当中pod的内部网络无法与外界通信,Overlay Network/VXLAN/Flannel
8.K8s yaml文件编写
编写规则:大小写敏感,缩进表示层级关系,缩进只能用空格,#注释,两种结构类型(lists/maps)
参数:version(K8S API的版本),kind(资源类型和角色),metadata(元数据对象),metadata.name(元数据对象的名字,如pod名), metadata.namespace(元数据对象的命名空间),
Spec(详细定义对象), spec.containers[](Spec对象的容器列表定义),spec.containers[].name(容器的名字),spec.containers[].image(镜像名称)
9.Pod重启策略、镜像拉取策略
重启策略(restartPolicy字段配置):Always、Never 、OnFailure
镜像拉取策略(imagePullPolicy字段配置): Always、Never、IfNotPresent
10.Pod存活探针种类(k8s通过存活探针检查容器是否还在运行)
httpGet: 通过容器IP/端口/路径发送http请求,返回200-400状态码表示成功
exec: 容器内执行shell,根据退出状态码是否为0判断,0健康,非0不健康
TCPSocket:与容器IP/端口建立TCPSocket链接,能建立则探测成功,反之失败
11.Pod一直处于pending状态怎么排查
Pod开始创建时,本身会处于pending状态,这是可能正在拉取镜像,正在创建容器过程。一直pending,首先使用kubectl describe查看pod events详细信息,
可能原因:调度器调度失败(调度器无法为pod分配一个合适的node节点,如node节点资源紧张、污点pod没有定义容忍等),pvc/pv无法动态创建
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)