【Kubernetes】k8s的安全管理详细说明【SA配置、k8s安装dashboard、资源限制(1)

[root@master sefe]#

node1解压镜像

[root@node1 ~]# docker load -i dashboard

dashboard-metrics_v1.0.1.tar dashboard_v2.0.0.tar dashboard.yaml

[root@node1 ~]# docker load -i dashboard_v2.0.0.tar

954115f32d73: Loading layer 91.22MB/91.22MB

Loaded image: registry.cn-hangzhou.aliyuncs.com/kube-iamges/dashboard:v2.0.0-beta8

[root@node1 ~]# docker load -i dashboard-metrics_v1.0.1.tar

89ac18ee460b: Loading layer 238.6kB/238.6kB

878c5d3194b0: Loading layer 39.87MB/39.87MB

1dc71700363a: Loading layer 2.048kB/2.048kB

Loaded image: registry.cn-hangzhou.aliyuncs.com/kube-iamges/metrics-scraper:v1.0.1

[root@node1 ~]#

node2解压镜像

[root@node2 ~]# docker load -i dashboard-metrics_v1.0.1.tar

89ac18ee460b: Loading layer 238.6kB/238.6kB

878c5d3194b0: Loading layer 39.87MB/39.87MB

1dc71700363a: Loading layer 2.048kB/2.048kB

Loaded image: registry.cn-hangzhou.aliyuncs.com/kube-iamges/metrics-scraper:v1.0.1

[root@node2 ~]# docker load -i dashboard_v2.0.0.tar

954115f32d73: Loading layer 91.22MB/91.22MB

Loaded image: registry.cn-hangzhou.aliyuncs.com/kube-iamges/dashboard:v2.0.0-beta8

[root@node2 ~]#

dashboard配置测试


yaml文件编辑

  • 这主要修改imges相关的内容【NodePort后面用另外一种方式修改】

  • 1、修改镜像名称,用我们上面下载的2个镜像名称

  • 2、修改imagePullPolicy策略为本地获取,第二个imagePullPolicy是手动增加的

[root@master sefe]# grep image dashboard.yaml

image: registry.cn-hangzhou.aliyuncs.com/kube-iamges/dashboard:v2.0.0-beta8

#image: kubernetesui/dashboard:v2.2.0

#imagePullPolicy: Always

imagePullPolicy: IfNotPresent

#image: kubernetesui/metrics-scraper:v1.0.6

image: registry.cn-hangzhou.aliyuncs.com/kube-iamges/metrics-scraper:v1.0.1

imagePullPolicy: IfNotPresent

[root@master sefe]#

生成dashboard的pod

  • 生成yaml文件和查看该pod【状态需要为running为正常】

[root@master sefe]# kubectl apply -f dashboard.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

[root@master sefe]#

[root@master sefe]# kubectl get pods -n kubernetes-dashboard

NAME READY STATUS RESTARTS AGE

dashboard-metrics-scraper-684f96bd4-bhq4c 1/1 Running 0 66s

kubernetes-dashboard-5d66bcd8fd-hbqhw 1/1 Running 0 66s

[root@master sefe]#

  • 前面说过这个会自动生成一个ns空间,所以我们现在查看这个ns下的所有pod

[root@master sefe]# kubectl get all -n kubernetes-dashboard

NAME READY STATUS RESTARTS AGE

pod/dashboard-metrics-scraper-684f96bd4-bhq4c 1/1 Running 0 17s

pod/kubernetes-dashboard-5d66bcd8fd-hbqhw 1/1 Running 0 17s

NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE

service/dashboard-metrics-scraper ClusterIP 10.101.25.25 8000/TCP 17s

service/kubernetes-dashboard ClusterIP 10.107.102.121 443/TCP 17s

NAME READY UP-TO-DATE AVAILABLE AGE

deployment.apps/dashboard-metrics-scraper 1/1 1 1 17s

deployment.apps/kubernetes-dashboard 1/1 1 1 17s

NAME DESIRED CURRENT READY AGE

