kubernetes(k8s)kubectl使用詳解


一、kubectl概述

kubectl是一個用於操作kubernetes集群的命令行接口,通過利用kubectl的各種命令可以實現各種功能。

二、通過kubect命令工具創建容器:

  在minion運行容器(nginx):

角色 IP  
master/etcd 192.168.10.5
node-1 192.168.10.8
node-2 192.168.10.9

 

 

 

 

 

 

1、檢查集群節點,及服務健康狀態:

[root@master ~]# kubectl get node
NAME           STATUS    AGE
192.168.10.8   Ready     22h
192.168.10.9   Ready     21h

[root@master ~]# kubectl get cs
NAME                 STATUS    MESSAGE              ERROR
scheduler            Healthy   ok                   
controller-manager   Healthy   ok                   
etcd-0               Healthy   {"health": "true"} 

 

2、在node-1和node-2節點服務器上下載docker鏡像:

[root@node-1 ~]# docker pull docker.io/nginx 
[root@node-1 ~]# docker pull docker.io/tianyebj/pod-infrastructure


#這里需要打一個registry.access.redhat.com/rhel7/pod-infrastructure:latest 的tag
[root@node-1 ~]# docker tag docker.io/tianyebj/pod-infrastructure registry.access.redhat.com/rhel7/pod-infrastructure:latest

 


# 這里首先會去檢查本地目錄鏡像名稱,如果沒有會去拉去這個鏡像,所以在本地把下載好的鏡像指向這個名稱

[root@node-1 ~]# cat /etc/kubernetes/kubelet |grep "KUBELET_POD_INFRA_CONTAINER" KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=registry.access.redhat.com/rhel7/pod-infrastructure:latest"

 

查看下載鏡像:

[root@node-1 ~]# docker images
REPOSITORY                                            TAG                 IMAGE ID            CREATED             SIZE
docker.io/nginx                                       latest              7042885a156a        12 days ago         109 MB
docker.io/ubuntu                                      latest              1d9c17228a9e        12 days ago         86.7 MB
docker.io/tianyebj/pod-infrastructure                 latest              34d3450d733b        23 months ago       205 MB
registry.access.redhat.com/rhel7/pod-infrastructure   latest              34d3450d733b        23 months ago       205 MB

3、創建一個容器:

語法:   kubectl run NAME --image=image [--env="key=value"] [--port=port] [--replicas=replicas]

kubectl run 和docker run 都是來啟動運行容器:

參數說明:

  • --image :指定docker運行的容器鏡像
  • --env : docker環境變量
  •  --port : 映射端口
  • --replicas  :  副本數

啟動pod:

[root@master cgroup]# kubectl run nginx --image=docker.io/nginx --replicas=1 --port=900 deployment "nginx" created

  #查看生成的pod,kubernetes將容器運行在pod中以方便實施卷和網絡共享等管理

[root@master cgroup]# kubectl get deployment
NAME      DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
nginx     1         1         1            0           1m

注:使用docker.io/nginx鏡像  ,--port=暴露容器端口 9000 ,設置副本數1

注: 如果docker.io/nginx鏡像沒有,那么node1和node2會自動在dockerhub上下載。也可以改成自己的私有倉庫地址:--image= 192.168.10.5:5000/nginx:1.13

 

查看運行狀態:

[root@master ~]# kubectl get pods
NAME                     READY     STATUS    RESTARTS   AGE
nginx-2187705812-7btdb   1/1       Running   0          50m

 

同時在node-1節點服務器查看容器是否運行:

通過describe命令 查看描述信息

[root@master ~]# kubectl describe pod nginx|grep Node
Node: 192.168.10.8/192.168.10.8

 

[root@node-1 ~]# docker ps
CONTAINER ID        IMAGE                                                        COMMAND                  CREATED             STATUS              PORTS               NAMES
ce019e387cae        docker.io/nginx                                              "nginx -g 'daemon ..."   43 minutes ago      Up 43 minutes                           k8s_nginx.92d20176_nginx-2187705812-7btdb_default_e24bf824-14c3-11e9-88ba-000c2953a750_3f14884e
a68ee7e56e7d        registry.access.redhat.com/rhel7/pod-infrastructure:latest   "/pod"                   44 minutes ago      Up 44 minutes                           k8s_POD.17af0ba2_nginx-2187705812-7btdb_default_e24bf824-14c3-11e9-88ba-000c2953a750_281d9235

 

