• 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)
  • 相关阅读:
    android studio首次运行出错
    分享4种CSS3效果(360度旋转、旋转放大、放大、移动)
    重温CSS:Border属性
    CSS3之过渡Transition
    ASP.NET(C#)--Repeater中生成“序号”列
    Android开发过程问题集锦(Continuous updating)
    ZOJ Problem Set Vol 1(Update paste)
    MapReduce基本原理及应用
    Tensorflow之基于MNIST手写识别的入门介绍[转载]
    Tensorflow 计算模型——计算图
  • 原文地址:https://www.cnblogs.com/51wansheng/p/10249182.html
Copyright © 2020-2023  润新知