一、什么是k8s,k8s都有什么功能?
k8s是一个docker容器管理工具
二、k8s的核心功能
自愈: 重新启动失败的容器,在节点不可用时,替换和重新调度节点上的容器,对用户定义的健康检查不响应的容器会被中止,并且在容器准备好服务之前不会把其向客户端广播。
弹性伸缩: 通过监控容器的cpu的负载值,如果这个平均高于80%,增加容器的数量,如果这个平均低于10%,减少容器的数量
服务的自动发现和负载均衡: 不需要修改您的应用程序来使用不熟悉的服务发现机制,Kubernetes 为容器提供了自己的 IP 地址和一组容器的单个 DNS 名称,并可以在它们之间进行负载均衡。
滚动升级和一键回滚: Kubernetes 逐渐部署对应用程序或其配置的更改,同时监视应用程序运行状况,以确保它不会同时终止所有实例。 如果出现问题,Kubernetes会为您恢复更改,利用日益增长的部署解决方案的生态系统。
三、k8s的应用场景
k8s最适合跑微服务架构
3.1 k8s常用的资源
3.1.1 创建pod资源
k8s yaml的主要组成
apiVersion: v1 api版本 kind: pod 资源类型 metadata: 属性 spec: 详细
3.1.2 创建一个pod.yaml文件
pod配置文件2:
3.2.1 ReplicationController资源
ReplicationController资源 也叫rc资源
rc:保证指定数量的pod始终存活,rc通过标签选择器来关联pod
k8s资源的常见操作:
创建一个rc yaml文件
升级 kubectl rolling-update nginx -f nginx-rc1.15.yaml --update-period=10s
这个是rc的资源升级命令 --update-period=10s这个是10.秒更新一个pod资源
回滚 kubectl rolling-update nginx2 -f nginx-rc.yaml --update-period=1s
这个是回滚的命令,如果升级的新版本有问题就马上回滚到上个稳定的版本中
3.3.1service资源
原理:kubernetes中,在受RC调控的时候,pod副本是变化的,对于的虚拟的ip地址也是变化的,比如发生迁移或者伸缩的时候。这就是对于pod资源的访问者来说是不可接受的,kubernetes中的service是一种抽象的概念,它的定义就是一个pod逻辑集合以及访问的它们的策略,service同pod的关联同样是居于lable来完成的service的目标的提供一种桥梁,它会为访问者提供一个固定访问地址,用于在访问时重定向到相应的后端,这使的非kubernetes原生态应用程序,在无须kubernetes编写特定代码的前提下,轻松访问后端。
service同rc一样,都是通过label来关联的pod的,当你在service的yaml文件中定义了该service的selector中的label为 app: myweb ,那么这个service会将pod-->metadata-->label中为app:myweb 的pod就可以作为发请求后端。当pod发生变化时(增加,减少,重建等),service会及是更新的,这样一来,service就是可以作为pod的访问入口,起到代理的作用,而对于访问者来说,通过service进行访问无需告状pod资源。(需要注意的是,kubernetes是通过kube-proxy组件来实现的虚拟IP路由及转发的,所以在之前集群部署的环节上,我们在每个node上都部署了proxy这个组件,从而实现了kubernetes层的虚拟网络转发)
service的内部网络负载均衡
当service的endpoints包含多个ip地址时,及服务代理存在多个后端,将进行请求的负载均衡。默认的负载均衡策略是轮询或者随机,同时,service上通过设置service--->spec--->sesionaffinity=clientip来实现基于源IP地址的会话保持
service自发机制
kubernetes中有一个重要的服务就是自发性,一旦一个service被创建,该service的service的ip和serviceponrt的资源等信息就会记录到pod的资源中供它们使用
service帮助pod暴露端口
创建一个service
修改nodePort范围
vim /etc/kubernetes/apiserver KUBE_API_ARGS="--service-node-port-range=3000-50000"
service默认使用iptables来实现负载均衡, k8s 1.8新版本中推荐使用lvs(四层负载均衡)
3.4 deployment资源
kubernetes提供的一种更加简单的更新rc和pod资源的机制,叫做delpoyment,通过deployment中描述所期望的集群状态,deployment 会将现在的集群状态在一个可控的速度下琢步更新你所期望的集群状态deployment 主要 的职责同样是为了保证pod的数量和健康90%的功能与rc资源完全一样,可以看到新一代的rc,但是,它又具备了rc之外的新特性: rc的全部功能:deploument继承了上面的描述的rc全部功能 事件和状态查看:可以查看deployment的升级详情进度和状态。 回滚:当升级的pod镜像或者相关参数时候发现问题,可以使用回滚的操作回滚到上一个稳定的版本或者指定的版本 版本记录:每一次deployment的操作,都可以保存下来,给予后续可能回滚的使用 暂停和启动: 对于每一次升级,都能够随时暂停和启动 多种升级方案:删除所有已存在的pod,重新创建新的,滚动升级,琢步替换的策略,同时滚动升级时,支持更多的附加参数,例如设置最大的不可用pod数量,最小升级间隔离时间等等。
创建deployment
deployment升级和回滚 命令行创建deployment kubectl run nginx --image=10.0.0.11:5000/nginx:1.13 --replicas=3 --record 命令行升级版本 kubectl set image deploy nginx nginx=10.0.0.11:5000/nginx:1.15 查看deployment所有历史版本 kubectl rollout history deployment nginx deployment回滚到上一个版本 kubectl rollout undo deployment nginx deployment回滚到指定版本 kubectl rollout undo deployment nginx --to-revision=2
4:k8s的附加组件
4.1 dns服务
安装dns服务 1:下载dns_docker镜像包 wget http://192.168.12.201/docker_image/docker_k8s_dns.tar.gz ###这个包电脑里面有这个地址不能下载 2:导入dns_docker镜像包(node2节点) 3:修改skydns-rc.yaml
4:创建dns服务 ###这些yaml文件都是本地写好的上传上去的 kubectl create -f skydns-rc.yaml 5:检查 kubectl get all --namespace=kube-system 6:修改所有node节点kubelet的配置文件 vim /etc/kubernetes/kubelet KUBELET_ARGS="--cluster_dns=10.254.230.254 --cluster_domain=cluster.local" systemctl restart kubelet
4.2 namespace命令空间
namespace做资源隔离
kubectl create namespace &&& ###这个写你要创建的名字 kubectl delete namespace &&& ### 这个写你要删除的名字 kubectl get namespace ####查看你已经创建的
4.3 健康检查
4.3.1 探针的种类
livenessProbe:健康状态检查,周期性检查服务是否存活,检查结果失败,将重启容器 readinessProbe:可用性检查,周期性检查服务是否可用,不可用将从service的endpoints中移除
4.3.2 探针的检测方法
- exec:执行一段命令 * httpGet:检测某个 http 请求的返回状态码 * tcpSocket:测试某个端口是否能够连接
4.3.3 liveness探针的exec使用
4.3.4 liveness探针的httpGet使用
4.3.5 liveness探针的tcpSocket使用
4.3.6 readiness探针的httpGet使用
4.4 dashboard服务
1:上传并导入镜像,打标签 2:创建dashborad的deployment和service
4.5 通过apiservicer反向代理访问service
5: k8s弹性伸缩
k8s弹性伸缩,需要附加插件heapster监控
5.1 安装heapster监控
1:上传并导入镜像,打标签
ls *.tar.gz for n in ls *.tar.gz ;do docker load -i $n ;done docker tag
docker.io/kubernetes/heapster_grafana:v2.6.0 10.0.0.11:5000/heapster_grafana:v2.6.0 docker tag docker.io/kubernetes/heapster_influxdb:v0.5 10.0.0.11:5000/heapster_influxdb:v0.5 docker tag docker.io/kubernetes/heapster:canary 10.0.0.11:5000/heapster:canary 2:上传配置文件,kubectl create -f . ###这几个文件在我自己电脑里面
3:打开dashboard验证
5.2 弹性伸缩
1:修改rc的配置文件 ###这几个文件都是在我的电脑里面写完上传上去的
2:创建弹性伸缩规则
kubectl autoscale -n qiangge replicationcontroller myweb --max=8 --min=1 --cpu-percent=8 ##-n 是资源隔离的名字
3:测试
ab -n 1000000 -c 40 http://172.16.28.6/index.html ###那个ip地址不是是随机不是是一样的
弹性伸缩是指定适应的负载变化,以弹性可伸缩的方式提供资源。反映到kubernetes中,指的是可根据负载均衡的高低动态调整pod副本数量,调整pod的副本数就是通过修改pod的副本来实现的
6:持久化存储
pv: persistent volume 全局的资源 pv,node
pvc: persistent volume claim 局部的资源(namespace)pod,rc,svc
6.1:安装nfs服务端(10.0.0.11)
yum install nfs-utils.x86_64 -y mkdir /data vim /etc/exports /data 10.0.0.0/24(rw,async,no_root_squash,no_all_squash) systemctl start rpcbind systemctl start nfs
6.2:在node节点安装nfs客户端
yum install nfs-utils.x86_64 -y showmount -e 10.0.0.11
6.3:创建pv和pvc
上传yaml配置文件,创建pv和pvc
6.4:创建mysql-rc,pod模板里使用volume
6.5: 验证持久化
验证方法1:删除mysql的pod,数据库不丢
kubectl delete pod mysql-gt054
验证方法2:查看nfs服务端,是否有mysql的数据文件
作者:不知道就
链接:https://www.jianshu.com/p/4869375928d6
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。