目录
K8S的目标
降低运维成本。
注:学习k8s之前一定要熟练使用docker。
K8S是啥
一种容器管理技术。
容器如何管理?
引入pod机制,通过pod来管理容器。
pod是啥?
一个逻辑分组,在pod中存在1个或多个容器,在pod中会部署一组相关的服务(为啥要是相关的?为了减少网络开销)。pod有自己的主机名、IP地址。pod是k8s能操作的最基本的单位。
举例
我们的系统(awp)要部署上线(通过容器),先准备好我们项目的镜像,然后通过k8s来进行管理(先通过k8s创建pod)。
我们访问一个master节点(服务器),我们的请求会调度到一个Node节点(linux服务器),创建一个pod(逻辑分组)。我们的项目镜像会在pod里创建一个容器。
注:
- node节点有自己的IP,pod有自己的IP,通过镜像创建的容器也有自己的IP。
- 一个镜像一个服务
- 系统如果要集群,就是多个pod的副本
Pause容器
创建pod时会自动创建一个pause容器,其它容器共享pause的存储和网络。
其它容器通过localhost相互访问。
K8S核心组件介绍
ReplicationController:副本控制器
举例:3个pod内都部署了tomcat,就是3个副本,相当于3个tomcat集群。
集群的预期数量由页面或配置文件或命令来指定。
如果一个挂掉,会自动再创建一个,保证服务高可用。
ReplicaSet:副本控制器
本质跟ReplicationController差不多,新版本的K8S建议用ReplicSet取代ReplicationController
区别:
ReplicationController做pod选择器的时候,只支持单选。(筛选pod)
ReplicSet还能支持复选。(筛选pod)
注:pod可以加标签,通过标签进行筛选
Deployment
Deployment为pod和ReplicSet提供了一个声明式定义方法,用来替代ReplicationController
建议使用Deployment来自动管理ReplicSet
可理解为Deployment对ReplicSet进行了一个封装
应用场景:
滚动更新:发布新版本应用的时候,Deployment会重新创建ReplicSet,再由ReplicSet创建新的pod
做到不停机发布新版本程序。
回滚应用:如果发版失败,可以回滚。
举例:如果v2版本不好用,可以迅速回滚到v1版本的程序。
扩容和缩容:增加pod或者删除pod
HPA
监控pod的CPU使用率,如果利用率过高,自动扩容。
StatefullSet
创建集群,就是创建多个pod副本,大部分的服务是无状态的,比如tomcat服务集群。
通过容器部署,适合那些无状态的服务。
无状态:
没有数据需要实时的保留
有状态:
需要实时的数据更新和存储
举例理解:如果集群里的一个服务器抽离出去,再加回来,不影响用户使用的话,就是无状态服务,比如tomcat或nginx,数据库不行,所以数据库服务是有状态服务。
引申:docker容器主要面向无状态服务,可以用来部署项目的应用服务,一般不用来部署数据存储服务。但是有了k8s的StatefullSet组件,docker容器就可以部署有状态服务。
比如:
有序部署→我们审计系统部署,先部署数据库,再部署Redis,再部署应用程序,最后部署nginx
有序删除→先删除nginx,再应用程序,再Redis,最后数据库
DaemonSet
确保每个node都至少存在一个pod
Label
K8s里所有对象都可以打标签(标识),一个资源对象可以定义任意数量标签。实质是一系列的键值对
没有标签,就无法找到一组相关的pod,也就无法实现负载均衡。
标签举例:
版本标签:”release”:”stable”
环境标签:”environment”:”dev”,”environment”:”server”
服务发现
在此不讲
集群安装
在此不讲
操作
前提
K8s默认是要开机自动启动的
服务器上已经安装了docker,Docker默认开机自启动
K8s命令分三类
陈述式:命令(指令)
陈述式对象配置:命令(指令)+资源配置文件
声明式:编写yaml文件
我只介绍陈述式
常用命令(master节点)
docker ps 看一下docker启动没有
docker images 看一下k8s的镜像有没有
一般会有以下
k8s.gcr.io/kube-apiserver
k8s.gcr.io/kube-proxy
k8s.gcr.io/kube-scheduler
k8s.gcr.io/kube-controller-manager
k8s.gcr.io/kube-etcd
k8s.gcr.io/coredns
k8s.gcr.io/pause
kubectl get node 查看集群节点,看节点是否已经启动
状态正常应该是Ready
kubectl get pod 查看集群运行的pod
kubectl get pod -n kube-system -o wide 查看k8s相关的pod
-n 命名空间,不指定,命名空间默认为default
-o 输出
wide 详细信息
状态为Running,正常
状态为Pending,可能有些依赖还没运行
状态为CrashLoopBackOff,重启
kubectl create -f kube-flannel.yml 创建yaml文件
kubectl apply -f kube-flannel.yml 应用yaml文件,会下载一些组件
在node节点执行
kubeadm join master的ip:端口号 --token xxxxxxx --discovery-token-ca-cert-hash xxxxxxx
加入master节点(加入到集群)
举例1:创建pod,pod里运行一个tomcat容器
实际操作:
在master节点下
kubectl run my-tomcat --image=tomcat --port=8080
执行后正常应该显示deployment.apps/my-tomcat created
再执行kubectl get pod -o wide看一下状态,也顺便看一下运行在集群的哪个节点
kubectl get rs 正常应该显示my-tomcat-xxxxx .....
kubectl get deployment 正常应该显示my-tomcat .....
结合Deployment组件介绍的那张图来执行命令
注:
这个my-tomcat是deployment的名称
没有指定pod副本数量,默认只创建一个pod副本
镜像会被放到某个节点下,这样很low,应该有统一的镜像仓库
kubectl run my-tomcat --image=tomcat:v2 --port=8080 --replicas=3
使用v2版本的tomcat镜像,创建3个副本
举例2:对上面的pod进行扩容
kubectl scale deployment my-tomcat --replicas=3 把pod扩展为3个副本
注:直接删除任意一个pod副本是删除不了的,又会自动创建出来
举例3:彻底删除上面的pod
kubectl delete deployment my-tomcat
注:如果没有自动删除rs和pod,手动再删除一下rs和pod
举例4:创建service
kubectl expose deployment/my-tomcat --port=30000 --target=8080 同时会产生一个yaml文件
kubectl get svc -o wide 查看service
kubectl edit svc/my-tomcat 编辑刚才创建的yaml文件
把type由ClusterIP改为NodePort,意思是说把30000这个端口映射到物理机上
再执行一下kubectl get svc,看一下冒号后面那个端口号
IP加上这个端口号,就能用浏览器访问了。
结尾
此文章内容只是我学习k8s的一个粗略总结,各种细节无法涉及,希望对大家有所帮助。也希望大家能指出我的问题。