pods常見的狀態:

  I、  ContainerCreating  #容器創建  

  注:如果這里pod是ContainerCreating  ,檢查要運行的容器鏡像是否存在,或其他問題,通過  kubectl describe pod nginx 命令查看詳細信息

 

  II、ImagePullBackOff  #從后端把鏡像拉取到本地

  注:如果這里pod沒有正常運行,都是因為docker hub沒有連接上,導致鏡像沒有下載成功,這時,可以在node節點上把相關鏡像手動上傳一下或把docker源換成阿里雲的。

  III、terminating  ['tɜ:mɪneɪtɪŋ]  #終止 。當刪除pod時的狀態

  V、Running :  容器正在運行中

 

4、使用kubectl delete刪除創建的對象

4.1、刪除POD:

[root@master ~]# kubectl get pods
NAME                     READY     STATUS    RESTARTS   AGE
nginx-2187705812-7btdb   1/1       Running   0          1h
[root@master
~]# kubectl delete pod nginx-2187705812-7btdb pod "nginx-2187705812-7btdb" deleted
[root@master
~]# kubectl get pods NAME READY STATUS RESTARTS AGE nginx-2187705812-qjp31 0/1 ContainerCreating 0 3s
[root@master
~]# kubectl describe pod nginx|grep Node Node: 192.168.10.9/192.168.10.9

當我們使用delete刪除pod時,可以看到kubectl又重新創建啟動一個POD ,而且我們通過describe指令看到pod已經運行在node-2服務器上了,這是正是replicas為1的作用,平台會一直保證有一個副本在運行

 

4.2、刪除deployment

直接刪除pod觸發了replicas的確保機制,所以需要我們直接刪除deployment
[root@master ~]# kubectl delete deployment nginx deployment "nginx" deleted
[root@master
~]# kubectl get pods No resources found.

 三、使用yaml文件生成deployment

  • kubectl 常用命令和參數說明:
  • 命令              說明
  • kubectl run     運行一個pod
  • kubectl delete  刪除一個POD
  • kubectl get     查看pod相關信息
  • kubectl create    創建deployment
  • kubectl logs               取得pod中容器的log信息
  • kubectl exec               在pod中執行一條命令
  • kubectl cp                  從容器拷出或向容器拷入文件
  • kubectl attach            Attach到一個運行中的容器上,實時查看容器消息

使用kubectl run在設定很復雜的需求時,需要非常長的一條語句,也很容易出錯,也沒法保存。所以更多場景下會使用yaml或者json文件。

1、兩個node-1和node-2下載docker鏡像:

[root@node-2 kubernetes]# docker pull docker.io/mysql/mysql-server

2、編寫MySQL啟動的yaml文件:

kind: Deployment   #使用deployment創建一個pod資源
apiVersion: extensions/v1beta1    #api版本
metadata:  
  name: mysql     #deployment的名稱,全局唯一
spec:
  replicas: 1     # Pod副本期待數量,1表示只運行一個pod,里面一個容器
  template:       #根據此模板創建Pod的副本(實例)
    metadata:
      labels:     #符合目標的Pod擁有此標簽。默認和name的值一樣
        name: mysql
    spec:
      containers:    # Pod中容器的定義部分
      - name: mysql  #容器的名稱
        image: docker.io/mysql/mysql-server  #獲取的docker鏡像
        imagePullPolicy: IfNotPresent
               #支持三種ImagePullPolicy:

                #  Always:不管鏡像是否存在都會進行一次拉取。
                #  Never:不管鏡像是否存在都不會進行拉取
                #  IfNotPresent:只有鏡像不存在時,才會進行鏡像拉取。
        ports:
        - containerPort: 3306   #容器暴露的端口號
          protocol: TCP
        env:                 #注入到容器的環境變量
          - name: MYSQL_ROOT_PASSWORD
            value: "123456"
kind: Deployment
apiVersion: extensions/v1beta1
metadata:
  name: mysql
spec:
  replicas: 1
  template:
    metadata:
      labels:
        name: mysql
    spec:
      containers:
      - name: mysql
        image: docker.io/mysql/mysql-server
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 3306
          protocol: TCP
        env:
          - name: MYSQL_ROOT_PASSWORD
            value: "123456"
mysql-deployment

3、kubectl  create 創建

 

[root@master ~]# kubectl create -f mysql-deployment.yaml
deployment "mysql" created

#使用get參數查看pod詳細信息 [root@master
~]# kubectl get pods NAME READY STATUS RESTARTS AGE mysql-3013141301-2000x 1/1 Running 0 12s [root@master ~]# kubectl get deployment NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE mysql 1 1 1 1 1m