replicaset.apps/dashboard-metrics-scraper-684f96bd4 1 1 1 17s

replicaset.apps/kubernetes-dashboard-5d66bcd8fd 1 1 1 17s

[root@master sefe]#

修改dashboard的svc类型并测试

  • 修改前呢是 ClusterIP,现在我们要将这个修改为NodePort

#首先需要查看dashboard的名称

[root@master sefe]# kubectl get svc -n kubernetes-dashboard

NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE

dashboard-metrics-scraper ClusterIP 10.101.25.25 8000/TCP 2m59s

kubernetes-dashboard ClusterIP 10.107.102.121 443/TCP 2m59s

然后编辑这个名称,注意,这是在下面固定的命名空间下的

[root@master sefe]# kubectl edit svc kubernetes-dashboard -n kubernetes-dashboard

#修改下面这一行内容,然后wq保存退出

type: NodePort #修改这行为这个内容【倒数第三行】

status:

loadBalancer: {}

~

:wq

[root@master sefe]#

修改完毕以后呢,就可以看到PORT中的dashboard多了一个TCP端口号了,如这31526

[root@master sefe]# kubectl get svc -n kubernetes-dashboard

NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE

dashboard-metrics-scraper ClusterIP 10.101.25.25 8000/TCP 5m54s

kubernetes-dashboard NodePort 10.107.102.121 443:31526/TCP 5m54s

  • 然后crul -k https://master主机ip:svc端口测试看是否有内容【有内容为正常】

[root@master sefe]# curl -k https://192.168.59.142:31526

<!doctype html>

Kubernetes Dashboard

type=“image/png”

href=“assets/images/kubernetes-logo.png” />

<meta name=“viewport”

content=“width=device-width”>

[root@master sefe]# systemctl status firewalld

● firewalld.service - firewalld - dynamic firewall daemon

Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)

Active: inactive (dead)

Docs: man:firewalld(1)

[root@master sefe]#

  • 并且此时呢,我们就可以t通过https://master主机ip:svc端口在浏览器中访问dashboard了【第一次访问需要接收并添加列外】

在这里插入图片描述

使用token登录,token获取继续往下看

在这里插入图片描述

访问报错Internet Explorer增强安全配置。。。
  • 报错内容如下

我这系统是server2012,普通windows可能没有这种报错。。。反正有的话这么处理就是了

在这里插入图片描述

  • 处理方法

打开服务器管理器,点击本地服务器,可以看到IE增强安全配置是启用状态,点击将IE增强安全配置修改为禁用状态,再重新打开IE浏览器,可以正常访问网页,不再弹出该弹窗。

在这里插入图片描述

在这里插入图片描述

端口通但浏览器无法访问
  • 如下,dashboard映射的端口通,但浏览器就是无法访问【此时linux中是可以正常访问的】

在这里插入图片描述

在这里插入图片描述

  • 原因和解决方法

  • 原因是:使用的浏览器是IE内核,这玩意不支持IE内核

  • 解决方法:换firefox浏览器即可【火狐浏览器】

在这里插入图片描述

查看token值并登陆

  • 上面我们网址登录的时候看到了可以选择token登陆

现在我们查看token

之前我们说过每当创建一个sa就会自动生成一个secrets,而token是记录在secrets中的。

#先查看secrets

[root@master sefe]# kubectl get secrets -n kubernetes-dashboard

NAME TYPE DATA AGE

default-token-4pqr6 kubernetes.io/service-account-token 3 129m

kubernetes-dashboard-certs Opaque 0 129m

kubernetes-dashboard-csrf Opaque 1 129m

kubernetes-dashboard-key-holder Opaque 2 129m

kubernetes-dashboard-token-6bnkg kubernetes.io/service-account-token 3 129m

[root@master sefe]#

[root@master sefe]# kubectl get sa -n kubernetes-dashboard

NAME SECRETS AGE

default 1 130m

kubernetes-dashboard 1 130m

[root@master sefe]#

sa对应的token格式呢是:xx-token-xx

#我们现在查看这个secrets的详细即可看到token内容

