kubernetes – 04

kubernetes 性能与监控

部署metrics-server

开启apiserver聚合服务
[root@master ~]# vim /etc/kubernetes/manifests/kube-apiserver.yaml
# spec.containers.command 最下面手动添加如下一行- --enable-aggregator-routing=true
[root@master ~]# systemctl restart kubelet
[root@master ~]# kubectl -n kube-system get pod kube-apiserver-master -o yaml |grep enable-aggregator-routing- --enable-aggregator-routing=true
证书的申请与签发

要在所有节点执行(master,node-0001,node-0002,node-0003)

申请的多余证书可以使用 (kubectl delete certificatesigningrequests 证书名称) 删除

[root@node-0001 ~]# vim /var/lib/kubelet/config.yaml
# 在文件的最后一行添加
serverTLSBootstrap: true
[root@node-0001 ~]# systemctl restart kubelet
#-------------------------签发证书必须在 master 上执行 ------------------------------------
[root@master ~]# kubectl get certificatesigningrequests
NAME        AGE   REQUESTOR            CONDITION
csr-wsfz7   8s    system:node:master   Pending
[root@master ~]# kubectl certificate approve csr-wsfz7
[root@master ~]# kubectl get certificatesigningrequests
NAME        AGE   REQUESTOR            CONDITION
csr-wsfz7   86s   system:node:master   Approved,Issued
安装mertics插件

拷贝 云盘的kubernetes/v1.17.6/metrics 目录到 master 上

[root@master metrics]# docker load -i metrisc-server.tar.gz
[root@master metrics]# docker tag gcr.io/k8s-staging-metrics-server/metrics-server:master 192.168.1.100:5000/metrics-server:master
[root@master metrics]# docker push 192.168.1.100:5000/metrics-server:master
[root@master metrics]# vim deployment.yaml
29: image: 192.168.1.100:5000/metrics-server:master
[root@master metrics]# kubectl apply -f rbac.yaml
[root@master metrics]# kubectl apply -f pdb.yaml
[root@master metrics]# kubectl apply -f deployment.yaml
[root@master metrics]# kubectl apply -f service.yaml
[root@master metrics]# kubectl apply -f apiservice.yaml
#-------------------------------- 查询验证 ----------------------------------------------
[root@master metrics]# kubectl -n kube-system get pod
NAME                              READY   STATUS    RESTARTS   AGE
metrics-server-78dfb54777-4dcjl   1/1     Running   0          116s
[root@master metrics]# kubectl -n kube-system get apiservices
NAME                                   SERVICE                      AVAILABLE   AGE
v1beta1.metrics.k8s.io                 kube-system/metrics-server   True        2m20s
[root@master metrics]# kubectl top node
NAME        CPU(cores)   CPU%   MEMORY(bytes)   MEMORY%
master      95m          4%     840Mi           48%
node-0001   24m          1%     266Mi           15%
node-0002   24m          1%     270Mi           15%
node-0003   26m          1%     280Mi           16%

部署Dashboard

拷贝 云盘的kubernetes/v1.17.6/dashboard 目录到 master 上

上传镜像到私有仓库
# 上传 dashboard 镜像
[root@master dashboard]# docker load -i dashboard.tar.gz
[root@master dashboard]# docker tag kubernetesui/dashboard:v2.0.0 192.168.1.100:5000/dashboard:v2.0.0
[root@master dashboard]# docker push 192.168.1.100:5000/dashboard:v2.0.0
# 上传 metrics-scraper 镜像
[root@master dashboard]# docker load -i metrics-scraper.tar.gz
[root@master dashboard]# docker tag kubernetesui/metrics-scraper:v1.0.4 192.168.1.100:5000/metrics-scraper:v1.0.4
[root@master dashboard]# docker push 192.168.1.100:5000/metrics-scraper:v1.0.4
安装dashboard
[root@master dashboard]# vim recommended.yaml# 43 行新添加nodePort: 30090# 46 行新添加type: NodePort# 191 行修改为image: 192.168.1.100:5000/dashboard:v2.0.0# 275 行修改为image: 192.168.1.100:5000/metrics-scraper:v1.0.4
[root@master dashboard]# kubectl apply -f recommended.yaml
# ---------------------------------- 查询验证 --------------------------------------
[root@master dashboard]# kubectl -n kubernetes-dashboard get pod
NAME                                         READY   STATUS    RESTARTS   AGE
dashboard-metrics-scraper-57bf85fcc9-vsz74   1/1     Running   0          52s
kubernetes-dashboard-7b7f78bcf9-5k8vq        1/1     Running   0          52s
[root@master dashboard]# kubectl -n kubernetes-dashboard get service
NAME                        TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)
dashboard-metrics-scraper   ClusterIP   10.254.76.85     <none>        8000/TCP
kubernetes-dashboard        NodePort    10.254.211.125   <none>        443:30090/TCP