注:當一個目錄下,有多個yaml文件的時候,使用kubectl create -f 目錄 的方式一下全部創建

 4、  kubectl get pod -o wide  命令

[root@master ~]# kubectl get pod -o wide
NAME                     READY     STATUS    RESTARTS   AGE       IP            NODE
mysql-3013141301-2000x   1/1       Running   0          5m        10.255.18.3   192.168.10.8

    該參數可以查看更詳細的信息,比如看到pod運行的節點服務器、IP;

在node-1上查看運行的容器MySQL

[root@node-1 ~]# docker ps
CONTAINER ID        IMAGE                                                        COMMAND                  CREATED             STATUS                    PORTS               NAMES
4cde1e00cb85        docker.io/mysql/mysql-server                                 "/entrypoint.sh my..."   10 minutes ago      Up 10 minutes (healthy)                       k8s_mysql.87212679_mysql-3013141301-2000x_default_84289d45-14dc-11e9-88ba-000c2953a750_9a34c7d8
10fff4f9ba9f        registry.access.redhat.com/rhel7/pod-infrastructure:latest   "/pod"                   10 minutes ago      Up 10 minutes                                 k8s_POD.1d520ba5_mysql-3013141301-2000x_default_84289d45-14dc-11e9-88ba-000c2953a750_be91bf03

5、kubectl logs 查看pod中容器日志信息:

[root@master ~]# kubectl get pods
NAME                     READY     STATUS    RESTARTS   AGE
mysql-3013141301-2000x   1/1       Running   0          19m
[root@master
~]# kubectl logs mysql-3013141301-2000x [Entrypoint] MySQL Docker Image 8.0.13-1.1.8 [Entrypoint] Initializing database 2019-01-10T13:32:27.838555Z 0 [System] [MY-013169] [Server] /usr/sbin/mysqld (mysqld 8.0.13) initializing of server in progress as process 20 2019-01-10T13:32:32.491456Z 5 [Warning] [MY-010453] [Server] root@localhost is created with an empty password ! Please consider switching off the --initialize-insecure option.

6、kubectl exec 在pod中執行一條命令

[root@master ~]# kubectl exec -it mysql-3013141301-2000x ls /
bin                etc             lib64          proc    sys
boot                healthcheck.cnf  media          root    tmp
dev                healthcheck.sh   mnt          run    usr
docker-entrypoint-initdb.d  home         mysql-init-complete  sbin    var
entrypoint.sh            lib             opt          srv

#進入容器環境 [root@master
~]# kubectl exec -it mysql-3013141301-2000x /bin/bash bash-4.2# ls bin dev entrypoint.sh healthcheck.cnf home lib64 mnt opt root sbin sys usr boot docker-entrypoint-initdb.d etc healthcheck.sh lib media mysql-init-complete proc run srv tmp var

7、kubectl cp   用於從容器與物理機文件的拷貝

#容器需要安裝tar二進制文件方能執行kuberctl cp

[root@master ~]# kubectl cp --help
Copy files and directories to and from containers.

Examples:
#
!!!Important Note!!! # Requires that the 'tar' binary is present in your container # image. If 'tar' is not present, 'kubectl cp' will fail.
語法: # Copy
/tmp/foo_dir local directory to /tmp/bar_dir in a remote pod in the default namespace kubectl cp /tmp/foo_dir <some-pod>:/tmp/bar_dir # Copy /tmp/foo local file to /tmp/bar in a remote pod in a specific container kubectl cp /tmp/foo <some-pod>:/tmp/bar -c <specific-container>

在容器里安裝tar命令:

[root@master ~]# kubectl exec -it mysql-3013141301-2000x /bin/bash

bash
-4.2# yum -y install tar
從容器拷貝文件到物理機
[root@master ~]# kubectl cp mysql-3013141301-2000x:/etc/hosts ./hosts

