1.集群管理命令:
? a.如何管理集群?
-kubectl是用于控制Kubernetes集群的命令行工具
b.語法格式:
-kubectl [command]? [TYPE]? ? ?[NAME]? ? [flages]
command:子命令,如create、get、descrbe、delete
type:資源類型,可以表示為單數,復數或縮寫形式
name:資源的總稱,如果忽略,則顯示所有資源信息
flages:指定可選標志,或附加的參數
2.管理主機授權
a.為其他主機添加管理權限
-安裝集群管理工具kubectl:eg:
b.拷貝證書到目標主機
-證書默認路徑:$ [HOME]/.kube/config
K8s集群管理案例:
信息查詢命令
子命令 說明
help 用于查看命令及子命令的幫助信息
cluster-info 顯示集群的相關配置信息
api-resources 查看當前服務器上所有的資源對象
api-versions 查看當前服務器上所有資源對象的版本
config 管理當前節點上的認證信息
命令示例
help# 查看幫助命令信息
[root@master ~]# kubectl help version
Print the client and server version information for the current context.Examples:# Print the client and server versions for the current contextkubectl version
... ...
cluster-info# 查看集群狀態信息
[root@master ~]# kubectl cluster-info
Kubernetes control plane is running at https://192.168.88.50:6443
CoreDNS is running at https://192.168.88.50:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
... ...
api-resources# 查看資源對象類型
[root@master ~]# kubectl api-resources
NAME SHORTNAMES APIVERSION NAMESPACED KIND
bindings v1 true Binding
endpoints ep v1 true Endpoints
events ev v1 true Event
... ...
api-versions# 查看資源對象版本
[root@master ~]# kubectl api-versions
admissionregistration.k8s.io/v1
apiextensions.k8s.io/v1
apiregistration.k8s.io/v1
apps/v1
... ...
config# 查看當前認證使用的用戶及證書
[root@master ~]# kubectl config get-contexts
CURRENT NAME CLUSTER AUTHINFO
* kubernetes-admin@kubernetes kubernetes kubernetes-admin
# 使用 view 查看詳細配置
[root@master ~]# kubectl config view
apiVersion: v1
clusters:
- cluster:certificate-authority-data: DATA+OMITTEDserver: https://192.168.88.50:6443name: kubernetes
contexts:
- context:cluster: kubernetesuser: kubernetes-adminname: kubernetes-admin@kubernetes
current-context: kubernetes-admin@kubernetes
kind: Config
preferences: {}
users:
- name: kubernetes-adminuser:client-certificate-data: REDACTEDclient-key-data: REDACTED
集群管理授權
[root@harbor ~]# vim /etc/hosts
192.168.88.240 harbor
192.168.88.50 master
192.168.88.51 node-0001
192.168.88.52 node-0002
192.168.88.53 node-0003[root@harbor ~]# dnf makecache
[root@harbor ~]# dnf install -y kubectl
[root@harbor ~]# mkdir -p $HOME/.kube
[root@harbor ~]# rsync -av master:/etc/kubernetes/admin.conf $HOME/.kube/config
[root@harbor ~]# chown $(id -u):$(id -g) $HOME/.kube/config
[root@harbor ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master Ready control-plane 24h v1.29.2
node-0001 Ready <none> 22h v1.29.2
node-0002 Ready <none> 22h v1.29.2
node-0003 Ready <none> 22h v1.29.2
3.資源對象概述
a.什么是資源對象?
-K8s中把可以創建或配置的應用和服務稱為資源對象
-我們在集群中創建的Pod、負載均衡、存儲、網絡服務等等都是資源對象
b.如何創建資源對象?
-簡單資源對象可以使用“kubectl”直接創建
-高級資源對象需要使用“資源清單文件”創建
c.上傳鏡像到harbor倉庫
d.使用run創建一個Pod資源對象
格式:kubectl run <pod名稱>? ?[選項/參數]? ? ?---image? ? <鏡像:標簽>
Pod管理案例:
Pod 管理
創建 Pod
上傳鏡像到 harbor 倉庫
rsync -av public/myos.tar.xz 192.168.88.50:/root/
# 導入鏡像
[root@master ~]# docker load -i myos.tar.xz
# 上傳鏡像到 library 項目
[root@master ~]# docker images|while read i t _;do[[ "${t}" == "TAG" ]] && continue[[ "${i}" =~ ^"harbor:443/".+ ]] && continuedocker tag ${i}:${t} harbor:443/library/${i##*/}:${t}docker push harbor:443/library/${i##*/}:${t}docker rmi ${i}:${t} harbor:443/library/${i##*/}:${t}
done
創建 Pod
# 創建 Pod 資源對象
[root@master ~]# kubectl run myweb --image=myos:httpd
pod/myweb created# 查詢資源對象
[root@master ~]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE
myweb 1/1 Running 0 3s 10.244.1.3 node-0001# 訪問驗證
[root@master ~]# curl http://10.244.1.3
Welcome to The Apache.
4.Pod概述
a.什么是Pod?
-Pod就像是豌豆莢一樣,它由一個或者多個容器組成
-Pod是一個服務的多個進程的聚合單位
-Pod是Kubernetes中最小的管理元素
-Pod會自動維護在其中運行的容器
-Pod具有原子性、一致性特點
-同一個Pod共享網絡與卷
Pod創建過程:
b.Pod狀態
-Pod的status字段是一個PodStatus的對象,Pod對象總是應該處于其生命進程中以下幾個相位(phase)之一.
5.Pod管理命令
a.系統中的核心服務都是運行在Pod中
-核心管理命令
續Pod管理命令:常用參數
-參數[ -o name]只顯示名字
-參數[-o? wide]顯示更加的詳細信息
-參數[-o? yaml/json] 以Yaml/json格式顯示資源對象.
b.系統命名空間
-default 默認的命名空間,不聲明命名空間的Pod都在這
-Kube-node-lease 為高可用提供心跳監視的命名空間
-Kube-public公共數據,所有用戶都可以讀取它
-Kube-system系統服務對象所使用的命名空間
c.K8s系統核心服務都運行在Kube-system名稱空間中
d.Kubectl create 語法格式
Kubectl create <資源對象>? ?[選項/參數]
e.Kubectl run 語法格式
kubectl run pod名稱 [選項/參數]
f.kubectl describe 語法格式
kubectl describe? 資源類型 [資源名稱]? ?[選項/參數]
-Events下是事務日志,常用于排錯
g.kubectl logs 語法格式
kubectl logs pod名稱? ?[選項/參數]
6.Pod排錯
a.排錯三兄弟
-K8s的系統管理和排錯一直都是難點和重點,在實際工作中排查問題、解決問題是我們必須要掌握的技能之一。
kubectl get
kubectl describe
kubectl logs
案例:
get# 查看 Pod 資源對象
[root@master ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
myweb 1/1 Running 0 10m# 只查看資源對象的名字
[root@master ~]# kubectl get pods -o name
pod/myweb# 查看資源對象運行節點的信息
[root@master ~]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE
myweb 1/1 Running 0 10m 10.244.1.3 node-0001# 查看資源對象詳細信息,Yaml/Json 格式
[root@master ~]# kubectl get pod myweb -o yaml
apiVersion: v1
kind: Pod
metadata:name: myweb
... ...# 查看名稱空間
[root@master ~]# kubectl get namespaces
NAME STATUS AGE
default Active 39h
kube-node-lease Active 39h
kube-public Active 39h
kube-system Active 39h# 查看名稱空間中的 Pod 信息
[root@master ~]# kubectl -n kube-system get pods
NAME READY STATUS RESTARTS AGE
etcd-master 1/1 Running 0 39h
kube-apiserver-master 1/1 Running 0 39h
kube-controller-manager-master 1/1 Running 0 39h
kube-scheduler-master 1/1 Running 0 39h
... ...
create# 創建名稱空間資源對象
[root@master ~]# kubectl create namespace work
namespace/work created# 查看名稱空間
[root@master ~]# kubectl get namespaces
NAME STATUS AGE
default Active 39h
kube-node-lease Active 39h
kube-public Active 39h
kube-system Active 39h
work Active 11s
run# 在 work 名稱空間創建 Pod
[root@master ~]# kubectl -n work run myhttp --image=myos:httpd
pod/myhttp created# 查詢資源對象
[root@master ~]# kubectl -n work get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE
myhttp 1/1 Running 0 3s 10.244.2.2 node-0002# 訪問驗證
[root@master ~]# curl http://10.244.2.2
Welcome to The Apache.
describe# 查看資源對象的配置信息
[root@master ~]# kubectl -n work describe pod myhttp
Name: myhttp
Namespace: work
Priority: 0
Service Account: default
Node: node-0002/192.168.88.52
... ...
Events:Type Reason Age From Message---- ------ ---- ---- -------Normal Scheduled 7s default-scheduler Successfully assigned work/myhttp to node-0002Normal Pulling 6s kubelet Pulling image "myos:httpd"Normal Pulled 2s kubelet Successfully pulled image "myos:httpd" in 4.495s (4.495s including waiting)Normal Created 2s kubelet Created container myhttpNormal Started 2s kubelet Started container myhttp# 查看 work 名稱空間的配置信息
[root@master ~]# kubectl describe namespaces work
Name: work
Labels: kubernetes.io/metadata.name=work
Annotations: <none>
Status: ActiveNo resource quota.No LimitRange resource.
logs# 查看容器日志
[root@master ~]# kubectl -n work logs myhttp
[root@master ~]#
[root@master ~]# kubectl -n default logs myweb
2022/11/12 18:28:54 [error] 7#0: *2 open() "... ..." failed (2: No such file or directory), ......
b.Pod管理命令(續)
管理命令:
--kubectl exec 在容器內執行命令
kubectl exec [選項/參數]? Pod名稱 ---操作命令
-常用參數 -it分配交互式終端
--kubectl cp拷貝文件/目錄
kubectl cp? [選項/參數] 原文件? ?目標文件
-路徑格式? [Pod名稱:絕對路徑]
--kubectl delete語法格式
-集群中所有資源均可使用delete命令刪除
kubectl delete? [選項/參數]? 資源類型 資源名稱
總結:
子命令 | 說明 | 備注 |
---|---|---|
exec | 在某一個容器內執行特定的命令 | 可選參數: -c 容器名稱 |
cp | 在容器和宿主機之間拷貝文件或目錄 | 可選參數: -c 容器名稱 |
delete | 刪除資源對象 | 可選參數: -l 標簽 |
案例:
exec# 在容器內執行命令
[root@master ~]# kubectl exec -it myweb -- ls
index.html info.php[root@master ~]# kubectl exec -it myweb -- bash
[root@myweb html]# ifconfig eth0
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1450inet 10.244.1.3 netmask 255.255.255.0 broadcast 10.244.2.255ether 3a:32:78:59:ed:25 txqueuelen 0 (Ethernet)
... ...
cp# 與容器進行文件或目錄傳輸
[root@master ~]# kubectl cp myweb:/etc/yum.repos.d /root/aaa
tar: Removing leading `/' from member names
[root@master ~]# tree /root/aaa
/root/aaa
├── local.repo
├── Rocky-AppStream.repo
├── Rocky-BaseOS.repo
└── Rocky-Extras.repo0 directories, 4 files
[root@master ~]# kubectl -n work cp /etc/passwd myhttp:/root/mima
[root@master ~]# kubectl -n work exec -it myhttp -- ls /root/
mima
delete# 刪除資源對象
[root@master ~]# kubectl delete pods myweb
pod "myweb" deleted# 刪除 work 名稱空間下所有 Pod 對象
[root@master ~]# kubectl -n work delete pods --all
pod "myhttp" deleted# 刪除名稱空間
[root@master ~]# kubectl delete namespaces work
namespace "work" deleted
7.資源監控組件
a.資源指標概述
資源指標有什么用?
在安裝部署程序之后,必須要了解應用程序在部署后的性能以及資源使用情況。你可以通過檢測 P?od 容器或節點來了解整個集群的情況。
如何監控資源指標?
Kubernetes 的 Metrics-server 組件提供有關節點和 Pod 的資源使用情況的信息,包括 CPU 和內存的指標。如果將 Metrics-server 部署到集群中,就可以查詢并使用到這些信息管理應用及服務。b.Metrics-server 是什么?
Metrics-Server 是集群核心監控數據的聚合器。通俗地說,它存儲了集群中各節點和 Pod 的監控數據,并且提供了API以供查詢和使用。Metrics-Server 通過 kubelet 獲取 node 和 Pod 的 CPU、內存等監控數據。為調度器、彈性控制器、以及 Dashboard 等UI組件提供數據來源。
c.Matrics-server組件安裝
-安裝Metrics-server條件:
--必須啟用聚合服務或使用kube-proxy代理轉發
--節點必須啟用身份驗證和授權
--證書需要由集群證書頒發機構簽名
----簽發引導令牌
案例:資源監控組件
資源監控組件
配置授權令牌
[root@master ~]# echo 'serverTLSBootstrap: true' >>/var/lib/kubelet/config.yaml
[root@master ~]# systemctl restart kubelet
[root@master ~]# kubectl get certificatesigningrequests
NAME AGE SIGNERNAME REQUESTOR REQUESTEDDURATION CONDITION
csr-2hg42 14s kubernetes.io/kubelet-serving system:node:master <none> Pending
[root@master ~]# kubectl certificate approve csr-2hg42
certificatesigningrequest.certificates.k8s.io/csr-2hg42 approved
[root@master ~]# kubectl get certificatesigningrequests
NAME AGE SIGNERNAME REQUESTOR REQUESTEDDURATION CONDITION
csr-2hg42 28s kubernetes.io/kubelet-serving system:node:master <none> Approved,Issued
安裝插件 metrics
# 上傳鏡像到私有倉庫
[root@master ~]# cd plugins/metrics
[root@master metrics]# docker load -i metrics-server.tar.xz
[root@master metrics]# docker images|while read i t _;do[[ "${t}" == "TAG" ]] && continue[[ "${i}" =~ ^"harbor:443/".+ ]] && continuedocker tag ${i}:${t} harbor:443/plugins/${i##*/}:${t}docker push harbor:443/plugins/${i##*/}:${t}docker rmi ${i}:${t} harbor:443/plugins/${i##*/}:${t}
done# 使用資源對象文件創建服務
[root@master metrics]# sed -ri 's,^(\s*image: )(.*/)?(.+),\1harbor:443/plugins/\3,' components.yaml
140: image: registry.k8s.io/metrics-server/metrics-server:v0.6.4
[root@master metrics]# kubectl apply -f components.yaml# 驗證插件 Pod 狀態
[root@master metrics]# kubectl -n kube-system get pods
NAME READY STATUS RESTARTS AGE
metrics-server-ddb449849-c6lkc 1/1 Running 0 64s
證書簽發
# 查看節點資源指標
[root@master metrics]# kubectl top nodes
NAME CPU(cores) CPU% MEMORY(bytes) MEMORY%
master 99m 4% 1005Mi 27%
node-0001 <unknown> <unknown> <unknown> <unknown>
node-0002 <unknown> <unknown> <unknown> <unknown>
node-0003 <unknown> <unknown> <unknown> <unknown>#--------------- 在所有計算節點配置證書 -----------------
[root@node ~]# echo 'serverTLSBootstrap: true' >>/var/lib/kubelet/config.yaml
[root@node ~]# systemctl restart kubelet#--------------- 在 master 簽發證書 -------------------
[root@master ~]# kubectl certificate approve $(kubectl get csr -o name)
certificatesigningrequest.certificates.k8s.io/csr-t8799 approved
certificatesigningrequest.certificates.k8s.io/csr-69qhz approved
... ...
[root@master ~]# kubectl get certificatesigningrequests
NAME AGE SIGNERNAME REQUESTOR CONDITION
csr-2hg42 14m kubernetes.io/kubelet-serving master Approved,Issued
csr-9gu29 28s kubernetes.io/kubelet-serving node-0001 Approved,Issued
... ...
資源指標監控
# 獲取資源指標有延時,等待 15s 即可查看
[root@master ~]# kubectl top nodes
NAME CPU(cores) CPU% MEMORY(bytes) MEMORY%
master 83m 4% 1789Mi 50%
node-0001 34m 1% 747Mi 20%
node-0002 30m 1% 894Mi 24%
node-0003 39m 1% 930Mi 25%