[root@master sefe]# kubectl describe kubernetes-dashboard-token-6bnkg -n kubernetes-dashboard

error: the server doesn’t have a resource type “kubernetes-dashboard-token-6bnkg”

[root@master sefe]# kubectl describe secrets kubernetes-dashboard-token-6bnkg -n kubernetes-dashboard

Name: kubernetes-dashboard-token-6bnkg

Namespace: kubernetes-dashboard

Labels:

Annotations: kubernetes.io/service-account.name: kubernetes-dashboard

kubernetes.io/service-account.uid: b9f8b781-3eb6-47e6-a6cb-ff5cb4372683

Type: kubernetes.io/service-account-token

Data

====

ca.crt: 1066 bytes

namespace: 20 bytes

token: eyJhbGciOiJSUzI1NiIsImtpZCI6IlM4MTVVSE5kXzVhZXdMaVN2VDBNcDdvdXV4S25aSmJ0aDVFV3Vhc2FFVVkifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlcm5ldGVzLWRhc2hib2FyZCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJrdWJlcm5ldGVzLWRhc2hib2FyZC10b2tlbi02Ym5rZyIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50Lm5hbWUiOiJrdWJlcm5ldGVzLWRhc2hib2FyZCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6ImI5ZjhiNzgxLTNlYjYtNDdlNi1hNmNiLWZmNWNiNDM3MjY4MyIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDprdWJlcm5ldGVzLWRhc2hib2FyZDprdWJlcm5ldGVzLWRhc2hib2FyZCJ9.tQ-_K-rsXRNIbHJRff0XiEVD9sr7qi_hEFTTgeaD0D8iLzELCDVqiDoVp95SHQyUi3-kbestzxm5C-djUd45loJpZNId3jpmNhW5sKQ4nrxqmT575SDoQSm98_3nAw0r80iuFfxJhA0puH6hltZzf4yTN6cJKetEiwkFmFOi7UWQMfNoJREppdaMFUK96O_SIEHvIHsHl2qcvw5ZttFHcE2w5FVOPYbB0JIoWxyRAZGonyshraYrPGnKwfkUTn18UYlHksP8oJEhT2Y05X9wlp-H0n-0GEjdcFl03ov3WrXxdhgBhJhPq62fztRC6S2voyjHuD-JbvGdLNtpX7QFGA

[root@master sefe]#

  • 复制这个token值,然后复制到浏览器中【很长,注意要复制完】

在这里插入图片描述

  • 现在登陆进去以后呢,是没有内容的,而且一直有警告,是正常的,因为没有给sa授权

在这里插入图片描述

SA授权并验证

  • 先授权吧

#dashboard自定义名称

#cluster-admin给admin权限

#kubernetes-dashboard:kubernetes-dashboard两个都是sa名称【中间有冒号】

[root@master sefe]# kubectl create clusterrolebinding dashboard --clusterrole=cluster-admin --serviceaccount=kubernetes-dashboard:kubernetes-dashboard

clusterrolebinding.rbac.authorization.k8s.io/dashboard created

[root@master sefe]#

[root@master sefe]# kubectl describe clusterrolebindings.rbac.authorization.k8s.io dashboard

Name: dashboard

Labels:

Annotations:

Role:

Kind: ClusterRole

Name: cluster-admin

Subjects:

Kind Name Namespace


ServiceAccount kubernetes-dashboard kubernetes-dashboard

[root@master sefe]#

  • 现在我们刷新浏览器,就可以看到dashboard已经有内容并且告警也没有 了

至此dashboard就配置完了,dashboard的功能其实挺多的,连集群的使用率都能看到,更多功能自行摸索吧。。。

在这里插入图片描述

在这里插入图片描述

资源限制

===================================================================

测试说明【含释放缓存内存方法】


  • 我们用cenos镜像来做测试吧,然后准备一个内存消耗的文件【脚本也行,可以自行随便准备一个】

#node节点有centos

[root@node2 ~]# docker images | grep cen

hub.c.163.com/library/centos latest 328edcd84f1b 4 years ago 193MB

[root@node2 ~]#

内存消耗rpm包

[root@master sefe]# ls | grep mem

memload-7.0-1.r29766.x86_64.rpm

[root@master sefe]#

  • 测试资源限制前呢,我们先来看看资源没有被限制的时候是什么样子的【条件不方便呢也可以不用做这些测试,比较这个呢,是比较简单直观的东西,不想弄可以不弄,看看我弄的过程就行了,应该很好理解的,而且这个代码也就那么点,真实环境限制也不容易出错。】

#有pod,先删了吧

[root@master sefe]# kubectl get pods

NAME READY STATUS RESTARTS AGE

pod1 1/1 Running 0 41m

[root@master sefe]# kubectl delete pod pod1

pod “pod1” deleted

[root@master sefe]#

我们用centos镜像来做测试,如下,创建好pod并安装好内存消耗的包

[root@master sefe]# cat pod2.yaml

apiVersion: v1

kind: Pod

metadata:

creationTimestamp: null

labels:

run: pod2

name: pod2

spec:

#nodeName: node2

#nodeSelector:

ccx_label: ccxhero

terminationGracePeriodSeconds: 0

containers:

  • image: hub.c.163.com/library/centos

command: [“sh”,“-c”,“sleep 1000000”]

imagePullPolicy: IfNotPresent

name: pod2

resources: {}

dnsPolicy: ClusterFirst

restartPolicy: Always

status: {}

[root@master sefe]#

[root@master sefe]# kubectl apply -f pod2.yaml

pod/pod2 created

[root@master sefe]# kubectl get pods

NAME READY STATUS RESTARTS AGE

pod2 1/1 Running 0 5s

[root@master sefe]#

[root@master sefe]# kubectl cp memload-7.0-1.r29766.x86_64.rpm pod2:/opt

[root@master sefe]# kubextl exec -it pod2 – bash

bash: kubextl: command not found…

[root@master sefe]# kubectl exec -it pod2 – bash

[root@pod2 /]# ls /opt

memload-7.0-1.r29766.x86_64.rpm

[root@pod2 /]# rpm -ivh /opt/memload-7.0-1.r29766.x86_64.rpm

Preparing… ################################# [100%]

Updating / installing…

1:memload-7.0-1.r29766 ################################# [100%]

[root@pod2 /]#

  • 基本环境弄好了,我们现在开始消耗内存看看

我下面是在多个窗口中,注意看主机名 的变化

这个pod是在node2上

[root@master ~]# kubectl get pods -o wide

NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES

pod2 1/1 Running 0 7m18s 10.244.104.42 node2

[root@master ~]#

可以看到node2现在消耗了1G内存

[root@node2 ~]# free -g

total used free shared buff/cache available

Mem: 31 1 28 0 1 29

Swap: 0 0 0

[root@node2 ~]#

#现在回到容器内部开始占用内容,因为我这虚机是32G内存,所以我占用多一点吧

#容器中占用了10G

[root@pod2 /]# memload 10240

Attempting to allocate 10240 Mebibytes of resident memory…

回到node2,可以看到10G确实可以被占用的

[root@node2 ~]# free -g

total used free shared buff/cache available

Mem: 31 1 28 0 1 29

Swap: 0 0 0

[root@node2 ~]# free -g

total used free shared buff/cache available

Mem: 31 4 24 0 1 25

Swap: 0 0 0

[root@node2 ~]#

[root@node2 ~]# free -g

total used free shared buff/cache available

Mem: 31 7 22 0 1 23

Swap: 0 0 0

[root@node2 ~]# free -g

total used free shared buff/cache available

Mem: 31 8 21 0 1 22

Swap: 0 0 0

[root@node2 ~]# free -g

total used free shared buff/cache available

Mem: 31 11 18 0 1 19

Swap: 0 0 0

[root@node2 ~]#

  • 上面呢是可以正常释放的,现在我们释放掉占用的这10G

#容器ctrl+c即可释放

[root@pod2 /]# memload 10240

Attempting to allocate 10240 Mebibytes of resident memory…

Allocated 10000 pages

^C

[root@pod2 /]#

回到node2看是否已经被释放,然后再释放下缓存内存

[root@node2 ~]# free -g

total used free shared buff/cache available

Mem: 31 1 28 0 1 29

Swap: 0 0 0

[root@node2 ~]# echo 3 > /proc/sys/vm/drop_caches

[root@node2 ~]#

[root@node2 ~]# free -g

total used free shared buff/cache available

Mem: 31 1 29 0 0 29

Swap: 0 0 0

[root@node2 ~]#

  • 支持资源占用测试呢,就完了反正是没有限制的时候想弄多少弄多少

现在,我们吧这pod删了吧。

[root@pod2 /]# exit

exit

command terminated with exit code 130

[root@master sefe]# kubectl delete pod pod2

pod “pod2” deleted

[root@master sefe]#

yaml文件中限制【resource字段限制】


作用: 用来限制每个pod的资源

代码参数说明

  • 就不多累赘了,反正资源限制就是这个字面意思,应该很好理解,而这个也不过是实现限制的一种方式罢了,所以没有必要过于深究原理,直接说操作吧。

  • 我放一段代码吧,在代码中做参数说明应该更容易理解一点

为了看着方便,我删了其他自动内容,只保留resource部分

#没有资源限制的时候呢,是这样子的

resources: {}

#限制以后呢,{}没了,成下面样子了

#内存可以cpu都是可以选的,可以单独存在,也可以同时存在

resources:

requests: # —容器所在节点 资源的最小值

memory: “256Mi” #内存限制,单位是M【G的单位是Gi】

cpu: “500m” #cpu限制,单位是微核心【下面会单独对微核心做说明】

limits: # —容器消耗资源最大值

memory: “512Mi”#内存限制,单位是M【G的单位是Gi】

cpu: “1000m”#cpu限制,单位是微核心【下面会单独对微核心做说明】

  • 微核心说明:

在kubernetets系统上,1个单位的CPU相当于虚拟机上的一颗虚拟CPU(vCPU)或者物理机上的一个超线(HyperThread,或者称一个逻辑CPU),它支持分数计量方式,一个核心(1 core)相当于1000个微核心(millicores),因此500m相当于是0.5个核心,即二分之一个核心。

测试说明【内存】

最小值限制
  • 这个最小值呢存在一个逻辑问题,就是说如果设置的最小值大于了能部署的node节点内存,那么该pod就不会被创建成功,状态会一直处于pending状态

如,我现在的内存是32G,我现在指定最小内存100G创建pod试试

前面说过,这些限制是可以单独存在的,所以我这只限制最低内存

[root@master sefe]# cat pod2.yaml

apiVersion: v1

kind: Pod

metadata:

creationTimestamp: null

labels:

run: pod2

name: pod2

spec:

#nodeName: node2

#nodeSelector:

ccx_label: ccxhero

terminationGracePeriodSeconds: 0

containers:

  • image: hub.c.163.com/library/centos

command: [“sh”,“-c”,“sleep 1000000”]

imagePullPolicy: IfNotPresent

name: pod2

resources:

requests:

memory: 100Gi

dnsPolicy: ClusterFirst

restartPolicy: Always

status: {}

[root@master sefe]#

[root@master sefe]# kubectl apply -f pod2.yaml

pod/pod2 created

[root@master sefe]#

[root@master sefe]# kubectl get pods

NAME READY STATUS RESTARTS AGE

pod2 0/1 Pending 0 3s

[root@master sefe]#

[root@master sefe]# kubectl delete pod pod2

pod “pod2” deleted

[root@master sefe]#

最大值限制
  • 现在呢,我限制内存的最大值为5G,也就是说,该pod最多能使用5G内存

[root@master sefe]# cat pod2.yaml

apiVersion: v1

kind: Pod

metadata:

creationTimestamp: null

labels:

run: pod2

name: pod2

spec:

#nodeName: node2

#nodeSelector:

ccx_label: ccxhero

terminationGracePeriodSeconds: 0

containers:

  • image: hub.c.163.com/library/centos

command: [“sh”,“-c”,“sleep 1000000”]

imagePullPolicy: IfNotPresent

name: pod2

resources:

requests:

memory: 1Gi

cpu: 100m

limits:

memory: 5Gi

dnsPolicy: ClusterFirst

restartPolicy: Always

status: {}

[root@master sefe]# kubectl apply -f pod2.yaml

pod/pod2 created

[root@master sefe]# kubectl get pods

NAME READY STATUS RESTARTS AGE

pod2 0/1 ContainerCreating 0 3s

[root@master sefe]# kubectl get pods

NAME READY STATUS RESTARTS AGE

pod2 1/1 Running 0 5s

[root@master sefe]#

[root@master ~]# kubectl get pods -owide

NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES

pod2 1/1 Running 0 3m3s 10.244.104.19 node2

[root@master ~]#

  • 现在测试看是否真是这样

[root@master sefe]# kubectl cp memload-7.0-1.r29766.x86_64.rpm pod2:/opt

[root@master sefe]# kubectl exec -it pod2 – bash

[root@pod2 /]# rpm -ivh /opt/memload-7.0-1.r29766.x86_64.rpm

Preparing… ################################# [100%]

Updating / installing…

1:memload-7.0-1.r29766 ################################# [100%]

[root@pod2 /]#

先占用2G,没问题

[root@pod2 /]# memload 2048

Attempting to allocate 2048 Mebibytes of resident memory…

#node2也确实被占用了

[root@node2 ~]# free -g

total used free shared buff/cache available

Mem: 31 3 27 0 0 27

Swap: 0 0 0

[root@node2 ~]#

现在占用6G试试【会失败,因为最多只能占用5G】

#可以看到被killed了,占用失败,没问题

[root@pod2 /]# memload 6000

Attempting to allocate 6000 Mebibytes of resident memory…

Killed

[root@pod2 /]#

  • 正常区间的限制呢,我就不说了,根据实际大小来控制的话,是不会有意外的。

测试说明【cpu】【使用率计算】

  • 注意:内存和cpu限制规则和逻辑是完全一样,所以我就不对cpu单独说明了,有不会的看看上面内存方法吧

  • 需要注意的就是,占用cpu微核心数量的时候需要简单计算一下【计算微核心的逻辑呢,看完就懂了】

  • 因为cpu是微核心为单位,所以呢,我这说明一下为核心的计算吧

[root@master sefe]# lscpu| grep CPU

CPU op-mode(s): 32-bit, 64-bit

CPU(s): 16

On-line CPU(s) list: 0-15

CPU family: 6

Model name: Intel® Xeon® CPU E7-4820 v3 @ 1.90GHz

CPU MHz: 1895.436

NUMA node0 CPU(s): 0-15

[root@master sefe]#

[root@master sefe]# kubectl top nodes

W1106 16:48:46.634284 47766 top_node.go:119] Using json format to get metrics. Next release will switch to protocol-buffers, switch early by passing --use-protocol-buffers flag

NAME CPU(cores) CPU% MEMORY(bytes) MEMORY%

master 478m 2% 2048Mi 6%

node1 248m 1% 1265Mi 3%

node2 174m 1% 857Mi 2%

[root@master sefe]#

  • 以上面的master为例,总共是16颗cpu,那么总公就有16000m的微核心

所以使用率就是478/16000=0.0298,但是top呢是只显示整数的

LimitRange的方式限制


作用: 用来限制每个pod的资源

一个LimitRange资源对象可以提供的功能

  • 在一个命名空间中实施对每个 Pod 或 Container 最小和最大的资源使用量的限制。

  • 在一个命名空间中实施对每个 PersistentVolumeClaim 能申请的最小和最大的存储空间大小的限制。

  • 在一个命名空间中实施对一种资源的申请值和限制值的比值的控制。

  • 设置一个命名空间中对计算资源的默认申请/限制值,并且自动的在运行时注入到多个 Container 中。

LimitRange资源参数使用说明

  • (1) 在LimitRange中,Pod和Container都可以设置minmaxmaxLimitRequestRatio这三个参数

而Container还可以设置defaultRequestdefaultLimit这两个参数,而Pod不可以设置这两个参数。

  • Container下的参数解释【一般使用这个】

  • min是Pod中所有容器的Requests值的下限

  • max是Pod中所有容器的Limits值的上限

  • defaultRequest是Pod中所有未指定Requests值的容器的默认Requests值

  • defaultLimit是Pod中所有未指定Limits值的容器的默认Limits值

  • maxLimitRequestRatio 用于限定Pod中所有容器的Limits值与Requests值得比例上限

  • Pod下得参数解析

  • min 是Pod中所有容器的Requests值的总和下限

  • max 是Pod中所有容器得Limits值的总和上限

  • maxLimitRequestRatio 用于限定Pod中所有容器的Limits值总和与Requests值总和的比例上限

  • 再说一遍,创建的limit是对命名空间生效的【如果不指定ns,则默认当前的ns空间生效】,在创建limit的ns中,所有pod都会应用这个资源限制规则。

创建和查看Limit

  • 这个呢,实际上也就是一个yaml文件,格式如下,具体使用呢,可以根据上面的资源参数使用说明中套过来哈,我这只是做一些简单的说明罢了

#最基本的limit文件格式 如下【可以同时存在多样】

#具体怎么使用看需求吧,限制格式看上面资源使用说明

[root@master sefe]# cat limit.yaml

apiVersion: v1

kind: LimitRange

metadata:

name: mem-min-max-demo-lr

#namespace: ns1

spec:

limits:

  • max:

memory: 5Gi

min:

memory: 512Mi

type: Container

[root@master sefe]#

创建limit

[root@master sefe]# kubectl apply -f limit.yaml

limitrange/mem-min-max-demo-lr created

[root@master sefe]#

查看limit

[root@master sefe]# kubectl get -f limit.yaml

NAME CREATED AT

mem-min-max-demo-lr 2021-11-06T09:11:43Z

查看limit详情【另一种查看方式】

[root@master sefe]# kubectl describe limits mem-min-max-demo-lr

Name: mem-min-max-demo-lr

Namespace: safe

Type Resource Min Max Default Request Default Limit Max Limit/Request Ratio


Container memory 512Mi 5Gi 5Gi 5Gi -

[root@master sefe]#

测试说明【内存】

  • 这个因为是定义的规则,所以在当前命名空间中的所有pod都生效,所以就正儿八经的值测试最大值了,最小值如果大于node内存的话,创建pod的状态也会成pending。

[root@master sefe]# cat limit.yaml

apiVersion: v1

kind: LimitRange

metadata:

name: mem-min-max-demo-lr

#namespace: ns1

spec:

limits:

  • max:

memory: 5Gi

min:

memory: 512Mi

type: Container

[root@master sefe]#

[root@master sefe]# kubectl apply -f limit.yaml

limitrange/mem-min-max-demo-lr created

[root@master sefe]#

[root@master sefe]# kubectl get limitranges limit.yaml

Error from server (NotFound): limitranges “limit.yaml” not found

[root@master sefe]# kubectl get -f limit.yaml

NAME CREATED AT

mem-min-max-demo-lr 2021-11-06T09:11:43Z

[root@master sefe]# kubectl describe limits mem-min-max-demo-lr

Name: mem-min-max-demo-lr

Namespace: safe

Type Resource Min Max Default Request Default Limit Max Limit/Request Ratio


Container memory 512Mi 5Gi 5Gi 5Gi -

[root@master sefe]#

  • 如上,我创建了一个最大内存为5G的limit,现在测试是否生效

得从创建pod开始啊,因为定义了limit,所以呢就不需要resource了

[root@master sefe]# cat pod2.yaml

apiVersion: v1

kind: Pod

metadata:

creationTimestamp: null

labels:

run: pod2

name: pod2

spec:

#nodeName: node2

#nodeSelector:

ccx_label: ccxhero

terminationGracePeriodSeconds: 0

containers:

  • image: hub.c.163.com/library/centos

command: [“sh”,“-c”,“sleep 1000000”]

imagePullPolicy: IfNotPresent

name: pod2

resources: {}

resources:

requests:

memory: 1Gi

cpu: 100m

limits:

memory: 5Gi

dnsPolicy: ClusterFirst

restartPolicy: Always

status: {}

[root@master sefe]#

[root@master sefe]# kubectl apply -f pod2.yaml

pod/pod2 created

[root@master sefe]# kubectl get pods -o wide

NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES

pod2 1/1 Running 0 9s 10.244.104.43 node2

[root@master sefe]#

包准备

[root@master sefe]#

[root@master sefe]# kubectl cp memload-7.0-1.r29766.x86_64.rpm pod2:/opt

[root@master sefe]# kubectl exec -it pod2 – bash

[root@pod2 /]# rpm -ivh /opt/memload-7.0-1.r29766.x86_64.rpm

Preparing… ################################# [100%]

Updating / installing…

1:memload-7.0-1.r29766 ################################# [100%]

[root@pod2 /]#

[root@pod2 /]#

#现在限制3G试试,没问题

[root@pod2 /]# memload 3096

Attempting to allocate 3096 Mebibytes of resident memory…

#确实被占用3g

[root@node2 ~]# free -g

total used free shared buff/cache available

Mem: 31 4 26 0 0 26

Swap: 0 0 0

[root@node2 ~]#

现在现在6G试试,正常会报错【因为定义了最大值为5G】

#和预期一样,该方法限制资源没问题。

[root@pod2 /]# memload 6000

Attempting to allocate 6000 Mebibytes of resident memory…

Killed

[root@pod2 /]#

  • 好了,测试就到这吧,具体限制逻辑呢,可以根据自己需求来多做测试,不会有意外的。

测试说明【cpu】【使用率计算】

  • 注意:内存和cpu限制规则和逻辑是完全一样,所以我就不对cpu单独说明了,有不会的看看上面内存方法吧

  • 需要注意的就是,占用cpu微核心数量的时候需要简单计算一下【计算微核心的逻辑呢,看完就懂了】

  • 因为cpu是微核心为单位,所以呢,我这说明一下为核心的计算吧

[root@master sefe]# lscpu| grep CPU

CPU op-mode(s): 32-bit, 64-bit

CPU(s): 16

On-line CPU(s) list: 0-15

CPU family: 6

Model name: Intel® Xeon® CPU E7-4820 v3 @ 1.90GHz

CPU MHz: 1895.436

NUMA node0 CPU(s): 0-15

[root@master sefe]#

[root@master sefe]# kubectl top nodes

W1106 16:48:46.634284 47766 top_node.go:119] Using json format to get metrics. Next release will switch to protocol-buffers, switch early by passing --use-protocol-buffers flag

NAME CPU(cores) CPU% MEMORY(bytes) MEMORY%

master 478m 2% 2048Mi 6%

node1 248m 1% 1265Mi 3%

node2 174m 1% 857Mi 2%

[root@master sefe]#

  • 以上面的master为例,总共是16颗cpu,那么总公就有16000m的微核心

所以使用率就是478/16000=0.0298,但是top呢是只显示整数的

写在最后

在结束之际,我想重申的是,学习并非如攀登险峻高峰,而是如滴水穿石般的持久累积。尤其当我们步入工作岗位之后,持之以恒的学习变得愈发不易,如同在茫茫大海中独自划舟,稍有松懈便可能被巨浪吞噬。然而,对于我们程序员而言,学习是生存之本,是我们在激烈市场竞争中立于不败之地的关键。一旦停止学习,我们便如同逆水行舟,不进则退,终将被时代的洪流所淘汰。因此,不断汲取新知识,不仅是对自己的提升,更是对自己的一份珍贵投资。让我们不断磨砺自己,与时代共同进步,书写属于我们的辉煌篇章。

需要完整版PDF学习资源私我

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化资料的朋友,可以点击这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 10
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值