從物理機拷貝文件到容器 [root@master
~]# kubectl cp hosts mysql-3013141301-2000x:/tmp/hosts

8、kubectl attath 用於動態查看pod中容器日志信息

[root@master ~]# kubectl attach mysql-3013141301-2000x

 

四、使用kubectl管理集群中deployment資源和service服務

  • kubectl相關命令參數如下:
  • kubectl   edit 編輯服務器側資源
  • kubectl   replace   使用文件名或者標准輸入資源
  • kubectl   patch      部分更新資源相關信息
  • kubectl   apply      使用文件或者標准輸入更改配置信息
  • kubectl   scale       重新設定Deployment/ReplicaSet/RC/Job的size
  • kubectl   autoscale       Deployment/ReplicaSet/RC的自動擴展設定
  • kubectl   cordon   設定node不可使用
  • kubectl   uncordon      設定node可以使用
  • kubectl   drain      設定node進入維護模式

1、下載測試鏡像:

在node-1和node-2 下載測試鏡像
[root@node-2 ~]# docker pull nginx [root@node-2 ~]# docker pull docker.io/richarvey/nginx-php-fpm

 

2、編寫部署nginx.yaml文件

#部署nginx服務
[root@master ~]# cat nginx-deployment.yaml kind: Deployment apiVersion: extensions/v1beta1 metadata: name: nginx spec: replicas: 1 template: metadata: labels: name: nginx spec: containers: - name: nginx image: docker.io/nginx:latest imagePullPolicy: IfNotPresent ports: - containerPort: 80 protocol: TCP
#服務端口映射 [root@master
~]# cat nginx-server.yaml kind: Service apiVersion: v1 metadata: name: nginx labels: name: nginx spec: type: NodePort ports: - protocol: TCP nodePort: 31001 targetPort: 80 port: 80 selector: name: nginx

3、創建pod:

[root@master ~]# kubectl create -f nginx-deployment.yaml

[root@master
~]# kubectl create -f nginx-server.yaml

查看創建的server、pod

[root@master ~]# kubectl get deploy
NAME      DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
mysql     1         1         1            1           1h
nginx     1         1         1            1           10m
[root@master
~]# kubectl get pods NAME READY STATUS RESTARTS AGE mysql-3013141301-2000x 1/1 Running 0 1h nginx-1011335894-4ngml 1/1 Running 0 10m [root@master ~]# kubectl get service NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes 10.254.0.1 <none> 443/TCP 1d nginx 10.254.49.161 <nodes> 80:31001/TCP 8m
[root@master
~]# kubectl get pod -o wide NAME READY STATUS RESTARTS AGE IP NODE mysql-3013141301-2000x 1/1 Running 0 1h 10.255.18.3 192.168.10.8 nginx-1011335894-4ngml 1/1 Running 0 11m 10.255.94.2 192.168.10.9

通過查看以上信息,我們可以看到nginx服務在node-2上運行並把80端口映射到主機31001端口

[root@node-2 kubernetes]# netstat -tunlp|grep 31001
tcp6       0      0 :::31001                :::*                    LISTEN      21843/kube-proxy 

訪問服務:

[root@master ~]# kubectl get pod -o wide
NAME                     READY     STATUS    RESTARTS   AGE       IP            NODE
mysql-3013141301-2000x   1/1       Running   0          1h        10.255.18.3   192.168.10.8
nginx-1011335894-4ngml   1/1       Running   0          11m       10.255.94.2   192.168.10.9

修改默認主頁
[root@master
~]# kubectl exec -it nginx-1011335894-4ngml bash
root@nginx
-1011335894-4ngml:/# echo "kubernetes test 2018" > /usr/share/nginx/html/index.html root@nginx-1011335894-4ngml:/#

4、kubectl edit 用於編輯服務器上的資源

   例1:查看service值。  -o參數指定輸出的消息為yaml類型

 

[root@master ~]# kubectl get service nginx -o yaml
apiVersion: v1
kind: Service
metadata:
  creationTimestamp: 2019-01-10T14:41:21Z
  labels:
    name: nginx
  name: nginx
  namespace: default
  resourceVersion: "116573"
  selfLink: /api/v1/namespaces/default/services/nginx
  uid: cc4cf987-14e5-11e9-88ba-000c2953a750
