自从上了K8S,项目更新都不带停机的!
如果你看了《Kubernetes太火了!花10分钟玩转它不香么?》一文的话,基本上已经可以玩转K8S了。其实K8S中还有一些高级特性也很值得学习,比如弹性扩缩应用、滚动更新、配置管理、存储卷、网关路由等。今天我们就来了解下这些高级特性,希望对大家有所帮助!
核心概念
首先我们先来了解一些核心概念,了解这些核心概念对使用K8S的高级特性很有帮助。
ReplicaSet
ReplicaSet确保任何时间都有指定数量的Pod副本在运行。通常用来保证给定数量的、完全相同的Pod的可用性。建议使用Deployment来管理ReplicaSet,而不是直接使用ReplicaSet。
ConfigMap
ConfigMap是一种API对象,用来将非机密性的数据保存到键值对中。使用时,Pod可以将其用作环境变量、命令行参数或者存储卷中的配置文件。使用ConfigMap可以将你的配置数据和应用程序代码分开。
Volume
Volume指的是存储卷,包含可被Pod中容器访问的数据目录。容器中的文件在磁盘上是临时存放的,当容器崩溃时文件会丢失,同时无法在多个Pod中共享文件,通过使用存储卷可以解决这两个问题。
常用的存储卷有如下几种:
configMap:configMap卷提供了向Pod注入配置数据的方法。ConfigMap对象中存储的数据可以被configMap类型的卷引用,然后被Pod中运行的容器化应用使用。
emptyDir:emptyDir卷可用于存储缓存数据。当Pod分派到某个Node上时,emptyDir卷会被创建,并且Pod在该节点上运行期间,卷一直存在。当Pod被从节点上删除时emptyDir卷中的数据也会被永久删除。
hostPath:hostPath卷能将主机节点文件系统上的文件或目录挂载到你的Pod中。在Minikube中的主机指的是Minikube所在虚拟机。
local:local卷所代表的是某个被挂载的本地存储设备,例如磁盘、分区或者目录。local卷只能用作静态创建的持久卷,尚不支持动态配置。
nfs:nfs卷能将NFS(网络文件系统)挂载到你的Pod中。
persistentVolumeClaim:persistentVolumeClaim卷用来将持久卷(PersistentVolume)挂载到Pod中。持久卷(PV)是集群中的一块存储,可以由管理员事先供应,或者使用存储类(Storage Class)来动态供应,持久卷是集群资源类似于节点。
Ingress
Ingress类似于K8S中的网关服务,是对集群中服务的外部访问进行管理的API对象,典型的访问方式是HTTP。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟托管。
高级特性
扩缩应用
当流量增加时,我们需要扩容应用程序满足用户需求。当流量减少时,需要缩放应用以减少服务器开销。在K8S中扩缩是通过改变Deployment中的副本数量来实现的。
获取所有Deployment可使用如下命令:
kubectl get deployments
NAME READY UP-TO-DATE AVAILABLE AGE
kubernetes-nginx 1/1 1 1 43h
获取所有ReplicaSet可使用如下命令:
kubectl get rs
NAME DESIRED CURRENT READY AGE
kubernetes-nginx-78bcc44665 1 1 1 43h
对应用进行扩容操作,扩容到4个实例,再查看所有:
kubectl scale deployments/kubernetes-nginx --replicas=4
[macro@linux-local root]$ kubectl get deployments
NAME READY UP-TO-DATE AVAILABLE AGE
kubernetes-nginx 4/4 4 4 43h
查看所有Pod,发现已经有4个运行在不同的IP地址上了;
kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
kubernetes-nginx-78bcc44665-8fnnn 1/1 Running 2 43h 172.17.0.3 minikube <none> <none>
kubernetes-nginx-78bcc44665-dvq4t 1/1 Running 0 84s 172.17.0.8 minikube <none> <none>
kubernetes-nginx-78bcc44665-thzg9 1/1 Running 0 84s 172.17.0.7 minikube <none> <none>
kubernetes-nginx-78bcc44665-w7xqd 1/1 Running 0 84s 172.17.0.6 minikube <none> <none>
对应用进行缩放操作,缩放到2个实例;
kubectl scale deployments/kubernetes-nginx --replicas=2
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
kubernetes-nginx-78bcc44665-8fnnn 1/1 Running 2 44h 172.17.0.3 minikube <none> <none>
kubernetes-nginx-78bcc44665-w7xqd 1/1 Running 0 11m 172.17.0.6 minikube <none> <none>
滚动更新
滚动更新允许通过使用新的实例逐步更新Pod实例,零停机进行Deployment更新。K8S不仅可以实现滚动更新,还可以支持回滚操作。
目前运行了4个Nginx
1.10
版本的实例:
[macro@linux-local root]$ kubectl get pods
NAME READY STATUS RESTARTS AGE
kubernetes-nginx-78bcc44665-8fnnn 1/1 Running 2 44h
kubernetes-nginx-78bcc44665-jpw2g 1/1 Running 0 5s
kubernetes-nginx-78bcc44665-w7xqd 1/1 Running 0 59m
kubernetes-nginx-78bcc44665-xx8s5 1/1 Running 0 5s
可以通过
kubectl describe
命令来查看镜像版本号:
[macro@linux-local root]$ kubectl describe pods |grep ImageImage: nginx:1.10Image ID: docker-pullable://nginx@sha256:6202beb06ea61f44179e02ca965e8e13b961d12640101fca213efbfd145d7575
通过
kubectl set image
命令来更新Nginx镜像的版本号为1.19
,此时K8S会执行滚动更新,逐步停止1.10
版本的实例并启动1.19
版本的实例;
# 命令格式 kubectl set image Deployment的名称 容器名称=容器镜像:镜像版本号
kubectl set image deployments/kubernetes-nginx nginx=nginx:1.19
# 停止1个旧实例并创建2个新实例
NAME READY STATUS RESTARTS AGE
kubernetes-nginx-66f67cd758-rbcz5 0/1 ContainerCreating 0 11s
kubernetes-nginx-66f67cd758-s9ck8 0/1 ContainerCreating 0 11s
kubernetes-nginx-78bcc44665-8fnnn 1/1 Running 2 45h
kubernetes-nginx-78bcc44665-jpw2g 0/1 Terminating 0 15m
kubernetes-nginx-78bcc44665-w7xqd 1/1 Running 0 75m
kubernetes-nginx-78bcc44665-xx8s5 1/1 Running 0 15m
# 1个实例已被停止2个新实例仍创建中
NAME READY STATUS RESTARTS AGE
kubernetes-nginx-66f67cd758-rbcz5 0/1 ContainerCreating 0 30s
kubernetes-nginx-66f67cd758-s9ck8 0/1 ContainerCreating 0 30s
kubernetes-nginx-78bcc44665-8fnnn 1/1 Running 2 45h
kubernetes-nginx-78bcc44665-w7xqd 1/1 Running 0 75m
kubernetes-nginx-78bcc44665-xx8s5 1/1 Running 0 15m
# 4个新实例均已创建完成
NAME READY STATUS RESTARTS AGE
kubernetes-nginx-66f67cd758-jn926 1/1 Running 0 48s
kubernetes-nginx-66f67cd758-rbcz5 1/1 Running 0 3m12s
kubernetes-nginx-66f67cd758-s9ck8 1/1 Running 0 3m12s
kubernetes-nginx-66f67cd758-smr7n 1/1 Running 0 44s
此时再使用
kubectl describe
命令来查看镜像版本号,发现Nginx已经更新至1.19
版本:
[macro@linux-local root]$ kubectl describe pods |grep ImageImage: nginx:1.19Image ID: docker-pullable://nginx@sha256:4cf620a5c81390ee209398ecc18e5fb9dd0f5155cd82adcbae532fec94006fb9
如果想回滚到原来的版本的话,直接使用
kubectl rollout undo
命令即可。
kubectl rollout undo deployments/kubernetes-nginx
配置管理
ConfigMap允许你将配置文件与镜像文件分离,以使容器化的应用程序具有可移植性。接下来我们演示下如何将ConfigMap的的属性注入到Pod的环境变量中去。
添加配置文件
nginx-config.yaml
用于创建ConfigMap,ConfigMap名称为nginx-config
,配置信息存放在data
节点下:
apiVersion: v1
kind: ConfigMap
metadata:name: nginx-confignamespace: default
data:nginx-env: test
应用
nginx-config.yaml
文件创建ConfigMap:
kubectl create -f nginx-config.yaml
获取所有ConfigMap:
kubectl get configmap
NAME DATA AGE
kube-root-ca.crt 1 2d22h
nginx-config 1 13s
通过
yaml
格式查看ConfigMap中的内容:
kubectl get configmaps nginx-config -o yaml
apiVersion: v1
data:nginx-env: test
kind: ConfigMap
metadata:creationTimestamp: "2021-01-08T01:49:44Z"managedFields:- apiVersion: v1fieldsType: FieldsV1fieldsV1:f:data:.: {}f:nginx-env: {}manager: kubectl-createoperation: Updatetime: "2021-01-08T01:49:44Z"name: nginx-confignamespace: defaultresourceVersion: "61322"uid: a477567f-2aff-4a04-9a49-f19220baf0d3
添加配置文件
nginx-deployment.yaml
用于创建Deployment,部署一个Nginx服务,在Nginx的环境变量中引用ConfigMap中的属性:
apiVersion: apps/v1
kind: Deployment
metadata:name: nginx-deploymentlabels:app: nginx
spec:replicas: 1selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- name: nginximage: nginx:1.10ports:- containerPort: 80env:- name: NGINX_ENV # 在Nginx中设置环境变量valueFrom:configMapKeyRef:name: nginx-config # 设置ConfigMap的名称key: nginx-env # 需要取值的键
应用配置文件文件创建Deployment:
kubectl apply -f nginx-deployment.yaml
创建成功后查看Pod中的环境变量,发现
NGINX_ENV
变量已经被注入了;
kubectl exec deployments/nginx-deployment -- env
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=nginx-deployment-66fcf997c-xxdsb
NGINX_ENV=test
存储卷使用
通过存储卷,我们可以把外部数据挂载到容器中去,供容器中的应用访问,这样就算容器崩溃了,数据依然可以存在。
记得之前我们使用Docker部署Nginx的时候,将Nginx的
html、logs、conf
目录从外部挂载到了容器中;
docker run -p 80:80 --name nginx \
-v /mydata/nginx/html:/usr/share/nginx/html \
-v /mydata/nginx/logs:/var/log/nginx \
-v /mydata/nginx/conf:/etc/nginx \
-d nginx:1.10
Minikube可以认为是一台虚拟机,我们可以用Minikube的
ssh
命令来访问它;
minikube ssh
Minikube中默认有一个
docker
用户,我们先重置下它的密码;
sudo passwd docker
在Minikube中创建
mydata
目录;
midir /home/docker/mydata
我们需要把Nginx的数据目录复制到Minikube中去,才能实现目录的挂载,注意docker用户只能修改
/home/docker
目录中的文件,我们通过scp
命令来复制文件;
scp -r /home/macro/mydata/nginx docker@192.168.49.2:/home/docker/mydata/nginx
添加配置文件
nginx-volume-deployment.yaml
用于创建Deployment:
apiVersion: apps/v1
kind: Deployment
metadata:name: nginx-volume-deploymentlabels:app: nginx
spec:replicas: 1selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- name: nginximage: nginx:1.10ports:- containerPort: 80volumeMounts:- mountPath: /usr/share/nginx/htmlname: html-volume- mountPath: /var/log/nginxname: logs-volume- mountPath: /etc/nginxname: conf-volumevolumes:- name: html-volumehostPath:path: /home/docker/mydata/nginx/htmltype: Directory- name: logs-volumehostPath:path: /home/docker/mydata/nginx/logstype: Directory- name: conf-volumehostPath:path: /home/docker/mydata/nginx/conftype: Directory
应用配置文件创建Deployment;
kubectl apply -f nginx-volume-deployment.yaml
添加配置文件
nginx-service.yaml
用于创建Service;
apiVersion: v1
kind: Service
metadata:name: nginx-service
spec:type: NodePortselector:app: nginxports:- name: httpprotocol: TCPport: 80targetPort: 80nodePort: 30080
应用配置文件创建Service;
kubectl apply -f nginx-service.yaml
查看下Service服务访问端口;
[macro@linux-local nginx]$ kubectl get services
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 6d23h
kubernetes-nginx NodePort 10.106.227.54 <none> 80:30158/TCP 5d22h
nginx-service NodePort 10.103.72.111 <none> 80:30080/TCP 7s
通过CURL命令可以访问Nginx首页信息。
curl $(minikube ip):30080
网关路由
Ingress可以作为K8S的网关来使用,能提供服务路由和负载均衡等功能。
Minikube默认没有启用Ingress插件,需要手动开启;
minikube addons enable ingress
开启Ingress过程中遇到了一个坑,会在验证的时候卡主,其实是Minikube内部无法下载Ingress镜像导致的:
[macro@linux-local ~]$ minikube addons enable ingress
* Verifying ingress addon...
解决该问题需要手动下载第三方镜像,并标记为需要的镜像,并重新启用Ingress插件;
# 查找启动有问题的Pod
kubectl get pods -n kube-system
# 查看启动失败原因
kubectl describe ingress-nginx-controller-xxx -n kube-system
# 连接到Minikube
minikube ssh
# 原来需要下载的镜像(已经无法下载)
docker pull us.gcr.io/k8s-artifacts-prod/ingress-nginx/controller:v0.40.2
# 下载第三方替代镜像(直接去DockerHub官网搜索即可)
docker pull pollyduan/ingress-nginx-controller:v0.40.2
# 修改镜像名称
docker tag pollyduan/ingress-nginx-controller:v0.40.2 us.gcr.io/k8s-artifacts-prod/ingress-nginx/controller:v0.40.2
重启插件后检查下Ingress是否在运行;
kubectl get pods -n kube-system
NAME READY STATUS RESTARTS AGE
ingress-nginx-admission-create-krpgk 0/1 Completed 0 46h
ingress-nginx-admission-patch-wnxlk 0/1 Completed 3 46h
ingress-nginx-controller-558664778f-wwgws 1/1 Running 2 46h
添加配置文件
nginx-ingress.yaml
用于创建Ingress;
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: nginx-ingressannotations:nginx.ingress.kubernetes.io/rewrite-target: /$1
spec:rules:- host: nginx-volume.comhttp:paths:- path: /pathType: Prefixbackend:service:name: nginx-serviceport:number: 80
应用配置文件创建Ingress;
kubectl apply -f nginx-ingress.yaml
查看所有Ingress,此时我们已经可以通过
nginx-volume.com
来访问Pod中运行的Nginx服务了;
kubectl get ingress
NAME CLASS HOSTS ADDRESS PORTS AGE
nginx-ingress <none> nginx-volume.com 192.168.49.2 80 6s
需要修改下
host
文件,注意切换到root
账号后修改:
# 切换到root用户
su -
# 修改host文件
vi /etc/hosts
# 添加如下记录
192.168.49.2 nginx-volume.com
最后通过CURL命令可以访问Nginx首页信息。
curl nginx-volume.com
总结
通过K8S扩展和管理容器化应用确实十分方便,通过几个命令我们就可以实现零停机更新,出了故障也不怕,一个命令实现回滚。但是大量的命令行操作总显得枯燥无味,要是有个可视化工具可以直接管理K8S就更好了。
参考资料
官方文档:https://kubernetes.io/zh/docs/home/
推荐阅读
如何打造一个经常宕机的业务系统?
同事写了一个update,误用一个双引号,生产数据全变0了!
这款IDEA插件刷爆了朋友圈,网友:这用起来有点酸爽~
K8S太火了!花10分钟玩转它不香么?
如何搭建一支拖垮公司的技术团队?
推荐一款 IDEA 神器 ,人工智能帮你写代码,再也不用加班了!!
还在使用Swagger?推荐几款接口文档生成神器!
Mall电商实战项目专属学习路线,主流技术一网打尽!
40K+Star!Mall电商实战项目开源回忆录!
mall-swarm 微服务电商项目发布重大更新,打造Spring Cloud最佳实践!
欢迎关注,点个在看
自从上了K8S,项目更新都不带停机的!相关推荐
- K8s项目实战笔记 图文并茂带你深度解析Kubernetes
一.前言 Kubernetes(简称K8S)是开源的容器集群管理系统,可以实现容器集群的自动化部署.自动扩缩容.维护等功能.它既是一款容器编排工具,也是全新的基于容器技术的分布式架构领先方案.在Doc ...
- 阿里P8架构师力荐K8s项目实战笔记 图文并茂带你深度解析Kubernetes
一.前言 Kubernetes(简称K8S)是开源的容器集群管理系统,可以实现容器集群的自动化部署.自动扩缩容.维护等功能.它既是一款容器编排工具,也是全新的基于容器技术的分布式架构领先方案.在Doc ...
- 分布式系统的Raft算法——在失联阶段这个老Leader的任何更新都不能算commit,都回滚,接受新的Leader的新的更新 意味着还是可能丢数据!!!...
过去, Paxos一直是分布式协议的标准,但是Paxos难于理解,更难以实现,Google的分布式锁系统Chubby作为Paxos实现曾经遭遇到很多坑. 来自Stanford的新的分布式协议研究称为R ...
- 如何在github上fork一个项目来贡献代码以及同步原作者的修改
如何在github上fork一个项目来贡献代码以及同步原作者的修改 作为一个IT人,通过github进行学习是最快的成长手段.我们可以浏览别人的优秀代码.但只看不动手还是成长得很慢,因此为别人贡献代码 ...
- 模拟k8s项目的生命周期
文章目录 模拟k8sngin项目生命周期 Kubectl是管理k8s集群的命令行工具 k8s项目创建资源 发布nginx服务提供负载均衡功能 为什么可以访问nginx? 查看proxy负载均衡端口 更 ...
- 通过Rancher Desktop在桌面上运行K8s
Rancher 发行的操作系统新选择:Rancher Desktop for Windows,它可以帮助你在Windows桌面上管理Kubernetes和容器.当然他当然会支持Linux,Mac的. ...
- 上传本地项目到gitee_用git上传本地文件到码云gitee的方法
首先登录码云 https://gitee.com/,注册一个账号,并登录账号. 1. 在码云上创建项目 在码云首页顶部,下图所示,右上角头像旁边的加号,鼠标移上去会显示下拉的,点击"新建项目 ...
- github入门到上传本地项目
GitHub是基于git实现的代码托管.git是目前最好用的版本控制系统了,非常受欢迎,比之svn更好. GitHub可以免费使用,并且快速稳定.即使是付费帐户,每个月不超过10美刀的费用也非常便宜. ...
- 在window系统上对web项目进行safair兼容测试
在window系统上对web项目进行safair兼容测试 公司需求:需要在safair上进行兼容测试,但是没有mac 解决方案:通过安装虚拟机,在虚拟机上装一个 mac os 下载 virtual B ...
最新文章
- c++函数模板_高考数学解答题得分模板——三角函数与解三角形
- [bzoj3131]淘金[sdoi2013][数位DP]
- EAGER的获取是代码的味道
- JEECG近期会开展培训公开课
- java 屏幕键盘io
- ASP.NET ActionPack
- 生物技术制药课程文献调研报告撰写说明
- xPath(他山之石)
- 27. 面向对象程序设计(2)
- SkewTransform
- js植物大战僵尸实训1
- 旅游黄山需要注意的几个问题
- 当生命科学遇上AI,会产生怎样1+1>2的效果?
- uni-app项目打包成apk(本地打包篇)
- L1-030. 一帮一-PAT团体程序设计天梯赛GPLT
- 备战sp23春招 day8 | 344.反转字符串 541. 反转字符串II 剑指 05.替换空格 151.翻转字符串里的单词 剑指58-II.左旋转字符串
- 计算机和计算机之间如何传送文件,两台电脑实现互传文件:多种方法可选择
- Word题注带一级标题,由图一.1变为图1.1
- 【转】回字有四种写法,那你知道单例有五种写法吗
- 什么是好的博客网站?
热门文章
- 数据库课程设计--公交车管理系统总结(Qt学习小结)
- ae稳定不能获取动态服务器,ae 获取动态链接服务器超时
- 护眼灯作用大不大?Led护眼灯的好处都有什么
- 在c语言中我叫做符号变量,问渠网-C语言基础-第一节 关键字符号与变量
- 归一化处理的目的和意义及其MATLAB方法
- 计算机二级c语言考上机考试吗,计算机二级c语言上机考试操作步骤及流程
- 使用java8新特性stream流实现获取String集合中最长的元素
- QQ支付下单思路和代码
- 我的电脑,虽然你很慢,但是我很爱你啊!
- nike air max polska 2016 ważne jest