一、 k8s的UI访问界面-dashboard
在dashboard中,虽然可以做到创建、删除、修改资源等操作,但通常情况下,我们会把它当做监控k8s集群的软件。
1、到GitHub主页上搜索"dashboard"即可。
//可以直接远程运行对应的yaml文件,不过,我们要看一看这个yaml文件内都有些什么内容,然后还需要将svc资源类型更改为NodePort的方式,所以这里我们可以先将这个yam文件下载到本地。
[root@master jk]# kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0/aio/deploy/recommended.yaml
[root@master jk]# ls
recommended.yaml
//更改其SVC资源的类型
[root@master jk]# vim recommended.yaml
...
spec:
type: NodePort
ports:
- port: 443
targetPort: 8443
nodePort: 30100
selector:
k8s-app: kubernetes-dashboard
...
[root@master jk]# kubectl apply -f recommended.yaml
namespace/kubernetes-dashboard created
serviceaccount/kubernetes-dashboard created
service/kubernetes-dashboard created
secret/kubernetes-dashboard-certs created
secret/kubernetes-dashboard-csrf created
secret/kubernetes-dashboard-key-holder created
configmap/kubernetes-dashboard-settings created
role.rbac.authorization.k8s.io/kubernetes-dashboard created
clusterrole.rbac.authorization.k8s.io/kubernetes-dashboard created
rolebinding.rbac.authorization.k8s.io/kubernetes-dashboard created
clusterrolebinding.rbac.authorization.k8s.io/kubernetes-dashboard created
deployment.apps/kubernetes-dashboard created
service/dashboard-metrics-scraper created
deployment.apps/dashboard-metrics-scraper created
//通常,涉及到k8s的镜像,国内下载往往很慢,不过这个还好。运行过后,查看对应的SVC暴露端口,注意,这个是基于https的访问。
[root@master jk]# kubectl get pod -n kubernetes-dashboard
NAME READY STATUS RESTARTS AGE
dashboard-metrics-scraper-76679bc5b9-fnbsz 1/1 Running 0 106s
kubernetes-dashboard-7f9fd5966c-5gms5 1/1 Running 0 106s
[root@master jk]# kubectl get svc -n kubernetes-dashboard
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
dashboard-metrics-scraper ClusterIP 10.100.13.74 <none> 8000/TCP 68s
kubernetes-dashboard NodePort 10.108.0.135 <none> 443:30100/TCP 69s
浏览器访问:https://192.168.1.20:30100
//此时可以看到,登录dashboard有两种方式,哪一种都可以。(这里两种方式都列举出来)
基于token的方法登录dashboard
1、创建一个dashboard的管理用户。
[root@master jk]# kubectl create serviceaccount dashboard-admin -n kube-system
2、绑定用户为集群管理用户。
[root@master jk]# kubectl create clusterrolebinding dashboard-cluster-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin
3、获取token
//得到token的名称
[root@master jk]# kubectl get secrets -n kube-system | grep dashboard-admin
dashboard-admin-token-5l2vh kubernetes.io/service-account-token 3 2m41s
//查看上述得到的secret资源的详细信息,会得到token. (后面加上刚得到的token名称)
[root@master jk]# kubectl describe secrets -n kube-system dashboard-admin-token-5l2vh
4、在浏览器上使用token登录。
PS: 这里访问可能有一些浏览器登录会不成功,需要换成其他浏览器, 推荐:火狐,
把上面的token,长串字母,复制到Kubernetes 仪表盘的输入token
基于kubeconfig配置文件的方法登录dashboard
1、获取token.
//得到token的名称
[root@master jk]# kubectl get secrets -n kube-system | grep dashboard-admin
dashboard-admin-token-5l2vh kubernetes.io/service-account-token 3 2m41s
//查看上述得到的secret资源的详细信息,会得到token. (后面加上刚得到的token名称)
[root@master jk]# kubectl describe secrets -n kube-system dashboard-admin-token-5l2vh
2、生成kubeconfig配置文件。
//设置一个环境变量代表获取的token (注意,命令中间是有你刚得到的token名称的)
[root@master jk]# DASH_TOKEN=$(kubectl get secrets -n kube-system dashboard-admin-token-5l2vh -o jsonpath={.data.token} | base64 -d)
//将k8s集群的配置信息写入kubeconfig配置文件中。(这里写自己的IP)
[root@master jk]# kubectl config set-cluster kubernetes --server=192.168.1.20:6443 --kubeconfig=/root/.dashboard-admin.conf
[root@master jk]# kubectl config set-credentials dashboard-admin --token=$DASH_TOKEN --kubeconfig=/root/.dashboard-admin.conf
[root@master jk]# kubectl config set-context dashboard-admin@kubernetes --cluster=kubernetes --user=dashboard-admin --kubeconfig=/root/.dashboard-admin.conf
[root@master jk]# kubectl config use-context dashboard-admin@kubernetes --kubeconfig=/root/.dashboard-admin.conf
3、将生成的/root/.dashboard-admin.conf的配置文件,导出并做保存。
[root@master jk]# sz /root/.dashboard-admin.conf
4、从浏览器选择kubeconfig的登录方式,然后导入配置文件即可。
二、Scope
安装scope
[root@master jk]# kubectl apply -f "https://cloud.weave.works/k8s/scope.yaml?k8s-version=$(kubectl version | base64 | tr -d '\n')"
[root@master jk]# kubectl get ns
NAME STATUS AGE
default Active 7d21h
kube-node-lease Active 7d21h
kube-public Active 7d21h
kube-system Active 7d21h
kubernetes-dashboard Active 46m
weave Active 72s
[root@master jk]# kubectl get svc -n weave
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
weave-scope-app ClusterIP 10.106.175.206 <none> 80/TCP 91s
[root@master jk]# kubectl edit svc -n weave weave-scope-app
...
spec:
clusterIP: 10.106.175.206
externalTrafficPolicy: Cluster
ports:
- name: app
nodePort: 31658
port: 80
protocol: TCP
targetPort: 4040
selector:
app: weave-scope
name: weave-scope-app
weave-cloud-component: scope
weave-scope-component: app
sessionAffinity: None
type: NodePort //修改为NodePort
...
[root@master jk]# kubectl get svc -n weave
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
weave-scope-app NodePort 10.106.175.206 <none> 80:31658/TCP 2m44s
浏览器访问:192.168.1.20:31658
三、Prometheus
PS: 在这里部署的prometheus,是使用的coreos提供的prometheus项目。
下载压缩包
[root@master jk]# wget https://github.com/prometheus-operator/kube-prometheus/archive/v0.3.0.tar.gz
解压
[root@master jk]# tar -zxf v0.3.0.tar.gz
kube-prometheus-0.3.0
**MetricsServer:**是k8s集群资源使用情况的聚合器,收集数据给k8s集群内使用,如kubectl,hpa,scheduler等。
Prometheus Operator : 是一个系统检测和警报工具箱,用来存储监控数据。
**Prometheus node-exporter:**收集k8s集群资源的数据,指定告警规则。
**Prometheus:**收集apiserver,scheduler,controller-manager,kubelet组件的数据,通过http协议传输。
**Grafana:**可视化数据统计和监控平台。
1.修改grafana-service.yaml文件,更改为nodePort的暴露方式,暴露端口
[root@master manifests]# pwd
/root/kube-prometheus-0.3.0/manifests
[root@master manifests]# vim grafana-service.yaml
...
spec:
type: NodePort //修改为NodePort
ports:
- name: http
port: 3000
targetPort: http
nodePort: 31001 //可以自己设置,也可以不写随机映射
...
2.修改prometheus-service.yaml文件,更改为nodePort的暴露方式,暴露端口
```bash
[root@master manifests]# vim prometheus-service.yaml
...
spec:
type: NodePort //修改为NodePort
ports:
- name: web
port: 9090
targetPort: web
nodePort: 31002 //可以自己设置,也可以不写随机映射
...
3.修改alertmanager-service.yaml文件,更改为nodePort的暴露方式,暴露端口
```bash
[root@master manifests]# vim alertmanager-service.yaml
...
spec:
type: NodePort //修改为NodePort
ports:
- name: web
port: 9093
targetPort: web
nodePort: 31003 //可以自己设置,也可以不写随机映射
...
4.将这个目录中的yaml文件,全部运行。是运行以上yaml文件的基础环境配置。有可能因为目录内yaml文件过多,一次不能全部运行,所以咋运行的时候,多运行两遍
[root@master manifests]# pwd
/root/kube-prometheus-0.3.0/manifests
[root@master manifests]# kubectl apply -f setup/
5.运行主yaml文件。有可能因为目录内yaml文件过多,一次不能全部运行,所以运行的时候,多运行两遍
[root@master kube-prometheus-0.3.0]# pwd
/root/kube-prometheus-0.3.0
[root@master kube-prometheus-0.3.0]# kubectl apply -f manifests/
部署成功字后,可以运行一条命令,查看资源使用情况(MetricsServer必须部署成功)
[root@master ~]# kubectl top node
NAME CPU(cores) CPU% MEMORY(bytes) MEMORY%
master 2197m 54% 1165Mi 67%
node01 2756m 68% 1102Mi 64%
node02 3545m 88% 1011Mi 58%
查看是否都运行成功
[root@master ~]# kubectl get pod -n monitoring
NAME READY STATUS RESTARTS AGE
alertmanager-main-0 2/2 Running 0 11m
alertmanager-main-1 2/2 Running 0 11m
alertmanager-main-2 2/2 Running 0 11m
grafana-77978cbbdc-f52sk 1/1 Running 0 10m
kube-state-metrics-7f6d7b46b4-4rd9h 3/3 Running 0 10m
node-exporter-8b2m7 2/2 Running 0 10m
node-exporter-kjzv4 2/2 Running 0 10m
node-exporter-vbw7m 2/2 Running 0 10m
prometheus-adapter-68698bc948-75zr6 1/1 Running 0 10m
prometheus-k8s-0 3/3 Running 1 10m
prometheus-k8s-1 3/3 Running 1 10m
prometheus-operator-6685db5c6-h4qm8 1/1 Running 0 12m
6.浏览器访问grafana
7.导入监控模板
从grafana的官网搜索
四、HPA
可以根据当前Pod资源的使用率,比如说CPU、磁盘、内存等进行副本Pod的动态的扩容与缩容。
前提条件:系统应该能否获取到当前Pod的资源使用情况(意思是可以执行kubectl top pod命令,并且能够得到反馈信息)。
heapster: 这个组件之前是集成在k8s集群的,不过在1.12版本之后被移除了。如果还想使用此功能,应该部署metricServer,这个k8s集群资源使用情况的聚合器。
这里,我们使用一个测试镜像,这个镜像基于php-apache制作的docker镜像,包含了一些可以运行cpu密集计算任务的代码。
//我们模拟运行一个Deployment资源对象,和SVC资源对象,待会要对他进行HAP控制。
下载之后可能需要更新,改个名就好了
[root@master ~]# docker tag mirrorgooglecontainers/hpa-example:latest mirrorgooglecontainers/hpa-example:test
提前准备好HAP的tar包
[root@master ~]# ls
[root@master ~]# docker load -i HPA.tar
[root@master ~]# kubectl run php-apache --image=mirrorgooglecontainers/hpa-example --requests=cpu=200m --expose --port=80
[root@master ~]# kubectl get deployments.
NAME READY UP-TO-DATE AVAILABLE AGE
php-apache 1/1 1 1 4m26s
[root@master ~]# kubectl top pod php-apache-867f97c8cb-fklcv
NAME CPU(cores) MEMORY(bytes)
php-apache-867f97c8cb-fklcv 5m 10Mi
创建HPA控制器。
[root@master ~]# kubectl autoscale deployment php-apache --cpu-percent=50 --min=1 --max=10
[root@master ~]# kubectl get hpa
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
php-apache Deployment/php-apache 2%/50% 1 10 1 23s
//创建一个应用,用来不停的访问我们刚刚创建的php-apache的svc资源。
[root@master ~]# kubectl run -i --tty load-generator --image=busybox /bin/sh
//进入Pod内,执行此命令,用来模拟访问php-apache的svc资源。
/ # while true; do wget -q -O- http://php-apache.default.svc.clus
ter.local ;done
//我们会发现,上述Deploymen对php-apache这个SVC不停的访问,查看对应的HPA资源它的CPU使用率明显升高,这个时候,我们再去观察php-apache这个Deployment,就会看到它的Pod数量也会不停的增加,直到我们设置HPA资源的最大Pod数量。
[root@master ~]# kubectl get hpa
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
php-apache Deployment/php-apache 35%/50% 1 10 1 4m50s
[root@master ~]# kubectl get deployments. -w
NAME READY UP-TO-DATE AVAILABLE AGE
load-generator 1/1 1 1 3m44s
php-apache 1/1 1 1 14m
//当然Pod数量不会继续增加的时候,我们将访问界面的服务停止掉,观察php-apache这个Deployment资源的Pod数量的变化。当php-apache的CPU使用率完全降下来之后,hpa资源控制的Pod数量并没有马上降下来,这是因为,它要维护这个Pod数量一段时间,保证大量的访问流量继续访问
资源限制
requests:代表容器启动请求的资源限制,分配的资源必须要达到此要求
limits:代表最多可以请求多少资源
单位m:CPU的计量单位叫毫核(m)。一个节点的CPU核心数量乘以1000,得到的就是节点总的CPU总数量。如,一个节点有两个核,那么该节点的CPU总量为2000m。
基于pod
Kubernetes对资源的限制实际上是通过cgroup来控制的,cgroup是容器的一组用来控制内核如何运行进程的相关属性接。针对内存、CPU和各种设备都有对应的cgroup
默认情况下,Pod运行没有CPU和内存限额。这意味着系统中的任何Pod将能够像执行该Pod所在接地那一样,消耗足够多的CPU和内存。一般会针对某些应用的Pod资源进行资源限制,这个资源限制是通过resources和requests和limits来实现。
[root@master ~]# vim croup-pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-cgroup
spec:
containers:
- name: pod-cgroup
imagePullPolicy: Always
image: httpd
ports:
- protocol: TCP
containerPort: 80
resources:
limits:
cpu: "4"
memory: 2Gi
requests:
cpu: 260m
memory: 260Mi
requests: 要分配的资源,limits为最高请求的资源值。可以简单的理解为初始值和最大值。
基于名称空间
1)计算资源配额
[root@master ~]# vim compute-resources.yaml
apiVersion: v1
kind: ResourceQuota
metadata:
name: compute-resources
spec:
hard:
pods: "20"
requests.cpu: "20"
requests.memory: 100Gi
limits.cpu: "40"
limits.memory: 200Gi
2)配置对象数量配额限制
[root@master ~]# vim object-counts.yaml
apiVersion: v1
kind: ResourceQuota
metadata:
name: object-counts
spec:
hard:
configmaps: "10"
persistentvolumeclaims: "4"
replicationcontrollers: "20"
secrets: "10"
service.loadbalancers: "2"
3)配置CPU和内存的LimitRange
[root@master ~]# vim limitrange.yaml
apiVersion: v1
kind: LimitRange
metadata:
name: mem-limit-range
spec:
limits:
- default:
memory: 50Gi
cpu: 5
defaultRequest:
memory: 1Gi
cpu: 1
type: Container
default 即 limit的值。
defaultRequest 即 request的值