思有所皈,绪有所依

给万千思绪,寻一寄存之所

九日齐山登高

唐·杜牧
江涵秋影雁初飞,与客携壶上翠微。
尘世难逢开口笑,菊花须插满头归。
但将酩酊酬佳节,不用登临恨落晖。
古往今来只如此,牛山何必独沾衣。

阅读全文 »

登金陵凤凰台

唐·李白
凤凰台上凤凰游,凤去台空江自流。
吴宫花草埋幽径,晋代衣冠成古丘。
三山半落青天外,二水中分白鹭洲。
总为浮云能蔽日,长安不见使人愁。

阅读全文 »

登鹳雀楼

唐·王之涣

白日依山尽,黄河入海流。
欲穷千里目,更上一层楼。

王之涣在任衡水主簿时受到诬陷,他不屑于继续留在肮脏的官场,就辞官去云游四海。这期间在路过山西永济市蒲州古城时,王之涣慕名游鹳雀楼写下了《登鹳雀楼》。

这首诗把景与理、景与情、情与理融为一体,天衣无缝。在修辞格式上,这首绝句全篇对仗、工整流畅,也是典范之作。

古代诗歌的“意象化”特性:诗歌通过调动人的形象思维来打动人心。这首诗的前两句“白日依山尽,黄河入海流”表面是写景物,实际是让人通过流水的易逝来感悟到时间的流逝。时间很抽象,于是古人给时间找了一个“意象化”的代言人,那就是流水。要抓住稍纵即逝的时间,就需要“更上一层楼”,这是诗人的答案,要抓紧时间,勇攀高峰。

王之涣

“自由豁达王之涣,工整有理流水对”(《诗词里的中国》)

王之涣(688年—742年),出生时大唐正处在全盛阶段,去世的时候盛唐也还没有结束。记载王之涣的史料非常少,他一辈子就只当过衡水主簿、文安县尉这样的小官。王之涣留存于世的诗只有六首,但仅凭《凉州词》与《登鹳雀楼》,王之涣就足以睥睨诗坛,流芳千古。

王之涣、高适、王昌龄和岑参并称为唐代“四大边塞诗人”。

“少有侠气,所从游皆五陵少年,击剑悲歌,从禽纵酒。”(《唐才子传》元·辛文房)
“孝闻于家,义闻于友,慷慨有大略,倜傥有异才”、“尝或歌从军,吟出塞,曒兮极关山明月之思,萧兮得易水寒风之声,传乎乐章,布在人口。”(《王之涣写墓志铭》唐·靳能)

另见:《凉州词》

登高

唐·杜甫
风急天高猿啸哀,渚清沙白鸟飞回。
无边落木萧萧下,不尽长江滚滚来。
万里悲秋常作客,百年多病独登台。
艰难苦恨繁霜鬓,潦倒新停浊酒杯。

阅读全文 »

k3s文档

中文文档:https://docs.rancher.cn/docs/k3s/_index

准备离线文件

https://github.com/k3s-io/k3s/releases下载以下文件:
* k3s-airgap-images-amd64.tar.zst
* k3s

https://rancher-mirror.rancher.cn/k3s/k3s-install.sh下载k3s-install.sh文件。

离线安装(Ubuntu 22.04)

  1. 将k3s-airgap-images-amd64.tar.zst文件上传到服务器的/var/lib/rancher/k3s/agent/images/目录下

    1
    2
    sudo mkdir -p /var/lib/rancher/k3s/agent/images/
    sudo cp k3s-airgap-images-amd64.tar.zst /var/lib/rancher/k3s/agent/images/
  2. 将k3s文件上传到服务器的/usr/local/bin/目录下

    1
    2
    sudo cp k3s /usr/local/bin/
    sudo chmod +x /usr/local/bin/k3s
  3. 将k3s-install.sh文件上传到服务器

  4. 执行安装脚本

    server1
    1
    2
    3
    4
    5
    chmod +x k3s-install.sh
    sudo INSTALL_K3S_SKIP_DOWNLOAD=true \
    INSTALL_K3S_EXEC='server --token=23f0fba79fc84fd5962279908c86d05e --cluster-init' \
    ./k3s-install.sh

    servern
    1
    2
    3
    4
    chmod +x k3s-install.sh
    sudo INSTALL_K3S_SKIP_DOWNLOAD=true \
    INSTALL_K3S_EXEC='server --token=23f0fba79fc84fd5962279908c86d05e --server https://server1:6443' \
    ./k3s-install.sh

