github.com/qsunny/k8s@v0.0.0-20220101153623-e6dca256d5bf/k8s_install/部署过程脚本.sh (about) 1 VBoxManage internalcommands sethduuid "D:\soft\vm\node1\centos7-9.vdi" 2 3 4 5 master 192.168.1.9 6 node1 192.168.1.10 7 node2 192.168.1.11 8 9 # 修改 hostname 10 hostnamectl set-hostname master01 11 # 查看修改结果 12 hostnamectl status 13 # 设置 hostname 解析 14 echo "127.0.0.1 $(hostname)" >> /etc/hosts 15 16 17 # 只在 master 节点执行 18 # 替换 x.x.x.x 为 master 节点实际 IP(请使用内网 IP) 19 # export 命令只在当前 shell 会话中有效,开启新的 shell 窗口后,如果要继续安装过程,请重新执行此处的 export 命令 20 export MASTER_IP=192.168.1.9 21 # 替换 apiserver.demo 为 您想要的 dnsName 22 export APISERVER_NAME=apiserver.demo 23 # Kubernetes 容器组所在的网段,该网段安装完成后,由 kubernetes 创建,事先并不存在于您的物理网络中 24 export POD_SUBNET=10.100.0.1/16 25 echo "${MASTER_IP} ${APISERVER_NAME}" >> /etc/hosts 26 curl -sSL https://kuboard.cn/install-script/v1.21.x/init_master.sh | sh -s 1.21.0 27 28 watch kubectl get pod -n kube-system -o wide 29 kubectl get nodes -o wide 30 ### 驱离k8s-node-1节点上的pod ### 31 kubectl drain k8s.node1 --delete-local-data --force --ignore-daemonsets 32 ### 删除节点 ### 33 kubectl delete node k8s.node1 34 kubectl get componentstatus 35 kubectl config view 36 # 查看名称为 “e2e” 的用户的密码 37 $ kubectl config view -o jsonpath='{.users[?(@.name == "e2e")].user.password}' 38 kubectl cluster-info 39 kubectl get replicaset 40 kubectl get node --show-labels 41 kubectl apply -f deployment.yaml --record 42 43 kubeadm config images list 44 ### 重置节点 ### 45 kubeadm reset 46 # 只在 master 节点执行 47 kubeadm token create --print-join-command 48 # --skip-preflight-checks,可以防止每次初始化都去检查配置文件 49 kubeadm join apiserver.demo:6443 --token 16h42d.01eem3xgw6picahg --discovery-token-ca-cert-hash sha256:ac138daa9c26e58f4d0215365cdf817fb43c438cc724a1a6fad7970d6faf0185 --skip-preflight-checks 50 kubeadm token list 51 kubeadm init --kubernetes-version=v1.14.2 --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/16 52 53 部署Dashboard 在master节点上执行: 54 wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.2.0/aio/deploy/recommended.yaml 55 56 57 kubectl apply -f kubernetes-dashboard.yaml 58 kubectl get secret --all-namespaces | grep kubernetes-dashboard-admin 59 kubectl describe secret kubernetes-dashboard-admin-token-jzmzp -n kube-system 60 kubectl get svc --all-namespaces 61 kubectl describe svc kubernetes-dashboard -n kubernetes-dashboard 62 63 端口转发 64 # Change mongo-75f59d57f4-4nd6q to the name of the Pod 65 kubectl port-forward mongo-75f59d57f4-4nd6q 28015:27017 66 kubectl port-forward pods/mongo-75f59d57f4-4nd6q 28015:27017 67 kubectl port-forward deployment/mongo 28015:27017 68 kubectl port-forward replicaset/mongo-75f59d57f4 28015:27017 69 kubectl port-forward service/mongo 28015:27017 70 71 https://kubernetes.io/zh/docs/tasks/access-application-cluster/service-access-application-cluster/ 72 kubectl get deployments hello-world 73 kubectl describe deployments hello-world 74 kubectl get replicasets 75 kubectl describe replicasets 76 kubectl expose deployment hello-world --type=NodePort --name=example-service 77 kubectl describe services example-service 78 kubectl get pods --selector="run=load-balancer-example" --output=wide 79 kubectl delete services example-service 80 kubectl delete deployment hello-world 81 kubectl apply -k ./ 82 83 /var/lib/kubelet/config.yaml 84 /var/lib/kubelet/kubeadm-flags.env 85 86 k8s.gcr.io/kube-apiserver:v1.21.1 87 k8s.gcr.io/kube-controller-manager:v1.21.1 88 k8s.gcr.io/kube-scheduler:v1.21.1 89 k8s.gcr.io/kube-proxy:v1.21.1 90 k8s.gcr.io/pause:3.4.1 91 k8s.gcr.io/etcd:3.4.13-0 92 k8s.gcr.io/coredns/coredns:v1.8.0 93 94 95 kubectl create secret docker-registry docker-regsitry-auth --docker-username=develop --docker-password=Dev888888 --docker-server=harbor.cn 96 kubectl get deployment java-demo 97 kubectl get pod -l app=java-demo 98 kubectl describe pod java-demo-6cd76ccd78-8c6pp 99 kubectl get ing java-demo 100 101 https://www.pianshen.com/article/30471096773/ 102 103 # ingress 部署 104 crictl pull docker.io/xzxiaoshan/nginx-ingress-controller:0.30.0 105 # 生成证书 106 openssl genrsa -out ingress-key.pem 2048 107 openssl req -new -x509 -key ingress-key.pem -out ingress.pem -subj /C=CN/ST=GuangXi/L=Nanning/O=Yunlang/OU=Yunlang/CN=www.yunlang.com 108 # 注意这里一定要用--key和--cert方式,不建议你用--from-file方式(除非你已经很了解secret不然有可能坑的你家都不知道在哪) 109 kubectl create secret tls ingress-secret --key ingress-key.pem --cert ingress.pem 110 kubectl apply -f mandatory.yaml 111 kubectl apply -f ingress-nginx.yaml 112 kubectl create --validate -f mypod.yaml 113 # 下面几个命令用于查看相关组件 114 kubectl get ingress -o wide -A 115 kubectl get secret -o wide -A 116 kubectl get deploy -o wide -A 117 kubectl get svc -o wide -A 118 kubectl get pod -o wide -A 119 kubectl get ingress -A 120 kubectl get pods --selector=name=nginx,type=frontend 121 kubectl get pods --all-namespaces -l app.kubernetes.io/name=ingress-nginx --watch 122 # 获取命名空间下所有运行中的 pod 123 $ kubectl get pods --field-selector=status.phase=Running 124 kubectl logs -f -n ingress-nginx nginx-ingress-controller-57c9688cff-xtdcx 125 kubectl exec nginx-76d945c598-bjn4h -it -- /bin/sh 126 确认当前user信息 127 kubectl config current-context 128 kubectl config use-context my-cluster-name # 设置默认的上下文为 my-cluster-name 129 kubectl config get-contexts 130 131 132 #卸载 要卸载kubeadm功能。 133 kubectl drain <node name> --delete-local-data --force --ignore-daemonsets 134 kubectl delete node <node name> 135 # 然后,在要删除的节点上,重置所有kubeadm安装状态: 136 kubeadm reset 137 138 # node 和集群交互 139 kubectl cordon my-node # 标记节点 my-node 为不可调度 140 kubectl drain my-node # 准备维护时,排除节点 my-node 141 kubectl uncordon my-node # 标记节点 my-node 为可调度 142 kubectl top node my-node # 显示给定节点的度量值 143 kubectl cluster-info # 显示 master 和 service 的地址 144 kubectl cluster-info dump # 将集群的当前状态转储到标准输出 145 kubectl cluster-info dump --output-directory=/path/to/cluster-state # 将集群的当前状态转储到目录 /path/to/cluster-state 146 147 kubectl logs my-pod # 转储 pod 日志到标准输出 148 kubectl logs my-pod -c my-container # 有多个容器的情况下,转储 pod 中容器的日志到标准输出 149 kubectl logs -f my-pod # pod 日志流向标准输出 150 kubectl logs -f my-pod -c my-container # 有多个容器的情况下,pod 中容器的日志流到标准输出 151 kubectl run -i --tty busybox --image=busybox -- sh # 使用交互的 shell 运行 pod 152 kubectl attach my-pod -i # 关联到运行中的容器 153 kubectl port-forward my-pod 5000:6000 # 在本地监听 5000 端口,然后转到 my-pod 的 6000 端口 154 kubectl exec my-pod -- ls / # 1 个容器的情况下,在已经存在的 pod 中运行命令 155 kubectl exec my-pod -c my-container -- ls / # 多个容器的情况下,在已经存在的 pod 中运行命令 156 kubectl top pod POD_NAME --containers # 显示 pod 及其容器的度量 157 kubectl --namespace monitoring port-forward svc/prometheus-k8s 9090 158 kubectl create deployment java-demo --image=yueming33990/java-demo --dry-run -o yaml > deploy.yaml 159 kubectl expose deployment java-demo --port=80 --target-port=8080 --type=NodePort -o yaml --dry-run > svc.yaml 160 kubectl label nodes <node-name> <label-key>=<label-value> 161 162 # 查看、查找资源 163 # 具有基本输出的 get 命令 164 kubectl get services # 列出命名空间下的所有 service 165 kubectl get pods --all-namespaces # 列出所有命名空间下的 pod 166 kubectl get pods -o wide # 列出命名空间下所有 pod,带有更详细的信息 167 kubectl get deployment my-dep # 列出特定的 deployment 168 kubectl get pods --include-uninitialized # 列出命名空间下所有的 pod,包括未初始化的对象 169 170 # 有详细输出的 describe 命令 171 kubectl describe nodes my-node 172 kubectl describe pods my-pod 173 174 kubectl get services --sort-by=.metadata.name # List Services Sorted by Name 175 176 # 根据重启次数排序,列出所有 pod 177 kubectl get pods --sort-by='.status.containerStatuses[0].restartCount' 178 179 # 查询带有标签 app=cassandra 的所有 pod,获取它们的 version 标签值 180 kubectl get pods --selector=app=cassandra rc -o \ 181 jsonpath='{.items[*].metadata.labels.version}' 182 183 # 获取命名空间下所有运行中的 pod 184 kubectl get pods --field-selector=status.phase=Running 185 kubectl get pods -w -l app=nginx 186 187 # 所有所有节点的 ExternalIP 188 kubectl get nodes -o jsonpath='{.items[*].status.addresses[?(@.type=="ExternalIP")].address}' 189 190 # 列出输出特定 RC 的所有 pod 的名称 191 # "jq" 命令对那些 jsonpath 看来太复杂的转换非常有用,可以在这找到:https://stedolan.github.io/jq/ 192 sel=${$(kubectl get rc my-rc --output=json | jq -j '.spec.selector | to_entries | .[] | "\(.key)=\(.value),"')%?} 193 echo $(kubectl get pods --selector=$sel --output=jsonpath={.items..metadata.name}) 194 195 # 检查那些节点已经 ready 196 JSONPATH='{range .items[*]}{@.metadata.name}:{range @.status.conditions[*]}{@.type}={@.status};{end}{end}' \ 197 && kubectl get nodes -o jsonpath="$JSONPATH" | grep "Ready=True" 198 199 # 列出某个 pod 目前在用的所有 Secret 200 kubectl get pods -o json | jq '.items[].spec.containers[].env[]?.valueFrom.secretKeyRef.name' | grep -v null | sort | uniq 201 202 # 列出通过 timestamp 排序的所有 Event 203 kubectl get events --sort-by=.metadata.creationTimestamp 204 205 # 修补资源 206 kubectl patch node k8s-node-1 -p '{"spec":{"unschedulable":true}}' # 部分更新节点 207 # 更新容器的镜像,spec.containers[*].name 是必需的,因为它们是一个合并键 208 kubectl patch pod valid-pod -p '{"spec":{"containers":[{"name":"kubernetes-serve-hostname","image":"new image"}]}}' 209 # 使用带有数组位置信息的 json 修补程序更新容器镜像 210 kubectl patch pod valid-pod --type='json' -p='[{"op": "replace", "path": "/spec/containers/0/image", "value":"new image"}]' 211 # 使用带有数组位置信息的 json 修补程序禁用 deployment 的 livenessProbe 212 kubectl patch deployment valid-deployment --type json -p='[{"op": "remove", "path": "/spec/template/spec/containers/0/livenessProbe"}]' 213 # 增加新的元素到数组指定的位置中 214 kubectl patch sa default --type='json' -p='[{"op": "add", "path": "/secrets/1", "value": {"name": "whatever" } }]' 215 216 # 更新资源 217 kubectl rolling-update frontend-v1 -f frontend-v2.json # 滚动更新 pod:frontend-v1 218 kubectl rolling-update frontend-v1 frontend-v2 --image=image:v2 # 变更资源的名称并更新镜像 219 kubectl rolling-update frontend --image=image:v2 # 更新 pod 的镜像 220 kubectl rolling-update frontend-v1 frontend-v2 --rollback # 中止进行中的过程 221 cat pod.json | kubectl replace -f - # 根据传入标准输入的 JSON 替换一个 pod 222 223 # 强制替换,先删除,然后再重建资源。会导致服务中断。 224 kubectl replace --force -f ./pod.json 225 226 # 为副本控制器(rc)创建服务,它开放 80 端口,并连接到容器的 8080 端口 227 kubectl expose rc nginx --port=80 --target-port=8000 228 229 # 更新单容器的 pod,将其镜像版本(tag)更新到 v4 230 kubectl get pod mypod -o yaml | sed 's/\(image: myimage\):.*$/\1:v4/' | kubectl replace -f - 231 232 kubectl label pods my-pod new-label=awesome # 增加标签 233 kubectl annotate pods my-pod icon-url=http://goo.gl/XXBTWq # 增加注释 234 kubectl autoscale deployment foo --min=2 --max=10 # 将名称为 foo 的 deployment 设置为自动扩缩容 235 236 # 删除资源 237 kubectl delete -f ./pod.json # 使用 pod.json 中指定的类型和名称删除 pod 238 kubectl delete pod,service baz foo # 删除名称为 "baz" 和 "foo" 的 pod 和 service 239 kubectl delete pods,services -l name=myLabel # 删除带有标签 name=myLabel 的 pod 和 service 240 kubectl delete pods,services -l name=myLabel --include-uninitialized # 删除带有标签 name=myLabel 的 pod 和 service,包括未初始化的对象 241 kubectl -n my-ns delete po,svc --all 242 243 # 缩放资源 244 kubectl scale --replicas=3 rs/foo # 缩放名称为 'foo' 的 replicaset,调整其副本数为 3 245 kubectl scale --replicas=3 -f foo.yaml # 缩放在 "foo.yaml" 中指定的资源,调整其副本数为 3 246 kubectl scale --current-replicas=2 --replicas=3 deployment/mysql # 如果名称为 mysql 的 deployment 目前规模为 2,将其规模调整为 3 247 kubectl scale --replicas=5 rc/foo rc/bar rc/baz # 缩放多个副本控制器 248 249 # 编辑资源 250 kubectl edit svc/docker-registry # 编辑名称为 docker-registry 的 service 251 KUBE_EDITOR="nano" kubectl edit svc/docker-registry # 使用 alternative 编辑器 252 253 # 如果带有该键和效果的污点已经存在,则将按指定的方式替换其值 254 kubectl taint nodes foo dedicated=special-user:NoSchedule 255 256 # 应用滚动升级 257 kubectl apply -f springboot-example-deployment.yaml 258 kubectl get pod -l app=java-demo -w 259 kubectl rollout history deployment/java-demo #查看应用历史版本 260 kubectl rollout undo deployment/java-demo #回滚到之前的版本 261 kubectl rollout undo deployment/java-demo --to-revision=1 #回到指定的历史版本 262 kubectl rollout status deploy/java-demo #查看发布情况 263 264 # 更新资源 265 kubectl rolling-update frontend-v1 -f frontend-v2.json # 滚动更新 pod:frontend-v1 266 kubectl rolling-update frontend-v1 frontend-v2 --image=image:v2 # 变更资源的名称并更新镜像 267 kubectl rolling-update frontend --image=image:v2 # 更新 pod 的镜像 268 kubectl rolling-update frontend-v1 frontend-v2 --rollback # 中止进行中的过程 269 cat pod.json | kubectl replace -f - # 根据传入标准输入的 JSON 替换一个 pod 270 271 # 强制替换,先删除,然后再重建资源。会导致服务中断。 272 kubectl replace --force -f ./pod.json 273 274 # 为副本控制器(rc)创建服务,它开放 80 端口,并连接到容器的 8080 端口 275 kubectl expose rc nginx --port=80 --target-port=8000 276 277 # 更新单容器的 pod,将其镜像版本(tag)更新到 v4 278 kubectl get pod mypod -o yaml | sed 's/\(image: myimage\):.*$/\1:v4/' | kubectl replace -f - 279 280 kubectl label pods my-pod new-label=awesome # 增加标签 281 kubectl annotate pods my-pod icon-url=http://goo.gl/XXBTWq # 增加注释 282 kubectl autoscale deployment foo --min=2 --max=10 # 将名称为 foo 的 deployment 设置为自动扩缩容 283 284 kubectl get ingress 285 kubectl describe svc/mysql 286 kubectl describe endpoints/mysql 287 #手动创建无头服务及endpoint,引入外部数据库,然后通过k8s集群中的域名解析服务访问,访问的主机名格式为:[svc_name].[namespace_name].svc.cluster.local。 288 289 # Kubernetes 基础对象清理 290 kubectl get pods --all-namespaces -o wide | grep Evicted | awk '{print $1,$2}' | xargs -L1 kubectl delete pod -n 291 kubectl get pods --all-namespaces -o wide | grep Error | awk '{print $1,$2}' | xargs -L1 kubectl delete pod -n 292 kubectl get pods --all-namespaces -o wide | grep Completed | awk '{print $1,$2}' | xargs -L1 kubectl delete pod -n 293 # 清理没有被使用的 PV 294 kubectl describe -A pvc | grep -E "^Name:.*$|^Namespace:.*$|^Used By:.*$" | grep -B 2 "<none>" | grep -E "^Name:.*$|^Namespace:.*$" | cut -f2 -d: | paste -d " " - - | xargs -n2 bash -c 'kubectl -n ${1} delete pvc ${0}' 295 # 清理没有被绑定的 PVC 296 kubectl get pvc --all-namespaces | tail -n +2 | grep -v Bound | awk '{print $1,$2}' | xargs -L1 kubectl delete pvc -n 297 298 # 隔离你的集群中除 4 个节点以外的所有节点 299 kubectl cordon <node-name> 300 kubectl get pdb zk-pdb 301 # 使用 kubectl drain 来隔离和腾空 zk-0 Pod 调度所在的节点。 302 kubectl drain $(kubectl get pod zk-0 --template {{.spec.nodeName}}) --ignore-daemonsets --force --delete-emptydir-data 303 # 使用 kubectl uncordon 来取消对第一个节点的隔离。 304 kubectl uncordon kubernetes-node-pb41 305 306 # kubectl scale 扩展副本数为 5 307 kubectl scale sts web --replicas=5 308 # 将 StatefulSet 缩容回三个副本 309 kubectl patch sts web -p '{"spec":{"replicas":3}}' 310 # Patch web StatefulSet 来执行 RollingUpdate 更新策略 311 kubectl patch statefulset web -p '{"spec":{"updateStrategy":{"type":"RollingUpdate"}}}' 312 # StatefulSet 来再次的改变容器镜像 313 kubectl patch statefulset web --type='json' -p='[{"op": "replace", "path": "/spec/template/spec/containers/0/image", "value":"gcr.io/google_containers/nginx-slim:0.8"}]' 314 # 获取 Pod 来查看他们的容器镜像 315 for p in 0 1 2; do kubectl get pod "web-$p" --template '{{range $i, $c := .spec.containers}}{{$c.image}}{{end}}'; echo; done 316 你还可以使用 kubectl rollout status sts/<name> 来查看 rolling update 的状态 317 # 使用 RollingUpdate 更新策略的 partition 参数来分段更新一个 StatefulSet 318 kubectl patch statefulset web -p '{"spec":{"updateStrategy":{"type":"RollingUpdate","rollingUpdate":{"partition":3}}}}' 319 kubectl patch statefulset web --type='json' -p='[{"op": "replace", "path": "/spec/template/spec/containers/0/image", "value":"k8s.gcr.io/nginx-slim:0.7"}]' 320 # 非级联删除 --cascade=orphan 只删除 StatefulSet 而不要删除它的任何 Pod 321 kubectl delete statefulset web --cascade=orphan 322 # 级联删除 323 kubectl delete statefulset web 324 # sts is an abbreviation for statefulset 325 kubectl delete sts web 326 327 328 # configmap 329 kubectl create configmap game-config-2 --from-file=game.properties --from-file=ui.properties 330 kubectl describe cm game-config-2 331 kubectl get pod/redis configmap/example-redis-config 332 333 # https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.1.0/deploy/static/provider/baremetal/deploy.yaml 334 # 云服务商 https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.1.0/deploy/static/provider/cloud/deploy.yaml 335 使用下面的命令查看 webhook 336 kubectl get validatingwebhookconfigurations 337 kubectl delete -A ValidatingWebhookConfiguration ingress-nginx-admission 338 339 # 调试问题 340 kubectl run -it --rm --restart=Never busybox-test --image=busybox sh 341 kubectl get pods -l app=java-demo \ 342 -o go-template='{{range .items}}{{.status.podIP}}{{"\n"}}{{end}}' 343 for ep in 10.244.2.49:8080 10.244.1.58:8080 10.244.2.48:8080; do 344 wget -qO- $ep 345 done 346 347 # 搭建NFS服务 348 # 服务器端防火墙开放111、662、875、892、2049的 tcp / udp 允许,否则远端客户无法连接 349 netstat -tnal |grep 111、662、875、892、2049 350 firewall-cmd --zone=public --add-port=892/tcp --permanent 351 firewall-cmd --zone=public --add-port=892/udp --permanent 352 firewall-cmd --reload 353 firewall-cmd --list-port 354 # 安装nfs 355 yum install -y nfs-utils 356 # 创建nfs目录 357 mkdir -p /nfs/data/ 358 mkdir -p /nfs/data/mysql 359 # 授予权限 360 chmod -R 777 /nfs/data 361 # 编辑export文件 362 vi /etc/exports 363 /nfs/data *(insecure,rw,no_root_squash,sync) 364 # 使得配置生效 365 exportfs -r 366 # 查看生效 367 exportfs 368 # 启动rpcbind、nfs服务 369 systemctl restart rpcbind && systemctl enable rpcbind 370 systemctl start nfs-server && systemctl enable nfs-server 371 # 查看rpc服务的注册情况 372 rpcinfo -p localhost 373 # showmount测试 374 showmount -e 192.168.1.5 375 # 报错rpc mount export: RPC: Unable to receive; errno = No route to host 376 firewall-cmd --add-service=nfs --permanent 377 firewall-cmd --add-service=rpc-bind --permanent 378 firewall-cmd --add-service=mountd --permanent 379 380 381 # 客户端安装 382 yum -y install nfs-utils 383 systemctl start nfs && systemctl enable nfs 384 # 执行以下命令检查 nfs 服务器端是否有设置共享目录 385 showmount -e 192.168.1.5 386 # 挂载目录到本机 387 mkdir -p /nfs/nfsmount 388 # mount -t nfs $(nfs服务器的IP):/root/nfs_root /root/nfsmount 389 mount -t nfs 192.168.1.5:/nfs/data /nfs/nfsmount 390 # 写入一个测试文件 391 echo "hello nfs server" > /nfs/nfsmount/test.txt 392 393 394 # 下载并安装sealos, sealos是个golang的二进制工具,直接下载拷贝到bin目录即可, release页面也可下载 395 $ wget -c https://sealyun.oss-cn-beijing.aliyuncs.com/latest/sealos && \ 396 chmod +x sealos && mv sealos /usr/bin 397 398 # 下载离线资源包 399 $ wget -c https://sealyun.oss-cn-beijing.aliyuncs.com/2fb10b1396f8c6674355fcc14a8cda7c-v1.20.0/kube1.20.0.tar.gz 400 401 # 安装一个三master的kubernetes集群 402 $ sealos init --passwd 'qiujiabao' \ 403 --master 192.168.56.101 \ 404 --node 192.168.56.102 --node 192.168.56.103 \ 405 --pkg-url /data/k8s/install/kube1.20.0.tar.gz \ 406 --version v1.20.0 407 408 409 sudo mkdir -p /etc/docker 410 sudo tee /etc/docker/daemon.json <<-'EOF' 411 { 412 "registry-mirrors": ["https://6ikg7eqs.mirror.aliyuncs.com"] 413 } 414 EOF 415 systemctl daemon-reload && systemctl restart docker 416 417 418 https://github.com/chinaboy007/kube-prometheus