Manjaro系统中安装为fcitx5安装主题
安装fcitx5以及中文输入法
1
2
3sudo pacman -S fcitx5-im
sudo pacman -S fcitx5-chinese-addons
sudo pacman -S fcitx5-rime
1
2
3sudo pacman -S fcitx5-im
sudo pacman -S fcitx5-chinese-addons
sudo pacman -S fcitx5-rime
Manjaro下没有grub-customizer,可以通过编译源码安装安装。再使用grub-customizer修改grub菜单。
这个方法是从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文件可以调整显示样式。
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
由于大家都知道到原因,国内无法直接访问gcr.io和quay.io很多Kubernetes相关镜像无法从国内下载,网上很多大神也给出了薅aliyun羊毛的方案,我自己也试了几次也总是不能成功,使用aliyun提供minikube的版本也总是无法启动ingress。
通过查看启动ingress失败的POD信息发现是无法下载使用到镜像,于是按照网络指导按照如下步骤提前下载镜像到minikube节点,再启动ingress即可成功,具体操作如下:
查询minikube版本对应的ingress镜像版本
使用kubectl get po -A
查询ingress对应POD
1
2
3
4
5
6
7
8
9
10
11
12
13kubectl get po -A
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system coredns-546565776c-xgggd 1/1 Running 0 27m
kube-system etcd-minikube 1/1 Running 0 27m
kube-system ingress-nginx-admission-create-d9dtl 0/1 Completed 0 28s
kube-system ingress-nginx-admission-patch-x67q7 0/1 Completed 1 28s
kube-system ingress-nginx-controller-7bb4c67d67-hp5c7 0/1 ContainerCreating 0 28s
kube-system kube-apiserver-minikube 1/1 Running 0 27m
kube-system kube-controller-manager-minikube 1/1 Running 0 27m
kube-system kube-proxy-7wbct 1/1 Running 0 27m
kube-system kube-scheduler-minikube 1/1 Running 0 27m
kube-system storage-provisioner 1/1 Running 0 27m
其中名字中包含ingress就是启动ingress新建到POD。
再使用kubectl describe po ingress-nginx-xxx --namespace kube-system
查询具体的失败信息,即可查询到失败原因为:获取镜像失败/超时。由于minikube
1.12.0版本以上的ingress镜像目前在阿里云上也无法下载,我们将minikube的版本切换到1.12.0版本,此时查询到的ingress插件依赖镜像信息如下:
1
2quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.32.0
jettech/kube-webhook-certgen:v1.2.0
手动安装ingress镜像 使用minikube ssh登录到minikube的节点上,再动过docker命令手工pull镜像。
1
2
3docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/nginx-ingress-controller:0.32.0
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/nginx-ingress-controller:0.32.0 quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.32.0
docker pull jettech/kube-webhook-certgen:v1.2.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副本。
上一篇学习了通过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和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 .
本地测试成功以后就可以推送到自己的镜像仓库了:)。