让k3s使用私有镜像仓库

放一个registries.yaml文件进行配置

/etc/rancher/k3s/registries.yaml
1
2
3
4
mirrors:
docker.io:
endpoint:
- "http://registry.example.com:5000"

重启k3s

1
sudo systemctl restart k3s

挂载NAS

在阿里云控制台查看具体操作

helm安装(ubuntu 22.04)

1
2
3
4
5
6
7
cp /etc/rancher/k3s/k3s.yaml ~/.kube/config

sudo snap install helm --classic

helm repo add bitnami https://charts.bitnami.com/bitnami

helm repo list

helm3不再需要Tiller和helm init

使用Lens访问

https://k8slens.dev/下载Lens安装包,支持windows,需要通过XShell的隧道来打通网络。
在Lens的Clusters界面增加(右下角的大加号),选择菜单Add from kubeconfig,复制粘贴K3s的kubeconfig(/etc/rancher/k3s/k3s.yaml)即可。

使用Docker下载镜像再导入到k8s

Docker下载

1
docker save registry.k8s.io/kube-state-metrics/kube-state-metrics:v2.9.2 -o kube-state-metrics-v2.9.2.tar

Docker导入

1
docker image load -i kube-state-metrics-v2.9.2.tar

k3s导入

1
2
k3s ctr image import kube-state-metrics-v2.9.2.tar
k3s ctr image ls|grep kube-state-metrics

注意:如果镜像的下载策略(imagePullPolicy)是Always,则始终会重新下载镜像,所以要使用导入的镜像,需要将镜像下载策略改为IfNotPresent

kube-prometheus

参考:https://github.com/prometheus-operator/kube-prometheus

1
2
3
4
5
6
7
8
9
kubectl apply --server-side -f manifests/setup
kubectl wait \
--for condition=Established \
--all CustomResourceDefinition \
--namespace=monitoring
kubectl apply -f manifests/

kubectl port-forward pod/grafana-748964b847-vtnk8 3000 3000 -n monitoring
默认账号密码: admin/admin

安装Docker(Ubuntu)

1
sudo apt install docker.io

配置镜像加速(阿里云)

1
2
3
4
5
6
7
8
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://??????.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

rancher(弃用)

Rancher安装后默认开启了一个内置的k3s集群,但是无法增加自建的k8s集群?或许只用k3s才是最简单的方式?毕竟Rancher带来了更多的复杂性和不可控性。

持久化存储(longhorn)

安装

1
2
3
wget https://raw.githubusercontent.com/longhorn/longhorn/v1.5.1/deploy/longhorn.yaml
kubectl apply -f longhorn.yaml
kubectl get sc

Dashboard

官方文档: accessing-the-ui

1
kubectl port-forward svc/longhorn-frontend 30080:80 -n longhorn-system

部署私有镜像仓库

启动私有镜像仓库

1
2
3
4
5
6
docker run -d\
-p 5000:5000\
--restart unless-stopped\
--name registry\
-v /mnt/registry-data:/var/lib/registry\
registry:latest

UI界面访问(joxit/docker-registry-ui)

大致找了一下,joxit/docker-registry-ui可以用(至少还在更新),github

docker-compose.yaml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
version: '3.8'

