Kubernetes之kubectl常用命令:故障排查和故障解決
kubectl故障排查相關常用命令
編號 | 命令 | 說明 |
---|---|---|
1 | version | 顯示客戶端和伺服器側版本資訊 |
2 | api-versions | 以group/version的格式顯示伺服器側所支援的API版本 |
3 | explain | 顯示資源文件資訊 |
4 | get | 取得確認物件資訊列表 |
5 | describe | 取得確認物件的詳細資訊 |
6 | logs | 取得pod中容器的log資訊 |
7 | exec | 在容器中執行一條命令 |
8 | cp | 從容器考出或向容器考入檔案 |
9 | attach | Attach到一個執行中的容器上 |
kubectl version
version命令用於確認客戶端和伺服器側的版本資訊,不同的版本的情況變化可能很大,所以故障排除時首先也需要確認的是現場環境的版本資訊。從下面可以清楚地看到,本文驗證時所使用的版本為1.11.2
[[email protected] ~]# kubectl version Client Version: version.Info{Major:"1", Minor:"11", GitVersion:"v1.11.2", GitCommit:"bb9ffb1654d4a729bb4cec18ff088eacc153c239", GitTreeState:"clean", BuildDate:"2018-08-07T23:17:28Z", GoVersion:"go1.10.3", Compiler:"gc", Platform:"linux/amd64"} Server Version: version.Info{Major:"1", Minor:"11", GitVersion:"v1.11.2", GitCommit:"bb9ffb1654d4a729bb4cec18ff088eacc153c239", GitTreeState:"clean", BuildDate:"2018-08-07T23:08:19Z", GoVersion:"go1.10.3", Compiler:"gc", Platform:"linux/amd64"}
kubectl api-versions
使用api-versions命令可以列出當前版本的kubernetes的伺服器端所支援的api版本資訊。
[[email protected] ~]# kubectl api-versions admissionregistration.k8s.io/v1beta1 apiextensions.k8s.io/v1beta1 apiregistration.k8s.io/v1 apiregistration.k8s.io/v1beta1 apps/v1 apps/v1beta1 apps/v1beta2 authentication.k8s.io/v1 authentication.k8s.io/v1beta1 authorization.k8s.io/v1 authorization.k8s.io/v1beta1 autoscaling/v1 autoscaling/v2beta1 batch/v1 batch/v1beta1 certificates.k8s.io/v1beta1 events.k8s.io/v1beta1 extensions/v1beta1 networking.k8s.io/v1 policy/v1beta1 rbac.authorization.k8s.io/v1 rbac.authorization.k8s.io/v1beta1 scheduling.k8s.io/v1beta1 storage.k8s.io/v1 storage.k8s.io/v1beta1 v1
kubectl explain
使用kubectl explain可以和kubectl help一樣進行輔助的功能確認,使用它可以瞭解各個部分的說明和組成部分。比如如下可以看到對rc的說明,在故障排除時作用並不具有太大作用,到是可以多讀讀加深一下對各個部分的理解。
[[email protected] ~]# kubectl explain rc
DESCRIPTION:
ReplicationController represents the configuration of a replication controller.
FIELDS:
apiVersion <string>
APIVersion defines the versioned schema of this representation of an
object. Servers should convert recognized schemas to the latest internal
value, and may reject unrecognized values. More info:
http://releases.k8s.io/HEAD/docs/devel/api-conventions.md#resources
kind <string>
Kind is a string value representing the REST resource this object
represents. Servers may infer this from the endpoint the client submits
requests to. Cannot be updated. In CamelCase. More info:
http://releases.k8s.io/HEAD/docs/devel/api-conventions.md#types-kinds
metadata <Object>
If the Labels of a ReplicationController are empty, they are defaulted to
be the same as the Pod(s) that the replication controller manages. Standard
object's metadata. More info:
http://releases.k8s.io/HEAD/docs/devel/api-conventions.md#metadata
spec <Object>
Spec defines the specification of the desired behavior of the replication
controller. More info:
http://releases.k8s.io/HEAD/docs/devel/api-conventions.md#spec-and-status
status <Object>
Status is the most recently observed status of the replication controller.
This data may be out of date by some window of time. Populated by the
system. Read-only. More info:
http://releases.k8s.io/HEAD/docs/devel/api-conventions.md#spec-and-status
explain命令能夠確認的資訊類別
其所能支援的類別如下:
類別 |
---|
clusters (僅對federation apiservers有效) |
componentstatuses (縮寫 cs) |
configmaps (縮寫 cm) |
daemonsets (縮寫 ds) |
deployments (縮寫 deploy) |
endpoints (縮寫 ep) |
events (縮寫 ev) |
horizontalpodautoscalers (縮寫 hpa) |
ingresses (縮寫 ing) |
jobs |
limitranges (縮寫 limits) |
namespaces (縮寫 ns) |
networkpolicies |
nodes (縮寫 no) |
persistentvolumeclaims (縮寫 pvc) |
persistentvolumes (縮寫 pv) |
pods (縮寫 po) |
podsecuritypolicies (縮寫 psp) |
podtemplates |
replicasets (縮寫 rs) |
replicationcontrollers (縮寫 rc) |
resourcequotas (縮寫 quota) |
secrets |
serviceaccounts (縮寫 sa) |
services (縮寫 svc) |
statefulsets |
storageclasses |
thirdpartyresources |
kubectl get
使用get命令確認所創建出來的pod和deployment的資訊
確認pod
可以看到創建出來的pod的所有資訊,也可以使用Kubectl get po進行確認
[[email protected] ~]# kubectl get pods
確認deployment
可以看到創建出來的deployment的所有資訊
[[email protected] ~]# kubectl get deployment
如果希望得到更加詳細一點的資訊,可以加上-o wide引數,比如對pods可以看到此pod在哪個node上執行,此pod的叢集IP是多少也被一併顯示了
[[email protected] ~]# kubectl get pods -o wide
確認node資訊
顯示node的資訊
[[email protected] ~]# kubectl get nodes -o wide
確認namespace資訊
列出所有的namespace
[[email protected] ~]# kubectl get namespaces
get命令能夠確認的資訊類別
使用node/pod/event/namespaces等結合起來,能夠獲取叢集基本資訊和狀況, 其所能支援的類別如下:
類別 |
---|
clusters (僅對federation apiservers有效) |
componentstatuses (縮寫 cs) |
configmaps (縮寫 cm) |
daemonsets (縮寫 ds) |
deployments (縮寫 deploy) |
endpoints (縮寫 ep) |
events (縮寫 ev) |
horizontalpodautoscalers (縮寫 hpa) |
ingresses (縮寫 ing) |
jobs |
limitranges (縮寫 limits) |
namespaces (縮寫 ns) |
networkpolicies |
nodes (縮寫 no) |
persistentvolumeclaims (縮寫 pvc) |
persistentvolumes (縮寫 pv) |
pods (縮寫 po) |
podsecuritypolicies (縮寫 psp) |
podtemplates |
replicasets (縮寫 rs) |
replicationcontrollers (縮寫 rc) |
resourcequotas (縮寫 quota) |
secrets |
serviceaccounts (縮寫 sa) |
services (縮寫 svc) |
statefulsets |
storageclasses |
thirdpartyresources |
kubectl describe
確認node詳細資訊
一般使用get命令取得node資訊,然後使用describe確認詳細資訊。
確認某一pod詳細資訊
[[email protected] tmp]# kubectl describe pod mysql-478535978-1dnm2
Name: mysql-478535978-1dnm2
Namespace: default
Node: 192.168.32.133/192.168.32.133
Start Time: Thu, 29 Jun 2017 05:04:21 -0400
Labels: name=mysql
pod-template-hash=478535978
Status: Running
IP: 172.200.44.2
Controllers: ReplicaSet/mysql-478535978
Containers:
mysql:
Container ID: docker://47ef1495e86f4b69414789e81081fa55b837dafe9e47944894e7cb3733700410
Image: 192.168.32.131:5000/mysql:5.7.16
Image ID: docker-pullable://192.168.32.131:5000/[email protected]:410b279f6827492da7a355135e6e9125849f62eeca76429974a534f021852b58
Port: 3306/TCP
State: Running
Started: Thu, 29 Jun 2017 05:04:22 -0400
Ready: True
Restart Count: 0
Volume Mounts:
/var/run/secrets/kubernetes.io/serviceaccount from default-token-dzs1w (ro)
Environment Variables:
MYSQL_ROOT_PASSWORD: hello123
Conditions:
Type Status
Initialized True
Ready True
PodScheduled True
Volumes:
default-token-dzs1w:
Type: Secret (a volume populated by a Secret)
SecretName: default-token-dzs1w
QoS Class: BestEffort
Tolerations: <none>
No events.
[[email protected] tmp]#
確認deployment詳細資訊
確認某一deployment的詳細資訊
[[email protected] tmp]# kubectl get deployment
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
mysql 1 1 1 1 1h
sonarqube 1 1 1 1 1h
[[email protected] tmp]# kubectl describe deployment mysql
Name: mysql
Namespace: default
CreationTimestamp: Thu, 29 Jun 2017 05:04:21 -0400
Labels: name=mysql
Selector: name=mysql
Replicas: 1 updated | 1 total | 1 available | 0 unavailable
StrategyType: RollingUpdate
MinReadySeconds: 0
RollingUpdateStrategy: 1 max unavailable, 1 max surge
Conditions:
Type Status Reason
---- ------ ------
Available True MinimumReplicasAvailable
OldReplicaSets: <none>
NewReplicaSet: mysql-478535978 (1/1 replicas created)
No events.
[[email protected] tmp]#
describe命令能夠確認的資訊
describe命令所能支援的類別如下:
類別 |
---|
clusters (僅對federation apiservers有效) |
componentstatuses (縮寫 cs) |
configmaps (縮寫 cm) |
daemonsets (縮寫 ds) |
deployments (縮寫 deploy) |
endpoints (縮寫 ep) |
events (縮寫 ev) |
horizontalpodautoscalers (縮寫 hpa) |
ingresses (縮寫 ing) |
jobs |
limitranges (縮寫 limits) |
namespaces (縮寫 ns) |
networkpolicies |
nodes (縮寫 no) |
persistentvolumeclaims (縮寫 pvc) |
persistentvolumes (縮寫 pv) |
pods (縮寫 po) |
podsecuritypolicies (縮寫 psp) |
podtemplates |
replicasets (縮寫 rs) |
replicationcontrollers (縮寫 rc) |
resourcequotas (縮寫 quota) |
secrets |
serviceaccounts (縮寫 sa) |
services (縮寫 svc) |
statefulsets |
storageclasses |
thirdpartyresources |
kubectl logs
類似於docker logs,使用kubectl logs能夠取出pod中映象的log,也是故障排除時候的重要資訊
[[email protected] tmp]# kubectl logs mysql-478535978-1dnm2
Initializing database
...
2017-06-29T09:04:37.081939Z 0 [Note] Event Scheduler: Loaded 0 events
2017-06-29T09:04:37.082097Z 0 [Note] mysqld: ready for connections.
Version: '5.7.16' socket: '/var/run/mysqld/mysqld.sock' port: 3306 MySQL Community Server (GPL)
kubectl exec
exec命令用於到容器中執行一條命令,比如下述命令用於到mysql的映象中執行hostname命令
[[email protected] tmp]# kubectl get pods
NAME READY STATUS RESTARTS AGE
mysql-478535978-1dnm2 1/1 Running 0 1h
sonarqube-3574384362-m7mdq 1/1 Running 0 1h
[[email protected] tmp]# kubectl exec mysql-478535978-1dnm2 hostname
mysql-478535978-1dnm2
[[email protected] tmp]#
更為常用的方式則是登陸到pod中,在有條件的時候,進行故障發生時的現場確認,這種方式是最為直接有效和快速,但是對許可權要求也較多。
[[email protected] tmp]# kubectl exec -it mysql-478535978-1dnm2 sh
# hostname
mysql-478535978-1dnm2
#
kubectl cp
用於pod和外部的檔案交換,比如如下示例瞭如何在進行內外檔案交換。
在pod中建立一個檔案message.log
[[email protected] tmp]# kubectl exec -it mysql-478535978-1dnm2 sh
# pwd
/
# cd /tmp
# echo "this is a message from `hostname`" >message.log
# cat message.log
this is a message from mysql-478535978-1dnm2
# exit
[[email protected] tmp]#
拷貝出來並確認
[[email protected] tmp]# kubectl cp mysql-478535978-1dnm2:/tmp/message.log message.log
tar: Removing leading `/' from member names
[[email protected] tmp]# cat message.log
this is a message from mysql-478535978-1dnm2
[[email protected] tmp]#
更改message.log並拷貝回pod
[[email protected] tmp]# echo "information added in `hostname`" >>message.log
[[email protected] tmp]# cat message.log
this is a message from mysql-478535978-1dnm2
information added in ku8-1
[[email protected] tmp]# kubectl cp message.log mysql-478535978-1dnm2:/tmp/message.log
[[email protected] tmp]#
確認更改後的資訊
[[email protected] tmp]# kubectl exec mysql-478535978-1dnm2 cat /tmp/message.log
this is a message from mysql-478535978-1dnm2
information added in ku8-1
[[email protected] tmp]#
kubectl attach
類似於docker attach的功能,用於取得實時的類似於kubectl logs的資訊
[[email protected] tmp]# kubectl get pods
NAME READY STATUS RESTARTS AGE
mysql-478535978-1dnm2 1/1 Running 0 1h
sonarqube-3574384362-m7mdq 1/1 Running 0 1h
[[email protected] tmp]# kubectl attach sonarqube-3574384362-m7mdq
If you don't see a command prompt, try pressing enter.
kubectl cluster-info
使用cluster-info和cluster-info dump也能取出一些資訊,尤其是你需要看整體的全部資訊的時候一條命令一條命令的執行不如kubectl cluster-info dump來的快一些
kubectl故障解決相關常用命令
編號 | 命令 | 說明 |
---|---|---|
1 | edit | 編輯伺服器側資源 |
2 | replace | 使用檔名或者標準輸入資源 |
3 | patch | 部分更新資源相關資訊 |
4 | apply | 使用檔案或者標準輸入更改配置資訊 |
5 | scale | 重新設定Deployment/ReplicaSet/RC/Job的size |
6 | autoscale | Deployment/ReplicaSet/RC的自動擴充套件設定 |
7 | cordon | 設定node不可使用 |
8 | uncordon | 設定node可以使用 |
9 | drain | 設定node進入維護模式 |
kubectl edit
edit這條命令用於編輯伺服器上的資源,具體是什麼意思,可以通過如下使用方式來確認。
編輯物件確認
使用-o引數指定輸出格式為yaml的nginx的service的設定情況確認,取得現場情況,這也是我們不知道其yaml檔案而只有環境時候能做的事情。
[[email protected] tmp]# kubectl get service |grep nginx
nginx 172.200.229.212 <nodes> 80:31001/TCP 2m
[[email protected] tmp]# kubectl get service nginx -o yaml
apiVersion: v1
kind: Service
metadata:
creationTimestamp: 2017-06-30T04:50:44Z
labels:
name: nginx
name: nginx
namespace: default
resourceVersion: "77068"
selfLink: /api/v1/namespaces/default/services/nginx
uid: ad45612a-5d4f-11e7-91ef-000c2933b773
spec:
clusterIP: 172.200.229.212
ports:
- nodePort: 31001
port: 80
protocol: TCP
targetPort: 80
selector:
name: nginx
sessionAffinity: None
type: NodePort
status:
loadBalancer: {}
[[email protected] tmp]#
使用edit命令對nginx的service設定進行編輯,得到如下資訊
可以看到當前埠為31001,在此編輯中,我們把它修改為31002
[[email protected] tmp]# kubectl edit service nginx
service "nginx" edited
[[email protected] tmp]#
編輯之後確認結果發現,此服務埠已經改變
[[email protected] tmp]# kubectl get service
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes 172.200.0.1 <none> 443/TCP 1d
nginx 172.200.229.212 <nodes> 80:31002/TCP 8m
[[email protected] tmp]#
所使用場景之一,edit編輯的是執行環境的設定而不需要停止服務。
kubectl replace
瞭解到edit用來做什麼之後,我們會立即知道replace就是替換,我們使用上個例子中的service的port,重新把它改回31001
事前確認
確認port資訊為31002
[[email protected] tmp]# kubectl get service
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes 172.200.0.1 <none> 443/TCP 1d
nginx 172.200.229.212 <nodes> 80:31002/TCP 17m
[[email protected] tmp]#
取得當前的nginx的service的設定檔案,然後修改port資訊
[[email protected] tmp]# kubectl get service nginx -o yaml >nginx_forreplace.yaml
[[email protected] tmp]# cp -p nginx_forreplace.yaml nginx_forreplace.yaml.org
[[email protected] tmp]# vi nginx_forreplace.yaml
[[email protected] tmp]# diff nginx_forreplace.yaml nginx_forreplace.yaml.org
15c15
< - nodePort: 31001
---
> - nodePort: 31002
[[email protected] tmp]#
執行replace命令
提示被替換了
[[email protected] tmp]# kubectl replace -f nginx_forreplace.yaml
service "nginx" replaced
[[email protected] tmp]#
確認結果
確認之後發現port確實重新變成了31001
[[email protected] tmp]# kubectl get service
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes 172.200.0.1 <none> 443/TCP 1d
nginx 172.200.229.212 <nodes> 80:31001/TCP 20m
[[email protected] tmp]#
kubectl patch
當部分修改一些設定的時候patch非常有用,尤其是在1.2之前的版本,port改來改去好無聊,這次換個image
事前確認
當前port中使用的nginx是alpine的1.12版本
[[email protected] tmp]# kubectl exec nginx-2476590065-1vtsp -it sh
/ # nginx -v
nginx version: nginx/1.12.0
/ #
執行patch進行替換
[root[email protected] tmp]# kubectl patch pod nginx-2476590065-1vtsp -p '{"spec":{"containers":[{"name":"nginx","image":"192.168.32.131:5000/nginx:1.13-alpine"}]}}'
"nginx-2476590065-1vtsp" patched
[[email protected] tmp]#
確認結果
確認當前pod中的映象已經patch成了1.13
[[email protected] tmp]# kubectl exec nginx-2476590065-1vtsp -it sh
/ # nginx -v
nginx version: nginx/1.13.1
/ #
kubectl apply
同樣apply命令是用來使用檔案或者標準輸入來更改配置資訊。
事前準備
[[email protected] tmp]# kubectl delete -f nginx/
deployment "nginx" deleted
service "nginx" deleted
[[email protected] tmp]# kubectl create -f nginx/
deployment "nginx" created
service "nginx" created
[[email protected] tmp]#
結果確認
Service的Port設定為了31001
[[email protected] tmp]# kubectl get service
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes 172.200.0.1 <none> 443/TCP 1d
nginx 172.200.68.154 <nodes> 80:31001/TCP 11s
[[email protected] tmp]#
修改設定檔案
將port修改為31002
[[email protected] tmp]# vi nginx/nginx.yaml
[[email protected] tmp]# grep 31002 nginx/nginx.yaml
nodePort: 31002
[[email protected] tmp]#
執行apply命令
執行設定檔案可以在執行狀態修改port資訊
[[email protected] tmp]# kubectl apply -f nginx/nginx.yaml
deployment "nginx" configured
service "nginx" configured
[[email protected] tmp]#
結果確認
確認確實將port已經修改為31002了
[[email protected] tmp]# kubectl get service
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes 172.200.0.1 <none> 443/TCP 1d
nginx 172.200.68.154 <nodes> 80:31002/TCP 1m
[[email protected] tmp]#
kubectl scale
scale命令用於橫向擴充套件,是kubernetes或者swarm這類容器編輯平臺的重要功能之一,讓我們來看看是如何使用的
事前準備
事前設定nginx的replica為一,而經過確認此pod在192.168.32.132上執行
[[email protected] tmp]# kubectl delete -f nginx/
deployment "nginx" deleted
service "nginx" deleted
[[email protected] tmp]# kubectl create -f nginx/
deployment "nginx" created
service "nginx" created
[[email protected] tmp]#
[[email protected] tmp]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE
nginx-2476590065-74tpk 1/1 Running 0 17s 172.200.26.2 192.168.32.132
[[email protected] tmp]# kubectl get deployments -o wide
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
nginx 1 1 1 1 27s
[[email protected] tmp]#
執行scale命令
使用scale命令進行橫向擴充套件,將原本為1的副本,提高到3。
[[email protected] tmp]# kubectl scale --current-replicas=1 --replicas=3 deployment/nginx
deployment "nginx" scaled
[[email protected] tmp]#
通過確認發現已經進行了橫向擴充套件,除了192.168.132.132,另外133和134兩臺機器也各有一個pod運行了起來,這正是scale命令的結果。
[[email protected] tmp]# kubectl get deployment
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
nginx 3 3 3 3 2m
[[email protected] tmp]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE
nginx-2476590065-74tpk 1/1 Running 0 2m 172.200.26.2 192.168.32.132
nginx-2476590065-cm5d9 1/1 Running 0 16s 172.200.44.2 192.168.32.133
nginx-2476590065-hmn9j 1/1 Running 0 16s 172.200.59.2 192.168.32.134
[[email protected] tmp]#
kube autoscale
autoscale命令用於自動擴充套件確認,跟scale不同的是前者還是需要手動執行,而autoscale則會根據負載進行調解。而這條命令則可以對Deployment/ReplicaSet/RC進行設定,通過最小值和最大值的指定進行設定,這裡只是給出執行的結果,不再進行實際的驗證。
[[email protected] tmp]# kubectl autoscale deployment nginx --min=2 --max=5
deployment "nginx" autoscaled
[[email protected] tmp]#
當然使用還會有一些限制,比如當前3個,設定最小值為2的話會出現什麼樣的情況?
[[email protected] tmp]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE
nginx-2476590065-74tpk 1/1 Running 0 5m 172.200.26.2 192.168.32.132
nginx-2476590065-cm5d9 1/1 Running 0 2m 172.200.44.2 192.168.32.133
nginx-2476590065-hmn9j 1/1 Running 0 2m 172.200.59.2 192.168.32.134
[[email protected] tmp]#
[[email protected] tmp]# kubectl autoscale deployment nginx --min=2 --max=2
Error from server (AlreadyExists): horizontalpodautoscalers.autoscaling "nginx" already exists
[[email protected] tmp]#
kubectl cordon 與 uncordon
在實際維護的時候會出現某個node壞掉,或者做一些處理,暫時不能讓生成的pod在此node上執行,需要通知kubernetes讓其不要建立過來,這條命令就是cordon,uncordon則是取消這個要求。例子如下:
事前準備
建立了一個nginx的pod,跑在192.168.32.133上。
[[email protected] tmp]# kubectl create -f nginx/
deployment "nginx" created
service "nginx" created
[[email protected] tmp]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE
nginx-2476590065-dnsmw 1/1 Running 0 6s 172.200.44.2
192.168.32.133
[[email protected] tmp]#
執行scale命令
橫向擴充套件到3個副本,發現利用roundrobin策略每個node上執行起來了一個pod,134這臺機器也有一個。
[[email protected] tmp]# kubectl scale --replicas=3 deployment/nginx
deployment "nginx" scaled
[[email protected] tmp]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE
nginx-2476590065-550sm 1/1 Running 0 5s 172.200.26.2 192.168.32.132
nginx-2476590065-bt3bc 1/1 Running 0 5s 172.200.59.2 192.168.32.134
nginx-2476590065-dnsmw 1/1 Running 0 17s 172.200.44.2 192.168.32.133
[[email protected] tmp]# kubectl get pods -o wide |grep 192.168.32.134
nginx-2476590065-bt3bc 1/1 Running 0 12s 172.200.59.2 192.168.32.134
[[email protected] tmp]#
執行cordon命令
設定134,使得134不可使用,使用get node確認,其狀態顯示SchedulingDisabled。
[[email protected] tmp]# kubectl cordon 192.168.32.134
node "192.168.32.134" cordoned
[[email protected] tmp]# kubectl get nodes -o wide
NAME STATUS AGE EXTERNAL-IP
192.168.32.132 Ready 1d <none>
192.168.32.133 Ready 1d <none>
192.168.32.134 Ready,SchedulingDisabled 1d <none>
[[email protected] tmp]#
執行scale命令
再次執行橫向擴充套件命令,看是否會有pod漂到134這臺機器上,結果發現只有之前的一個pod,再沒有新的pod漂過去。
[[email protected] tmp]# kubectl scale --replicas=6 deployment/nginx
deployment "nginx" scaled
[[email protected] tmp]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE
nginx-2476590065-550sm 1/1 Running 0 32s 172.200.26.2 192.168.32.132
nginx-2476590065-7vxvx 1/1 Running 0 3s 172.200.44.3 192.168.32.133
nginx-2476590065-bt3bc 1/1 Running 0 32s 172.200.59.2 192.168.32.134
nginx-2476590065-dnsmw 1/1 Running 0 44s 172.200.44.2 192.168.32.133
nginx-2476590065-fclhj 1/1 Running 0 3s 172.200.44.4 192.168.32.133
nginx-2476590065-fl9fn 1/1 Running 0 3s 172.200.26.3 192.168.32.132
[[email protected] tmp]# kubectl get pods -o wide |grep 192.168.32.134
nginx-2476590065-bt3bc 1/1 Running 0 37s 172.200.59.2 192.168.32.134
[[email protected] tmp]#
執行uncordon命令
使用uncordon命令解除對134機器的限制,通過get node確認狀態也已經正常。
[[email protected] tmp]# kubectl uncordon 192.168.32.134
node "192.168.32.134" uncordoned
[[email protected] tmp]#
[[email protected] tmp]# kubectl get nodes -o wide
NAME STATUS AGE EXTERNAL-IP
192.168.32.132 Ready 1d <none>
192.168.32.133 Ready 1d <none>
192.168.32.134 Ready 1d <none>
[[email protected] tmp]#
執行scale命令
再次執行scale命令,發現有新的pod可以建立到134node上了。
[[email protected] tmp]# kubectl scale --replicas=10 deployment/nginx
deployment "nginx" scaled
[[email protected] tmp]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE
nginx-2476590065-550sm 1/1 Running 0 1m 172.200.26.2 192.168.32.132
nginx-2476590065-7vn6z 1/1 Running 0 3s 172.200.44.4 192.168.32.133
nginx-2476590065-7vxvx 1/1 Running 0 35s 172.200.44.3 192.168.32.133
nginx-2476590065-bt3bc 1/1 Running 0 1m 172.200.59.2 192.168.32.134
nginx-2476590065-dnsmw 1/1 Running 0 1m 172.200.44.2 192.168.32.133
nginx-2476590065-fl9fn 1/1 Running 0 35s 172.200.26.3 192.168.32.132
nginx-2476590065-pdx91 1/1 Running 0 3s 172.200.59.3 192.168.32.134
nginx-2476590065-swvwf 1/1 Running 0 3s 172.200.26.5 192.168.32.132
nginx-2476590065-vdq2k 1/1 Running 0 3s 172.200.26.4 192.168.32.132
nginx-2476590065-wdv52 1/1 Running 0 3s 172.200.59.4 192.168.32.134
[[email protected] tmp]#
kubectl drain
drain命令用於對某個node進行設定,是為了設定此node為維護做準備。英文的drain有排幹水的意思,下水道的水之後排幹後才能進行維護。那我們來看一下kubectl”排水”的時候都作了什麼
事前準備
將nginx的副本設定為4,確認發現134上啟動了兩個pod。
[[email protected] tmp]# kubectl create -f nginx/
deployment "nginx" created
service "nginx" created
[[email protected] tmp]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE
nginx-2476590065-d6h8f 1/1 Running 0 8s 172.200.59.2 192.168.32.134
[[email protected] tmp]#
[[email protected] tmp]# kubectl get nodes -o wide
NAME STATUS AGE EXTERNAL-IP
192.168.32.132 Ready 1d <none>
192.168.32.133 Ready 1d <none>
192.168.32.134 Ready 1d <none>
[[email protected] tmp]#
[[email protected] tmp]# kubectl scale --replicas=4 deployment/nginx
deployment "nginx" scaled
[[email protected] tmp]#
[[email protected] tmp]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE
nginx-2476590065-9lfzh 1/1 Running 0 12s 172.200.59.3 192.168.32.134
nginx-2476590065-d6h8f 1/1 Running 0 1m 172.200.59.2 192.168.32.134
nginx-2476590065-v8xvf 1/1 Running 0 43s 172.200.26.2 192.168.32.132
nginx-2476590065-z94cq 1/1 Running 0 12s 172.200.44.2 192.168.32.133
[[email protected] tmp]#
執行drain命令
執行drain命令,發現這條命令做了兩件事情:
1. 設定此node不可以使用(cordon)
2. evict了其上的兩個pod
[[email protected] tmp]# kubectl drain 192.168.32.134
node "192.168.32.134" cordoned
pod "nginx-2476590065-d6h8f" evicted
pod "nginx-2476590065-9lfzh" evicted
node "192.168.32.134" drained
[[email protected] tmp]#
結果確認
evict的意思有驅逐和回收的意思,讓我們來看一下evcit這個動作的結果到底是什麼。
結果是134上面已經不再有pod,而在132和133上新生成了兩個pod,用以替代在134上被退場的pod,而這個替代的動作應該是replicas的機制保證的。所以drain的結果就是退場pod和設定node不可用(排水),這樣的狀態則可以進行維護了,執行完後重新uncordon即可。
相關推薦
Kubernetes之kubectl常用命令使用指南:2:故障排查
alpha eth message resources mount 權限 copyright count limit kubectl是一個用於操作kubernetes集群的命令行接口,通過利用kubectl的各種命令可以實現各種功能,是在使用kubernetes中非常
Kubernetes之kubectl常用命令使用指南:3:故障對應
kubectl是一個用於操作kubernetes叢集的命令列介面,通過利用kubectl的各種命令可以實現各種功能,是在使用kubernetes中非常常用的工具。這裡我們會通過一些簡單的例項來展現其中一些高頻命令的使用方法。 更為重要的是這些命令使用的場景以及能夠解決什麼樣的
Kubernetes之kubectl常用命令:故障排查和故障解決
kubectl故障排查相關常用命令 編號 命令 說明 1 version 顯示客戶端和伺服器側版本資訊 2 api-versions 以group/version的格式顯示伺服器側所支援的API版本 3 explain
Kubernetes之kubectl常用命令使用指南:1:建立和刪除
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!  
Kubernetes之kubectl常用命令
1. Help 類似於所有的命令列工具工具,kubectl也可以直接執行或 | 可獲得命令的幫助資訊。如下圖所示,kubectl使用方式為: Usage: kubectl [flags] kubectl [commond]
Kubernetes之kubectl常用命令使用指南 4 docker命令 vs kubectl
描述 朋友 使用指南 各種功能 總結 ref body 一個 -i kubectl是一個用於操作kubernetes集群的命令行接口,通過利用kubectl的各種命令可以實現各種功能,是在使用kubernetes中非常常用的工具。這裏我們會通過一些簡單的實例來展現其
Kubernetes之kubectl命令列工具簡介、安裝配置及常用命令
kubectl概述 kubectl是Kubernetes叢集的命令列工具,通過kubectl能夠對叢集本身進行管理,並能夠在叢集上進行容器化應用的安裝部署。執行kubectl命令的語法如下所示: $ kubectl [command] [TYPE] [NAME] [flags] coma
kubernetes之故障排查和節點維護(二)
案例現場: 測試環境叢集本來正常,突然間歇性地出現服務不能正常訪問,過一會兒重新整理頁面又可以正常訪問了.進入到服務所在的pod檢視輸出日誌並沒有發現異常.使用kubectl get node命令正好發現一個節點是NotReady狀態 為了方便觀察,使用kubectl get node --watch來觀
Kubernetes kubectl常用命令
Kubernetes kubectl常用命令 [TOC] 1. 檢視資源物件 常用檢視資源物件(%rc%)有namespace(ns) pods service(svc) endpoints(ep) deployment(deploy) pvc ingresses(ing),括號內為最簡寫法。 kube
redis之四 常用命令和5種資料結構
redis中文官網:string hash list set sortedset 一、基本操作 #獲取所有的key keys * #判斷一個鍵是否存在。存在則返回1,否則返回0 exists mykey #刪除鍵 del mykey #過期時間(單位:秒) #設定過期時間
kubernetes之kubectl命令用法總結
常用 thead set 可選 顯示 file url scale accounts 本文是對k8s,kubectl常用命令的總結。 語法 kubectl [command] [TYPE] [NAME] [flags] 1 command:子命令,用於操作Kub
No-sql之redis常用命令
ucc container per coo xxx pivot orm article repl 轉自:http://blog.csdn.net/nicewuranran/article/details/51793760 No-SQL之Redis 介紹 Redis是一
JDK命令行監控和故障處理工具
快照 文件 令行 ces 垃圾 編譯 監控 align con JDK監控和故障處理工具 名稱 主要作用 jps JVM Process Status Tool,顯示指定系統內所有的HotSpot虛擬機進程。 jstat JVM Statistics Moni
Linux運維常見故障排查和處理的33個技巧匯總
login directory 安全系統 很大的 hfile 系統損壞 iptables open 實踐 作為linux運維,多多少少會碰見這樣那樣的問題或故障,從中總結經驗,查找問題,匯總並分析故障的原因,這是一個Linux運維工程師良好的習慣。每一次技術的突破,都經歷著
大數據之---hadoop常用命令大全終極篇
大數據 Hadoop 軟件環境 RHEL6.8 hadoop2.8.1 apache-maven-3.3.9findbugs-1.3.9 protobuf-2.5.0.tar.gz jdk-8u45(操作環境root安裝啟動的hadoop)hadoop fs == hdfs dfs 將文件上傳至ha
Linux常用命令———文件和目錄操作命令(18個)
系統/運維 Linux 文件和目錄操作命令(18個) ls(列出目錄內容和屬性) 全拼list,功能是列出目錄的內容及其內容屬性信息。-l(long) 長格式 註:-l 顯示的時間是mtime-d --directorys當遇到目錄時列出目錄本身而非目錄內的文件
kubectl常用命令
sca 默認 ide containe all ice scale exe name command kubectl kubectl 輸出格式 顯示Pod的更多信息 kubectl get pod <pod-name> -o wide 以yaml格式顯示Po
redis的常用命令、問題和一些快取清理
Q、C盤空間不足 解決方式:多資料夾檢視大小,逐步縮小方位, 最終定位位置: 快取清理目錄:C:\Windows\ServiceProfiles\NetworkService\AppData\Local\Redis [圖片] Q、檢視redis版本和redis埠: 1
Linxu基礎之Ubuntu常用命令記錄
進入root模式 sudo -i 安裝和解除安裝軟體 sudo apt-get install sudo apt-get remove 清空終端 clear 顯示日期與時間的命令: date 顯示日曆的命令: cal 簡單好用的計算器: bc