Kubernetes之(五)快速部署应用

释放双眼,带上耳机,听听看~!

目录

  • Kubernetes之(五)快速部署应用

  • kubectl命令介绍

    • kubectl run命令行部署应用

    • kubectl expose 通过service暴漏Pod

    • kubectl scale 动态伸缩应用副本

    • kubectl set image 应用版本升级

    • kubectl rollout 回滚

    • 集群外部访问Service

Kubernetes之(五)快速部署应用

kubectl命令介绍


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
1[root@master ~]# kubectl --help
2kubectl controls the Kubernetes cluster manager.
3
4Find more information at: https://kubernetes.io/docs/reference/kubectl/overview/
5
6Basic Commands (Beginner):
7  create         Create a resource from a file or from stdin.
8  expose         使用 replication controller, service, deployment 或者 pod 并暴露它作为一个 新的 Kubernetes Service
9  run            在集群中运行一个指定的镜像
10  set            为 objects 设置一个指定的特征
11
12Basic Commands (Intermediate):
13  explain        查看资源的文档
14  get            显示一个或更多 resources
15  edit           在服务器上编辑一个资源
16  delete         Delete resources by filenames, stdin,resources and names, or
17by resources and label selector
18
19Deploy Commands:
20  rollout        Manage the rollout of a resource
21  scale          为 Deployment, ReplicaSet, Replication Controller 或者 Job设置一个新的副本数量
22  autoscale      自动调整一个 Deployment, ReplicaSet, 或者ReplicationController 的副本数量
23
24Cluster Management Commands:
25  certificate    修改 certificate 资源.
26  cluster-info   显示集群信息
27  top            Display Resource (CPU/Memory/Storage) usage.
28  cordon         标记 node 为 unschedulable
29  uncordon       标记 node 为 schedulable
30  drain          Drain node in preparation for maintenance
31  taint          更新一个或者多个 node 上的 taints
32
33Troubleshooting and Debugging Commands:
34  describe       显示一个指定 resource 或者 group 的 resources 详情
35  logs           输出容器在 pod 中的日志
36  attach         Attach 到一个运行中的 container
37  exec           在一个 container 中执行一个命令
38  port-forward   Forward one or more local ports to a pod
39  proxy          运行一个 proxy 到 Kubernetes API server
40  cp             复制 files 和 directories 到 containers
41和从容器中复制 files 和 directories.
42  auth           Inspect authorization
43
44Advanced Commands:
45  diff           Diff live version against would-be applied version
46  apply          通过文件名或标准输入流(stdin)对资源进行配置
47  patch          使用 strategic merge patch 更新一个资源的 field(s)
48  replace        通过 filename 或者 stdin替换一个资源
49  wait           Experimental: Wait for a specific condition on one or many
50resources.
51  convert        在不同的 API versions 转换配置文件
52
53Settings Commands:
54  label          更新在这个资源上的 labels
55  annotate       更新一个资源的注解
56  completion     Output shell completion code for the specified shell (bash or
57zsh)
58
59Other Commands:
60  api-resources  Print the supported API resources on the server
61  api-versions   Print the supported API versions on the server, in the form of"group/version"
62  config         修改 kubeconfig 文件
63  plugin         Provides utilities for interacting with plugins.
64  version        输出 client 和 server 的版本信息
65
66Usage:
67  kubectl [flags] [options]
68
69Use "kubectl <command> --help" for more information about a given command.
70Use "kubectl options" for a list of global command-line options (applies to all
71commands).
72

kubectl run命令行部署应用

语法:


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

举例


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
1[root@master ~]# kubectl run nginx-deploy --image=nginx:1.14-alpine --port=80 --replicas=1 --dry-run=true
2kubectl 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.
3deployment.apps/nginx-deploy created (dry run)
4#--image 指定镜像
5#--port 暴漏端口
6#--replicas 设置副本数量
7# --dry-run=true 干跑模式,不执行,类似验证,无问题后再执行
8[root@master ~]# kubectl run nginx-deploy --image=nginx:1.14-alpine --port=80 --replicas=1
9deployment.apps/nginx-deploy created
10## 查看是否创建成功
11#查看deployment
12[root@master ~]# kubectl get deployment
13NAME           READY   UP-TO-DATE   AVAILABLE   AGE
14nginx-deploy   1/1     1            1           30s
15#查看pod
16[root@master ~]# kubectl get pods
17NAME                            READY   STATUS    RESTARTS   AGE
18nginx-deploy-84cbfc56b6-st4tq   1/1     Running   0          72s
19# -o wide 显示更多详细信息
20[root@master ~]# kubectl get pods -o wide
21NAME                            READY   STATUS    RESTARTS   AGE   IP           NODE     NOMINATED NODE   READINESS GATES
22nginx-deploy-84cbfc56b6-st4tq   1/1     Running   0          98s   10.244.2.2   node02   <none>           <none>
23

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


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
1[root@master ~]# curl -I 10.244.2.2
2HTTP/1.1 200 OK
3Server: nginx/1.14.2
4Date: Thu, 28 Mar 2019 02:23:42 GMT
5Content-Type: text/html
6Content-Length: 612
7Last-Modified: Fri, 08 Mar 2019 03:09:00 GMT
8Connection: keep-alive
9ETag: "5c81dccc-264"
10Accept-Ranges: bytes
11
12[root@node01 ~]# curl -I 10.244.2.2
13HTTP/1.1 200 OK
14Server: nginx/1.14.2
15Date: Thu, 28 Mar 2019 02:23:48 GMT
16Content-Type: text/html
17Content-Length: 612
18Last-Modified: Fri, 08 Mar 2019 03:09:00 GMT
19Connection: keep-alive
20ETag: "5c81dccc-264"
21Accept-Ranges: bytes
22
23[root@node02 ~]# curl -I 10.244.2.2
24HTTP/1.1 200 OK
25Server: nginx/1.14.2
26Date: Thu, 28 Mar 2019 02:23:46 GMT
27Content-Type: text/html
28Content-Length: 612
29Last-Modified: Fri, 08 Mar 2019 03:09:00 GMT
30Connection: keep-alive
31ETag: "5c81dccc-264"
32Accept-Ranges: bytes
33