services:
registry-ui:
image: joxit/docker-registry-ui:2.5.7
restart: unless-stopped
ports:
- 18080:80
environment:
- SINGLE_REGISTRY=true
- REGISTRY_TITLE=Docker Registry UI
- DELETE_IMAGES=true
- SHOW_CONTENT_DIGEST=true
- REGISTRY_URL=http://localhost:5000
- SHOW_CATALOG_NB_TAGS=true
- CATALOG_MIN_BRANCHES=1
- CATALOG_MAX_BRANCHES=1
- TAGLIST_PAGE_SIZE=100
- REGISTRY_SECURED=false
- CATALOG_ELEMENTS_LIMIT=1000
container_name: registry-ui
networks:
- registry-net

registry-server:
image: registry:2.8.2
restart: unless-stopped
ports:
- 5000:5000
environment:
REGISTRY_HTTP_HEADERS_Access-Control-Allow-Origin: '[http://localhost:18080]'
REGISTRY_HTTP_HEADERS_Access-Control-Allow-Methods: '[HEAD,GET,OPTIONS,DELETE]'
REGISTRY_HTTP_HEADERS_Access-Control-Allow-Credentials: '[true]'
REGISTRY_HTTP_HEADERS_Access-Control-Allow-Headers: '[Authorization,Accept,Cache-Control]'
REGISTRY_HTTP_HEADERS_Access-Control-Expose-Headers: '[Docker-Content-Digest]'
REGISTRY_STORAGE_DELETE_ENABLED: 'true'
volumes:
- /your-path/registry-data:/var/lib/registry
container_name: registry-server
networks:
- registry-net
networks:
registry-net:
1
2
3
4
# 启动
docker-compose up -d
# 关闭
docker-compose down

避坑指南:如果是使用XShell这样的终端,可以通过XShell的隧道来从工作终端访问内网,但是需要把registry-server的5000端口,以及registry-ui的18080端口都映射到本地。

标记镜像并推送到私有仓库

1
2
docker tag registry:latest 127.0.0.1:5000/registry:v2.7.1
docker push 127.0.0.1:5000/registry:v2.7.1

用curl查看仓库中的镜像

1
2
3
4
5
# 查看仓库中镜像
curl -X GET 127.0.0.1:5000/v2/_catalog

# 查看某个具体镜像的tag
curl -X GET 127.0.0.1:5000/v2/image_name/tags/list

如果出现异常可以加-v或–verbose参数以详细模式运行curl,方便排查

从私有仓库拉取镜像

其他主机使用私有仓库镜像,则需要修改daemon.json文件,并使之生效:

