zoukankan      html  css  js  c++  java
  • Kubernetes之(五)快速部署应用

    Kubernetes之(五)快速部署应用

    kubectl命令介绍

    [root@master ~]# kubectl --help
    kubectl controls the Kubernetes cluster manager. 
    
    Find more information at: https://kubernetes.io/docs/reference/kubectl/overview/
    
    Basic Commands (Beginner):
      create         Create a resource from a file or from stdin.
      expose         使用 replication controller, service, deployment 或者 pod 并暴露它作为一个 新的 Kubernetes Service
      run            在集群中运行一个指定的镜像
      set            为 objects 设置一个指定的特征
    
    Basic Commands (Intermediate):
      explain        查看资源的文档
      get            显示一个或更多 resources
      edit           在服务器上编辑一个资源
      delete         Delete resources by filenames, stdin,resources and names, or
    by resources and label selector
    
    Deploy Commands:
      rollout        Manage the rollout of a resource
      scale          为 Deployment, ReplicaSet, Replication Controller 或者 Job设置一个新的副本数量
      autoscale      自动调整一个 Deployment, ReplicaSet, 或者ReplicationController 的副本数量
    
    Cluster Management Commands:
      certificate    修改 certificate 资源.
      cluster-info   显示集群信息
      top            Display Resource (CPU/Memory/Storage) usage.
      cordon         标记 node 为 unschedulable
      uncordon       标记 node 为 schedulable
      drain          Drain node in preparation for maintenance
      taint          更新一个或者多个 node 上的 taints
    
    Troubleshooting and Debugging Commands:
      describe       显示一个指定 resource 或者 group 的 resources 详情
      logs           输出容器在 pod 中的日志
      attach         Attach 到一个运行中的 container
      exec           在一个 container 中执行一个命令
      port-forward   Forward one or more local ports to a pod
      proxy          运行一个 proxy 到 Kubernetes API server
      cp             复制 files 和 directories 到 containers
    和从容器中复制 files 和 directories.
      auth           Inspect authorization
    
    Advanced Commands:
      diff           Diff live version against would-be applied version
      apply          通过文件名或标准输入流(stdin)对资源进行配置
      patch          使用 strategic merge patch 更新一个资源的 field(s)
      replace        通过 filename 或者 stdin替换一个资源
      wait           Experimental: Wait for a specific condition on one or many
    resources.
      convert        在不同的 API versions 转换配置文件
    
    Settings Commands:
      label          更新在这个资源上的 labels
      annotate       更新一个资源的注解
      completion     Output shell completion code for the specified shell (bash or
    zsh)
    
    Other Commands:
      api-resources  Print the supported API resources on the server
      api-versions   Print the supported API versions on the server, in the form of"group/version"
      config         修改 kubeconfig 文件
      plugin         Provides utilities for interacting with plugins.
      version        输出 client 和 server 的版本信息
    
    Usage:
      kubectl [flags] [options]
    
    Use "kubectl <command> --help" for more information about a given command.
    Use "kubectl options" for a list of global command-line options (applies to all
    commands).
    

    kubectl run命令行部署应用

    语法:

    Usage:
     kubectl run NAME --image=image [--env="key=value"] [--port=port]
    [--replicas=replicas] [--dry-run=bool] [--overrides=inline-json] [--command] --
    [COMMAND] [args...] [options]
    

    举例

    [root@master ~]# kubectl run nginx-deploy --image=nginx:1.14-alpine --port=80 --replicas=1 --dry-run=true
    kubectl run --generator=deployment/apps.v1 is DEPRECATED and will be removed in a future version. Use kubectl run --generator=run-pod/v1 or kubectl create instead.
    deployment.apps/nginx-deploy created (dry run)
    #--image 指定镜像
    #--port 暴漏端口
    #--replicas 设置副本数量
    # --dry-run=true 干跑模式,不执行,类似验证,无问题后再执行
    [root@master ~]# kubectl run nginx-deploy --image=nginx:1.14-alpine --port=80 --replicas=1
    deployment.apps/nginx-deploy created
    ## 查看是否创建成功
    #查看deployment
    [root@master ~]# kubectl get deployment
    NAME           READY   UP-TO-DATE   AVAILABLE   AGE
    nginx-deploy   1/1     1            1           30s
    #查看pod
    [root@master ~]# kubectl get pods
    NAME                            READY   STATUS    RESTARTS   AGE
    nginx-deploy-84cbfc56b6-st4tq   1/1     Running   0          72s
    # -o wide 显示更多详细信息
    [root@master ~]# kubectl get pods -o wide 
    NAME                            READY   STATUS    RESTARTS   AGE   IP           NODE     NOMINATED NODE   READINESS GATES
    nginx-deploy-84cbfc56b6-st4tq   1/1     Running   0          98s   10.244.2.2   node02   <none>           <none>
    

    从上面创建的应用可以得知,nginx-deploy应用的pod的ip为10.244.2.2,这是一个pod ip,仅仅可以在集群内部访问,如下:

    [root@master ~]# curl -I 10.244.2.2
    HTTP/1.1 200 OK
    Server: nginx/1.14.2
    Date: Thu, 28 Mar 2019 02:23:42 GMT
    Content-Type: text/html
    Content-Length: 612
    Last-Modified: Fri, 08 Mar 2019 03:09:00 GMT
    Connection: keep-alive
    ETag: "5c81dccc-264"
    Accept-Ranges: bytes
    
    [root@node01 ~]# curl -I 10.244.2.2
    HTTP/1.1 200 OK
    Server: nginx/1.14.2
    Date: Thu, 28 Mar 2019 02:23:48 GMT
    Content-Type: text/html
    Content-Length: 612
    Last-Modified: Fri, 08 Mar 2019 03:09:00 GMT
    Connection: keep-alive
    ETag: "5c81dccc-264"
    Accept-Ranges: bytes
    
    [root@node02 ~]# curl -I 10.244.2.2
    HTTP/1.1 200 OK
    Server: nginx/1.14.2
    Date: Thu, 28 Mar 2019 02:23:46 GMT
    Content-Type: text/html
    Content-Length: 612
    Last-Modified: Fri, 08 Mar 2019 03:09:00 GMT
    Connection: keep-alive
    ETag: "5c81dccc-264"
    Accept-Ranges: bytes
    

    尝试删除Pod

    [root@master ~]# kubectl delete pods nginx-deploy-84cbfc56b6-st4tq
    pod "nginx-deploy-84cbfc56b6-st4tq" deleted
    [root@master ~]# kubectl get pods -o wide
    NAME                            READY   STATUS    RESTARTS   AGE   IP           NODE     NOMINATED NODE   READINESS GATES
    nginx-deploy-84cbfc56b6-w66pw   1/1     Running   0          53s   10.244.2.3   node02   <none>           <none>
    

    可以看到删除Pod后又重新开起了一个Pod,因为pod是被控制器管理的(此处为deployment),当Pod数量不满足控制器的desired值得时候,会自动补全Pod(随机在集群内满足要求得node节点创建),来满足期望值,同样的如果过多也会关掉多余得Pod。

    此时Pod得IP已经发生变化,所以如果需要被外部访问就需要提供一个固定得端点,就是接下来说得Service:

    kubectl expose 通过service暴漏Pod

    语法

    Usage:
      kubectl expose (-f FILENAME | TYPE NAME) [--port=port] [--protocol=TCP|UDP|SCTP] [--target-port=number-or-name]
    [--name=name] [--external-ip=external-ip-of-service] [--type=type] [options]
    #--port=port 这里是服务端口
    #--target-port 容器端口
    #--type=type service类型,分为Custer IP ,NodePort,LoadBalancer,ExternalName,默认是Custer IP
    后面会详细讲解
    

    举例

    #将name为nginx-deploy的deployment暴漏为80端口
    [root@master ~]# kubectl expose deployment nginx-deploy --name=nginx --port=80 --target-port=80 --protocol=TCP                 
    service/nginx-deploy exposed
    #查看服务 services 简写为svc
    [root@master ~]# kubectl get svc
    NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
    kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP   18h
    nginx        ClusterIP   10.98.2.12   <none>        80/TCP    3s    35s
    

    此时在节点访问svc的80端口来访问pod,即使Pod被删除后重建也可以访问

    #Pod在node02上,次数使用node01来访问
    [root@node01 ~]# curl -I 10.98.2.12
    HTTP/1.1 200 OK
    Server: nginx/1.14.2
    Date: Thu, 28 Mar 2019 02:48:13 GMT
    Content-Type: text/html
    Content-Length: 612
    Last-Modified: Fri, 08 Mar 2019 03:09:00 GMT
    Connection: keep-alive
    ETag: "5c81dccc-264"
    Accept-Ranges: bytes
    #删除Pod后再次尝试
    [root@master ~]# kubectl get pods
    NAME                            READY   STATUS    RESTARTS   AGE
    nginx-deploy-84cbfc56b6-w66pw   1/1     Running   0          20m
    [root@master ~]# kubectl delete pods nginx-deploy-84cbfc56b6-w66pw
    pod "nginx-deploy-84cbfc56b6-w66pw" deleted
    [root@master ~]# kubectl get pods -o wide
    NAME                            READY   STATUS    RESTARTS   AGE   IP           NODE     NOMINATED NODE   READINESS GATES
    nginx-deploy-84cbfc56b6-tcssz   1/1     Running   0          6s    10.244.2.4   node02   <none>           <none>
    [root@node01 ~]# curl -I 10.98.2.12
    HTTP/1.1 200 OK
    Server: nginx/1.14.2
    Date: Thu, 28 Mar 2019 02:49:35 GMT
    Content-Type: text/html
    Content-Length: 612
    Last-Modified: Fri, 08 Mar 2019 03:09:00 GMT
    Connection: keep-alive
    ETag: "5c81dccc-264"
    Accept-Ranges: bytes
    

    10.99.146.96这网段依然是集群内部的网段,只能被集群内部客户端访问,外部是无法通过service的ip进行访问。那么针对pod的客户端除了通过service ip访问还可以通过service的名称进行访问,但是前提是需要对service的名称能够进行解析。而解析时是依赖coredns服务的,而我们本地的dns指向并非coredns,如下:

    [root@node02 ~]# curl -I nginx
    curl: (6) Could not resolve host: nginx-deploy; 未知的错误
    #查看节点的dns地址
    [root@node02 ~]# cat /etc/resolv.conf
    # Generated by NetworkManager
    nameserver 114.114.114.114
    nameserver 10.0.0.2
    

    查看coredns的IP地址

    [root@master ~]# kubectl get pods -n kube-system -o wide
    NAME                             READY   STATUS    RESTARTS   AGE   IP           NODE     NOMINATED NODE   READINESS GATES
    coredns-78d4cf999f-6cb69         1/1     Running   0          18h   10.244.1.2   node01   <none>           <none>
    coredns-78d4cf999f-tflpn         1/1     Running   0          18h   10.244.1.3   node01   <none>           <none>
    etcd-master                      1/1     Running   0          18h   10.0.0.10    master   <none>           <none>
    kube-apiserver-master            1/1     Running   0          18h   10.0.0.10    master   <none>           <none>
    kube-controller-manager-master   1/1     Running   0          18h   10.0.0.10    master   <none>           <none>
    kube-flannel-ds-amd64-gtv85      1/1     Running   0          18h   10.0.0.10    master   <none>           <none>
    kube-flannel-ds-amd64-gwbql      1/1     Running   1          18h   10.0.0.12    node02   <none>           <none>
    kube-flannel-ds-amd64-ml7nf      1/1     Running   0          18h   10.0.0.11    node01   <none>           <none>
    kube-proxy-ch4vp                 1/1     Running   0          18h   10.0.0.11    node01   <none>           <none>
    kube-proxy-cz2rf                 1/1     Running   1          18h   10.0.0.12    node02   <none>           <none>
    kube-proxy-kdp7d                 1/1     Running   0          18h   10.0.0.10    master   <none>           <none>
    kube-scheduler-master            1/1     Running   0          18h   10.0.0.10    master   <none>           <none>
    #-n指定名称空间
    

    正常来说,也不会直接访问coredns的Pod的IP来直接访问,也是通过coredns的service进行访问

    [root@master ~]# kubectl get svc -n kube-system 
    NAME       TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)         AGE
    kube-dns   ClusterIP   10.96.0.10   <none>        53/UDP,53/TCP   18h
    

    可以通过这个service ip:10.96.0.10进行解析上面的nginx服务。
    提前准备dig命令 yum install -y bind-utils,这里需要使用完整的服务名称,否则可能由于dns搜索域问题导致失败

    [root@master ~]# dig -t A nginx.default.svc.cluster.local @10.96.0.10
    
    ; <<>> DiG 9.9.4-RedHat-9.9.4-73.el7_6 <<>> -t A nginx.default.svc.cluster.local @10.96.0.10
    ;; global options: +cmd
    ;; Got answer:
    ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 58335
    ;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0
    
    ;; QUESTION SECTION:
    ;nginx.default.svc.cluster.local. IN    A
    
    ;; ANSWER SECTION:
    nginx.default.svc.cluster.local. 5 IN   A       10.98.2.12
    
    ;; Query time: 1 msec
    ;; SERVER: 10.96.0.10#53(10.96.0.10)
    ;; WHEN: 四 3月 28 11:02:11 CST 2019
    ;; MSG SIZE  rcvd: 96
    

    尝试通过集群内pod客户端进行访问:

    [root@master ~]# kubectl run client --image=busybox --replicas=1 -it --restart=Never
    If you don't see a command prompt, try pressing enter.
    / # cat /etc/resolv.conf 
    nameserver 10.96.0.10
    search default.svc.cluster.local svc.cluster.local cluster.local
    options ndots:5
    / # wget -O - -q http://nginx:80
    <!DOCTYPE html>
    <html>
    <head>
    <title>Welcome to nginx!</title>
    <style>
        body {
             35em;
            margin: 0 auto;
            font-family: Tahoma, Verdana, Arial, sans-serif;
        }
    </style>
    </head>
    <body>
    <h1>Welcome to nginx!</h1>
    <p>If you see this page, the nginx web server is successfully installed and
    working. Further configuration is required.</p>
    
    <p>For online documentation and support please refer to
    <a href="http://nginx.org/">nginx.org</a>.<br/>
    Commercial support is available at
    <a href="http://nginx.com/">nginx.com</a>.</p>
    
    <p><em>Thank you for using nginx.</em></p>
    </body>
    </html>
    

    此时name为nginx的service就为name为nginx-deploy的deployment提供了固定访问断电,无论deployment内Pod的增加删除,都不影响访问,使用命令来查看services的详细信息:

    [root@master ~]# kubectl describe svc nginx
    Name:              nginx
    Namespace:         default
    Labels:            run=nginx-deploy
    Annotations:       <none>
    Selector:          run=nginx-deploy
    Type:              ClusterIP
    IP:                10.98.2.12
    Port:              <unset>  80/TCP
    TargetPort:        80/TCP
    Endpoints:         10.244.2.4:80
    Session Affinity:  None
    Events:            <none>
    
    #Endpoints: Pod的IP地址
    

    无论Pod怎么增删,只要标Labels存在run=nginx-deploy的 就会被svc锁访问。

    [root@master ~]# kubectl get pods --show-labels
    NAME                            READY   STATUS    RESTARTS   AGE   LABELS
    client                          1/1     Running   0          28m   run=client
    nginx-deploy-84cbfc56b6-tcssz   1/1     Running   0          51m   pod-template-hash=84cbfc56b6,run=nginx-deploy
    

    run=nginx-deploy就是这个应用的标签,所以当pod的改变,并不会影响service的访问。

    kubectl scale 动态伸缩应用副本

    语法

    Usage:
      kubectl scale [--resource-version=version] [--current-replicas=count] --replicas=COUNT (-f FILENAME | TYPE NAME)
    

    举例

    #创建新的deployment
    [root@master ~]# kubectl run myapp --image=ikubernetes/myapp:v1 --replicas=2
    kubectl run --generator=deployment/apps.v1 is DEPRECATED and will be removed in a future version. Use kubectl run --generator=run-pod/v1 or kubectl create instead.
    deployment.apps/myapp created
    [root@master ~]# kubectl get deployment
    NAME           READY   UP-TO-DATE   AVAILABLE   AGE
    myapp          2/2     2            2           48s
    nginx-deploy   1/1     1            1           3h58m
    #查看pod
    [root@master ~]# kubectl get pods -o wide
    NAME                            READY   STATUS      RESTARTS   AGE     IP           NODE     NOMINATED NODE   READINESS GATES
    client                          0/1     Completed   0          3h2m    10.244.2.5   node02   <none>           <none>
    myapp-9b4987d5-98k45            1/1     Running     0          64s     10.244.1.4   node01   <none>           <none>
    myapp-9b4987d5-ncpb7            1/1     Running     0          64s     10.244.2.6   node02   <none>           <none>
    nginx-deploy-84cbfc56b6-tcssz   1/1     Running     0          3h26m   10.244.2.4   node02   <none>           <none>
    

    此时使用客户端访问

    / # wget -O - -q 10.244.2.6/hostname.html
    myapp-9b4987d5-ncpb7
    / # wget -O - -q 10.244.1.4/hostname.html
    myapp-9b4987d5-98k45
    

    为myapp创建service

    [root@master ~]# kubectl expose deployment myapp --name=myapp --port=80 
    service/myapp exposed
    [root@master ~]# kubectl get svc
    NAME         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)   AGE
    kubernetes   ClusterIP   10.96.0.1        <none>        443/TCP   22h
    myapp        ClusterIP   10.104.138.182   <none>        80/TCP    3s
    nginx        ClusterIP   10.98.2.12       <none>        80/TCP    3h21m
    

    所生成的myapp的地址为10.104.138.182,端口暴漏为80,协议默认为TCP
    使用客户端访问myapp服务

    Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
    / # wget -O - -q myapp/hostname.html
    myapp-9b4987d5-98k45
    / # wget -O - -q myapp/hostname.html
    myapp-9b4987d5-98k45
    / # wget -O - -q myapp/hostname.html
    myapp-9b4987d5-ncpb7
    #hostname.html显示的是pod的名字,也是pod的hostname
    

    扩展副本数量

    [root@master ~]# kubectl scale --replicas=5 deployment myapp
    deployment.extensions/myapp scaled
    [root@master ~]# kubectl get pods -o wide
    NAME                            READY   STATUS    RESTARTS   AGE     IP           NODE     NOMINATED NODE   READINESS GATES
    client-f5cdb799f-pklmc          1/1     Running   0          5m46s   10.244.2.7   node02   <none>           <none>
    myapp-9b4987d5-98k45            1/1     Running   0          8m44s   10.244.1.4   node01   <none>           <none>
    myapp-9b4987d5-ck9bt            1/1     Running   0          9s      10.244.2.8   node02   <none>           <none>
    myapp-9b4987d5-gfqjp            1/1     Running   0          9s      10.244.2.9   node02   <none>           <none>
    myapp-9b4987d5-ncpb7            1/1     Running   0          8m44s   10.244.2.6   node02   <none>           <none>
    myapp-9b4987d5-wrp7r            1/1     Running   0          9s      10.244.1.5   node01   <none>           <none>
    nginx-deploy-84cbfc56b6-tcssz   1/1     Running   0          3h33m   10.244.2.4   node02   <none>           <none>
    

    此时使用客户端访问myapp服务

    / # for i in `seq 10000`;do wget -O - -q myapp/hostname.html;sleep 1;done
    myapp-9b4987d5-wrp7r
    myapp-9b4987d5-ncpb7
    myapp-9b4987d5-wrp7r
    myapp-9b4987d5-98k45
    myapp-9b4987d5-wrp7r
    myapp-9b4987d5-98k45
    myapp-9b4987d5-gfqjp
    myapp-9b4987d5-wrp7r
    myapp-9b4987d5-gfqjp
    myapp-9b4987d5-gfqjp
    myapp-9b4987d5-ncpb7
    

    再次修改副本数量为3

    [root@master ~]# kubectl get pods -o wide                   
    NAME                            READY   STATUS        RESTARTS   AGE     IP           NODE     NOMINATED NODE   READINESS GATES
    client-f5cdb799f-pklmc          1/1     Running       0          8m32s   10.244.2.7   node02   <none>           <none>
    myapp-9b4987d5-98k45            1/1     Running       0          11m     10.244.1.4   node01   <none>           <none>
    myapp-9b4987d5-ck9bt            0/1     Terminating   0          2m55s   10.244.2.8   node02   <none>           <none>
    myapp-9b4987d5-gfqjp            0/1     Terminating   0          2m55s   10.244.2.9   node02   <none>           <none>
    myapp-9b4987d5-ncpb7            1/1     Running       0          11m     10.244.2.6   node02   <none>           <none>
    myapp-9b4987d5-wrp7r            1/1     Running       0          2m55s   10.244.1.5   node01   <none>           <none>
    nginx-deploy-84cbfc56b6-tcssz   1/1     Running       0          3h36m   10.244.2.4   node02   <none>           <none>
    
    #客户端查看
    myapp-9b4987d5-98k45
    myapp-9b4987d5-98k45
    myapp-9b4987d5-wrp7r
    myapp-9b4987d5-wrp7r
    myapp-9b4987d5-wrp7r
    myapp-9b4987d5-wrp7r
    myapp-9b4987d5-ncpb7
    myapp-9b4987d5-ncpb7
    myapp-9b4987d5-98k45
    

    此时服务就只会访问剩余的3个副本间

    kubectl set image 应用版本升级

    语法
    Usage:
    kubectl set image (-f FILENAME | TYPE NAME) CONTAINER_NAME_1=CONTAINER_IMAGE_1 ... CONTAINER_NAME_N=CONTAINER_IMAGE_N
    [options]
    举例

    #升级myapp的版本为v2
    [root@master ~]# kubectl set image deployment myapp myapp=ikubernetes/myapp:v2
    deployment.extensions/myapp image updated
    
    #查看更新过程
    [root@master ~]# kubectl rollout status deployment myapp                      
    Waiting for deployment "myapp" rollout to finish: 2 out of 3 new replicas have been updated...
    Waiting for deployment "myapp" rollout to finish: 2 out of 3 new replicas have been updated...
    Waiting for deployment "myapp" rollout to finish: 1 old replicas are pending termination...
    Waiting for deployment "myapp" rollout to finish: 1 old replicas are pending termination...
    deployment "myapp" successfully rolled out
    
    #此过程客户端过程
    / # for i in `seq 10000`;do wget -O - -q myapp;sleep 1;done
    Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
    Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
    Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
    Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
    Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
    Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
    Hello MyApp | Version: v2 | <a href="hostname.html">Pod Name</a>
    Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
    Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
    Hello MyApp | Version: v2 | <a href="hostname.html">Pod Name</a>
    Hello MyApp | Version: v2 | <a href="hostname.html">Pod Name</a>
    Hello MyApp | Version: v2 | <a href="hostname.html">Pod Name</a>
    

    也可以使用kubectl describe 来查看Pod的详细信息

    [root@master ~]# kubectl get pods
    NAME                            READY   STATUS    RESTARTS   AGE
    client-f5cdb799f-pklmc          1/1     Running   0          21m
    myapp-65899575cd-q9wt9          1/1     Running   0          4m56s
    myapp-65899575cd-xhwmr          1/1     Running   0          4m58s
    myapp-65899575cd-xnqd4          1/1     Running   0          4m58s
    nginx-deploy-84cbfc56b6-tcssz   1/1     Running   0          3h49m
    [root@master ~]# kubectl describe pods myapp-65899575cd-xhwmr
    Name:               myapp-65899575cd-xhwmr
    Namespace:          default
    Priority:           0
    PriorityClassName:  <none>
    Node:               node01/10.0.0.11
    Start Time:         Thu, 28 Mar 2019 14:33:50 +0800
    Labels:             pod-template-hash=65899575cd
                        run=myapp
    Annotations:        <none>
    Status:             Running
    IP:                 10.244.1.10
    Controlled By:      ReplicaSet/myapp-65899575cd
    Containers:
      myapp:
        Container ID:   docker://5f9c63ce9f84fb6f863b44dd2eb9626f3eff2a599b48eb7000c84f5b70f6d2c9
        Image:          ikubernetes/myapp:v2
    ... ...
    

    kubectl rollout 回滚

    一种方法是直接修改image版本,另外一种是使用kubectl rollout

    [root@master ~]# kubectl rollout -h
    Manage the rollout of a resource.
      
    Valid resource types include: 
    
      * deployments  
      * daemonsets  
      * statefulsets
    
    Examples:
      # Rollback to the previous deployment
      kubectl rollout undo deployment/abc
      
      # Check the rollout status of a daemonset
      kubectl rollout status daemonset/foo
    
    Available Commands:
      history     显示 rollout 历史
      pause       标记提供的 resource 为中止状态
      resume      继续一个停止的 resource
      status      显示 rollout 的状态
      undo        撤销上一次的 rollout
    
    Usage:
      kubectl rollout SUBCOMMAND [options]
    

    举例

    [root@master ~]# kubectl rollout undo deployment myapp
    deployment.extensions/myapp rolled back
    [root@master ~]# kubectl get pods
    NAME                            READY   STATUS              RESTARTS   AGE
    client-f5cdb799f-pklmc          1/1     Running             0          24m
    myapp-65899575cd-q9wt9          0/1     Terminating         0          8m15s
    myapp-65899575cd-xhwmr          1/1     Terminating         0          8m17s
    myapp-65899575cd-xnqd4          1/1     Running             0          8m17s
    myapp-9b4987d5-47sjj            0/1     ContainerCreating   0          0s
    myapp-9b4987d5-684q9            1/1     Running             0          2s
    myapp-9b4987d5-djdr9            1/1     Running             0          3s
    nginx-deploy-84cbfc56b6-tcssz   1/1     Running             0          3h52m
    
    #客户端查看
    / # for i in `seq 10000`;do wget -O - -q myapp;sleep 1;done
    Hello MyApp | Version: v2 | <a href="hostname.html">Pod Name</a>
    Hello MyApp | Version: v2 | <a href="hostname.html">Pod Name</a>
    Hello MyApp | Version: v2 | <a href="hostname.html">Pod Name</a>
    Hello MyApp | Version: v2 | <a href="hostname.html">Pod Name</a>
    Hello MyApp | Version: v2 | <a href="hostname.html">Pod Name</a>
    Hello MyApp | Version: v2 | <a href="hostname.html">Pod Name</a>
    Hello MyApp | Version: v2 | <a href="hostname.html">Pod Name</a>
    Hello MyApp | Version: v2 | <a href="hostname.html">Pod Name</a>
    Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
    Hello MyApp | Version: v2 | <a href="hostname.html">Pod Name</a>
    Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
    Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
    Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
    Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
    Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
    Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
    #已经全部回退到上个版本
    

    集群外部访问Service

    [root@master ~]# kubectl edit svc myapp
    # Please edit the object below. Lines beginning with a '#' will be ignored,
    # and an empty file will abort the edit. If an error occurs while saving this file will be
    # reopened with the relevant failures.
    #
    apiVersion: v1
    kind: Service
    metadata:
      creationTimestamp: "2019-03-28T06:20:00Z"
      labels:
        run: myapp
      name: myapp
      namespace: default
      resourceVersion: "36470"
      selfLink: /api/v1/namespaces/default/services/myapp
      uid: 8425bae4-5121-11e9-80a7-000c295ec349
    spec:
      clusterIP: 10.104.138.182
      ports:
      - port: 80
        protocol: TCP
        targetPort: 80
      selector:
        run: myapp
      sessionAffinity: None
      type: NodePort
    status:
      loadBalancer: {}                  
    

    查看服务

    [root@master ~]# kubectl get svc
    NAME         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
    kubernetes   ClusterIP   10.96.0.1        <none>        443/TCP        22h
    myapp        NodePort    10.104.138.182   <none>        80:30298/TCP   38m
    nginx        ClusterIP   10.98.2.12       <none>        80/TCP         4h
    

    myapp服务80端口映射到节点的30298,且整个集群的30298节点都可以访问

    另一节点访问

    参考资料

    https://www.cnblogs.com/linuxk
    马永亮. Kubernetes进阶实战 (云计算与虚拟化技术丛书)

  • 相关阅读:
    1-vue初识
    使用 MegaCLI 检测磁盘状态
    CDH中spark-shell报错: Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/hadoop/fs/FSDataInputStream
    Linux查看服务器公网ip的方法
    Linux sar 查看网卡流量 网络io
    Docker为何需要OS的基础镜像?
    Spark中reduceByKey(_+_)的说明
    ELK
    Navicat Premium 12安装与激活
    数据查询
  • 原文地址:https://www.cnblogs.com/wlbl/p/10694277.html
Copyright © 2011-2022 走看看