这个方法是从archlinux build源手工安装软件。首先需要安装基础的软件包,再下载源编译和安装。
这个方法是从archlinux build源手工安装软件。首先需要安装基础的软件包,再下载源编译和安装。
使用markdown + marp或者markdown + revealjs可以写PPT。使文档写作过程只专注于写作本身而不是各种格式。其实第一次还是要将常用的格式做好调试(主要是写一些常用的css文件自定义样式),后续则可以在markdown->html/PDF/docx/pptx/ebook间随意转换了。
以下主要记录几个常用命令,完整的pandoc手册可以参考:https://pandoc.org/MANUAL.html
markdown 2 pptx
pandoc mark.md -o mark.pptx --reference-doc=template.potx
mardown 2 revealjs
pandoc -t revealjs mark.md -o mark.html --self-contained -V revealjs-url=./reveal.js/ --css=custom.css
-t 参数还可以设置成s5, slidy, slideous, dzslides;
-V revealjs-url 可以制定本地目录reveal.js, 将https://github.com/hakimel/reveal.js下载本地即可;
-css 可以制定css附件,通过定制css文件可以调整显示样式。
对于revealjs可以在文件中设置width和height调整显示大小
1 | --- |
1 | .reveal h1{ |
在Manjaro系统中不能直接通过ibus-setup设置ibus-rime显示模式为水平模式(可能是Manjaro的bug)只能设置字体和文字大小。可以通过直接修改ibus-rime配置文件配置想要的显示方式。
ibus-rime的配置文件默认在~/.config/ibus/rime/build/
目录下,直接将horizontal
配置项修改成true
即可。
其他的ibus配置可以参考https://wiki.archlinux.org/title/IBus
minikube addons enable ingress
由于大家都知道到原因,国内无法直接访问gcr.io和quay.io很多Kubernetes相关镜像无法从国内下载,网上很多大神也给出了薅aliyun羊毛的方案,我自己也试了几次也总是不能成功,使用aliyun提供minikube的版本也总是无法启动ingress。
通过查看启动ingress失败的POD信息发现是无法下载使用到镜像,于是按照网络指导按照如下步骤提前下载镜像到minikube节点,再启动ingress即可成功,具体操作如下:
查询minikube版本对应的ingress镜像版本使用kubectl get po -A
查询ingress对应POD
1 | kubectl get po -A |
其中名字中包含ingress就是启动ingress新建到POD。
再使用kubectl describe po ingress-nginx-xxx --namespace kube-system
查询具体的失败信息,即可查询到失败原因为:获取镜像失败/超时。由于minikube 1.12.0版本以上的ingress镜像目前在阿里云上也无法下载,我们将minikube的版本切换到1.12.0版本,此时查询到的ingress插件依赖镜像信息如下:
1 | quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.32.0 |
手动安装ingress镜像使用minikube ssh登录到minikube的节点上,再动过docker命令手工pull镜像。
1 | docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/nginx-ingress-controller:0.32.0 |
quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.32.0 镜像可以由aliyun的镜像替代,再重新Tag成原有镜像。
再次启用ingress
上述操作均成功以后可以再次启动ingress插件即可秒成功 :)
之前文章中我们都是用POD部署应用,特别是用POD部署应用时如果要更新应用程序,必须先更新镜像(Image)/配置(ConfigMap),删除POD再重新部署应用程序才能整整的更新。Kubernetes提供了更高级的应用部署和升级方法。
如果用ReplicationController(RC)部署的应用可以通过RC update来更新应用。具体的kubia-rc.yaml文件如下:
1 | apiVersion: v1 |
使用kubectl create -f kubia-rc.yaml
创建RC,部署成功以后即可看到根据RC的配置会产生3个副本kubectl get rc,po
。
1 | kubectl get po,rc |
当前POD到到镜像版本为v1
1 | kubectl describe po |
通过kubectl set image rc/kubia kubia=172.17.0.1:5000/kubia:v2
更新镜像。此时的应用程序并不会自动更新。当POD 异常或者手工删除以后RC 会自动拉起一个POD ,保证POD的副本数和RC 中配置的一致,此时新的POD 就是使用新的镜像创建应用,也就是说有的POD 使用新的镜像,有的POD 使用老的镜像。可以通过kubectl describe po
查询到POD中容器的镜像版本不同。
1 | kubectl describe po |
使用ReplicationController部署应用,需要手工选择POD 逐一进行升级。实际部署应用过程中我们希望这个过程可以可控、且自动完成,这就需要通过更高级更高级的概念来部署应用。
Kubernetes提供更高级的概念来实现应用的部署、滚动升级以及回滚。一个典型的kubernetes的应用会包含:POD、RepliciaSet以及Deployment。他们之间的关系如下:
1 | apiVersion: apps/v1 |
还是上面的例子,这次将ReplicationController的yaml文件中kinde替换城Deployment,并另存为kubia-deploymnent.yaml,使用kubectl create -f kubia-deployment.yaml
重新部署应用,部署成功以后可以功过kubectl get po,rs,deployment
查询部署的应用情况。
1 | kubectl get po,rs,deployment |
通过kubectl descibe po
查询到POD到详细情况如下:
1 | kubectl describe po |
kubectl set image deployment/kubia kubia=172.17.0.1:5000/kubia:v2
设置完成以后deployment会自动滚动升级,可以通过kubectl rollout deployment/kubia status
查询升级状态,此时查询应用部署的详情可以看到PO,RS更新中或者已经更新成功。kubectl get po,rs,deployment
其中存在2个rs,一个升级前的rs,一个是当前到rs。
1 | kubectl get po,rs,deployment |
查询POD详细信息,可以看到新建到POD已经更新为新到镜像。
1 | kubectl describe po kubia-84ddcd9474-bv8fl ‹-- 新建POD |
此时如果使用kubectl rollout undo deployment/kubia
即可全部回滚应用,可以通过kubectl rollout pause/resume/restart/history等控制滚动升级过程(如果测试过程中难以观察到升级过程,可以讲deployment中副本数量调高)。
此外,也可以使用StatefulSet部署有状态应用。StatefulSet和Deployment最大的区别是为每个副本POD实例提供店里存储,可以保证POD副本有固定的名字和主机,可以按照预期的顺序启停POD副本。
Kubernetes使用ConfigMap配置应用程序(二)
上一篇学习了通过args方式还是env方式都是将配置应用,配置参数硬编码在POD配置文件中,实际应用部署的过程中,我们希望配置参数和POD配置能够解藕,今天我们就看一下如何用ConfigMap配置应用。
1 | kubectl create configmap fortune-configmap --from-literal=sleep-interval=60 |
创建成功以后可以通过kubectl命令查询configmap的配置。
kubectl get configmap fortune-configmap -o yaml
查询结果如下:
1 | apiVersion: v1 |
上述查询到信息将metadata中只保留名称就可以创建一个简单的ConfigMap配置文件,使用如下命令即可通过文件创建ConfigMap
kubectl create -f fortune-congfigmap.yaml
1 | apiVersion: v1 |
重新创建PODkubectl create -f fortune-pod-env.yaml
, 此时再查询fortune每个60秒更新一次。实际应用部署时,也可以修改ConfigMap的配置,当新新建POD时会使用新的ConfigMap值。
和使用环境变量配置POD类似,修改POD配置文件,使用ConfigMap配置args参数
1 | apiVersion: v1 |
创建PODkubectl create -f fortune-pod-args.yaml
, 此时查询fortune每个60秒更新一次。
此时,如果删除旧的ConfigMap,重新配置一个新的ConfigMap,再同时删除frotune-env pod和fortune-args pod并重新新建POD时会使用新的ConfigMap值。
从文件、文件夹和字符创建的ConfigMap
Kubernetes使用ConfigMap配置应用程序(一)
传统的应用程序在部署时往往需要通过命令行参数、环境变量、配置文件等方式配置应用程序。Kubernetes应用程序可以通过ConfigMap和Secret来配置应用程序。ConfigMap和Secret的区别主要是Secret用于敏感数据配置,数据在Kubernetes中是加密存储的。
选择ConfigMap和Secret的原则比较简单:
ConfigMap和Secret使用方式类似,这里主要描述ConfigMap的使用方式。
这次还是以fortune应用程序为例,通过ConfigMap向fortune传递参数调整程序刷新的时间间隔。首先我看一下不借助ConfigMap我们如何通过命令参数和环境变量配置应用。
1 |
|
1 | FROM ubuntu:latest |
重新制作镜像:docker build -t 172.17.0.1:5000/fortune:args .
,并推送本地镜像仓库
1 | docker run --name fortune-args -it 172.17.0.1:5000/fortune:args 15 |
1 | apiVersion: v1 |
这样重新创建POD即可看到应用参数更新成"30"秒。
1 |
|
1 | FROM ubuntu:latest |
重新制作镜像:docker build -t 172.17.0.1:5000/fortune:env .
,并推送本地镜像仓库
1 | apiVersion: v1 |
这样重新创建POD即可看到应用参数更新成"45"秒。
上述两种方式,无论时通过args方式还是env方式都是将配置参数硬编码在POD配置文件中。实际应用部署的过程中,我们希望配置参数和POD配置能够解藕,这个就需要用到Kubernetes提供的ConfigMap来实现。
之前一直有个疑问,如果要在同一个Kubernetes的POD中部署两个系统镜像的容器,两个容器岂不是会有资源(网络端口号,文件等)冲突。在尝试在Kubernetes挂载不同的存储时就遇到同一个nginx镜像部署在同一个POD中,第二个POD始终失败的问题,查看日志也提示尝试多次终止了容器。猜测应该是在同一个POD中端口冲突导致第二个容器启动失败,于是修改官方nginx镜像的端口号成功在一个POD中启动了两个nginx容器。
具体操作如下:
docker pull nginx:alpine
1 | docker run -it --name nginx nginx:alpine /bin/sh |
1 | user nginx; |
1 | FROM nginx:alpine |
docker build -t nginx:log .
本地测试成功以后就可以推送到自己的镜像仓库了:)。
为演示在Kubernetes挂载存储以下面为例:
fortune进程利用fortune游戏每10秒钟更新一次html文档;并将更新过程钟写入日志。
web-server进程使用nginx作为web服务器向外提供服务,客户展示fortune生成的html文件。
log-server进程使用nginx作为服务器向外提供服务,可以查询fortune日志。
分别将上述进程部署到不同的容器中,容器间通过挂载emptyDir卷共享信息。
1 |
|
每10秒钟生成一次html文件,并记录生成日志
1 | FROM ubuntu:latest |
1 | apiVersion: v1 |
nginx:log源于nginx:alpine镜像,只是将nginx默认80端口修改成8080端口,将默认的html root目录修改成/usr/share/nginx/log目录,具体修改方法下次在详细讲。
1 | kind: Service |
注意selector实际是按照POD中容器标签进行选择的,因此该信息必须和POD中设置的标签保持一致;
targetPort和容器端口一致,nginx:alpine默认端口是80端口
1 | kind: Service |
注意selector实际是按照POD中容器标签进行选择的,因此该信息必须和POD中设置的标签保持一致;
targetPort和容器端口一致,nginx:log默认端口是8080端口
1 | apiVersion: extensions/v1beta1 |
通过Ingress对外提供访问策略,分别根据不同的域名选择到不同的服务中。新版本的Kubernetes提供了新的网络策略接口,在后续文章中详细测试。
在minikube中创建ingress后可以通过:kubectl get ingress
查询ingress信息,该信息中包含了域名和IP地址的对应信息,在/etc/hosts中配置该信息即可在本机通过域名访问服务。
kubernets集群内部的服务可以直接环境变量、内部DNS等方式被发现,并在集群内部提供服务。如何将Kubernetes的服务暴露给外部客户端呢?
Kubernetes提供以下集中方式将服务暴露给开外部客户端:
顾名思义,将服务类型设置成NodePort方式,Kubernetes会在集群每个节点上打开一个端口,将该端口的流量转发到服务的POD。
负载均衡方式实际是NodePort方式的增强,将服务类型设置成LoadBalancer方式实际是通过云基础架构提供的负载均衡器,将流量转发到集群内部的NodePort上。
Ingress是Kubernetes一种资源,通过类似LoadBalancer类似的能力,区别在于每个LoadBalancer都需要一个独立的公网IP,而Ingress只需要一个公网IP即可根据规则将流量转发到对应的服务。