1
2
3
4
5
6
7
8
9
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://your_id.mirror.aliyuncs.com"],
"insecure-registries": ["192.168.1.1:5000"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

解决Docker镜像无法pull的问题

国外平台的Docker镜像无法下载时,可以通过DaoCloud的公开镜像加速来下载,即增加m.daocloud.io前缀。

参考: DaoCloud公开镜像加速

用helm安装zookeeper

搜索需要的版本:

1
helm search repo bitnami/zookeeper -l|grep 3.8

下载指定的版本(这个版本是helm的chart版本,不是zookeeper的版本):

1
helm fetch bitnami/zookeeper --version 11.4.11

解压下载的tgz文件,修改values.yaml进行定制化配置:

1
2
3
tar -zxvf zookeeper-11.4.11.tgz
cd zookeeper-11.4.11
vi values.yaml

修改values.yaml文件:

1
2
3
4
5
6
7
8
9
10
11
replicaCount: 3
...
persistence:
storageClass: longhorn
size: 2Gi
...
resources:
limits: {}
requests:
memory: 128Mi
cpu: 50m

安装及输出:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
helm install zookeeper .

NAME: zookeeper
LAST DEPLOYED: Tue Jul 30 13:17:31 2024
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
CHART NAME: zookeeper
CHART VERSION: 11.4.11
APP VERSION: 3.8.2

** Please be patient while the chart is being deployed **

ZooKeeper can be accessed via port 2181 on the following DNS name from within your cluster:

zookeeper.default.svc.cluster.local

To connect to your ZooKeeper server run the following commands:

export POD_NAME=$(kubectl get pods --namespace default -l "app.kubernetes.io/name=zookeeper,app.kubernetes.io/instance=zookeeper,app.kubernetes.io/component=zookeeper" -o jsonpath="{.items[0].metadata.name}")
kubectl exec -it $POD_NAME -- zkCli.sh

To connect to your ZooKeeper server from outside the cluster execute the following commands:

kubectl port-forward --namespace default svc/zookeeper 2181:2181 &
zkCli.sh 127.0.0.1:2181

查看zookeeper集群状态:

1
kubectl exec -it zookeeper-0 -- zkServer.sh status

安装dubbo-admin

参考:https://github.com/apache/dubbo-admin

Admin 控制台的最新稳定版本是0.5.0,貌似很久没更新了。
在kubernetes中安装,需要先调整一下dubbo-admin\kubernetes\dubbo-admin.yaml里的配置:

1
2
3
4
5
6
7
8
...
data:
application.properties: |-
admin.root.user.name: root
admin.root.user.password: root
...
admin.check.signSecret: adkfkdkd13413
...

注意:admin.check.signSecret默认是空,如果不填写,则无法登录。

部署:

1
kubectl apply -f dubbo-admin.yaml

端口转发:

1
kubectl port-forward -n default deployment/dubbo-admin 38080:8080

用浏览器访问:http://localhost:38080

将文件或者文件夹转换为ConfigMap

https://blog.csdn.net/m0_51964671/article/details/135480707
https://blog.csdn.net/lewyu521/article/details/139546315

1
2
3
$ kubectl create configmap testfile --from-file pods/

$ kubectl get configmaps testfile -oyaml

注意:从文件创建configmap时,建议把Windows(CR LF)格式的配置文件转换为Unix(LF)格式,这样输出为yaml文件时,才不会出现CR LF的转义符。

利用echo进行base64编码和解码

1
2
3
echo -n "admin:admin" | base64

echo -n "YWRtaW46YWRtaW4=" | base64 -d

Argo CD

安装:

1
2
kubectl create namespace argocd
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml

访问:

1
2
3
4
5
6
#查看admin账号的默认密码
kubectl get secret argocd-initial-admin-secret -n argocd -oyaml
echo -n "..." | base64 -d

#端口转发后用浏览器访问:https://localhost:8443
kubectl port-forward svc/argocd-server -n argocd 8443:443

argocd的UI上配置仓库连接时,采用https和账号、密码的方式比较简单

安装CLI(需先从github下载argocd-linux-amd64):

1
2
sudo install -m 555 argocd-linux-amd64 /usr/local/bin/argocd
rm argocd-linux-amd64

使用CLI:

1
2
3
4
argocd login https://localhost:8443 --username admin --password ...

# 查看集群状态
argocd cluster list

HPA(Horizontal Pod Autoscaler)

先调整deployment的配置,主要是将replicas设置为1,并增加资源的请求和限制:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
apiVersion: apps/v1
kind: Deployment
metadata:
name: your-deployment-name
spec:
replicas: 1
selector:
matchLabels:
app: your-deployment-name
template:
metadata:
labels:
app: your-deployment-name
spec:
terminationGracePeriodSeconds: 60
containers:
- name: your-deployment-name
image: youre-image-name:v1.0.0
imagePullPolicy: IfNotPresent
resources:
requests:
memory: "2Gi"
cpu: "0.5"
limits:
memory: "3Gi"
cpu: "0.8"

之所以增加资源的requests和limits,是因为HPA的资源占用百分比计算,是以资源请求的值来计算的。如果不设置资源请求,则HPA就无法计算资源的占比,从而无法进行扩缩容。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: your-deployment-name
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: your-deployment-name
minReplicas: 1
maxReplicas: 3
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 50 # 50%
- type: Resource
resource:
name: memory
target:
type: Utilization
averageUtilization: 100 # 100%
behavior:
# 缩容
scaleDown:
stabilizationWindowSeconds: 300 # 稳定窗口期,默认300s
policies:
- type: Pods
value: 1
periodSeconds: 15 # 检查周期,默认15s
# 扩容
scaleUp:
stabilizationWindowSeconds: 300
policies:
- type: Pods
value: 1
periodSeconds: 15

查看HPA的状态:

1
2
kubectl get hpa
kubectl describe hpa

望岳

唐·杜甫
岱宗夫如何?齐鲁青未了。
造化钟神秀,阴阳割昏晓。
荡胸生曾云,决眦入归鸟。
会当凌绝顶,一览众山小。

阅读全文 »

run命令中指定entrypoint

有时需要查看镜像的文件,或者在实例上去进行一些测试,就可以通过--entrypoint来启动shell,例如:

1
docker run --entrypoint /bin/sh -it --rm some-app

Fix No chain/target/match by that name

最近在Alibaba Cloud Linux 3上使用audo apt update进行系统升级后,某个Docker容器无法重启,错误如下:

1
2
Error response from daemon: Cannot restart container some-app: driver failed programming external connectivity on endpoint some-app (88301987d72d07ba99c1630461e1ade9d1fb53879b1d6f94fc8571ac7db7e2a6):  (iptables failed: iptables --wait -t nat -A DOCKER -p tcp -d 0/0 --dport 9015 -j DNAT --to-destination 172.17.0.3:9015 ! -i docker0: iptables: No chain/target/match by that name.
(exit status 1))

首先排除了iptables的原因,因为我们在做容器化部署的服务器上,都禁用了iptables。

然后怀疑是系统更新的时候,影响到了Docker容器的某些配置,导致容器无法重启。但是重建容器后,还是无法重启,报一样的错误。

最后搜索了一下,找到了解决办法:
参考:docker启动容器报错(iptables failed)

重启docker服务即可:

1
systemctl restart docker

容器的健康检测

如果在Dockerfile或者docker run命令里进行了健康检测,容器启动后查看状态会多出一个信息:healthy或者unhealthy。

1
2
3
# docker ps
... STATUS
... Up 19 minutes (healthy)

在Dockerfile里配置健康检测

Dockerfile
1
HEALTHCHECK --interval=10s --timeout=2s --start-period=30s --retries=3 CMD curl --silent --fail http://localhost:7015/actuator/health || exit 1

在容器启动时指定健康检测参数

1
2
3
4
5
6
7
8
docker run ...
--health-interval=10s \
--health-timeout=2s \
--health-start-period=30s \
--health-retries=3 \
--health-cmd="curl --silent --fail http://localhost:7017/actuator/health || exit 1" \
--restart on-failure \
...

自动重启unhealthy的容器

参考Github项目: Autoheal
大致是说本来docker run有一个issue,或者说应该有那么一个功能,参数--exit-on-unhealthy,默认值true,在容器unhealthy时就退出。再配合--restart=on-failure,来实现容器的自动重启。在exit-on-unhealthy没实现之前,就用这个Autoheal来实现这个功能。

1
2
3
4
5
6
docker run -d \
--name autoheal \
--restart=unless-stopped \
-e AUTOHEAL_CONTAINER_LABEL=all \
-v /var/run/docker.sock:/var/run/docker.sock \
willfarrell/autoheal
  • AUTOHEAL_CONTAINER_LABEL的默认值是autoheal,表示Autoheal会监视带有标签--label autoheal=true的容器。
  • 设置AUTOHEAL_CONTAINER_LABEL=all则是监视所有正在运行的容器。
  • 也可以自定义AUTOHEAL_CONTAINER_LABEL的值,比如AUTOHEAL_CONTAINER_LABEL=myapp,这会监视所有带myapp=true标签的容器。(说实话,官方的这句Set ENV AUTOHEAL_CONTAINER_LABEL to existing label name that has the value true.,最初让我懵了一下。)
0%