2017年,Kubernetes很火,已经成为容器编排的事实标准。之前,我们用Docker,把应用容器化,部署,方便了很多,但是,当容器多了之后,手动管理容器,就很麻烦了,比如,容器挂了,要手动重启,流量大了,要手动扩容,发布,要手动一个个更新,等等,这时候,就需要一个容器编排工具,来自动管理容器,Kubernetes,就是目前最好的选择。
我最近,在学习,和,使用Kubernetes,踩了一些坑,也总结了一些经验,今天,就来分享一下,Kubernetes的入门知识,从Docker到容器编排,带大家,快速上手Kubernetes。
一、为什么需要容器编排
先说说,为什么需要容器编排。
用Docker,把应用容器化之后,部署一个应用,很简单,只需要,docker run,一下,就行,但是,当应用多了,容器多了,手动管理,就很麻烦了,主要有以下几个问题:
- 容器的生命周期管理: 容器挂了,怎么办?需要,自动重启,保证服务可用,手动重启,太麻烦,也不及时。
- 服务发现和负载均衡: 多个容器,提供同一个服务,怎么,把流量,分发到各个容器?怎么,让客户端,找到这些容器?需要,服务发现,和,负载均衡。
- 弹性伸缩: 流量大的时候,需要,自动扩容,增加容器,流量小的时候,需要,自动缩容,减少容器,节省资源,手动扩容缩容,太麻烦,也不及时。
- 滚动发布和回滚: 发布新版本的时候,需要,滚动更新,不中断服务,出了问题,需要,快速回滚,手动一个个更新,太麻烦,也容易出问题。
- 配置和密钥管理: 应用的配置,密钥,怎么管理?怎么,注入到容器里?不同环境,不同配置,怎么管理?
- 存储管理: 有状态的应用,比如数据库,需要,持久化存储,怎么,管理存储?怎么,把存储,挂载到容器里?
这些问题,都是,容器多了之后,会遇到的,手动管理,几乎不可能,所以,需要一个容器编排工具,来自动管理这些,Kubernetes,就是目前最流行,最成熟的容器编排工具。
二、Kubernetes是什么
Kubernetes,简称K8s,是Google开源的容器编排工具,用于自动部署、扩展和管理容器化应用。
Kubernetes,有以下几个特点:
- 自动化: 自动部署,自动重启,自动扩容缩容,自动滚动发布,等等,很多操作,都能自动化,减少人工干预。
- 可扩展: Kubernetes的架构,是可扩展的,可以,通过插件,扩展功能,比如,网络插件,存储插件,Ingress控制器,等等。
- 高可用: Kubernetes本身,支持高可用部署,没有单点故障,同时,管理的应用,也能,保证高可用,容器挂了,自动重启,节点挂了,自动迁移。
- 跨平台: Kubernetes,可以,运行在,各种环境,比如,物理机,虚拟机,公有云,私有云,混合云,等等,一次部署,到处运行。
- 生态丰富: Kubernetes的生态,很丰富,有很多工具,和,项目,比如,Helm(包管理),Prometheus(监控),EFK(日志),Istio(服务网格),等等,能满足各种需求。
三、Kubernetes的核心组件
Kubernetes的架构,分为,Master节点,和,Node节点,Master节点,负责管理和控制,Node节点,负责运行容器。
Master节点的核心组件:
- API Server: Kubernetes的API入口,所有的操作,都通过API Server,它负责,接收请求,校验,处理,返回结果,是Kubernetes的核心。
- Scheduler: 调度器,负责,把Pod,调度到,合适的Node节点上,根据,资源需求,亲和性,反亲和性,等等,选择最合适的节点。
- Controller Manager: 控制器管理器,负责,运行各种控制器,比如,Node控制器,Replication控制器,Endpoint控制器,等等,保证,集群的状态,和,期望的状态,一致。
- etcd: 分布式键值存储,负责,存储Kubernetes的所有数据,比如,节点信息,Pod信息,配置,等等,是Kubernetes的数据库。
Node节点的核心组件:
- Kubelet: 节点代理,负责,管理本节点上的Pod,和,容器,保证,容器正常运行,同时,向Master节点,汇报节点状态。
- Kube-proxy: 网络代理,负责,管理本节点的网络规则,实现,Kubernetes的服务发现,和,负载均衡。
- Container Runtime: 容器运行时,负责,运行容器,比如,Docker,containerd,CRI-O,等等。
四、Kubernetes的常用资源对象
Kubernetes,有很多资源对象,常用的有以下几个:
- Pod: 最小的部署单元,一个Pod里,可以有一个或多个容器,这些容器,共享网络,和,存储,Pod是短暂的,随时可能被销毁和重建。
- Deployment: 部署,用于,管理无状态应用,定义,期望的Pod数量,和,更新策略,Deployment会,自动创建和管理ReplicaSet,保证Pod的数量,和,状态,符合期望。
- Service: 服务,用于,给一组Pod,提供一个统一的访问入口,实现,服务发现,和,负载均衡,Service有几种类型,比如,ClusterIP(集群内部访问),NodePort(节点端口访问),LoadBalancer(负载均衡器访问)。
- Ingress: 入口,用于,管理外部访问,HTTP和HTTPS路由,通过域名,路径,等,把流量,转发到不同的Service,Ingress需要,Ingress控制器,才能工作,比如,Nginx Ingress。
- ConfigMap: 配置映射,用于,管理应用的配置,把配置,从镜像里,分离出来,方便,不同环境,不同配置,ConfigMap可以,挂载为文件,或者,环境变量,注入到容器里。
- Secret: 密钥,用于,管理敏感信息,比如,密码,密钥,证书,等等,和ConfigMap类似,但是,Secret是加密存储的,更安全。
- PersistentVolume(PV)和PersistentVolumeClaim(PVC): 持久化存储,PV是,集群里的存储资源,PVC是,用户对存储的请求,Kubernetes会,把PVC,绑定到,合适的PV,然后,挂载到容器里,实现,数据持久化。
- Namespace: 命名空间,用于,把集群,逻辑上,分成多个环境,比如,开发,测试,生产,不同的命名空间,资源是隔离的,方便,多团队,多环境,共享一个集群。
五、部署一个简单应用
下面,用一个简单的例子,演示一下,怎么在Kubernetes上,部署一个应用。
假设,我们有一个Node.js的Web应用,镜像已经构建好了,是myapp:1.0,监听3000端口,现在,要部署到Kubernetes上。
1. 创建Deployment:
创建一个deployment.yaml文件:
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp
spec:
replicas: 3
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
spec:
containers:
- name: myapp
image: myapp:1.0
ports:
- containerPort: 3000
resources:
requests:
cpu: 100m
memory: 128Mi
limits:
cpu: 500m
memory: 512Mi这个Deployment,会创建3个Pod副本,每个Pod,运行myapp:1.0镜像,监听3000端口,同时,配置了资源请求和限制。
执行:kubectl apply -f deployment.yaml
2. 创建Service:
创建一个service.yaml文件:
apiVersion: v1
kind: Service
metadata:
name: myapp
spec:
selector:
app: myapp
ports:
- port: 80
targetPort: 3000
type: ClusterIP这个Service,会把80端口的流量,转发到,标签为app=myapp的Pod的3000端口,类型是ClusterIP,只能在集群内部访问。
执行:kubectl apply -f service.yaml
3. 创建Ingress:
如果要,外部访问,需要创建Ingress:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: myapp
spec:
rules:
- host: myapp.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: myapp
port:
number: 80这个Ingress,会把域名myapp.example.com的流量,转发到myapp Service的80端口。
执行:kubectl apply -f ingress.yaml
这样,一个简单的应用,就部署好了,Kubernetes会,自动管理Pod的生命周期,保证3个副本正常运行,如果某个Pod挂了,会自动重启,如果流量大了,可以手动,或者自动,扩容。
六、最佳实践和踩坑经验
最后,分享一些,Kubernetes的最佳实践,和,踩坑经验:
- 资源请求和限制,一定要配置: 每个容器,都要配置,CPU和内存的requests和limits,不然,可能会,被其他容器,抢占资源,或者,资源使用过多,导致节点不稳定。
- 健康检查,一定要配置: 每个容器,都要配置,livenessProbe(存活探针)和readinessProbe(就绪探针),这样,Kubernetes才能,知道容器是否正常,是否可以接收流量,容器挂了,自动重启,容器没就绪,不转发流量。
- 不要用latest标签: 镜像,不要用latest标签,要用,具体的版本号,比如,myapp:1.0.0,这样,才能,保证,部署的版本,是确定的,方便,回滚,和,排查问题。
- 配置和密钥,用ConfigMap和Secret: 不要把配置,和,密钥,写在镜像里,要用ConfigMap和Secret,管理,这样,不同环境,不同配置,不用重新构建镜像,也更安全。
- 有状态应用,用StatefulSet: 无状态应用,用Deployment,有状态应用,比如数据库,消息队列,要用StatefulSet,保证,Pod的名称,稳定,存储,持久化,有序部署和扩缩。
- 日志,不要存在容器里: 容器是短暂的,随时可能被销毁,所以,日志,不要存在容器里,要,输出到stdout/stderr,然后,用日志收集工具,比如,Fluentd,Filebeat,收集到,集中的日志系统,比如,Elasticsearch,方便,查看和分析。
- 监控,一定要做: Kubernetes的集群,和,应用,都要,做监控,比如,用Prometheus+Grafana,监控,节点资源,Pod状态,应用指标,等等,出了问题,能及时发现,快速定位。
- 先在测试环境,验证: Kubernetes的配置,比较复杂,先在测试环境,充分验证,没问题了,再上生产,避免,配置错误,导致生产故障。
七、写在最后
Kubernetes入门:从Docker到容器编排。
Kubernetes,是目前最流行,最成熟的容器编排工具,能帮我们,自动管理容器化应用,解决,容器多了之后的各种管理问题,虽然,学习曲线,有点陡,概念比较多,但是,掌握了之后,会发现,它真的很强大,能大大提升,部署和运维的效率。
希望,这篇入门分享,能帮大家,快速了解Kubernetes,上手Kubernetes,少踩一些坑。
最后,用一句话结尾:
"容器化,是趋势,Kubernetes,是容器编排的事实标准,掌握Kubernetes,是每个运维和开发工程师,必备的技能,早学早受益。"
祝大家,都能,顺利上手Kubernetes,用得越来越好!
评论(0)
暂无评论,快来抢沙发~
评论功能仅对会员开放,请先登录
登录