K8s(资源管理,namespace,Pod)
介紹
在kubernetes中,所有的內容都抽象為資源,用戶需要通過操作資源來管理kubernetes。
kubernetes的本質上就是一個集群系統,用戶可以在集群中部署各種服務,所謂的部署服務,其實就是在kubernetes集群中運行一個個的容器,并將指定的程序跑在容器中。
kubernetes的最小管理單元是pod而不是容器,所以只能將容器放在Pod中,而kubernetes一般也不會直接管理Pod,而是通過Pod控制器來管理Pod的。
Pod可以提供服務之后,就要考慮如何訪問Pod中服務,kubernetes提供了Service資源實現這個功能。
當然,如果Pod中程序的數據需要持久化,kubernetes還提供了各種存儲系統。
YAML語言介紹
YAML是一個類似 XML、JSON 的標記性語言。它強調以數據為中心,并不是以標識語言為重點。因而YAML本身的定義比較簡單,號稱"一種人性化的數據格式語言"。
<xiaowang><age>21</age><address>Beijing</address> </heima> xiaowang:age: 21address: BeijingYAML的語法比較簡單,主要有下面幾個:
- 大小寫敏感
- 使用縮進表示層級關系
- 縮進不允許使用tab,只允許空格( 低版本限制 )
- 縮進的空格數不重要,只要相同層級的元素左對齊即可
- '#'表示注釋
YAML支持以下幾種數據類型:
- 純量:單個的、不可再分的值
- 對象:鍵值對的集合,又稱為映射(mapping)/ 哈希(hash) / 字典(dictionary)
- 數組:一組按次序排列的值,又稱為序列(sequence) / 列表(list)
k8s資源管理的方式
- 命令式對象管理:直接使用命令去操作kubernetes資源
- 命令式對象配置:通過命令配置和配置文件去操作kubernetes資源
- 聲明式對象配置:通過apply命令和配置文件去操作kubernetes資源(支持對一個目錄下的所有文件yaml文件進行操作)
k8s的資源類型
kubernetes中所有的內容都抽象為資源,可以通過下面的命令進行查看:
kubectl api-resources
| 集群級別資源 | nodes | no | 集群組成部分 |
| namespaces | ns | 隔離Pod | |
| pod資源 | pods | po | 裝載容器 |
| pod資源控制器 | replicationcontrollers | rc | 控制pod資源 |
| replicasets | rs | 控制pod資源 | |
| deployments | deploy | 控制pod資源 | |
| daemonsets | ds | 控制pod資源 | |
| jobs | 控制pod資源 | ||
| cronjobs | cj | 控制pod資源 | |
| horizontalpodautoscalers | hpa | 控制pod資源 | |
| statefulsets | sts | 控制pod資源 | |
| 服務發現資源 | services | svc | 統一pod對外接口 |
| ingress | ing | 統一pod對外接口 | |
| 存儲資源 | volumeattachments | 存儲 | |
| persistentvolumes | pv | 存儲 | |
| persistentvolumeclaims | pvc | 存儲 | |
| 配置資源 | configmaps | cm | 配置 |
| secrets | 配置 |
經常使用的操作有下面這些:
- 創建一個namespace
- 獲取namespace
- 在此namespace下創建并運行一個nginx的Pod
- 查看新創建的pod
- 刪除指定的pod
- 刪除指定的namespace
命令式對象配置(yaml文件格式)
- 創建一個pod-nginx.yaml
- 執行create命令,創建資源:
- 執行get命令,查看資源
- 執行delete命令,刪除資源
namespace
Namespace是kubernetes系統中的一種非常重要資源,它的主要作用是用來實現多套環境的資源隔離或者多租戶的資源隔離。
默認情況下,kubernetes集群中的所有的Pod都是可以相互訪問的。但是在實際中,可能不想讓兩個Pod之間進行互相的訪問,那此時就可以將兩個Pod劃分到不同的namespace下。kubernetes通過將集群內部的資源分配到不同的Namespace中,可以形成邏輯上的"組",以方便不同的組的資源進行隔離使用和管理。
可以通過kubernetes的授權機制,將不同的namespace交給不同租戶進行管理,這樣就實現了多租戶的資源隔離。此時還能結合kubernetes的資源配額機制,限定不同租戶能占用的資源,例如CPU使用量、內存使用量等等,來實現租戶可用資源的管理。
- 集群啟動之后,會默認創建幾個namespace
- 查看所有的namespace
- 查看指定的namespace
- 指定輸出格式
kubernetes支持的格式有很多,比較常見的是wide、json、yaml
命令:kubectl get ns ns名稱 -o 格式參數
- 查看namespace詳情
- 創建一個namespace
- 刪除一個namespace
- yaml文件配置
Pod
Pod是kubernetes集群進行管理的最小單元,程序要運行必須部署在容器中,而容器必須存在于Pod中。
Pod可以認為是容器的封裝,一個Pod中可以存在一個或者多個容器。
kubernetes在集群啟動之后,集群中的各個組件也都是以Pod方式運行的!
[root@master ~]# kubectl get pod -n kube-system NAME READY STATUS RESTARTS AGE coredns-9d85f5447-tfs4f 0/1 Running 1 13h coredns-9d85f5447-zzvn2 0/1 Running 1 13h etcd-master 1/1 Running 2 13h kube-apiserver-master 1/1 Running 2 13h kube-controller-manager-master 1/1 Running 2 13h kube-flannel-ds-94qzl 1/1 Running 1 13h kube-flannel-ds-cv6nz 1/1 Running 1 13h kube-flannel-ds-l9l9t 1/1 Running 1 13h kube-proxy-hmlgc 1/1 Running 1 13h kube-proxy-v2mck 1/1 Running 2 13h kube-proxy-zp2g5 1/1 Running 1 13h kube-scheduler-master 1/1 Running 2 13h創建并運行pod
命令格式: kubectl run (pod控制器名稱) [參數]
# --image 指定Pod的鏡像 # --port 指定端口 # --namespace 指定namespace [root@master ~]# kubectl run nginx --image=nginx:latest --port=80 --namespace dev kubectl run --generator=deployment/apps.v1 is DEPRECATED and will be removed in a future version. Use kubectl run --generator=run-pod/v1 or kubectl create instead. deployment.apps/nginx created查看pod信息
# 查看pod的基本信息 [root@master ~]# kubectl get pods -n dev NAME READY STATUS RESTARTS AGE nginx-dd6b5d745-ggw95 1/1 Running 0 47s [root@master ~]# kubectl get pods -n dev -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES nginx-dd6b5d745-ggw95 1/1 Running 0 63s 10.20.1.7 node01 <none> <none> ## 查看Pod的詳細信息 [root@master ~]# kubectl describe pods -n dev Name: nginx-dd6b5d745-ggw95 Namespace: dev Priority: 0 Node: node01/192.168.0.18 Start Time: Mon, 09 May 2022 13:05:04 +0800 Labels: pod-template-hash=dd6b5d745run=nginx Annotations: <none> Status: Running IP: 10.20.1.7 IPs:IP: 10.20.1.7 Controlled By: ReplicaSet/nginx-dd6b5d745 Containers:nginx:Container ID: docker://f9f03c480229a7f5b715d69758cd420ab9c8853f5dd9004cad0c7c25d81d319dImage: nginx:latestImage ID: docker-pullable://nginx@sha256:0d17b565c37bcbd895e9d92315a05c1c3c9a29f762b011a10c54a66cd53c9b31Port: 80/TCPHost Port: 0/TCPState: RunningStarted: Mon, 09 May 2022 13:05:06 +0800Ready: TrueRestart Count: 0Environment: <none>Mounts:/var/run/secrets/kubernetes.io/serviceaccount from default-token-m6twv (ro) Conditions:Type StatusInitialized TrueReady TrueContainersReady TruePodScheduled True Volumes:default-token-m6twv:Type: Secret (a volume populated by a Secret)SecretName: default-token-m6twvOptional: false QoS Class: BestEffort Node-Selectors: <none> Tolerations: node.kubernetes.io/not-ready:NoExecute for 300snode.kubernetes.io/unreachable:NoExecute for 300s Events:Type Reason Age From Message---- ------ ---- ---- -------Normal Scheduled 73s default-scheduler Successfully assigned dev/nginx-dd6b5d745-ggw95 to node01Normal Pulling 72s kubelet, node01 Pulling image "nginx:latest"Normal Pulled 71s kubelet, node01 Successfully pulled image "nginx:latest"Normal Created 71s kubelet, node01 Created container nginxNormal Started 71s kubelet, node01 Started container nginx訪問Pod
[root@master ~]# curl http://10.20.1.7:80 <!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> <style> html { color-scheme: light dark; } body { width: 35em; margin: 0 auto; font-family: Tahoma, Verdana, Arial, sans-serif; } </style> </head> <body> <h1>Welcome to nginx!</h1> <p>If you see this page, the nginx web server is successfully installed and working. Further configuration is required.</p><p>For online documentation and support please refer to <a href="http://nginx.org/">nginx.org</a>.<br/> Commercial support is available at <a href="http://nginx.com/">nginx.com</a>.</p><p><em>Thank you for using nginx.</em></p> </body> </html>刪除指定Pod
# 刪除指定的Pod [root@master ~]# kubectl delete pods nginx-dd6b5d745-ggw95 -n dev pod "nginx-dd6b5d745-ggw95" deleted# 此時,顯示刪除Pod成功,但是再查詢,發現又新產生了一個 [root@master ~]# kubectl get pods -n dev NAME READY STATUS RESTARTS AGE nginx-dd6b5d745-lm4t5 1/1 Running 0 58s這是因為當前Pod是由Pod控制器創建的,控制器會監控Pod狀況,一旦發現Pod死亡,會立即重建!此時要想刪除Pod,必須刪除Pod控制器
# 先來查詢一下當前namespace下的Pod控制器 [root@master ~]# kubectl get deploy -n dev NAME READY UP-TO-DATE AVAILABLE AGE nginx 1/1 1 1 7m31s # 刪除此PodPod控制器 [root@master ~]# kubectl delete deploy nginx -n dev deployment.apps "nginx" deleted # 查詢Pod,發現Pod被刪除了 [root@master ~]# kubectl get pods -n dev No resources found in dev namespace.yaml配置操作
創建一個pod-nginx.yaml文件,
apiVersion: v1 kind: Pod metadata:name: nginxnamespace: dev spec:containers:- image: nginx:latestname: podports:- name: nginx-portcontainerPort: 80protocol: TCP- 執行命令
總結
以上是生活随笔為你收集整理的K8s(资源管理,namespace,Pod)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Unity绿背景抠图插件
- 下一篇: 来自腾讯相当好的文章:研发效能度量实践指