Kubernetes是什么?
一个大规模的容器编排系统。 具有以下特性:
- 服务发现和负载均衡 可以使用DNS名称或ip公开容器,k8s可以负载均衡的分配网络流量。
- 存储编排 允许你自动挂载你选择的存储系统,例如本地存储,公共云提供商等。
- 自动部署和回滚 k8s可以部署创建新容器,删除现有容器并将他们的所有资源用于新容器。
- 管理容器资源 k8s可以管理每个容器所需的cpu和内存。
- 自动修复 k8s可以重新启动失败的容器,替换容器,杀死不响应的容器。
- 秘钥和配置管理 k8s允许存储和管理敏感信息,例如密码
k8s架构是什么样的?
k8s集群是 N个master 节点 + N 个worker节点。 N>=1
各个组件如下:
- Master 节点:
- Worker 节点:
- API Server:类似门面模式,隐藏了决策者,接受程序员的命令。
- Controller manager : 决策者
- kubelet: 管理容器中的应用,可以对应用进行健康检查。它保证容器都运行在pod中。
- kube-proxy: 用于网络访问应用的,存储应用地址的。
- kube-Scheduler:可以选择节点让新创建的pod在上面运行。
- etcd: 是具有一致性和高可用性的键值数据库,用于保存k8s集群数据的后台数据库。
集群部署组件:
- kubectl : 是程序员给k8s发送命令的。
- kubeadmin:帮助程序员管理k8s。
NameSpace
名称空间,用来对集群资源进行隔离。默认只隔离资源,不隔离网络。
命令:
kubectl get [namespace|ns] 查看所有名称空间
kubectl create ns [namespce名称] 创建名称空间
kubectl delete ns [namespace名称] 删除名称空间
Pod
在其中运行一组容器。是k8s应用中的最小单位。 相当于docker中的容器,可理解为应用, k8s 会对每个pod分配一个ip,这个ip地址只能在k8s集群中访问。
查看Pod:
kubectl get pods -A 查看所有的pod
kubectl get pods -n [namespace] 查看指定指定namespace下的pod。
kubectl get pod 获取默认命名空间下的pod
kubectl get pod -owide 可以查看pod更加详细的信息,比如ip地址。
kubectl describe pod [pod名称] 查看pod的详细信息。
kubectl get pod --show-labels 查看pod的标签
创建Pod:
kubectl run [pod名称] --image=[docker镜像名称] 根据镜像创建pod
删除Pod:
kubectl delete pod [pod名称]
查看pod中运行应用的日志:
kubectl logs [pod名称]
进入Pod中:
kubectl exec -it [pod名称] -- /bin/bash
Deployment
使Pod拥有很多副本,自愈,扩容的能力。就是可以控制pod的行为。 无状态应用部署,比如微服务
创建deploy
kubectl create deployment [pod名称] --image=[镜像名称] 创建deployment
kubectl create deployment [pod名称] --image=[镜像名称] --replicas=3 创建3个部署
查看deploy:
kubectl get deploy 查看部署
kubectl get deploy/[deploy名称] -oyaml 查看部署,以yaml输出。
扩缩容
将pod的个数设置为5个
kubectl scale --replicas=5 deploy/[deploy名称]
或者通过以下命令编辑 replicas 属性
kubectl edit deploy [deploy名称]
自愈&故障转移
自愈:当pod故障了,自动重启
故障转移:当某台机器上pod故障了,可以在其他机器上自动拉起一份。
滚动更新
在软件升级部署中,可以继续对外提供功能。 先启动一个新pod,再关闭一个旧pod。 此时,是新旧两个版本同时对外提供,直到新pod全部启动,旧pod全部下线。
kubectl set image deploy/[deploy名称] [原有镜像]=[新镜像] --record
版本回退
查看历史记录:
# 查看deploy历史记录
kubectl rollout history deploy/[deploy名称]
# 查看某个历史版本详情
kubectl rollout history deploy/[deploy名称] --revision=[版本号]
# 回滚到上次
kubectl rollout undo history deploy/[deploy名称]
# 回滚到指定版本
kubectl rollout undo deploy/[deploy名称] --to-revision=[版本号]
StatefulSet
有状态应用部署 比如 Redis,提供稳定存储,网络等功能。
DaemonSet
守护型应用部署,比如日志收集组件
Job/CronJob
定时任务部署,比如垃圾清理组件,可以在指定时间运行。
Service
提供Pod的服务发现和负载均衡。 即pod缩放后,service可以自动感知到,从而将访问pod的请求自动负载均衡到可用的pod上。
查看service
kubectl get service
删除service
kubectl delete svc [service名称]
暴露deploy
# 默认通过集群ip对外暴露,集群内部可以访问。
kubectl expose deploy [Pod的标签] --port=[Pod的port名称] --target-port=[对外暴露端口]
# 采用NodePort模式,集群内外都可以访问,每个pod都会暴露一个相同的对外端口,通过任意一个pod的ip+端口就可以负载均衡的访问到集群上的服务。k8s会在30000-32767之间随机暴露端口。
kubectl expose deploy [Pod的标签] --port=[Pod的port名称] --target-port=[对外暴露端口] --type=NodePort
通过暴露一组pod对外的端口后,就可以通过service的ip:对外端口 就可以访问 pod内的服务。 也可以通过域名:端口也可以访问,不过这只能在k8s集群内部的pod中可以访问。 域名规则: pod的标签.命名空间.svc
Ingress
Service 的统一网关入口,流量首先通过Ingress,通过ingress将请求路由到指定的service中,内部就是一个nginx。
查看Ingress
kubectl get ingress
存储抽象
就是在不同节点上共享目录 PV PVC
ConfigMap
抽取应用配置,给pod提供配置,且可以自动更新,数据保存在etcd中。
创建配置集
kubectl create cm [配置集名称] --from-file=[配置文件地址]
查看配置集
kubectl get cm
Secret
存放一些密码信息
命令: kubectl get secret