更新時間:2022-05-30 10:43:21 來源:動力節(jié)點 瀏覽3607次
命令
1.基本命令
命令 | 作用 |
---|---|
create | 創(chuàng)建資源 |
edit | 編輯資源 |
get | 獲取資源 |
patch | 更新(修改)資源 |
delete | 刪除資源 |
explain | 展示資源文檔 |
2.運行/調(diào)試命令
命令 | 作用 |
---|---|
run | 在集群中運行指定鏡像 |
expose | 暴露資源為service |
describe | 展示資源內(nèi)部信息 |
logs | 輸出容器在pod中的日志 |
attach | 進入運行中的容器 |
cp | 在pod內(nèi)外復(fù)制文件 |
rollout | 管理資源的發(fā)布 |
scale | 擴/縮容Pod數(shù)量 |
autoscale | 自動調(diào)整pod數(shù)量 |
資源分類
1.集群級別資源
資源名稱 | 縮寫 | 說明 | 資源作用 |
---|---|---|---|
nodes | no | node節(jié)點 | 集群組成部分 |
namespace | ns | 命名空間 | 隔離Pod |
2.pod資源
資源名稱 | 縮寫 | 說明 | 資源作用 |
---|---|---|---|
pods | po | pod | 裝載容器的最小單元 |
3.pod資源控制器
資源名稱 | 縮寫 | 說明 | 資源作用 |
---|---|---|---|
replicationcontroller | rc | 控制pod資源 | |
replicasets | rs | 控制pod資源 | |
daemonsets | ds | 控制pod資源 | |
jobs | 控制pod資源 | ||
cronjobs | cj | 控制pod資源 | |
horizontalpodautoscalers | hpa | 控制pod資源 | |
statefulsets | sts | 控制pod資源 |
4.服務(wù)發(fā)現(xiàn)資源
資源名稱 | 縮寫 | 說明 | 資源作用 |
---|---|---|---|
services | svc | 服務(wù) | 統(tǒng)一pod對外接口 |
ingress | ing | 統(tǒng)一pod對外接口 |
參數(shù)
參數(shù) | 說明 |
---|---|
-A | 展示所有 |
-f | 指定文件 |
-k | 處理kustomization目錄。此標志不能與-f或-R一起使用。 |
-L | 指定標簽lebel |
-o | 指定輸出格式,常用的有json、yaml、wide(詳細列表) |
-R | 遞歸處理-f,–filename中使用的目錄。在需要管理時非常有用 |
-l | 要進行篩選的選擇器(只支持標簽查詢),支持“=”、“=”和“!=”。(例如-l鍵1=value1,鍵2=value2) 用法示例: kubectl get pod -l "key=value" |
-w | 持續(xù)跟蹤命令的狀態(tài)或者事件變化,類似tail -f 功能 |
-n | 指定命名空間,--namepace 的縮寫 |
-i | 即使未連接任何組件,也要保持pod中容器上的stdin打開。 |
-t | 為pod中的每個容器分配了一個tty。 |
命令行敲出的指令分為2種,
其中kubectl、run、create、apply 等等都是命令,
前面帶-或者--的都是參數(shù),比如--port、-image、-n
資源管理方式分類
類型 | 操作對象 | 適用環(huán)境 | 優(yōu)點 | 缺點 | 使用頻率 |
---|---|---|---|---|---|
命令式對象管理 | 對象 | 測試 | 簡單 | 只操作活動對象,無法審計、跟蹤 | 較少 |
命令式對象配置 | 文件 | 開發(fā) | 可以審計跟蹤 | 項目大時,配置文件多,操作麻煩 | 常用 |
聲明式對象配置 | 目錄 | 開發(fā) | 支持目錄操作 | 意外情況下難以調(diào)試 | 較少 |
1.命令式對象管理
直接使用命令去操作k8s資源,命令和參數(shù)一起出現(xiàn)
kubectl run nginx-pod --image=nginx:1.17.1 --port=80
2.命令式對象配置
通過命令和配置文件去操作作k8s資源,命令還是那個命令,只不過參數(shù)都放在配置文件里面
kubectl create/patch -f nginx-pod.yaml
3.聲明式對象配置
kubectl apply -f nginx-pod.yaml
使用apply創(chuàng)建資源,
如果資源不存在,就創(chuàng)建,相當于執(zhí)行kubectl create -f nginx-pod.yaml
如果資源存在,就修改,相當于執(zhí)行kubectl patch -f nginx-pod.yaml
node
1.獲取所有節(jié)點
[root@master ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master Ready control-plane,master 15h v1.20.9
node1 Ready <none> 13h v1.20.9
node2 Ready <none> 11h v1.20.9
說明
NAME : 節(jié)點名稱
STATUS :節(jié)點狀態(tài)
Ready : 已就緒
NotReady:未就緒
ROLES :角色
AGE:運行時長,從啟動到現(xiàn)在運行了多長時間
VERSION : 版本
2.刪除節(jié)點
在master節(jié)點執(zhí)行以下命令即可刪除
# 先卸載節(jié)點,但是還未刪除
kubectl drain node1 --delete-local-data --force --ignore-daemonsets
# 刪除節(jié)點
kubectl delete node node2
還需要在work節(jié)點上執(zhí)行以下命令來清空ini配置
kubeadm reset
3.加入節(jié)點
先在主節(jié)點創(chuàng)建令牌
# 執(zhí)行后會返回一個 kubeadm 開頭的命令
kubeadm token create --print-join-command
然后在需要加入集群的節(jié)點中執(zhí)行令牌,注意這里的命令是通過kubeadm token create --print-join-command命令返回的結(jié)果
# 在工作節(jié)點上執(zhí)行以下命令即可加入集群
kubeadm join cluster-endpoint:6443 --token xxx.xxx --discovery-token-ca-cert-hash sha256:xxx
namespace
1.獲取所有namespace
# 第一種用法
[root@master ~]# kubectl get namespaces
NAME STATUS AGE
default Active 16h # 所有未指定namespace的對象都會被分配在default空間
kube-node-lease Active 16h # 集群節(jié)點之間的心跳維護,v1.13開始引入
kube-public Active 16h # 此命名空間可以被所有人訪問(包括未認證用戶)
kube-system Active 16h # k8s系統(tǒng)空間,所有由k8s創(chuàng)建的資源都分配到這個空間
# 第二種用法
kubectl get namespace
# 第三種用法
kubectl get ns
2.獲取某個命名空間
# 獲取名為default的namespace
kubectl get ns default
3.獲取namespace為default的的描述信息
[root@master ~]# kubectl describe ns default
Name: default
Labels: <none>
Annotations: <none>
Status: Active
No resource quota. # 針對namespace做的資源限制
No LimitRange resource. # LimitRange 針對 namespace中每個組件做的資源限制
說明
Status
Active :正在使用,
Terminating :正在刪除namespace
4.創(chuàng)建namespace
記住,名稱中不能用下劃線_,可以用橫行-
第一種創(chuàng)建方式–命令行創(chuàng)建
kubectl create ns xxx
第二種創(chuàng)建方式–命令行 + 配置文件
創(chuàng)建一個名為namespace-dev.yaml的文件,內(nèi)容如下(注意大小寫,kind的頭字母必須大寫)
apiVersion: v1
kind: Namespace
metadata:
name: dev
然后偶執(zhí)行命令進行創(chuàng)建
kubectl create -f namespace-dev.yaml
5.刪除namespace
需要注意的是,刪除后,當前命名空間下的pod、deployment、container也會一起刪掉
第一種–使用命令刪除
kubectl delete ns xxx
第二種–使用配置文件刪除
kubectl delete -f namespace-dev.yaml
6.查看命名空間詳情
kubectl describe ns xxx
pod
1.獲取所有pod
[root@master ~]# kubectl get pod -A
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system calico-kube-controllers-7498f6cbdd-k6m4q 0/1 Running 20 10h
kube-system calico-node-5bj92 0/1 Init:0/2 1 10h
kube-system calico-node-fqn48 0/1 Init:0/2 0 10h
kube-system calico-node-r2ln8 0/1 Init:0/2 1 10h
kube-system coredns-5897cd56c4-vnw4c 0/1 ContainerCreating 0 15h
kube-system coredns-5897cd56c4-zvwdn 0/1 ContainerCreating 0 15h
第二種用法
kubectl get pods -A
第三種用法
kubectl get po -A
說明
NAMESPACE :名稱空間
NAME:Pod名稱
READY:已準備好的實例數(shù)/總實例數(shù)
STATUS:狀態(tài)
Running:運行中
Init:0/2 : 正在初始化 已初始化完成數(shù)量/總數(shù)
ContainerCreating : 容器正在創(chuàng)建中,需要注意的是,如果長時間還是這個狀態(tài)的話,就是有錯誤了,需通過命令kubectl describe pod podName查看原因
RESTARTS : 重啟次數(shù)
AGE:運行時長
獲取所有namespace的pod并監(jiān)視資源變動
加上-w 表示監(jiān)視資源變動信息,此時命令行進入阻塞狀態(tài),如果pod有變化將會馬上呈現(xiàn)出來;
kubectl get pod -A -w
其他參數(shù)
# -n 表示獲取指定namespace的pod
kubectl get pod -n kube-system
# 如果不加 -n 參數(shù),默認獲取的是default下的pod,所以以下2個命令的執(zhí)行結(jié)果是一樣的
kubectl get pod
kubectl get pod -n default
2.創(chuàng)建pod
因為pod里面至少要有一個容器,所以pod是和容器一起創(chuàng)建的,新建一個文件pod.ymal,內(nèi)容如下
apiVersion: v1
kind: Pod
metadata:
name: pod-name
namespace: dev
spec:
containers:
- image: nginx:1.17.1
name: nginx-container
ports:
- name: nginx-port
containerPort: 80
protocol: TCP
然后執(zhí)行命令并指定配置文件進行創(chuàng)建
kubectl create -f pod.ymal
3.修改pod
4.刪除pod
如果只是單純的刪除pod,你會發(fā)現(xiàn),刪除了之后,k8s會自動啟動了另一個pod,這是因為當前pod是由pod控制器創(chuàng)建的,控制器會監(jiān)控pod狀態(tài),一旦pod死亡,會立即重建,所以想要刪除pod就得先刪除deployment。刪除后,與此deployment關(guān)聯(lián)的pod也會一起刪除;
如果不刪除delployment的話,這里的刪除pod只是充當一個重啟的作用;
如果是創(chuàng)建時未指定pod控制器,那就可以使用以下命令直接刪除pod
# 刪除deployment,刪除后,與此deployment關(guān)聯(lián)的pod也會一起刪除
kubectl delete deployment xxx
# 刪除pod
kubectl delete pod xxx
label
1.為資源打標簽(第一種方式:使用命令打標簽)
# 為pod資源打標簽,需要注意的是,打標簽之前,pod必須提前創(chuàng)建好
kubectl label pod pod-name labelKey=labelValue -n deplot-name
# 為node資源打標簽
kubectl label nodes node1 nodetag=node1
2.為資源打標簽(第二種方式:使用配置文件打標簽)
以下示例是為pod資源打標簽,這種方式是和pod一起創(chuàng)建的,新建一個配置文件 label.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-name
namespace: dev
labels:
lebelKey1: "labelValue1"
lebelKey2: "labelValue2"
lebelKey3: "labelValue3"
spec:
containers:
- image: nginx:1.17.1
name: nginx-container
ports:
- name: nginx-port
containerPort: 80
protocol: TCP
執(zhí)行命令創(chuàng)建pod
kubectl apply -f label.ymal
3.更新標簽
適合更新label值,前提是label的key必須已存在;
kubectl label pod pod-name labelKey=labelValue -n deplot-name --overwrite
4.查看標簽
kubectl get pod pod-name -n dev --show-labels
5.篩選標簽
# 查詢lebelKey1=labelValue1的pod
kubectl get pod -n dev -l lebelKey1=labelValue1 --show-labels
# 查詢A不等于B的pod
kubectl get pod -n dev -l A!=B --show-labels
6..刪除標簽
刪除key為lebelKey的標簽
# 刪除pod資源的表標簽
kubectl label pod ymal-create-pod-name lebelKey- -n dev
# 刪除node資源的標簽
pod控制器(deployment)
pod控制器有很多種,我們這里就用deployment
1.創(chuàng)建deployment(第一種方式:命令行創(chuàng)建)
使用以下run命令運行一個nginx,deployment名稱為app=run-cmd-nginx-deploy-3
kubectl create deployment app=run-cmd-nginx-deploy-3 --image=nginx:1.17.1 --port=80 --replicas=3 -n dev
# 說明
nginx-deploy # pod控制器的名稱,也就是deployment,
--image=nginx:1.17.1 # 指定鏡像版本
--port=80 # 指定nginx的端口
--replicas=3 # 創(chuàng)建三個副本,也就是會創(chuàng)建三個pod(注意:在k8s版本v1.8以后,r--eplicas已失效,建議使用deployment,不過僅僅是run命令失效,create 和yaml配置文件還是有效的)
-n dev # 指定namespace
通過以下命令可以看到,會自動生成一個app=run-cmd-nginx-deploy-3的標簽
[root@master ~]# kubectl get deployment -o wide -n dev --show-labels
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR LABELS
run-cmd-nginx-deploy-3 3/3 3 3 18m nginx nginx:1.17.1 app=run-cmd-nginx-deploy-3 app=run-cmd-nginx-deploy-3
2.創(chuàng)建deployment(第二種方式:yaml配置文件創(chuàng)建)
新建一個deployment.yaml文件,內(nèi)容如下
apiVersion: apps/v1 # 前面的apps/必須這樣寫,斜杠后面隨便寫,暫不知為何
kind: Deployment # 創(chuàng)建deployment
metadata:
name: ymal-deployment-name # deployment名稱
namespace: dev # 所屬命名空間
spec:
replicas: 3 # 副本數(shù)量
selector:
matchLabels: # 匹配標簽
deploy-label-1: ymal-label # 此選擇器和下面的template.metadata..labels進行關(guān)聯(lián),可以發(fā)現(xiàn)這倆值是一樣的,一樣的值就會進行關(guān)聯(lián)
template: # pod模板
metadata: # 以下是pod配置
labels:
deploy-label-1: ymal-label
spec:
containers: # 以下是容器配置
- image: nginx:1.17.1
name: nginx-container
ports:
- name: nginx-port
containerPort: 80
protocol: TCP
3.查詢deployment的詳細信息
# 查看deployment詳細信息
kubectl describe deployment xxx -n dev
# 查看所有的deplyment
kubectl get deployment -A
# 查詢某個deployment
kubectl get deployment xxx -n dev
# 模糊查詢
kubectl get deployment -A | grep xxx
# 查詢deployment下的所有pod
kubectl get pod -A | grep deployment-name
4.刪除deployment
需要注意的是,一旦刪除pod控制器,此pod控制器下的所有pod和容器也會一并刪除;
# 第一種刪除方式,直接命令刪除
kubectl delete deployment xxx -n dev
# 第二種刪除方式,使用配置文件進行刪除
kubectl delete -f deployment.yaml
service
1.創(chuàng)建service–命令行方式創(chuàng)建
默認創(chuàng)建的pod是只能對內(nèi)訪問的,所以需要創(chuàng)建一個對外的訪問端口,創(chuàng)建一個service其實就是暴露對外的訪問端口
kubectl expose deployment xxx --name=service-name --port=80 --target-port=80 --type=NodePort
說明
expose deployment xxx : 需要暴露的deployment名稱
--name :service名稱
--port : service 暴露的端口
--target-port : 目標端口,也就是pod容器中的端口
--type:service類型,分為以下幾個
ClusterIP:默認值,它是Kubernetes系統(tǒng)自動分配的虛擬IP,只能在集群內(nèi)部訪問
NodePort:將Service通過指定的Node上的端口暴露給外部,通過此方法,就可以在集群外部訪問服務(wù)
LoadBalancer:使用外接負載均衡器完成到服務(wù)的負載分發(fā),注意此模式需要外部云環(huán)境支持
ExternalName: 把集群外部的服務(wù)引入集群內(nèi)部,直接使用
創(chuàng)建好service之后,查看service信息,可以看到,暴露的端口為:30474,
外部訪問:因為博主這邊是虛擬機,所以使用主機的ip:端口,也就是192.168.253.131:30474就可以訪問到頁面了;
內(nèi)部訪問:直接在虛擬機內(nèi)訪問10.96.216.128:80即可
[root@master ~]# kubectl get svc -n dev
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
ymal-service-name NodePort 10.96.216.128 <none> 80:30474/TCP 10m
# 說明
CLUSTER-IP # 此ip只能內(nèi)部訪問
PORT(S) # 我們看到上面有2個端口80:30474,80是內(nèi)部訪問端口,30474是外部訪問的端口;
2.創(chuàng)建service(ymal方式創(chuàng)建)
新建一個service.ymal文件,內(nèi)容如下
apiVersion: v1
kind: Service
metadata:
name: service-name
namespace: dev
spec:
clusterIP: 10.96.98.123
ports:
- port: 80
protocol: TCP
targetPort: 80
selector: # 標簽選擇器,需要和deployment的label一致
deploy-label-1: ymal-label
type: NodePort
3.查看service
以下三種用法都可以
# 第一種
kubectl get services
# 第二種
kubectl get services
# 第三種
kubectl get svc
4.刪除service
kubectl delete service xxx
查詢pod控制器和pod
kubectl get deployment,pod -n dev
endpoint
Endpoint是kubernetes中的一個資源對象,存儲在etcd中,用來記錄一個service對應(yīng)的所有pod的訪問地址,它是根據(jù)service配置文件中selector描述產(chǎn)生的。
一個Service由一組Pod組成,這些Pod通過Endpoints暴露出來,Endpoints是實現(xiàn)實際服務(wù)的端點集合。換句話說,service和pod之間的聯(lián)系是通過endpoints實現(xiàn)的。
每創(chuàng)建一個service,k8s會自動創(chuàng)建一個同名的 Endpoint出來
1.查看 endpoint
# 一定要加s
kubectl get endpoints -n dev
# 查看endpoint的詳細信息
kubectl describe endpoints -n dev
2.刪除endpoint
如果是由service創(chuàng)建出來的endpoints,刪除后會馬上創(chuàng)建出一個同名的endpoint出來,如果要刪除必須先刪除service
kubectl delete endpoints xxxx -n dev
3.創(chuàng)建endpoint
因為每次創(chuàng)建一個service,k8s會自動創(chuàng)建一個同名的 Endpoint出來,所我們直接創(chuàng)建service就可以了
kind: Service
apiVersion: v1
metadata:
name: nginx
namespace: dev
spec:
type: ClusterIP
ports:
- name: app-port
protocol: TCP
port: 80
targetPort: 80
selector:
app: nginx-pod