尝试删除Pod


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

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

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

kubectl expose 通过service暴漏Pod

语法


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

举例


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

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


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

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


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

查看coredns的IP地址


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

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


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

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


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

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


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
1[root@master ~]# kubectl run client --image=busybox --replicas=1 -it --restart=Never
2If you don't see a command prompt, try pressing enter.
3/ # cat /etc/resolv.conf
4nameserver 10.96.0.10
5search default.svc.cluster.local svc.cluster.local cluster.local
6options ndots:5
7/ # wget -O - -q http://nginx:80
8<!DOCTYPE html>
9<html>
10<head>
11<title>Welcome to nginx!</title>
12<style>
13    body {
14        width: 35em;
15        margin: 0 auto;
16        font-family: Tahoma, Verdana, Arial, sans-serif;
17    }
18</style>
19</head>
20<body>
21<h1>Welcome to nginx!</h1>
22<p>If you see this page, the nginx web server is successfully installed and
23working. Further configuration is required.</p>
24
25<p>For online documentation and support please refer to
26<a href="http://nginx.org/">nginx.org</a>.<br/>
27Commercial support is available at
28<a href="http://nginx.com/">nginx.com</a>.</p>
29
30<p><em>Thank you for using nginx.</em></p>
31</body>
32</html>
33

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


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
1[root@master ~]# kubectl describe svc nginx
2Name:              nginx
3Namespace:         default
4Labels:            run=nginx-deploy
5Annotations:       <none>
6Selector:          run=nginx-deploy
7Type:              ClusterIP
8IP:                10.98.2.12
9Port:              <unset>  80/TCP
10TargetPort:        80/TCP
11Endpoints:         10.244.2.4:80
12Session Affinity:  None
13Events:            <none>
14
15#Endpoints: Pod的IP地址
16

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


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

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

kubectl scale 动态伸缩应用副本

语法


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

举例


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
1#创建新的deployment
2[root@master ~]# kubectl run myapp --image=ikubernetes/myapp:v1 --replicas=2
3kubectl 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.
4deployment.apps/myapp created
5[root@master ~]# kubectl get deployment
6NAME           READY   UP-TO-DATE   AVAILABLE   AGE
7myapp          2/2     2            2           48s
8nginx-deploy   1/1     1            1           3h58m
9#查看pod
10[root@master ~]# kubectl get pods -o wide
11NAME                            READY   STATUS      RESTARTS   AGE     IP           NODE     NOMINATED NODE   READINESS GATES
12client                          0/1     Completed   0          3h2m    10.244.2.5   node02   <none>           <none>
13myapp-9b4987d5-98k45            1/1     Running     0          64s     10.244.1.4   node01   <none>           <none>
14myapp-9b4987d5-ncpb7            1/1     Running     0          64s     10.244.2.6   node02   <none>           <none>
15nginx-deploy-84cbfc56b6-tcssz   1/1     Running     0          3h26m   10.244.2.4   node02   <none>           <none>
16

此时使用客户端访问


1
2
3
4
5
1/ # wget -O - -q 10.244.2.6/hostname.html
2myapp-9b4987d5-ncpb7
3/ # wget -O - -q 10.244.1.4/hostname.html
4myapp-9b4987d5-98k45
5

为myapp创建service


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

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


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

扩展副本数量


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

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


1
2
3
4
5
6
7
8
9
10
11
12
13
1/ # for i in `seq 10000`;do wget -O - -q myapp/hostname.html;sleep 1;done
2myapp-9b4987d5-wrp7r
3myapp-9b4987d5-ncpb7
4myapp-9b4987d5-wrp7r
5myapp-9b4987d5-98k45
6myapp-9b4987d5-wrp7r
7myapp-9b4987d5-98k45
8myapp-9b4987d5-gfqjp
9myapp-9b4987d5-wrp7r
10myapp-9b4987d5-gfqjp
11myapp-9b4987d5-gfqjp
12myapp-9b4987d5-ncpb7
13

再次修改副本数量为3


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