在华为云上为 node 节点绑定弹性公网IP [ https://弹性公网IP:30090/ ]

token认证登录
[root@master dashboard]# kubectl apply -f admin-token.yaml
[root@master ~]# kubectl -n kubernetes-dashboard get secrets
NAME                               TYPE                                  DATA   AGE
admin-user-token-bxjlz             kubernetes.io/service-account-token   3      23s
[root@master ~]# kubectl -n kubernetes-dashboard describe secrets admin-user-token-bxjlz
Name:         admin-user-token-bxjlz
... ...
ca.crt:     1025 bytes
namespace:  20 bytes
token:      这里这个很长的字符串就是你要找的认证 token

使用获取的 token 登录,通过 web 页面访问即可

部署Prometheus

导入镜像

kubernetes/v1.17.6/prometheus/images/ 下所有镜像导入到私有仓库

拷贝所有镜像到 master 的 images 目录下

[root@master images]# for i in *.gz;do docker load -i ${i};done
[root@master images]# img="prom/node-exporter v1.0.0
quay.io/coreos/prometheus-config-reloader v0.35.1
quay.io/coreos/prometheus-operator v0.35.1
quay.io/coreos/kube-state-metrics v1.9.2
grafana/grafana 6.4.3
jimmidyson/configmap-reload v0.3.0
quay.io/prometheus/prometheus v2.11.0
quay.io/prometheus/alertmanager v0.18.0
quay.io/coreos/k8s-prometheus-adapter-amd64 v0.5.0
quay.io/coreos/kube-rbac-proxy v0.4.1"
[root@master images]# while read _f _v;do docker tag ${_f}:${_v} 192.168.1.100:5000/${_f##*/}:${_v}docker push 192.168.1.100:5000/${_f##*/}:${_v}docker rmi ${_f}:${_v}
done <<<"${img}"
[root@master images]# curl http://192.168.1.100:5000/v2/_catalog
{"repositories":["alertmanager","configmap-reload","coredns","dashboard","etcd","flannel","grafana","k8s-prometheus-adapter-amd64","kube-apiserver","kube-controller-manager","kube-proxy","kube-rbac-proxy","kube-scheduler","kube-state-metrics","metrics-scraper","metrics-server","myos","nginx-ingress-controller","node-exporter","pause","prometheus","prometheus-config-reloader","prometheus-operator"]}
operator安装

拷贝prometheus/setup 目录到 master 下

[root@master prometheus]# curl http://192.168.1.100:5000/v2/configmap-reload/tags/list
{"name":"configmap-reload","tags":["v0.3.0"]}
[root@master prometheus]# curl http://192.168.1.100:5000/v2/prometheus-config-reloader/tags/list
{"name":"prometheus-config-reloader","tags":["v0.35.1"]}
[root@master prometheus]# curl http://192.168.1.100:5000/v2/prometheus-operator/tags/list
{"name":"prometheus-operator","tags":["v0.35.1"]}
[root@master prometheus]# vim setup/prometheus-operator-deployment.yaml
27:        - --config-reloader-image=192.168.1.100:5000/configmap-reload:v0.3.0
28:        - --prometheus-config-reloader=192.168.1.100:5000/prometheus-config-reloader:v0.35.1
29:        image: 192.168.1.100:5000/prometheus-operator:v0.35.1
# 验证安装
[root@master prometheus]# kubectl apply -f setup/
[root@master prometheus]# kubectl -n monitoring get pod
NAME                                   READY   STATUS    RESTARTS   AGE
prometheus-operator-75b4b59b74-72qhg   1/1     Running   0          47s
Prometheus server安装

拷贝 prometheus/prom-server 目录到 master 下

[root@master prometheus]# curl http://192.168.1.100:5000/v2/prometheus/tags/list
{"name":"prometheus","tags":["v2.11.0"]}
[root@master prometheus]# vim prom-server/prometheus-prometheus.yaml
14:   baseImage: 192.168.1.100:5000/prometheus
34:   version: v2.11.0
[root@master prometheus]# kubectl apply -f prom-server/
[root@master prometheus]# kubectl -n monitoring get pod
NAME                                   READY   STATUS    RESTARTS   AGE
prometheus-k8s-0                       3/3     Running   1          45s
prometheus-k8s-1                       3/3     Running   1          45s
prom-adapter安装

拷贝 prometheus/prom-adapter 目录到 master 下

[root@master prometheus]# curl http://192.168.1.100:5000/v2/k8s-prometheus-adapter-amd64/tags/list
{"name":"k8s-prometheus-adapter-amd64","tags":["v0.5.0"]}
[root@master prometheus]# vim prom-adapter/prometheus-adapter-deployment.yaml
28:      image: 192.168.1.100:5000/k8s-prometheus-adapter-amd64:v0.5.0
[root@master prometheus]# kubectl apply -f prom-adapter
[root@master prometheus]# kubectl -n monitoring get pod
NAME                                   READY   STATUS    RESTARTS   AGE
prometheus-adapter-856854f9f6-knqtq    1/1     Running   0          6s
metrics-state安装

拷贝 prometheus/metrics-state 目录到 master 下

[root@master prometheus]# curl http://192.168.1.100:5000/v2/kube-state-metrics/tags/list
{"name":"kube-state-metrics","tags":["v1.9.2"]}
[root@master prometheus]# curl http://192.168.1.100:5000/v2/kube-rbac-proxy/tags/list
{"name":"kube-rbac-proxy","tags":["v0.4.1"]}
[root@master prometheus]# vim metrics-state/kube-state-metrics-deployment.yaml
24:         image: 192.168.1.100:5000/kube-rbac-proxy:v0.4.1
41:         image: 192.168.1.100:5000/kube-rbac-proxy:v0.4.1
58:         image: 192.168.1.100:5000/kube-state-metrics:v1.9.2
[root@master prometheus]# kubectl apply -f metrics-state/
[root@master prometheus]# kubectl -n monitoring get pod
NAME                                   READY   STATUS    RESTARTS   AGE
kube-state-metrics-5894f64799-krvn6    3/3     Running   0          4s
node-exporter安装

拷贝 prometheus/node-exporter 目录到 master 下

[root@master prometheus]# curl http://192.168.1.100:5000/v2/node-exporter/tags/list
{"name":"node-exporter","tags":["v1.0.0"]}
[root@master prometheus]# curl http://192.168.1.100:5000/v2/kube-rbac-proxy/tags/list
{"name":"kube-rbac-proxy","tags":["v0.4.1"]}
[root@master prometheus]# vim node-exporter/node-exporter-daemonset.yaml
27:         image: 192.168.1.100:5000/node-exporter:v1.0.0
57:         image: 192.168.1.100:5000/kube-rbac-proxy:v0.4.1
[root@master prometheus]# kubectl apply -f node-exporter/
[root@master prometheus]# kubectl -n monitoring get pod
NAME                                   READY   STATUS    RESTARTS   AGE
node-exporter-7h4l9                    2/2     Running   0          7s
node-exporter-7vxmx                    2/2     Running   0          7s
node-exporter-mr6lw                    2/2     Running   0          7s
node-exporter-zg2j8                    2/2     Running   0          7s
alertmanager安装

拷贝 prometheus/alertmanager 目录到 master 下

[root@master prometheus]# curl http://192.168.1.100:5000/v2/alertmanager/tags/list
{"name":"alertmanager","tags":["v0.18.0"]}
[root@master prometheus]# vim alertmanager/alertmanager-alertmanager.yaml
09:  baseImage: 192.168.1.100:5000/alertmanager
18:  version: v0.18.0
[root@master prometheus]# kubectl apply -f alertmanager/
[root@master prometheus]# kubectl -n monitoring get pod
NAME                                   READY   STATUS    RESTARTS   AGE
alertmanager-main-0                    2/2     Running   0          16s
alertmanager-main-1                    2/2     Running   0          16s
alertmanager-main-2                    2/2     Running   0          16s
grafana安装

拷贝 prometheus/grafana 目录到 master 下

[root@master prometheus]# curl http://192.168.1.100:5000/v2/grafana/tags/list
{"name":"grafana","tags":["6.4.3"]}
[root@master prometheus]# vim grafana/grafana-deployment.yaml
19:     - image: 192.168.1.100:5000/grafana:6.4.3
[root@master prometheus]# kubectl apply -f grafana/
[root@master prometheus]# kubectl -n monitoring get pod
NAME                                   READY   STATUS    RESTARTS   AGE
grafana-647d948b69-d2hv9               1/1     Running   0          19s
发布服务

grafana服务

[root@master prometheus]# cp grafana/grafana-service.yaml ./
[root@master prometheus]# vim grafana-service.yaml
apiVersion: v1
kind: Service
metadata:labels:app: grafananame: grafananamespace: monitoring
spec:type: NodePortports:- name: httpport: 3000nodePort: 30002targetPort: httpselector:app: grafana
[root@master prometheus]# kubectl apply -f grafana-service.yaml
[root@master prometheus]# kubectl -n monitoring get service
NAME                    TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)
grafana                 NodePort    10.254.79.49     <none>        3000:30002/TCP

