Please enable Javascript to view the contents

Kubernetes 运维笔记合集

 ·  ☕ 8 分钟

Kubernetes 运维笔记合集

本文把若干零散的排查与操作记录合并在一起,每条都是当时环境下的实测结果;环境变化后命令可能失效,以官方文档为准。

Kubernetes 集群规划之规模与节点大小

从调研数据来看,大家选择小集群的比较较高。下面是从节点数、节点配置角度提供的一份对比列表。

下面是选择少量大集群,还是多个小集群的对比列表:

特征少量大集群多个小集群
资源利用率高低
管理节点开销低高
资源伸缩范围大小
资源调度范围大小
应用间通信效率高低
集群运维难度高低
集群版本多样性低高
爆炸半径大小

下面是选择少量高配节点,还是多个低配节点的对比列表:

特征少量高配节点多个低配节点
资源利用率高低
管理节点开销低高
应用内存上限高低
Kubelet 压力高低
拉取镜像效率高低
节点 Pod 密度高低
爆炸半径大小
单位资源成本低高

如何更新 Kubernetes 证书

在默认情况下,Kubernetes 的证书每隔一年需要 renew 一次,下面是记录的一次证书更新过程。

1. 查看证书

在 Master 节点上查看证书过期时间:

1
kubeadm certs check-expiration

低版本的集群下,执行命令会报错,可以执行命令: kubeadm alpha certs check-expiration

2. 备份相关文件

这里可以直接备份整个 Kubernetes 配置文件

1
cp -r /etc/kubernetes /etc/kubernetes.old

3. 在每个 Master 节点上执行命令更新证书

1
kubeadm certs renew all

低版本的集群下,执行命令会报错,可以执行命令: kubeadm alpha certs renew all

4. 更新 ~/.kube/config 文件

  • Docker
1
2
3
4
5
6
cat > kubeadm.yaml <<EOF
apiVersion: kubeadm.k8s.io/v1beta3
kind: InitConfiguration
nodeRegistration:
  criSocket: unix:///var/run/cri-dockerd.sock
EOF
1
kubeadm init phase kubeconfig all --config kubeadm.yaml
  • Containerd
1
kubeadm init phase kubeconfig all
  • 更新全部使用方 kubeconfig 文件
1
2
cp -f /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
  • 查看 kubeconfig 文件中的证书有效期
1
2
3
4
KUBECONFIG=~/.kube/config \
kubectl config view --raw -o jsonpath='{.users[0].user.client-certificate-data}' \
| base64 -d \
| openssl x509 -noout -dates

5. 重启相关服务

  • 重启 kubelet
1
systemctl restart kubelet
  • 重启集群组件
1
nerdctl -n k8s.io ps | egrep "kube-apiserver|kube-scheduler|kube-controller-manager|etcd" | awk '{print $1}' | xargs -r -n1 -P0 nerdctl -n k8s.io restart || true
  • 查看组件状态
1
nerdctl -n k8s.io ps | egrep "kube-apiserver|kube-scheduler|kube-controller-manager|etcd"

6. 查看配置文件中的证书有效期

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
for f in /etc/kubernetes/*.conf; do
  echo "=== $f ==="
  cert=$(grep 'client-certificate-data:' "$f" | awk '{print $2}')
  if [ -n "$cert" ]; then
    echo "$cert" | base64 --decode | openssl x509 -noout -dates
  else
    echo "No client certificate found"
  fi
  echo
done

给 Kubernetes 添加 imagePullSecrets

1. 通过 kubectl create 添加

1
kubectl create secret docker-registry mypullsecret --docker-server=harbor.chenshaowen.com --docker-username=robot-test --docker-password=xxxxxx

通过 kubectl create 可以直接添加拉取镜像的凭证。

2. 通过 ~/.docker/config.json 添加

  • 使用账户密码登录镜像仓库
1
docker login harbor.chenshaowen.com:5000
1
docker login harbor.chenshaowen.com

可以添加多个。

  • 查看本地保存的凭证
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
cat ~/.docker/config.json

{
	"auths": {
		"harbor.chenshaowen.com:5000": {
			"auth": "xxxxxx"
		},
		"harbor.chenshaowen.com": {
			"auth": "xxxxxx"
		}
	}
}
  • 对凭证进行 base64 编码
1
2
3
cat ~/.docker/config.json |base64 -w 0

base64XXXXXXXXXXXXXXXXXXXXXX

这里有一个细节,如果编码没有 -w 0 参数,创建负载时可能会遇到 Failed to pull image "harbor.chenshaowen.com:5000/library/nginx:latest": illegal base64 data at input byte 60 的错误。

-w 0 的含义是编码之后,不用换行对齐,而是输出完整的一行数据。

  • 创建 Kubernetes Secret 凭证

利用上面得到的 Base64 编码的凭证创建 Secret。

1
2
3
4
5
6
7
8
9
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Secret
metadata:
  name: mypullsecret
data:
  .dockerconfigjson: base64XXXXXXXXXXXXXXXXXXXXXX
type: kubernetes.io/dockerconfigjson
EOF

3. 负载测试

  • 创建负载
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
cat <<EOF | kubectl apply -f -
  apiVersion: apps/v1
  kind: Deployment
  metadata:
    name: a1
  spec:
    replicas: 1
    selector:
      matchLabels:
        app: a1
    template:
      metadata:
        labels:
          app: a1
      spec:
        containers:
        - name: a1
          image: harbor.chenshaowen.com:5000/library/nginx:latest
          imagePullPolicy: Always
        imagePullSecrets:
        - name: mypullsecret
EOF
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
cat <<EOF | kubectl apply -f -
  apiVersion: apps/v1
  kind: Deployment
  metadata:
    name: a2
  spec:
    replicas: 1
    selector:
      matchLabels:
        app: a2
    template:
      metadata:
        labels:
          app: a2
      spec:
        containers:
        - name: a2
          image: harbor.chenshaowen.com/library/nginx:latest
          imagePullPolicy: Always
        imagePullSecrets:
        - name: mypullsecret
EOF
  • 检测是否能拉取成功
1
kubectl get pod w
  • 清理测试负载
1
kubectl delete deployments.apps a2 a1

Istio 注入 Sidecar 的几种方式

Istio 注入 Sidecar 的模板在 istio-sidecar-injector ConfigMap 中。通过 annotations 可以对 Sidecar 的各种参数进行自定义配置,比如 CPU 使用、proxyImage 等。下面主要整理的是 Sidecar 的注入方式。

1. 给命名空间添加标签 -> 整个命名空间生效

  • 注入标签
1
kubectl label namespace default istio-injection=enabled --overwrite

重启应用之后,会自动注入 Sidecar 容器。此时,访问流量将通过 envoy 转发至服务,查看响应头可验证。

  • 清理标签
1
kubectl label namespace default istio-injection-

2. 给 Pod 添加标签 -> 单个负载生效

  • 注入标签
1
kubectl patch deployments blog -p '{"spec":{"template":{"metadata":{"labels":{"sidecar.istio.io/inject":"true"}}}}}' --type merge

Pod 会自动重启。

  • 清理标签
1
kubectl patch deployments blog -p '{"spec":{"template":{"metadata":{"labels":{"sidecar.istio.io/inject":""}}}}}' --type merge

sidecar.istio.io/inject 为 false 含义是拒绝注入,因此这里需要设置为空。

3. istioctl kube-inject 注入 -> 指定的负载生效

  • dry-run 仅查看
1
istioctl kube-inject -f deployment.yaml -o deployment-injected.yaml

或者

1
kubectl get deployment blog -o yaml | istioctl kube-inject -f -
  • 新建负载注入
1
istioctl kube-inject -f deployment.yaml | kubectl apply -f -
  • 已存在的负载注入
1
kubectl get deployment blog -o yaml | istioctl kube-inject -f - | kubectl apply -f -

如何升级 Kubernetes 集群

升级思路是,驱逐负载、摘除流量之后,先升级控制节点,后升级工作节点。

1. 查看集群版本

1
2
3
4
kubectl version

Client Version: version.Info{Major:"1", Minor:"20", GitVersion:"v1.20.4", GitCommit:"e87da0bd6e03ec3fea7933c4b5263d151aafd07c", GitTreeState:"clean", BuildDate:"2021-02-18T16:12:00Z", GoVersion:"go1.15.8", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"22", GitVersion:"v1.22.0", GitCommit:"c2b5237ccd9c0f1d600d3072634ca66cefdf272f", GitTreeState:"clean", BuildDate:"2021-08-04T17:57:25Z", GoVersion:"go1.16.6", Compiler:"gc", Platform:"linux/amd64"}

当前版本是 1.22,由于 kubeadm 不允许跨版本升级,这里准备升级到 1.23 。

2. 添加 Kubernetes 安装源

CentOS 操作系统:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
cat > /etc/yum.repos.d/kubernetes.repo << EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
epo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

Ubuntu 操作系统:

1
2
3
4
5
6
apt-get update && apt-get install -y apt-transport-https
curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add -
cat <<EOF >/etc/apt/sources.list.d/kubernetes.list
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF
apt-get update

3. 查找目标版本的 kubeadm

1
2
3
4
yum list --showduplicates kubeadm --disableexcludes=kubernetes

...
kubeadm.x86_64              1.23.4-0             kubernetes

4. 升级 Kubeadm

1
2
yum remove -y kubeadm
yum install -y kubeadm-1.23.4-0 --disableexcludes=kubernetes

5. 查看升级计划

这里忽略掉了一些错误情况,强行查看升级计划。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
kubeadm upgrade plan --ignore-preflight-errors=ControlPlaneNodesReady,CoreDNSUnsupportedPlugins,CoreDNSMigration

...
Upgrade to the latest stable version:

COMPONENT                 CURRENT   TARGET
kube-apiserver            v1.22.0   v1.23.4
kube-controller-manager   v1.22.0   v1.23.4
kube-scheduler            v1.22.0   v1.23.4
kube-proxy                v1.22.0   v1.23.4
CoreDNS                   v1.8.4    v1.8.6
etcd                      3.5.0-0   3.5.1-0

6. 拉取依赖的镜像

提前拉取依赖,可以提前发现无法拉取的镜像,还可以加快升级过程。如果拉取不到镜像,可以通过 kubeadm config images list 命令查看镜像列表,然后通过下面的方式拉取镜像:

1
2
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.23.4
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.23.4 k8s.gcr.io/kube-apiserver:v1.23.4

直接拉取依赖的镜像:

1
2
3
4
5
6
7
8
9
kubeadm config images pull

[config/images] Pulled k8s.gcr.io/kube-apiserver:v1.23.4
[config/images] Pulled k8s.gcr.io/kube-controller-manager:v1.23.4
[config/images] Pulled k8s.gcr.io/kube-scheduler:v1.23.4
[config/images] Pulled k8s.gcr.io/kube-proxy:v1.23.4
[config/images] Pulled k8s.gcr.io/pause:3.6
[config/images] Pulled k8s.gcr.io/etcd:3.5.1-0
[config/images] Pulled k8s.gcr.io/coredns/coredns:v1.8.6

7. 开始升级 Kubernetes 集群

1
2
3
4
kubeadm upgrade apply v1.23.4 --ignore-preflight-errors=ControlPlaneNodesReady,CoreDNSUnsupportedPlugins,CoreDNSMigration

[upgrade/successful] SUCCESS! Your cluster was upgraded to "v1.23.4". Enjoy!
[upgrade/kubelet] Now that your control plane is upgraded, please proceed with upgrading your kubelets if you haven't already done so.

8. 升级 kubectl 和 kubelet

1
yum install -y kubelet-1.23.4-0 kubectl-1.23.4-0 --disableexcludes=kubernetes

KubeSpray 安装 Kubernetes 报错 ip in ansible_all_ipv4_addresses

  • 使用 KubeSpray 安装 Kubernetes 时,报错
1
2
3
4
5
6
fatal: [node0]: FAILED! => {
    "assertion": "ip in ansible_all_ipv4_addresses",
    "changed": false,
    "evaluated_to": false,
    "failed": true
}
  • 查看 inventory.ini 配置
1
2
3
4
5
6
7
cat inventory.ini
# ## Configure 'ip' variable to bind kubernetes services on a
# ## different ip than the default iface
# ## We should set etcd_member_name for etcd cluster. The node that is not a etcd member do not need to set the value, or can set the empty string value.
[all]
node0  ansible_host=139.168.12.4  ip=139.168.12.4
...
  • 查找报错信息来源

kubespray/extra_playbooks/roles/network_plugin/calico/tasks/pre.yml

1
2
3
4
5
6
7
8
9
---
- name: Calico | Get kubelet hostname
  shell: >-
    {{ bin_dir }}/kubectl get node -o custom-columns='NAME:.metadata.name,INTERNAL-IP:.status.addresses[?(@.type=="InternalIP")].address'
    | egrep "{{ ansible_all_ipv4_addresses | join('$|') }}$" | cut -d" " -f1    
  register: calico_kubelet_name
  delegate_to: "{{ groups['kube-master'][0] }}"
  when:
    - "cloud_provider is defined"
  • 在 Kubernetes 集群上执行 KubeSpray 的检测命令
1
2
3
4
kubectl get node -o custom-columns='NAME:.metadata.name,INTERNAL-IP:.status.addresses[?(@.type=="InternalIP")].address'
NAME    INTERNAL-IP
node0   192.168.12.4
...

可以发现,ansible 会检测 Node 的 IP 是否在 INTERNAL-IP 中。而 INTERNAL-IP 在 Kubelet 配置,如果没有配置,Kubelet 会使用默认网卡的内网 IP 地址。

  • 查看机器的默认网卡,通常是 eth0
ip route show

default via 192.168.12.1 dev eth0 proto dhcp metric 100
10.233.90.0/24 via 192.168.12.5 dev tunl0 proto bird onlink
blackhole 10.233.94.0/24 proto bird
10.233.94.1 dev calia2d66a641cc scope link
10.233.94.2 dev calibebb7f7ab3d scope link
10.233.94.3 dev caliae46a1366fa scope link
10.233.94.5 dev calibf915b87dfb scope link
10.233.96.0/24 via 192.168.12.6 dev tunl0 proto bird onlink
172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1
172.18.0.0/16 dev br-b5a4cd7c2364 proto kernel scope link src 172.18.0.1
172.19.0.0/16 dev br-11f14e31b318 proto kernel scope link src 172.19.0.1
172.20.0.0/16 dev br-915052dd5899 proto kernel scope link src 172.20.0.1
172.21.0.0/16 dev br-0598710a1345 proto kernel scope link src 172.21.0.1
192.168.12.0/24 dev eth0 proto kernel scope link src 192.168.12.4 metric 100
  • 查看默认网卡的 IP 地址,这里是 192.168.12.4。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
ip address

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 52:54:22:46:f4:c0 brd ff:ff:ff:ff:ff:ff
    inet 192.168.12.4/24 brd 192.168.12.255 scope global noprefixroute dynamic eth0
       valid_lft 81107sec preferred_lft 81107sec
    inet6 fe80::5054:22ff:fe46:f4c0/64 scope link
       valid_lft forever preferred_lft forever
  • 修改 IP 配置信息
1
2
3
4
5
6
7
cat inventory.ini
# ## Configure 'ip' variable to bind kubernetes services on a
# ## different ip than the default iface
# ## We should set etcd_member_name for etcd cluster. The node that is not a etcd member do not need to set the value, or can set the empty string value.
[all]
node0  ansible_host=192.168.12.4  ip=192.168.12.4
...

如果是多网卡,也可以通过参数指定 Kubelet 的 Node IP:

cat /var/lib/kubelet/kubeadm-flags.env

KUBELET_KUBEADM_ARGS="--cgroup-driver=cgroupfs --network-plugin=cni --pod-infra-container-image=gcr.io/google-containers/pause:3.1 --node-ip={NODE_IP}"

在 Kubernetes 集群部署 Dragonfly

1. 部署 NFS 存储

1.1 在存储节点配置 NFS 服务

  • 存储节点安装 NFS 服务
1
apt-get install -y nfs-kernel-server
  • 启动并设置 NFS 服务开机自启
1
systemctl start nfs-server.service & systemctl enable nfs-server.service
  • 配置 NFS 共享目录
1
mkdir -p /data/nfs
1
vim /etc/exports
/data/nfs  *(rw,sync,no_root_squash,no_all_squash)
  • 重启 NFS 服务
1
systemctl restart nfs-server.service

1.2 在全部节点配置 NFS 客户端

1
apt-get install -y nfs-common

2 配置 StorageClass

1
2
helm repo add csi-driver-nfs https://raw.githubusercontent.com/kubernetes-csi/csi-driver-nfs/master/charts
helm install csi-driver-nfs csi-driver-nfs/csi-driver-nfs --namespace kube-system --version v4.9.0
1
export NFS_SERVER_IP=x.x.x.x
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
kubectl apply -f - <<EOF
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: nfs-csi-storageclass
  annotations:
    storageclass.kubernetes.io/is-default-class: "true"
provisioner: nfs.csi.k8s.io
parameters:
  server: ${NFS_SERVER_IP}
  share: /data/nfs
reclaimPolicy: Delete
volumeBindingMode: Immediate
mountOptions:
  - nfsvers=4.1
EOF

3 部署 Dragonfly

  • 添加 Helm 仓库
1
2
helm repo add dragonfly https://dragonflyoss.github.io/helm-charts/
helm repo update
  • 安装 Dragonfly
 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
cat <<EOF > dragonfly-values.yaml
manager:
  image:
    repository: dragonflyoss/manager
    tag: latest
  metrics:
    enable: true

scheduler:
  image:
    repository: dragonflyoss/scheduler
    tag: latest
  metrics:
    enable: true

seedClient:
  image:
    repository: dragonflyoss/client
    tag: latest
  metrics:
    enable: true

client:
  image:
    repository: dragonflyoss/client
    tag: latest
  metrics:
    enable: true
EOF
1
helm install --create-namespace --namespace dragonfly-system dragonfly dragonfly/dragonfly -f dragonfly-values.yaml

卸载

1
helm uninstall dragonfly --namespace dragonfly-system
  • 修改缓存目录
1
kubectl -n dragonfly-system edit ds dragonfly-client
1
2
3
volumes:
  - emptyDir: {}
    name: storage

改为

1
2
3
4
5
volumes:
  - hostPath:
      path: /data/dragonfly
      type: DirectoryOrCreate
    name: storage
  • 修改 Client 超时配置
1
kubectl -n dragonfly-system edit cm dragonfly-client

调整一下 download 中的 pieceTimeout 以便于下载大镜像文件。

1
kubectl -n dragonfly-system rollout restart ds dragonfly-client

4 配置使用 Dragonfly

旧版本默认的代理端口是 65001,使用 gen-containerd-hosts.sh 生成配置文件;新版本是 4001,gen-containerd-hosts2.sh 生成配置文件。

1
2
3
4
5
wget -O /tmp/gen-containerd-hosts.sh https://raw.githubusercontent.com/shaowenchen/demo/master/dragonfly/gen-containerd-hosts2.sh

bash /tmp/gen-containerd-hosts.sh docker.io
bash /tmp/gen-containerd-hosts.sh registry.cn-beijing.aliyuncs.com
bash /tmp/gen-containerd-hosts.sh registry.cn-shanghai.aliyuncs.com
1
ls /etc/containerd/certs.d/

给 Kubernetes 配置 Proxy

通常,我们在主机上执行 export http_proxy/https_proxy 格式的命令,即可设置 Proxy 。但是主机上的设置在容器中并不会生效,下面提供了几种配置方法。

1. 配置 Docker 的代理 - Node 级

在需要使用 Proxy 的节点进行配置,下面以 Docker 为例:

  • 创建配置文件
1
2
mkdir -p /etc/systemd/system/docker.service.d
touch /etc/systemd/system/docker.service.d/https-proxy.conf
  • 编辑配置文件,配置代理
[Service]
Environment="HTTP_PROXY=http://proxy.example.com:80/"
Environment="HTTPS_PROXY=https://proxy.example.com:443/"
Environment="NO_PROXY=localhost,127.0.0.1"
  • 重启 Docker
1
2
systemctl daemon-reload
systemctl restart docker

2. containers 中配置 Proxy - Container 级

在需要使用 Proxy 的容器中进行配置。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
spec:
  containers:
    - env:
        - name: HTTP_PROXY
          value: "http://proxy.example.com:80/"
        - name: HTTPS_PROXY
          value: "HTTPS_PROXY=https://proxy.example.com:443/"
        - name: http_proxy
          value: "http://proxy.example.com:80/"
        - name: https_proxy
          value: "HTTPS_PROXY=https://proxy.example.com:443/"
        - name: no_proxy
          value: "localhost,127.0.0.1"

3. 参考

国内的 Helm 镜像源

helm 官方源 https://charts.helm.sh/stable ,国内的某些机器无法访问,需要配置镜像源。

1. 官方镜像源

1
helm repo add stable https://charts.helm.sh/stable

2. Git Pages 镜像

1
helm repo add stable https://burdenbear.github.io/kube-charts-mirror/

可以参考 kube-charts-mirror ,搭建一个自主可控的镜像源。

3. Aliyun 镜像

长时间未更新,版本较旧

1
helm repo add stable  https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts/

4. Azure 镜像源

已经不可用,2021.07.08 更新。

1
2
helm repo add stable http://mirror.azure.cn/kubernetes/charts/
helm repo add incubator http://mirror.azure.cn/kubernetes/charts-incubator/

Kubernetes 批量操作命令

1. 批量删除 Evicted 状态的 Pod

1
kubectl get pods --all-namespaces -o wide | grep Evicted | awk '{print $1,$2}' | xargs -L1 kubectl delete pod -n

2. 批量删除指定空间指定状态的 Pod

根据 field-selectors ,可以删除指定空间指定状态的 Pod 。

1
kubectl get pods --field-selector=status.phase!=Running -n default | cut -d' ' -f 1 | xargs kubectl delete pod -n default

二进制部署 Thanos

1. 下载二进制文件

1
2
3
4
wget https://github.com/thanos-io/thanos/releases/download/v0.26.0/thanos-0.26.0.linux-amd64.tar.gz
tar xvf thanos-0.26.0.linux-amd64.tar.gz
mv thanos-0.26.0.linux-amd64/thanos /usr/bin/
rm -rf thanos-0.26.0.linux-amd64*

2. 安装 Thanos Query

1
vim /etc/systemd/system/thanos-query.service
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
[Unit]
Description=Thanos Query
After=network-online.target

[Service]
Restart=on-failure
ExecStart=/usr/bin/thanos query \
    --log.level=debug \
    --query.auto-downsampling \
    --grpc-address=0.0.0.0:30091 \
    --http-address=0.0.0.0:30092 \
    --query.partial-response \
    --query.replica-label=prometheus_replica \
    --query.replica-label=rule_replica  \
    --store=1.0.0.0:30091 \
    --store=2.0.0.0:30091

[Install]
WantedBy=multi-user.target

--store 参数添加需要聚合的全部源。

1
systemctl daemon-reload && systemctl enable thanos-query
1
systemctl start thanos-query && systemctl status thanos-query

3. 安装 Thanos Sidecar

1
vim /etc/systemd/system/thanos-sidecar.service
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
[Unit]
Description=Thanos SideCar
After=network-online.target

[Service]
Restart=on-failure
ExecStart=/usr/bin/thanos sidecar \
    --grpc-address=0.0.0.0:30091 \
    --tsdb.path /var/lib/prometheus \
    --prometheus.url "http://localhost:9090"

[Install]
WantedBy=multi-user.target

这里如果需要上传到对象存储还需要加上 --objstore.config-file /etc/thanos/bucket_config.yaml,指定对象存储相关的参数。

1
systemctl daemon-reload && systemctl enable thanos-sidecar
1
systemctl start thanos-sidecar && systemctl status thanos-sidecar

Kubernetes Cheat Sheet

白板分享 - Jenkins on Kubernetes


陈少文
作者
陈少文