Namespace --- 集群的共享與隔離
語言中namespace概念
-
namespace核心作用隔離
以上是隔離的代碼。namespace隔離的是:
- 1.資源對象的隔離:Service、Deployment、Pod
- 2.資源配額的隔離:Cpu、Memory
創建命名空間
kubectl create namespace dev apiVersion: v1 kind: Namespace metadata: name: dev
kubectl create -f namespace.yaml
kubectl get all -n dev
yaml文件中指定namespace

apiVersion: apps/v1 kind: Deployment metadata: name: web-demo-new namespace: dev spec: selector: matchLabels: app: web-demo replicas: 1 template: metadata: labels: app: web-demo spec: containers: - name: web-demo image: 172.17.166.217/kubenetes/k8s-web-demo:2021070520 ports: - containerPort: 8080 --- #service apiVersion: v1 kind: Service metadata: name: web-demo namespace: dev spec: ports: - port: 80 protocol: TCP targetPort: 8080 selector: app: web-demo type: ClusterIP --- #ingress apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: web-demo namespace: dev spec: rules: - host: www.csweb.com http: paths: - pathType: Prefix path: / backend: service: name: web-demo port: number: 80
####在metadata中指定namespace
不同命名空間下的service-ip是可以互相訪問的,與命名空間無關。
不同命名空間下的pod名稱與dns是訪問不到的。pod-ip是不隔離的。
切換默認namespace
kubectl config set-context ctx-dev \ --cluster=kubernetes \ --user=admin \ --namespace=dev \ --kubeconfig=/root/.kube/config 設置上下文 區分權限的話重新創建user並賦予對應權限 kubectl config set-context ctx-dev --kubeconfig=/root/.kube/config 設置當前默認上下文
-
划分Namespace方式
- 1.按照環境划分:dev、test
- 2.按照團隊來划分
- 3.自定義多級划分 #安裝-划線名稱作用等划分
Resources---多維度集群資源管理
-
限制namespace下資源
- 1.內存
- 2.cpu
- 3.gpu
- 4.持久化存儲
kubelet會收集node硬件信息等上報給apiserver。
-
Resources核心設計
- 1.Requests(請求)
- 2.Limits(限制)
requests是希望容器被容器分配到的資源,可以完全保證的資源。scheduler會使用這個值來計算,從而得到最優節點。scheduler調度是不考慮limits的。
limits是容器使用的資源上限,當整個節點資源不足時,發生競爭會參考這個值從而做出進一步的決策。把某些pod驅逐。
deployment中對於pod限制

apiVersion: apps/v1 kind: Deployment metadata: name: web-demo namespace: dev spec: selector: matchLabels: app: web-demo replicas: 4 template: metadata: labels: app: web-demo spec: containers: - name: web-demo image: 172.17.166.217/kubenetes/web:v1 ports: - containerPort: 8080 resources: requests: memory: 500Mi cpu: 100m limits: memory: 1000Mi cpu: 200m
#內存單位為Mi/Gi cpu為m/個數 1核心cpu=1000m
查看node節點中資源使用情況
kubectl describe nodes node-3-172.17.166.219
對應傳輸給docker的值,查看容器詳細信息
docker inspect 容器id
CpuShares=requests中cpu的值 會先把requests中定義的cpu值轉化為核數,然后乘以1024。等於其cpu權重。
Memory=requests中memory的值 會將memory定義的值*1024*1024轉化為內存字節。
CpuQuota=limits中cpu的值,單位是minico需要*10萬。CpuPeriod是docker中默認值10萬納秒,100毫秒。一起使用表示在100毫秒中最多分配的cpu量。
測試內存資源限制,進入容器編寫腳本
#!/bin/bash str="[sdfsofajpfjpfsajfs]" while true; do str="$str$str" echo "+++++" sleep 0.1 done
###當資源耗盡(cpu/memory),會將容器中資源占用最多的進程殺掉。並不會殺掉容器。
測試cpu限制
查看cpu使用情況
crictl stats d5c1df6d1561e
kubectl top命令需要第三方api metrics-server支持,可參考https://blog.csdn.net/wangmiaoyan/article/details/102868728
進入容器模擬cpu占用
dd if=/dev/zero of=/dev/null &執行多次就會占用光cpu
###cpu占滿后與內存不同的是進程不會殺掉,cpu是可壓縮資源,內存不是。
設置pod container默認限制