spec:
  clusterIP: 10.254.49.161
  ports:
  - nodePort: 31001
    port: 80
    protocol: TCP
    targetPort: 80
  selector:
    name: nginx
  sessionAffinity: None
  type: NodePort
status:
  loadBalancer: {}
類似vim 打開服務配置文件進項修改,然后保存
[root@master ~]# kubectl edit service nginx service "nginx" edited

    改:19   - nodePort: 31001

    為:19   - nodePort: 31002

 

查看POD端口映射信息已經改變

[root@master ~]# kubectl get service
NAME         CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
kubernetes   10.254.0.1      <none>        443/TCP        1d
nginx        10.254.49.161   <nodes>       80:31002/TCP   23m

通過31002端口訪問服務:

注:edit編輯的是運行環境的設定而不需要停止服務。

 

5、kubctl replace 用於替換,我們使用上個例子中的service的port,把它改為31003

[root@master ~]# kubectl get service nginx -o yaml > nginx_replace.yaml

查看導出文件並修改:

[root@master ~]# cat nginx_replace.yaml 
apiVersion: v1
kind: Service
metadata:
  creationTimestamp: 2019-01-10T14:41:21Z
  labels:
    name: nginx
  name: nginx
  namespace: default
  resourceVersion: "118277"
  selfLink: /api/v1/namespaces/default/services/nginx
  uid: cc4cf987-14e5-11e9-88ba-000c2953a750
spec:
  clusterIP: 10.254.49.161
  ports:
  - nodePort: 31003
    port: 80
    protocol: TCP
    targetPort: 80
  selector:
    name: nginx
  sessionAffinity: None
  type: NodePort
status:
  loadBalancer: {}

我們把映射端口改為31003,然后保存退出;使用replace 命令

[root@master ~]# kubectl replace -f nginx_replace.yaml
service "nginx" replaced
[root@master
~]# kubectl get service NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes 10.254.0.1 <none> 443/TCP 1d nginx 10.254.49.161 <nodes> 80:31003/TCP 2h

 

6、kuberctl patch  當修改一部分設定時,使用patch很方便。比如:給pod換個image鏡像。

給nginx容器替換一個支持php的docker鏡像

[root@master ~]# kubectl patch pod nginx-1011335894-4ngml -p '{"spec":{"containers":[{"name":"nginx","image":"docker.io/richarvey/nginx-php-fpm"}]}}'
"nginx-1011335894-4ngml" patched

[root@master ~]# kubectl get service
NAME         CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
kubernetes   10.254.0.1      <none>        443/TCP        1d
nginx        10.254.49.161   <nodes>       80:31003/TCP   2h

 

通過瀏覽器訪問31003端口:

 

7、kubectl apply 用於使用文件或者標准輸入來更改配置信息

[root@master ~]# vim nginx-server.yaml 
把    nodePort: 31001
改為    nodePort: 31004

用apply命令加載修改的配置:

可以見到端口修改的范圍30000-32767
[root@master ~]# kubectl apply -f nginx-server.yaml The Service "nginx" is invalid: spec.ports[0].nodePort: Invalid value: 8080: provided port is not in the valid range. The range of valid ports is 30000-32767 [root@master ~]# vim nginx-server.yaml
[root@master
~]# kubectl apply -f nginx-server.yaml service "nginx" configured
[root@master
~]# kubectl get service NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes 10.254.0.1 <none> 443/TCP 1d nginx 10.254.49.161 <nodes> 80:31004/TCP 2h

 

8、kubectl scale   用於橫向擴展,是kubernetes或者swarm這類容器編輯平台的重要功能之一

實現環境: 之前已經設定nginx的replica副本為1

[root@master ~]# kubectl get pod -o wide
NAME                     READY     STATUS    RESTARTS   AGE       IP            NODE
mysql-3013141301-2000x   1/1       Running   1          3h        10.255.18.2   192.168.10.8
nginx-1011335894-4ngml   1/1       Running   2          2h        10.255.94.2   192.168.10.9

[root@master ~]# kubectl get deployment
NAME      DESIRED   CURRENT   UP-TO-DATE AVAILABLE AGE mysql 1 1 1 1 3h nginx 1 1 1 1 2h

執行scale命令,使用scale命令進行橫向擴展,將原本為1的副本提高到3