服务发布以后可以通过华为云弹性公网IP直接访问即可

grafana 第一次默认登录的用户名/密码(admin/admin)

HPA集群

集群图例
#mermaid-svg-cYv92mmvNSeGsc92 .label{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color:#333}#mermaid-svg-cYv92mmvNSeGsc92 .label text{fill:#333}#mermaid-svg-cYv92mmvNSeGsc92 .node rect,#mermaid-svg-cYv92mmvNSeGsc92 .node circle,#mermaid-svg-cYv92mmvNSeGsc92 .node ellipse,#mermaid-svg-cYv92mmvNSeGsc92 .node polygon,#mermaid-svg-cYv92mmvNSeGsc92 .node path{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-cYv92mmvNSeGsc92 .node .label{text-align:center;fill:#333}#mermaid-svg-cYv92mmvNSeGsc92 .node.clickable{cursor:pointer}#mermaid-svg-cYv92mmvNSeGsc92 .arrowheadPath{fill:#333}#mermaid-svg-cYv92mmvNSeGsc92 .edgePath .path{stroke:#333;stroke-width:1.5px}#mermaid-svg-cYv92mmvNSeGsc92 .flowchart-link{stroke:#333;fill:none}#mermaid-svg-cYv92mmvNSeGsc92 .edgeLabel{background-color:#e8e8e8;text-align:center}#mermaid-svg-cYv92mmvNSeGsc92 .edgeLabel rect{opacity:0.9}#mermaid-svg-cYv92mmvNSeGsc92 .edgeLabel span{color:#333}#mermaid-svg-cYv92mmvNSeGsc92 .cluster rect{fill:#ffffde;stroke:#aa3;stroke-width:1px}#mermaid-svg-cYv92mmvNSeGsc92 .cluster text{fill:#333}#mermaid-svg-cYv92mmvNSeGsc92 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:12px;background:#ffffde;border:1px solid #aa3;border-radius:2px;pointer-events:none;z-index:100}#mermaid-svg-cYv92mmvNSeGsc92 .actor{stroke:#ccf;fill:#ECECFF}#mermaid-svg-cYv92mmvNSeGsc92 text.actor>tspan{fill:#000;stroke:none}#mermaid-svg-cYv92mmvNSeGsc92 .actor-line{stroke:grey}#mermaid-svg-cYv92mmvNSeGsc92 .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333}#mermaid-svg-cYv92mmvNSeGsc92 .messageLine1{stroke-width:1.5;stroke-dasharray:2, 2;stroke:#333}#mermaid-svg-cYv92mmvNSeGsc92 #arrowhead path{fill:#333;stroke:#333}#mermaid-svg-cYv92mmvNSeGsc92 .sequenceNumber{fill:#fff}#mermaid-svg-cYv92mmvNSeGsc92 #sequencenumber{fill:#333}#mermaid-svg-cYv92mmvNSeGsc92 #crosshead path{fill:#333;stroke:#333}#mermaid-svg-cYv92mmvNSeGsc92 .messageText{fill:#333;stroke:#333}#mermaid-svg-cYv92mmvNSeGsc92 .labelBox{stroke:#ccf;fill:#ECECFF}#mermaid-svg-cYv92mmvNSeGsc92 .labelText,#mermaid-svg-cYv92mmvNSeGsc92 .labelText>tspan{fill:#000;stroke:none}#mermaid-svg-cYv92mmvNSeGsc92 .loopText,#mermaid-svg-cYv92mmvNSeGsc92 .loopText>tspan{fill:#000;stroke:none}#mermaid-svg-cYv92mmvNSeGsc92 .loopLine{stroke-width:2px;stroke-dasharray:2, 2;stroke:#ccf;fill:#ccf}#mermaid-svg-cYv92mmvNSeGsc92 .note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-cYv92mmvNSeGsc92 .noteText,#mermaid-svg-cYv92mmvNSeGsc92 .noteText>tspan{fill:#000;stroke:none}#mermaid-svg-cYv92mmvNSeGsc92 .activation0{fill:#f4f4f4;stroke:#666}#mermaid-svg-cYv92mmvNSeGsc92 .activation1{fill:#f4f4f4;stroke:#666}#mermaid-svg-cYv92mmvNSeGsc92 .activation2{fill:#f4f4f4;stroke:#666}#mermaid-svg-cYv92mmvNSeGsc92 .mermaid-main-font{font-family:"trebuchet ms", verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-cYv92mmvNSeGsc92 .section{stroke:none;opacity:0.2}#mermaid-svg-cYv92mmvNSeGsc92 .section0{fill:rgba(102,102,255,0.49)}#mermaid-svg-cYv92mmvNSeGsc92 .section2{fill:#fff400}#mermaid-svg-cYv92mmvNSeGsc92 .section1,#mermaid-svg-cYv92mmvNSeGsc92 .section3{fill:#fff;opacity:0.2}#mermaid-svg-cYv92mmvNSeGsc92 .sectionTitle0{fill:#333}#mermaid-svg-cYv92mmvNSeGsc92 .sectionTitle1{fill:#333}#mermaid-svg-cYv92mmvNSeGsc92 .sectionTitle2{fill:#333}#mermaid-svg-cYv92mmvNSeGsc92 .sectionTitle3{fill:#333}#mermaid-svg-cYv92mmvNSeGsc92 .sectionTitle{text-anchor:start;font-size:11px;text-height:14px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-cYv92mmvNSeGsc92 .grid .tick{stroke:#d3d3d3;opacity:0.8;shape-rendering:crispEdges}#mermaid-svg-cYv92mmvNSeGsc92 .grid .tick text{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-cYv92mmvNSeGsc92 .grid path{stroke-width:0}#mermaid-svg-cYv92mmvNSeGsc92 .today{fill:none;stroke:red;stroke-width:2px}#mermaid-svg-cYv92mmvNSeGsc92 .task{stroke-width:2}#mermaid-svg-cYv92mmvNSeGsc92 .taskText{text-anchor:middle;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-cYv92mmvNSeGsc92 .taskText:not([font-size]){font-size:11px}#mermaid-svg-cYv92mmvNSeGsc92 .taskTextOutsideRight{fill:#000;text-anchor:start;font-size:11px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-cYv92mmvNSeGsc92 .taskTextOutsideLeft{fill:#000;text-anchor:end;font-size:11px}#mermaid-svg-cYv92mmvNSeGsc92 .task.clickable{cursor:pointer}#mermaid-svg-cYv92mmvNSeGsc92 .taskText.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-cYv92mmvNSeGsc92 .taskTextOutsideLeft.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-cYv92mmvNSeGsc92 .taskTextOutsideRight.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-cYv92mmvNSeGsc92 .taskText0,#mermaid-svg-cYv92mmvNSeGsc92 .taskText1,#mermaid-svg-cYv92mmvNSeGsc92 .taskText2,#mermaid-svg-cYv92mmvNSeGsc92 .taskText3{fill:#fff}#mermaid-svg-cYv92mmvNSeGsc92 .task0,#mermaid-svg-cYv92mmvNSeGsc92 .task1,#mermaid-svg-cYv92mmvNSeGsc92 .task2,#mermaid-svg-cYv92mmvNSeGsc92 .task3{fill:#8a90dd;stroke:#534fbc}#mermaid-svg-cYv92mmvNSeGsc92 .taskTextOutside0,#mermaid-svg-cYv92mmvNSeGsc92 .taskTextOutside2{fill:#000}#mermaid-svg-cYv92mmvNSeGsc92 .taskTextOutside1,#mermaid-svg-cYv92mmvNSeGsc92 .taskTextOutside3{fill:#000}#mermaid-svg-cYv92mmvNSeGsc92 .active0,#mermaid-svg-cYv92mmvNSeGsc92 .active1,#mermaid-svg-cYv92mmvNSeGsc92 .active2,#mermaid-svg-cYv92mmvNSeGsc92 .active3{fill:#bfc7ff;stroke:#534fbc}#mermaid-svg-cYv92mmvNSeGsc92 .activeText0,#mermaid-svg-cYv92mmvNSeGsc92 .activeText1,#mermaid-svg-cYv92mmvNSeGsc92 .activeText2,#mermaid-svg-cYv92mmvNSeGsc92 .activeText3{fill:#000 !important}#mermaid-svg-cYv92mmvNSeGsc92 .done0,#mermaid-svg-cYv92mmvNSeGsc92 .done1,#mermaid-svg-cYv92mmvNSeGsc92 .done2,#mermaid-svg-cYv92mmvNSeGsc92 .done3{stroke:grey;fill:#d3d3d3;stroke-width:2}#mermaid-svg-cYv92mmvNSeGsc92 .doneText0,#mermaid-svg-cYv92mmvNSeGsc92 .doneText1,#mermaid-svg-cYv92mmvNSeGsc92 .doneText2,#mermaid-svg-cYv92mmvNSeGsc92 .doneText3{fill:#000 !important}#mermaid-svg-cYv92mmvNSeGsc92 .crit0,#mermaid-svg-cYv92mmvNSeGsc92 .crit1,#mermaid-svg-cYv92mmvNSeGsc92 .crit2,#mermaid-svg-cYv92mmvNSeGsc92 .crit3{stroke:#f88;fill:red;stroke-width:2}#mermaid-svg-cYv92mmvNSeGsc92 .activeCrit0,#mermaid-svg-cYv92mmvNSeGsc92 .activeCrit1,#mermaid-svg-cYv92mmvNSeGsc92 .activeCrit2,#mermaid-svg-cYv92mmvNSeGsc92 .activeCrit3{stroke:#f88;fill:#bfc7ff;stroke-width:2}#mermaid-svg-cYv92mmvNSeGsc92 .doneCrit0,#mermaid-svg-cYv92mmvNSeGsc92 .doneCrit1,#mermaid-svg-cYv92mmvNSeGsc92 .doneCrit2,#mermaid-svg-cYv92mmvNSeGsc92 .doneCrit3{stroke:#f88;fill:#d3d3d3;stroke-width:2;cursor:pointer;shape-rendering:crispEdges}#mermaid-svg-cYv92mmvNSeGsc92 .milestone{transform:rotate(45deg) scale(0.8, 0.8)}#mermaid-svg-cYv92mmvNSeGsc92 .milestoneText{font-style:italic}#mermaid-svg-cYv92mmvNSeGsc92 .doneCritText0,#mermaid-svg-cYv92mmvNSeGsc92 .doneCritText1,#mermaid-svg-cYv92mmvNSeGsc92 .doneCritText2,#mermaid-svg-cYv92mmvNSeGsc92 .doneCritText3{fill:#000 !important}#mermaid-svg-cYv92mmvNSeGsc92 .activeCritText0,#mermaid-svg-cYv92mmvNSeGsc92 .activeCritText1,#mermaid-svg-cYv92mmvNSeGsc92 .activeCritText2,#mermaid-svg-cYv92mmvNSeGsc92 .activeCritText3{fill:#000 !important}#mermaid-svg-cYv92mmvNSeGsc92 .titleText{text-anchor:middle;font-size:18px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-cYv92mmvNSeGsc92 g.classGroup text{fill:#9370db;stroke:none;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:10px}#mermaid-svg-cYv92mmvNSeGsc92 g.classGroup text .title{font-weight:bolder}#mermaid-svg-cYv92mmvNSeGsc92 g.clickable{cursor:pointer}#mermaid-svg-cYv92mmvNSeGsc92 g.classGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-cYv92mmvNSeGsc92 g.classGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-cYv92mmvNSeGsc92 .classLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5}#mermaid-svg-cYv92mmvNSeGsc92 .classLabel .label{fill:#9370db;font-size:10px}#mermaid-svg-cYv92mmvNSeGsc92 .relation{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-cYv92mmvNSeGsc92 .dashed-line{stroke-dasharray:3}#mermaid-svg-cYv92mmvNSeGsc92 #compositionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-cYv92mmvNSeGsc92 #compositionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-cYv92mmvNSeGsc92 #aggregationStart{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-cYv92mmvNSeGsc92 #aggregationEnd{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-cYv92mmvNSeGsc92 #dependencyStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-cYv92mmvNSeGsc92 #dependencyEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-cYv92mmvNSeGsc92 #extensionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-cYv92mmvNSeGsc92 #extensionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-cYv92mmvNSeGsc92 .commit-id,#mermaid-svg-cYv92mmvNSeGsc92 .commit-msg,#mermaid-svg-cYv92mmvNSeGsc92 .branch-label{fill:lightgrey;color:lightgrey;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-cYv92mmvNSeGsc92 .pieTitleText{text-anchor:middle;font-size:25px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-cYv92mmvNSeGsc92 .slice{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-cYv92mmvNSeGsc92 g.stateGroup text{fill:#9370db;stroke:none;font-size:10px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-cYv92mmvNSeGsc92 g.stateGroup text{fill:#9370db;fill:#333;stroke:none;font-size:10px}#mermaid-svg-cYv92mmvNSeGsc92 g.statediagram-cluster .cluster-label text{fill:#333}#mermaid-svg-cYv92mmvNSeGsc92 g.stateGroup .state-title{font-weight:bolder;fill:#000}#mermaid-svg-cYv92mmvNSeGsc92 g.stateGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-cYv92mmvNSeGsc92 g.stateGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-cYv92mmvNSeGsc92 .transition{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-cYv92mmvNSeGsc92 .stateGroup .composit{fill:white;border-bottom:1px}#mermaid-svg-cYv92mmvNSeGsc92 .stateGroup .alt-composit{fill:#e0e0e0;border-bottom:1px}#mermaid-svg-cYv92mmvNSeGsc92 .state-note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-cYv92mmvNSeGsc92 .state-note text{fill:black;stroke:none;font-size:10px}#mermaid-svg-cYv92mmvNSeGsc92 .stateLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.7}#mermaid-svg-cYv92mmvNSeGsc92 .edgeLabel text{fill:#333}#mermaid-svg-cYv92mmvNSeGsc92 .stateLabel text{fill:#000;font-size:10px;font-weight:bold;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-cYv92mmvNSeGsc92 .node circle.state-start{fill:black;stroke:black}#mermaid-svg-cYv92mmvNSeGsc92 .node circle.state-end{fill:black;stroke:white;stroke-width:1.5}#mermaid-svg-cYv92mmvNSeGsc92 #statediagram-barbEnd{fill:#9370db}#mermaid-svg-cYv92mmvNSeGsc92 .statediagram-cluster rect{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-cYv92mmvNSeGsc92 .statediagram-cluster rect.outer{rx:5px;ry:5px}#mermaid-svg-cYv92mmvNSeGsc92 .statediagram-state .divider{stroke:#9370db}#mermaid-svg-cYv92mmvNSeGsc92 .statediagram-state .title-state{rx:5px;ry:5px}#mermaid-svg-cYv92mmvNSeGsc92 .statediagram-cluster.statediagram-cluster .inner{fill:white}#mermaid-svg-cYv92mmvNSeGsc92 .statediagram-cluster.statediagram-cluster-alt .inner{fill:#e0e0e0}#mermaid-svg-cYv92mmvNSeGsc92 .statediagram-cluster .inner{rx:0;ry:0}#mermaid-svg-cYv92mmvNSeGsc92 .statediagram-state rect.basic{rx:5px;ry:5px}#mermaid-svg-cYv92mmvNSeGsc92 .statediagram-state rect.divider{stroke-dasharray:10,10;fill:#efefef}#mermaid-svg-cYv92mmvNSeGsc92 .note-edge{stroke-dasharray:5}#mermaid-svg-cYv92mmvNSeGsc92 .statediagram-note rect{fill:#fff5ad;stroke:#aa3;stroke-width:1px;rx:0;ry:0}:root{--mermaid-font-family: '"trebuchet ms", verdana, arial';--mermaid-font-family: "Comic Sans MS", "Comic Sans", cursive}#mermaid-svg-cYv92mmvNSeGsc92 .error-icon{fill:#522}#mermaid-svg-cYv92mmvNSeGsc92 .error-text{fill:#522;stroke:#522}#mermaid-svg-cYv92mmvNSeGsc92 .edge-thickness-normal{stroke-width:2px}#mermaid-svg-cYv92mmvNSeGsc92 .edge-thickness-thick{stroke-width:3.5px}#mermaid-svg-cYv92mmvNSeGsc92 .edge-pattern-solid{stroke-dasharray:0}#mermaid-svg-cYv92mmvNSeGsc92 .edge-pattern-dashed{stroke-dasharray:3}#mermaid-svg-cYv92mmvNSeGsc92 .edge-pattern-dotted{stroke-dasharray:2}#mermaid-svg-cYv92mmvNSeGsc92 .marker{fill:#333}#mermaid-svg-cYv92mmvNSeGsc92 .marker.cross{stroke:#333}:root { --mermaid-font-family: "trebuchet ms", verdana, arial;}#mermaid-svg-cYv92mmvNSeGsc92 {color: rgba(0, 0, 0, 0.75);font: ;}

K8S集群
web-service
web-ingress
apache
自动扩展节点
apache
自动扩展节点
apache
用户
实验步骤
[root@master ~]# vim hpa-example.yaml
---
apiVersion: apps/v1
kind: Deployment
metadata:name: myweb
spec:selector:matchLabels:app: apachereplicas: 1template:metadata:labels:app: apachespec:containers:- name: apacheimage: 192.168.1.100:5000/myos:httpdports:- containerPort: 80resources:requests:cpu: 200mrestartPolicy: Always---
apiVersion: v1
kind: Service
metadata:name: web-service
spec:ports:- protocol: TCPport: 80targetPort: 80selector:app: apachetype: ClusterIP---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:name: my-appannotations:kubernetes.io/ingress.class: "nginx"
spec:backend:serviceName: web-serviceservicePort: 80---
apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:name: myweb
spec:minReplicas: 1maxReplicas: 3scaleTargetRef:apiVersion: apps/v1kind: Deploymentname: mywebtargetCPUUtilizationPercentage: 50
[root@master ~]# kubectl apply -f hpa-example.yaml
[root@master ~]# kubectl get hpa
NAME    REFERENCE          TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
myweb   Deployment/myweb   0%/50%    1         3         1          15m

当容器的cpu占用超过 50% 的时候,自动扩展一个POD,依次扩展,一直到最大值