apiVersion: v1 kind: LimitRange #范圍的限制 metadata: name: test-limits #策略名稱 spec: limits: - max: cpu: 4000m #最大cpu memory: 2Gi #最大內存 min: cpu: 100m #最小cpu memory: 100Mi #最小內存 maxLimitRequestRatio: cpu: 3 #cpu中limits最大比requests的倍數 memory: 2 #memory中limits最大比requests的倍數 type: Pod #類型pod - default: cpu: 300m #默認cpu memory: 200Mi #默認memory defaultRequest: cpu: 200m #默認requestcpu memory: 100Mi #默認request memory max: cpu: 2000m #最大值 memory: 1Gi min: cpu: 100m #最小值 memory: 100Mi maxLimitRequestRatio: cpu: 5 #limit最多比request比例的倍數 memory: 4 type: Container #類型container
查看命名空間下資源限制
kubectl describe limitranges --all-namespaces
namespace資源限制
資源限制
apiVersion: v1 kind: ResourceQuota #資源配額 metadata: name: resource-quota namespace: wanger spec: hard: pods: 4 #最多允許pod個數 requests.cpu: 2000m requests.memory: 4Gi limits.cpu: 4000m limits.memory: 8Gi
apiVersion: v1 kind: ResourceQuota metadata: name: object-counts spec: hard: configmaps: 10 #最多允許configmap persistentvolumeclaims: 4 #最多允許pvc replicationcontrollers: 20 #最多允許有replicat secrets: 10 #最多允許secret services: 10 #最多允許service
查看quota設置
kubectl get quota -n test kubectl describe -n wanger quota
pod驅逐策略-Eviction
-
pod容器資源策略優先級
- requests == limits時優先級最高(絕對可靠)
- 不設置 (最為不可靠)
- limits > requests 優先級次之(相對可靠)
kubelet啟動常用驅逐策略配置:
###當node內存小於1.5G持續1m30秒進行pod驅逐,如果node內存小於100M磁盤小於1G剩余inodes節點小於百分之五立刻進行驅逐。
kubelet配置驅逐策略:
kubelet --eviction-hard=imagefs.available<10%,memory.available<500Mi,nodefs.available<5%,nodefs.inodesFree<5% --eviction-soft=imagefs.available<30%,nodefs.available<10% --eviction-soft-grace-period=imagefs.available=2m,nodefs.available=2m --eviction-max-pod-grace-period=600
#或者啟動文件中配置
磁盤緊缺驅逐優先級
- 刪除死掉的pod、容器
- 刪除沒用的鏡像
- 按資源優先級、資源占用情況進行驅逐 ###如同一優先級下先驅逐占用資源多的
內存驅逐策略
- 驅逐不可靠的pod #按照資源占用情況驅逐
- 驅逐基本可靠的pod #limit大於request的pod limit比request占用值越大越先驅逐
- 驅逐可靠pod #按照資源占用
label小標簽大作用
label本質是key=value鍵值對,可以貼到任意資源中。
deployment通過標簽選擇pod
apiVersion: apps/v1 kind: Deployment metadata: name: web-demo namespace: dev spec: selector: matchLabels: app: web-demo #選擇pod label app=web-demo replicas: 1 template: metadata: labels: app: web-demo #定義pod label app=web-demo spec: containers: - name: web-demo image: hub.mooc.com/kubernetes/web:v1 ports: - containerPort: 8080 --- #service apiVersion: v1 kind: Service metadata: name: web-demo namespace: dev spec: ports: - port: 80 protocol: TCP targetPort: 8080 selector: app: web-demo #service 選擇pod label app=web-demo type: ClusterIP
###1.6版本之前在pod之上還有rc概念,即replicas副本控制器。deployment將rc封裝,deployment本質是操作副本控制器。selector與pod名稱需一致,rc去調用pod。deployment label是可變的,多個同樣名稱的rc和pod是不沖突的,屬於不同的deployment
pod通過group標簽rc選中group
apiVersion: apps/v1 kind: Deployment metadata: name: web-demo namespace: dev spec: selector: matchLabels: app: web-demo matchExpressions: - {key: group, operator: In, values: [dev, test]}#定義選擇組 replicas: 1 template: metadata: labels: group: dev #pod打上組標簽 app: web-demo spec: containers: - name: web-demo image: hub.mooc.com/kubernetes/web:v1 ports: - containerPort: 8080
###校驗pod是否是deployment需要的。
查看是否創建成功
kubectl get pods -l app=web-demo -n dev kubectl get pods -l group=dev -n dev kubectl get pods -l app=web-demo group=dev -n dev kubectl get pods -l 'group in (dev, test)' -n dev
kubectl get pods -l 'group notin (dev, test) -n dev'
container通過標簽選擇node

apiVersion: apps/v1 kind: Deployment metadata: name: web-demo namespace: dev spec: selector: matchLabels: app: web-demo matchExpressions: - {key: group, operator: In, values: [dev, test]} replicas: 1 template: metadata: labels: group: dev app: web-demo spec: containers: - name: web-demo image: hub.mooc.com/kubernetes/web:v1 ports: - containerPort: 8080 nodeSelector: disktype: ssd
給node打上標簽
kubectl label node node-3-172.17.166.219 disktype=ssd kubectl get nodes node-3-172.17.166.219 --show-labels