[root@master ~]# kubectl scale --current-replicas=1 --replicas=3 deployment/nginx
deployment "nginx" scaled
[root@master
~]# kubectl get deployment NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE mysql 1 1 1 1 3h nginx 3 3 3 3 2h

我們可以看到nginx的副本分布,node-1 運行了一個nginx,node-2運行了兩個nginx

[root@master ~]# kubectl get pod -o wide
NAME                     READY     STATUS    RESTARTS   AGE       IP            NODE
mysql-3013141301-2000x   1/1       Running   1          3h        10.255.18.2   192.168.10.8
nginx-1011335894-4ngml   1/1       Running   2          2h        10.255.94.2   192.168.10.9
nginx-1011335894-lhm28   1/1       Running   0          52s       10.255.18.3   192.168.10.8
nginx-1011335894-xtmbb   1/1       Running   0          52s       10.255.94.3   192.168.10.9

9、kubectl autoscale 

用於自動擴展確認,跟scale不同的是前者還是需要手動執行,而autoscale則會根據負載進行調解。而這條命令則可以對Deployment/ReplicaSet/RC進行設定,通過最小值和最大值的指定進行設定,這里只是給出執行的結果,不再進行實際的驗證。

[root@master ~]# kubectl autoscale deployment nginx --min=2 --max=5
deployment "nginx" autoscaled

當然使用還會有一些限制,比如當前3個,設定最小和最大值為2的,會報以一下錯誤:

[root@master ~]# kubectl autoscale deployment nginx --min=2 --max=2
Error from server (AlreadyExists): horizontalpodautoscalers.autoscaling "nginx" already exists

 

10、kubectl cordon 與 kubectl  uncordon

在實際維護的時候會出現某個node壞掉,或者做一些處理,暫時不能讓生成的pod在此node上運行,需要通知kubernetes讓其不要創建過來,這條命令就是cordon,uncordon則是取消這個要求。

設定node2上不再運行新的pod實例,使用get node確認,其狀態顯示SchedulingDisabled

[root@master ~]# kubectl get nodes -o wide
NAME           STATUS    AGE       EXTERNAL-IP
192.168.10.8   Ready     1d        <none>
192.168.10.9   Ready     1d        <none>

[root@master ~]# kubectl cordon 192.168.10.9
node "192.168.10.9" cordoned

[root@master ~]# kubectl get nodes -o wide
NAME           STATUS                     AGE       EXTERNAL-IP
192.168.10.8   Ready                      1d        <none>
192.168.10.9   Ready,SchedulingDisabled   1d        <none>

執行scale命令,再次執行橫向擴展命令,看是否會有pod漂到node2這台機器上,結果發現只有之前的一個pod,再沒有新的pod漂過去。

[root@master ~]# kubectl get nodes -o wide
NAME           STATUS                     AGE       EXTERNAL-IP
192.168.10.8   Ready                      1d        <none>
192.168.10.9   Ready,SchedulingDisabled   1d        <none>
[root@master ~]# kubectl scale --replicas=6 deployment/mysql deployment "mysql" scaled

MySQL的6個副本全部運行在node-1 [root@master
~]# kubectl get pod -o wide NAME READY STATUS RESTARTS AGE IP NODE mysql-3013141301-2000x 1/1 Running 1 4h 10.255.18.2 192.168.10.8 mysql-3013141301-5679l 1/1 Running 0 19s 10.255.18.8 192.168.10.8 mysql-3013141301-9736f 1/1 Running 0 19s 10.255.18.7 192.168.10.8 mysql-3013141301-d0lgh 1/1 Running 0 19s 10.255.18.4 192.168.10.8 mysql-3013141301-kgtrz 1/1 Running 0 19s 10.255.18.6 192.168.10.8 mysql-3013141301-qst0p 1/1 Running 0 19s 10.255.18.5 192.168.10.8 nginx-1011335894-4ngml 1/1 Running 2 3h 10.255.94.2 192.168.10.9 nginx-1011335894-lhm28 1/1 Running 0 28m 10.255.18.3 192.168.10.8 nginx-1011335894-xtmbb 1/1 Running 0 28m 10.255.94.3 192.168.10.9

執行uncordon解除封鎖命令

[root@master ~]# kubectl uncordon 192.168.10.9
node "192.168.10.9" uncordoned

