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 文件
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
|
1
| kubeadm init phase kubeconfig all
|
1
2
| cp -f /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
|
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. 重启相关服务
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"
}
}
}
|
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 的含义是编码之后,不用换行对齐,而是输出完整的一行数据。
利用上面得到的 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 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 注入 -> 指定的负载生效
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
}
|
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 地址。
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
|
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 服务
1
| apt-get install -y nfs-kernel-server
|
1
| systemctl start nfs-server.service & systemctl enable nfs-server.service
|
/data/nfs *(rw,sync,no_root_squash,no_all_squash)
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
1
2
| helm repo add dragonfly https://dragonflyoss.github.io/helm-charts/
helm repo update
|
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
|
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"
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