此时服务就只会访问剩余的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]
举例


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
1#升级myapp的版本为v2
2[root@master ~]# kubectl set image deployment myapp myapp=ikubernetes/myapp:v2
3deployment.extensions/myapp image updated
4
5#查看更新过程
6[root@master ~]# kubectl rollout status deployment myapp                      
7Waiting for deployment "myapp" rollout to finish: 2 out of 3 new replicas have been updated...
8Waiting for deployment "myapp" rollout to finish: 2 out of 3 new replicas have been updated...
9Waiting for deployment "myapp" rollout to finish: 1 old replicas are pending termination...
10Waiting for deployment "myapp" rollout to finish: 1 old replicas are pending termination...
11deployment "myapp" successfully rolled out
12
13#此过程客户端过程
14/ # for i in `seq 10000`;do wget -O - -q myapp;sleep 1;done
15Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
16Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
17Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
18Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
19Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
20Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
21Hello MyApp | Version: v2 | <a href="hostname.html">Pod Name</a>
22Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
23Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
24Hello MyApp | Version: v2 | <a href="hostname.html">Pod Name</a>
25Hello MyApp | Version: v2 | <a href="hostname.html">Pod Name</a>
26Hello MyApp | Version: v2 | <a href="hostname.html">Pod Name</a>
27

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


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

kubectl rollout 回滚

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


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
1[root@master ~]# kubectl rollout -h
2Manage the rollout of a resource.
3  
4Valid resource types include:
5
6  * deployments  
7  * daemonsets  
8  * statefulsets
9
10Examples:
11  # Rollback to the previous deployment
12  kubectl rollout undo deployment/abc
13  
14  # Check the rollout status of a daemonset
15  kubectl rollout status daemonset/foo
16
17Available Commands:
18  history     显示 rollout 历史
19  pause       标记提供的 resource 为中止状态
20  resume      继续一个停止的 resource
21  status      显示 rollout 的状态
22  undo        撤销上一次的 rollout
23
24Usage:
25  kubectl rollout SUBCOMMAND [options]
26

举例


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
1[root@master ~]# kubectl rollout undo deployment myapp
2deployment.extensions/myapp rolled back
3[root@master ~]# kubectl get pods
4NAME                            READY   STATUS              RESTARTS   AGE
5client-f5cdb799f-pklmc          1/1     Running             0          24m
6myapp-65899575cd-q9wt9          0/1     Terminating         0          8m15s
7myapp-65899575cd-xhwmr          1/1     Terminating         0          8m17s
8myapp-65899575cd-xnqd4          1/1     Running             0          8m17s
9myapp-9b4987d5-47sjj            0/1     ContainerCreating   0          0s
10myapp-9b4987d5-684q9            1/1     Running             0          2s
11myapp-9b4987d5-djdr9            1/1     Running             0          3s
12nginx-deploy-84cbfc56b6-tcssz   1/1     Running             0          3h52m
13
14#客户端查看
15/ # for i in `seq 10000`;do wget -O - -q myapp;sleep 1;done
16Hello MyApp | Version: v2 | <a href="hostname.html">Pod Name</a>
17Hello MyApp | Version: v2 | <a href="hostname.html">Pod Name</a>
18Hello MyApp | Version: v2 | <a href="hostname.html">Pod Name</a>
19Hello MyApp | Version: v2 | <a href="hostname.html">Pod Name</a>
20Hello MyApp | Version: v2 | <a href="hostname.html">Pod Name</a>
21Hello MyApp | Version: v2 | <a href="hostname.html">Pod Name</a>
22Hello MyApp | Version: v2 | <a href="hostname.html">Pod Name</a>
23Hello MyApp | Version: v2 | <a href="hostname.html">Pod Name</a>
24Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
25Hello MyApp | Version: v2 | <a href="hostname.html">Pod Name</a>
26Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
27Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
28Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
29Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
30Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
31Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
32#已经全部回退到上个版本
33

集群外部访问Service


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
1[root@master ~]# kubectl edit svc myapp
2# Please edit the object below. Lines beginning with a '#' will be ignored,
3# and an empty file will abort the edit. If an error occurs while saving this file will be
4# reopened with the relevant failures.
5#
6apiVersion: v1
7kind: Service
8metadata:
9  creationTimestamp: "2019-03-28T06:20:00Z"
10  labels:
11    run: myapp
12  name: myapp
13  namespace: default
14  resourceVersion: "36470"
15  selfLink: /api/v1/namespaces/default/services/myapp
16  uid: 8425bae4-5121-11e9-80a7-000c295ec349
17spec:
18  clusterIP: 10.104.138.182
19  ports:
20  - port: 80
21    protocol: TCP
22    targetPort: 80
23  selector:
24    run: myapp
25  sessionAffinity: None
26  type: NodePort
27status:
28  loadBalancer: {}                  
29

查看服务


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

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

另一节点访问

给TA打赏
共{{data.count}}人
人已打赏
安全运维

故障复盘的简洁框架-黄金三问

2021-9-30 19:18:23

安全运维

OpenSSH-8.7p1离线升级修复安全漏洞

2021-10-23 10:13:25

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索