如果cpu访问不足 50% 的时候,每 300s 缩减一个 POD 节点,直到最小值时停止

访问测试可以使用镜像内提供的 info.php增加系统负载,从而查看状态信息

访问地址 http://ip.xx.xx.xx/info.php?id=1000000

id 为计算结果集的数量,id 越大,占用内存和CPU越高,设置特别大容易死机

华为云部署K8s之K8s安装4相关推荐

  1. 华为云ssl证书申请和安装

    华为云ssl证书申请和安装 1.打开网站,点击领取免费证书,点击立即购买. 2.打开华为云控制台,找到云证书管理服务.确认付款后自动跳转,点击申请证书. 填写自己的域名. 填写授权人信息,姓名.电话. ...

  2. 华为云初次使用和配置安装宝塔配置mysql、Redis远程连接访问

    文本仅为记录日常操作,安装配置过程步骤. 准备:购买一台新的未开封的华为云服务器 初次使用 登录首页 进入到控制台 配置修改登录密码 我的资源已经创建 ECS 云服务器 点击进入配置账号密码 xshe ...

  3. 华为云部署 springboot

    我这几天用了华为云部署了docker 聚到了很多问题总算是部署成功了 1.首先通过官方下载docker容器 2.把要部署的项目放到linux服务器中 3.最重要的一步运行 因为华为云的是arm架构所以 ...

  4. 华为云部署JavaWeb(SpringBoot)程序(基于Centos7)

    文章目录 Linux对应版本java软件 项目打包 华为云配置 Mysql配置 JDK8配置 MAVEN配置 项目上线 效果展示 你也可以完全自己安装Mysql这些软件,或者直接使用Docker进行容 ...

  5. 云上武功秘籍(四)金蝶最新产品KIS全版本华为云部署

    每天琐事缠身,查错.维护.开接口?--不,你可以更加富有创造力! 假期千里迢迢飞回公司机房处理一个小故障?--不,你可以更加自由高效! 如果这就是你的写照,那为什么不选择上云呢? 如果要上云,那为什么 ...

  6. 华为云部署YOLOv5

    文章目录 使用框架 华为云使用 环境搭建 本地测试 网络测试 后端部署([gunicorn部署](https://blog.csdn.net/wbw0wbw/article/details/89517 ...

  7. 华为云服务器实战 之 Gitlab安装与配置使用

    简介 GitLab是一个利用Ruby on Rails开发的开源应用程序,实现一个自托管的Git项目仓库,可通过Web界面进行访问公开的或者私人项目. 它拥有与GitHub类似的功能,能够浏览源代码, ...

  8. 使用华为云桌面的电脑如何安装破解版PSCAD4.6.2

    1 下载好解压压缩包,解压后运行setup进行安装,安装过程默认选择便可,可更换安装路径,路径中不能有空格: 2 安装完成后,解压crack,电脑如果是64为操作系统的,便复制64bit文件夹里边的程 ...

  9. 华为云部署K8s之容器技术.docker安装

    docker安装 安装前准备: ​ 1.禁用 selinux [SELINUX=disabled] ​ 2.卸载防火墙 [yum -y remove firewalld-*] ​ 3.docker软件 ...

最新文章

  1. 在 Linux 中使用超级用户权限
  2. 重集合中找出最相近的一个数字
  3. HDU 2079-课程时间(生成函数)
  4. 什么是java OOM?如何分析及解决oom问题?
  5. C++多态,虚函数,纯虚函数
  6. matlab模糊推理,模糊推理系统的matlab代码
  7. 科学家公布“寿命计算器”,快算一下你能活多久?
  8. vscode 不能运行h5c3代码_让开发效率“飞起”的VS Code 插件
  9. 常识推理相关最新研究进展
  10. TensorFlow 教程 --新手入门--1.3 安装实例
  11. Oracle grant connect, resource to user语句中的权限
  12. 写作技巧~100段作文排比句(81-100段),考试一定用得上,赶紧收藏!
  13. 缺陷跟踪系统BugTracker。 以下对使用
  14. Cobaltstrike内网工具的使用笔记
  15. fwrite函数的用法
  16. 记我的第一次腾讯游戏策划面试
  17. 2009年的总结(二)
  18. 机器学习之恶意流量检测的特征工程
  19. Python中len()的用法
  20. 计算机操作系统(汤子瀛)习题答案 第一章操作系统导论

热门文章

  1. Web 页面如何添加水印?
  2. 简体字---繁体字---网页简体字转繁体字--包教包会
  3. 带你7天玩转可视化建站平台
  4. 最长公共前后缀(KMP中next数组求法)
  5. 判断文件夹是否存在的方法
  6. 今天项目报错: No operations allowed after connection closed
  7. mac usb iso linux系统安装教程,Mac上制作linux系统U盘安装盘
  8. python实训报告50000_Python实训周总结
  9. 深入分析中小型千兆网吧解决方案(转)
  10. 读《STRENGTHNET: DEEP LEARNING-BASED EMOTION STRENGTH ASSESSMENT FOR EMOTIONAL SPEECH SYNTHESIS》