使用uncordon命令解除對node2機器的限制,通過get node確認狀態也已經正常。

[root@master ~]# kubectl get nodes -o wide
NAME           STATUS    AGE       EXTERNAL-IP
192.168.10.8   Ready     1d        <none>
192.168.10.9   Ready     1d        <none>

 

11、kubectl drain 用於對某個node結點進行維護

  drain兩個作用:

    1. 設定此node不可以使用(cordon)

    2. evict驅逐pod到他正常的node節點上

 

事前准備:

[root@master ~]# kubectl delete deployment nginx

將nginx 的副本設定為4

[root@master ~]# kubectl create -f nginx-deployment.yaml 
deployment "nginx" created
[root@master
~]# kubectl scale --replicas=4 deployment nginx deployment "nginx" scaled
發現兩邊分別運行了兩個
[root@master
~]# kubectl get pod -o wide NAME READY STATUS RESTARTS AGE IP NODE nginx-1011335894-5wlvs 1/1 Running 0 9s 10.255.94.3 192.168.10.9 nginx-1011335894-crl6j 1/1 Running 0 9s 10.255.18.3 192.168.10.8 nginx-1011335894-g7rs0 1/1 Running 0 23s 10.255.18.2 192.168.10.8 nginx-1011335894-wft9s 1/1 Running 0 21s 10.255.94.2 192.168.10.9

 

執行drain命令,讓node2不可用,並把node2上已經運行pod驅逐到其他node1上:

[root@master ~]# kubectl drain 192.168.10.9
node "192.168.10.9" cordoned
pod "nginx-1011335894-5wlvs" evicted
pod "nginx-1011335894-wft9s" evicted
node "192.168.10.9" drained

把node2上的pod刪除后,k8s會根據replicas的機制,在清退pod和設定node時,在其他結點上生成新的pod。這時就可以對node2節點進行維護了,維護好后,重新uncordon即可。

[root@master ~]# kubectl get node
NAME           STATUS                     AGE
192.168.10.8   Ready                      1d
192.168.10.9   Ready,SchedulingDisabled   1d
[root@master
~]# kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE nginx-1011335894-83vxq 1/1 Running 0 5m 10.255.18.5 192.168.10.8 nginx-1011335894-crl6j 1/1 Running 0 8m 10.255.18.3 192.168.10.8 nginx-1011335894-g7rs0 1/1 Running 0 8m 10.255.18.2 192.168.10.8 nginx-1011335894-swb88 1/1 Running 0 5m 10.255.18.4 192.168.10.8

等修改好后,現在恢復可用:

[root@master ~]#  kubectl uncordon 192.168.10.9
[root@master ~]# kubectl get node -o wide
NAME           STATUS    AGE       EXTERNAL-IP
192.168.10.8   Ready     1d        <none>
192.168.10.9   Ready     1d        <none>

 

五、kubectl使用命令總結:

kubectl相關命令參數如下:

    • kubectl run   運行一個pod
    • kubectl delete    刪除一個POD
    • kubectl get   查看pod相關信息
    • kubectl create    創建deployment
    • kubectl logs    取得pod中容器的log信息
    • kubectl exec    在pod中執行一條命令
    • kubectl cp    從容器拷出或向容器拷入文件
    • kubectl attach    Attach到一個運行中的容器上,實時查看容器消息
    • kubectl describe   獲得resource集群相關的信息
    • kubectl edit   編輯服務器側資源
    • kubectl replace   使用文件名或者標准輸入資源
    • kubectl patch    部分更新資源相關信息
    • kubectl apply    使用文件或者標准輸入更改配置信息
    • kubectl scale    重新設定Deployment/ReplicaSet/RC/Job的size
    • kubectl autoscale    Deployment/ReplicaSet/RC的自動擴展設定
    • kubectl cordon    設定node不可使用
    • kubectl uncordon    設定node可以使用
    • kubectl drain    設定node進入維護模式
    • kucectl help    查看幫助信息

kubectl get命令能夠確認的信息類別:

  • deployments (縮寫 deploy)
  • events (縮寫 ev)
  • namespaces (縮寫 ns)
  • nodes (縮寫 no)
  • pods (縮寫 po)
  • replicasets (縮寫 rs)
  • replicationcontrollers (縮寫 rc)
  • services (縮寫 svc)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM