Índice
1. Crie um novo monitor de namespace
3. Efeito de monitoramento de teste
Artigo de referência:
Preparação:
Introdução do nó do cluster de cluster:
mestre: 192.168.136.21 (as etapas a seguir são todas executadas neste nó)
trabalhador: 192.168.136.22
trabalhador: 192.168.136.23
##confusão de indentação do vim, no modo de dois pontos, :set paste entra no modo de colagem, :set nopaste sai do modo de colagem (padrão). ##
1. Crie um novo monitor de namespace
kubectl criar monitor ns
Puxe a imagem do cadvisor, pois a imagem oficial está na imagem do Google e não pode ser acessada na China, eu uso a imagem de outra pessoa aqui, é só puxar direto, observe que o nome da imagem é lagoudocker/cadvisor:v0.37.0.
docker pull lagoudocker/cadvisor:v0.37.0
2. Implantação
Crie um novo diretório /opt/cadvisor_prome_gra, existem muitos arquivos de configuração, então crie um novo diretório separadamente.
2.1 implantar cadvisor
Implante o recurso DaemonSet do cadvisor. O recurso DaemonSet pode garantir que cada nó no cluster execute o mesmo conjunto de pods e até mesmo nós recém-adicionados criarão pods correspondentes automaticamente.
vim case1-daemonset-deploy-cadvisor.yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: cadvisor
namespace: monitor
spec:
selector:
matchLabels:
app: cAdvisor
template:
metadata:
labels:
app: cAdvisor
spec:
tolerations: #污点容忍,忽略master的NoSchedule
- effect: NoSchedule
key: node-role.kubernetes.io/master
hostNetwork: true
restartPolicy: Always # 重启策略
containers:
- name: cadvisor
image: lagoudocker/cadvisor:v0.37.0
imagePullPolicy: IfNotPresent # 镜像策略
ports:
- containerPort: 8080
volumeMounts:
- name: root
mountPath: /rootfs
- name: run
mountPath: /var/run
- name: sys
mountPath: /sys
- name: docker
mountPath: /var/lib/containerd
volumes:
- name: root
hostPath:
path: /
- name: run
hostPath:
path: /var/run
- name: sys
hostPath:
path: /sys
- name: docker
hostPath:
path: /var/lib/containerd
kubectl apply -f case1-daemonset-deploy-cadvisor.yaml
kubectl get pod -n monitor -owide query
Como há três nós, haverá três pods. Se um nó de trabalho for adicionado posteriormente, o DaemonSet o adicionará automaticamente.
teste cadvisor <masterIP>:<8080>
2.2 implantar node_exporter
Implante o recurso DaemonSet e o recurso Service do node-exporter.
vim case2-daemonset-deploy-node-exporter.yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: node-exporter
namespace: monitor
labels:
k8s-app: node-exporter
spec:
selector:
matchLabels:
k8s-app: node-exporter
template:
metadata:
labels:
k8s-app: node-exporter
spec:
tolerations:
- effect: NoSchedule
key: node-role.kubernetes.io/master
containers:
- image: prom/node-exporter:v1.3.1
imagePullPolicy: IfNotPresent
name: prometheus-node-exporter
ports:
- containerPort: 9100
hostPort: 9100
protocol: TCP
name: metrics
volumeMounts:
- mountPath: /host/proc
name: proc
- mountPath: /host/sys
name: sys
- mountPath: /host
name: rootfs
args:
- --path.procfs=/host/proc
- --path.sysfs=/host/sys
- --path.rootfs=/host
volumes:
- name: proc
hostPath:
path: /proc
- name: sys
hostPath:
path: /sys
- name: rootfs
hostPath:
path: /
hostNetwork: true
hostPID: true
---
apiVersion: v1
kind: Service
metadata:
annotations:
prometheus.io/scrape: "true"
labels:
k8s-app: node-exporter
name: node-exporter
namespace: monitor
spec:
type: NodePort
ports:
- name: http
port: 9100
nodePort: 39100
protocol: TCP
selector:
k8s-app: node-exporter
kubectl get pod -n monitor
Verifique os dados do nó-exportador, preste atenção à porta 9100, <nodeIP>:<9100>
2.3 implantar prometheus
Os recursos do Prometheus incluem recursos ConfigMap, recursos de implantação e recursos de serviço.
vim case3-1-prometheus-cfg.yaml
---
kind: ConfigMap
apiVersion: v1
metadata:
labels:
app: prometheus
name: prometheus-config
namespace: monitor
data:
prometheus.yml: |
global:
scrape_interval: 15s
scrape_timeout: 10s
evaluation_interval: 1m
scrape_configs:
- job_name: 'kubernetes-node'
kubernetes_sd_configs:
- role: node
relabel_configs:
- source_labels: [__address__]
regex: '(.*):10250'
replacement: '${1}:9100'
target_label: __address__
action: replace
- action: labelmap
regex: __meta_kubernetes_node_label_(.+)
- job_name: 'kubernetes-node-cadvisor'
kubernetes_sd_configs:
- role: node
scheme: https
tls_config:
ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
relabel_configs:
- action: labelmap
regex: __meta_kubernetes_node_label_(.+)
- target_label: __address__
replacement: kubernetes.default.svc:443
- source_labels: [__meta_kubernetes_node_name]
regex: (.+)
target_label: __metrics_path__
replacement: /api/v1/nodes/${1}/proxy/metrics/cadvisor
- job_name: 'kubernetes-apiserver'
kubernetes_sd_configs:
- role: endpoints
scheme: https
tls_config:
ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
relabel_configs:
- source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name]
action: keep
regex: default;kubernetes;https
- job_name: 'kubernetes-service-endpoints'
kubernetes_sd_configs:
- role: endpoints
relabel_configs:
- source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scrape]
action: keep
regex: true
- source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scheme]
action: replace
target_label: __scheme__
regex: (https?)
- source_labels: [__meta_kubernetes_service_annotation_prometheus_io_path]
action: replace
target_label: __metrics_path__
regex: (.+)
- source_labels: [__address__, __meta_kubernetes_service_annotation_prometheus_io_port]
action: replace
target_label: __address__
regex: ([^:]+)(?::\d+)?;(\d+)
replacement: $1:$2
- action: labelmap
regex: __meta_kubernetes_service_label_(.+)
- source_labels: [__meta_kubernetes_namespace]
action: replace
target_label: kubernetes_namespace
- source_labels: [__meta_kubernetes_service_name]
action: replace
target_label: kubernetes_service_name
Observe que o k8s-master no arquivo de configuração case3-2 deve ser alterado e não pode ser alterado para o ip do host local (o motivo é desconhecido)
Defina o nó 192.168.136.21 (k8s-master) como o caminho de armazenamento de dados do prometheus /data/prometheus.
vim case3-2-prometheus-deployment.yaml
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: prometheus-server
namespace: monitor
labels:
app: prometheus
spec:
replicas: 1
selector:
matchLabels:
app: prometheus
component: server
#matchExpressions:
#- {key: app, operator: In, values: [prometheus]}
#- {key: component, operator: In, values: [server]}
template:
metadata:
labels:
app: prometheus
component: server
annotations:
prometheus.io/scrape: 'false'
spec:
nodeName: k8s-master
serviceAccountName: monitor
containers:
- name: prometheus
image: prom/prometheus:v2.31.2
imagePullPolicy: IfNotPresent
command:
- prometheus
- --config.file=/etc/prometheus/prometheus.yml
- --storage.tsdb.path=/prometheus
- --storage.tsdb.retention=720h
ports:
- containerPort: 9090
protocol: TCP
volumeMounts:
- mountPath: /etc/prometheus/prometheus.yml
name: prometheus-config
subPath: prometheus.yml
- mountPath: /prometheus/
name: prometheus-storage-volume
volumes:
- name: prometheus-config
configMap:
name: prometheus-config
items:
- key: prometheus.yml
path: prometheus.yml
mode: 0644
- name: prometheus-storage-volume
hostPath:
path: /data/prometheusdata
type: Directory
Criar sa e clusterrolebinding
kubectl cria monitor de conta de serviço -n monitor
kubectl criar clusterrolebinding monitor-clusterrolebinding -n monitor --clusterrole=cluster-admin --serviceaccount=monitor:monitor
kubectl apply -f case3-2-prometheus-deployment.yaml
No caso 3-2, há um grande buraco nesta etapa, é possível usar "k8s-master", mas não usar "192.168.136.21"! A implantação e o pod não puderam ser ativados. A verificação do log do pod mostra que o host "192.168.136.21" não pode ser encontrado e a alteração para "k8s-master" não funcionará. Tudo ficará bem depois de alguns dias e o máquina será desligada durante o período. (motivo desconhecido)
vim case3-3-prometheus-svc.yaml
---
apiVersion: v1
kind: Service
metadata:
name: prometheus
namespace: monitor
labels:
app: prometheus
spec:
type: NodePort
ports:
- port: 9090
targetPort: 9090
nodePort: 30090
protocol: TCP
selector:
app: prometheus
component: server
kubectl apply -f case3-3-prometheus-svc.yaml
2.4 Implantar permissões rbac
Incluindo recursos secretos, recursos ServiceAccount, recursos ClusterRole e recursos ClusterRoleBinding, ServiceAccount é uma conta de serviço, ClusterRole é uma regra de permissão e ClusterRoleBinding é vincular ServiceAccount e ClusterRole.
As informações de autenticação do pod e do apiserver são definidas por segredo. Como as informações de autenticação são informações confidenciais, elas precisam ser armazenadas no recurso secreto e montadas no pod como um volume de armazenamento. Dessa forma, a aplicação em execução no Pod pode se conectar ao apiserver através das informações do secret correspondente e concluir a autenticação.
o gerenciamento de permissão rbac é um conjunto de sistema de autenticação de k8s. O acima é apenas uma breve explicação. Para uma compreensão mais aprofundada, você pode navegar: autorização rbac de k8s APIserver mecanismo de segurança_Stupid child@GF Knowledge and action blog-CSDN blog_Which file is k8s rbac escrito em
vim case4-prom-rbac.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
name: prometheus
namespace: monitor
---
apiVersion: v1
kind: Secret
type: kubernetes.io/service-account-token
metadata:
name: monitor-token
namespace: monitor
annotations:
kubernetes.io/service-account.name: "prometheus"
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: prometheus
rules:
- apiGroups:
- ""
resources:
- nodes
- services
- endpoints
- pods
- nodes/proxy
verbs:
- get
- list
- watch
- apiGroups:
- "extensions"
resources:
- ingresses
verbs:
- get
- list
- watch
- apiGroups:
- ""
resources:
- configmaps
- nodes/metrics
verbs:
- get
- nonResourceURLs:
- /metrics
verbs:
- get
---
#apiVersion: rbac.authorization.k8s.io/v1beta1
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: prometheus
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: prometheus
subjects:
- kind: ServiceAccount
name: prometheus
namespace: monitor
kubectl apply -f case4-prom-rbac.yaml
2.5. Implantar métricas
Incluindo recurso de implantação, recurso de serviço, recurso ServiceAccount, recurso ClusterRole, recurso ClusterRoleBinding.
Observe que ele é implantado no sistema kube!
vim case5-kube-state-metrics-deploy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: kube-state-metrics
namespace: kube-system
spec:
replicas: 1
selector:
matchLabels:
app: kube-state-metrics
template:
metadata:
labels:
app: kube-state-metrics
spec:
serviceAccountName: kube-state-metrics
containers:
- name: kube-state-metrics
image: registry.cn-hangzhou.aliyuncs.com/zhangshijie/kube-state-metrics:v2.6.0
ports:
- containerPort: 8080
---
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: kube-state-metrics
namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: kube-state-metrics
rules:
- apiGroups: [""]
resources: ["nodes", "pods", "services", "resourcequotas", "replicationcontrollers", "limitranges", "persistentvolumeclaims", "persistentvolumes", "namespaces", "endpoints"]
verbs: ["list", "watch"]
- apiGroups: ["extensions"]
resources: ["daemonsets", "deployments", "replicasets"]
verbs: ["list", "watch"]
- apiGroups: ["apps"]
resources: ["statefulsets"]
verbs: ["list", "watch"]
- apiGroups: ["batch"]
resources: ["cronjobs", "jobs"]
verbs: ["list", "watch"]
- apiGroups: ["autoscaling"]
resources: ["horizontalpodautoscalers"]
verbs: ["list", "watch"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: kube-state-metrics
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: kube-state-metrics
subjects:
- kind: ServiceAccount
name: kube-state-metrics
namespace: kube-system
---
apiVersion: v1
kind: Service
metadata:
annotations:
prometheus.io/scrape: 'true'
name: kube-state-metrics
namespace: kube-system
labels:
app: kube-state-metrics
spec:
type: NodePort
ports:
- name: kube-state-metrics
port: 8080
targetPort: 8080
nodePort: 31666
protocol: TCP
selector:
app: kube-state-metrics
kubectl apply -f case5-kube-state-metrics-deploy.yaml
2.6 implantar grafana
A interface gráfica do grafana está conectada à fonte de dados do prometheus, incluindo recursos de implantação e recursos de serviço.
vim grafana-enterprise.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: grafana-enterprise
namespace: monitor
spec:
replicas: 1
selector:
matchLabels:
app: grafana-enterprise
template:
metadata:
labels:
app: grafana-enterprise
spec:
containers:
- image: grafana/grafana
imagePullPolicy: Always
#command:
# - "tail"
# - "-f"
# - "/dev/null"
securityContext:
allowPrivilegeEscalation: false
runAsUser: 0
name: grafana
ports:
- containerPort: 3000
protocol: TCP
volumeMounts:
- mountPath: "/var/lib/grafana"
name: data
resources:
requests:
cpu: 100m
memory: 100Mi
limits:
cpu: 500m
memory: 2500Mi
volumes:
- name: data
emptyDir: {}
---
apiVersion: v1
kind: Service
metadata:
name: grafana
namespace: monitor
spec:
type: NodePort
ports:
- port: 80
targetPort: 3000
nodePort: 31000
selector:
app: grafana-enterprise
kubectl apply -f grafana-enterprise.yaml
Administrador da conta Administrador da senha
Adicione as origens de dados da fonte de dados, denominadas prometheus, preste atenção ao número da porta 30090 .
Adicione o modelo 13332, você também pode adicionar outros modelos, como: 14981, 13824, 14518.
Clique no sinal "+" à esquerda e selecione "importar" para importar o modelo.
Modelo 13332
O número do modelo do cadvisor é 14282. Há um bug aqui que não foi resolvido. Ele pode monitorar os recursos de desempenho de todos os contêineres no cluster, mas se um dos contêineres for selecionado, os dados não podem ser exibidos. (deve ser consertável).
O ID do pod é exibido agora, o que não é conveniente para o administrador navegar. Para exibir o nome do pod por conveniência, selecione o "ícone de configurações" no lado direito do modelo, selecione "Variáveis", selecione o segundo e mude "name" para "pod" É isso.
Cada seção do painel também precisa ser alterada. Clique no título da seção, selecione "Editar" e altere "nome" para "pod".
3. Efeito de monitoramento de teste
Crie uma nova tarefa de implantação chamada nginx01 para testar os resultados do monitoramento.
vim nginx01.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx01
spec:
replicas: 2
selector:
matchLabels:
app: nginx01
template:
metadata:
labels:
app: nginx01
spec:
containers:
- name: nginx
image: nginx:1.7.9
kubectl apply -f nginx01.yaml
Dois nginx01 aparecem porque 2 réplicas estão definidas.
Até o momento, a implantação do monitoramento de cluster cadvisor+prometheus+grafana está concluída.