1、为什么K8s要引入deployment资源。

答:deployment也是保证pod高可用的一种方式,明明已经有RC(Replication Controller),为什么还要引入deployment呢?是因为deployment解决了RC(Replication Controller)的一个痛点。是因为RC在进行版本升级的时候,会造成一个问题,就是它的svc(Service)短时间内访问不了了,deployment就是解决这个问题的。
 

2、创建一个deployment的配置文件。

 1 # 声明api的版本。
 2 apiVersion: extensions/v1beta1
 3 # kind代表资源的类型,资源是Deployment。
 4 kind: Deployment
 5 # 资源叫什么名字,是在其属性metadata里面的。
 6 metadata:
 7   # 第一个属性name的值是myweb,即Service的名字就叫做myweb。
 8   name: nginx-deployment
 9 # spec是详细,详细里面定义了一个容器。
10 spec:
11   # 副本的数量,比RC少了一个selector。
12   replicas: 3
13   # 模板,都是使用模板来启动Pod的。
14   template:
15     # 资源叫什么名字,是在其属性metadata里面的。
16     metadata:
17       # 给Pod贴上了一个标签,标签是app: nginx,标签是有一定的作用的。
18       labels:
19         app: nginx
20     # spec是详细,详细里面定义了一个容器。
21     spec:
22       # 定义一个容器,可以声明多个容器的。
23       containers:
24         # 容器的名称叫做nginx
25         - name: nginx
26         # 使用了什么镜像,可以使用官方公有的,也可以使用私有的。
27           image: 192.168.110.133/nginx:1.13
28         # ports定义容器的端口
29           ports:
30             #  容器的端口是80,如果容器有多个端口,可以在后面接着写一行即可。
31             - containerPort: 80

具体操作,如下所示:

 1 [root@k8s-master ~]# cd k8s/
 2 [root@k8s-master k8s]# ls
 3 pod  rc  svc
 4 [root@k8s-master k8s]# mkdir deploy
 5 [root@k8s-master k8s]# cd deploy/
 6 [root@k8s-master deploy]# ls
 7 [root@k8s-master deploy]# kubectl get rc 
 8 NAME      DESIRED   CURRENT   READY     AGE
 9 myweb     3         3         3         4d
10 [root@k8s-master deploy]# kubectl delete rc myweb 
11 replicationcontroller "myweb" deleted
12 [root@k8s-master deploy]# kubectl get rc 
13 No resources found.
14 [root@k8s-master deploy]# kubectl get svc 
15 NAME         CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
16 kubernetes   10.254.0.1       <none>        443/TCP        12d
17 myweb        10.254.210.104   <nodes>       80:30000/TCP   2d
18 [root@k8s-master deploy]# kubectl delete svc myweb 
19 service "myweb" deleted
20 [root@k8s-master deploy]# kubectl get svc 
21 NAME         CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
22 kubernetes   10.254.0.1   <none>        443/TCP   12d
23 [root@k8s-master deploy]# vim nginx-deploy.yaml
24 [root@k8s-master deploy]# 

然后开始创建deployment,如下所示:

1 [root@k8s-master deploy]# kubectl create -f nginx-deploy.yaml 
2 deployment "nginx-deployment" created

然后创建deployment资源完毕之后,可以查看创建的资源,如下所示:

 1 [root@k8s-master deploy]# kubectl get all -o wide
 2 NAME                      DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
 3 deploy/nginx-deployment   3         3         3            0           2m
 4 
 5 NAME             CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE       SELECTOR
 6 svc/kubernetes   10.254.0.1   <none>        443/TCP   12d       <none>
 7 
 8 NAME                             DESIRED   CURRENT   READY     AGE       CONTAINER(S)   IMAGE(S)                     SELECTOR
 9 rs/nginx-deployment-3699032092   3         3         0         2m        nginx          192.168.110.133/nginx:1.13   app=nginx,pod-template-hash=3699032092
10 
11 NAME                                   READY     STATUS             RESTARTS   AGE       IP            NODE
12 po/nginx-deployment-3699032092-3jnk6   0/1       ImagePullBackOff   0          2m        172.16.85.2   k8s-master
13 po/nginx-deployment-3699032092-97bfm   0/1       ImagePullBackOff   0          2m        172.16.38.2   k8s-node3
14 po/nginx-deployment-3699032092-fmqkx   0/1       ImagePullBackOff   0          2m        172.16.5.2    k8s-node2
15 [root@k8s-master deploy]# 

我这里明显没有启动起来,说镜像拉取错误,仔细检查是nginx-deploy.yaml配置文件,在配置image的地方写错了,漏写了端口号导致的。

再使用命令创建一遍,就发现创建好了。deployment并不像RC直接去启动Pod,它们之间的区别是deployment会启动一个RS,RS拥有RC的百分之九十的功能,比RC的功能还多一些,由RC再去启动三个POD。

 1 [root@k8s-master deploy]# kubectl get deployment 
 2 NAME               DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
 3 nginx-deployment   3         3         3            0           5m
 4 [root@k8s-master deploy]# kubectl delete deployment nginx-deployment
 5 deployment "nginx-deployment" deleted
 6 [root@k8s-master deploy]# kubectl get deployment 
 7 No resources found.
 8 [root@k8s-master deploy]# kubectl get all -o wide
 9 NAME             CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE       SELECTOR
10 svc/kubernetes   10.254.0.1   <none>        443/TCP   12d       <none>
11 [root@k8s-master deploy]# kubectl create -f nginx-deploy.yaml 
12 deployment "nginx-deployment" created
13 [root@k8s-master deploy]# kubectl get all -o wide
14 NAME                      DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
15 deploy/nginx-deployment   3         3         3            3           7s
16 
17 NAME             CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE       SELECTOR
18 svc/kubernetes   10.254.0.1   <none>        443/TCP   12d       <none>
19 
20 NAME                             DESIRED   CURRENT   READY     AGE       CONTAINER(S)   IMAGE(S)                          SELECTOR
21 rs/nginx-deployment-3018768667   3         3         3         7s        nginx          192.168.110.133:5000/nginx:1.13   app=nginx,pod-template-hash=3018768667
22 
23 NAME                                   READY     STATUS    RESTARTS   AGE       IP            NODE
24 po/nginx-deployment-3018768667-1c6lm   1/1       Running   0          7s        172.16.38.2   k8s-node3
25 po/nginx-deployment-3018768667-cvvjc   1/1       Running   0          7s        172.16.85.2   k8s-master
26 po/nginx-deployment-3018768667-grvlh   1/1       Running   0          7s        172.16.5.2    k8s-node2
27 [root@k8s-master deploy]# 

此时,已经有了一个deployment,那么如何让Pod里面的服务让外界访问呢,我们也是需要创建一个service的,除了使用配置文件进行创建,还可以通过命令进行关联。

 1 [root@k8s-master ~]# kubectl expose deployment nginx-deployment --port=80 --type=NodePort
 2 service "nginx-deployment" exposed
 3 [root@k8s-master ~]# kubectl get all -o wide
 4 NAME                      DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
 5 deploy/nginx-deployment   3         3         3            3           1h
 6 
 7 NAME                   CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE       SELECTOR
 8 svc/kubernetes         10.254.0.1      <none>        443/TCP        12d       <none>
 9 svc/nginx-deployment   10.254.95.103   <nodes>       80:36848/TCP   23s       app=nginx
10 
11 NAME                             DESIRED   CURRENT   READY     AGE       CONTAINER(S)   IMAGE(S)                          SELECTOR
12 rs/nginx-deployment-3018768667   3         3         3         1h        nginx          192.168.110.133:5000/nginx:1.13   app=nginx,pod-template-hash=3018768667
13 
14 NAME                                   READY     STATUS    RESTARTS   AGE       IP            NODE
15 po/nginx-deployment-3018768667-1c6lm   1/1       Running   0          1h        172.16.38.2   k8s-node3
16 po/nginx-deployment-3018768667-cvvjc   1/1       Running   0          1h        172.16.85.2   k8s-master
17 po/nginx-deployment-3018768667-grvlh   1/1       Running   0          1h        172.16.5.2    k8s-node2
18 [root@k8s-master ~]# curl -I 192.168.110.133:36848
19 HTTP/1.1 200 OK
20 Server: nginx/1.13.12
21 Date: Wed, 17 Jun 2020 03:05:29 GMT
22 Content-Type: text/html
23 Content-Length: 612
24 Last-Modified: Mon, 09 Apr 2018 16:01:09 GMT
25 Connection: keep-alive
26 ETag: "5acb8e45-264"
27 Accept-Ranges: bytes
28 
29 [root@k8s-master ~]# 

下面可以对nginx进行版本升级,不用创建配置文件,这里可以直接修改配置文件即可。

1 [root@k8s-master ~]# kubectl edit deployment nginx-deployment

具体修改内容,如下所示:

修改,保存之后再使用curl命令进行查看,发现版本已经进行了升级了的。

 1 [root@k8s-master ~]# curl -I 192.168.110.133:36848
 2 HTTP/1.1 200 OK
 3 Server: nginx/1.15.12
 4 Date: Wed, 17 Jun 2020 03:09:26 GMT
 5 Content-Type: text/html
 6 Content-Length: 612
 7 Last-Modified: Tue, 16 Apr 2019 13:08:19 GMT
 8 Connection: keep-alive
 9 ETag: "5cb5d3c3-264"
10 Accept-Ranges: bytes
11 
12 [root@k8s-master ~]# 

可以通过命令查看升级之后三个Pod节点的情况,这里可以看到多了一个rs/nginx-deployment-3181297949,之前的那个rs/nginx-deployment-3018768667都被设置为了0。

注意:这里我也出现了升级之后无法将Node2节点的Pod启动成功的情况,我重启了三台机器,三个节点的Pod都有了,这里可能是因为从私有仓库下载的地方没有配置好,重启之前Node2节点使用docker images命令是无法查看到私有仓库的nginx:1.15版本的,重启之后才可以看到。

 1 [root@k8s-master ~]# kubectl get all -o wide
 2 NAME                      DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
 3 deploy/nginx-deployment   3         3         3            3           1h
 4 
 5 NAME                   CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE       SELECTOR
 6 svc/kubernetes         10.254.0.1      <none>        443/TCP        12d       <none>
 7 svc/nginx-deployment   10.254.95.103   <nodes>       80:36848/TCP   14m       app=nginx
 8 
 9 NAME                             DESIRED   CURRENT   READY     AGE       CONTAINER(S)   IMAGE(S)                          SELECTOR
10 rs/nginx-deployment-3018768667   0         0         0         1h        nginx          192.168.110.133:5000/nginx:1.13   app=nginx,pod-template-hash=3018768667
11 rs/nginx-deployment-3181297949   3         3         3         10m       nginx          192.168.110.133:5000/nginx:1.15   app=nginx,pod-template-hash=3181297949
12 
13 NAME                                   READY     STATUS    RESTARTS   AGE       IP            NODE
14 po/nginx-deployment-3181297949-9d3t0   1/1       Running   1          10m       172.16.59.2   k8s-node2
15 po/nginx-deployment-3181297949-mjtk3   1/1       Running   1          10m       172.16.16.2   k8s-master
16 po/nginx-deployment-3181297949-vp84j   1/1       Running   1          10m       172.16.32.2   k8s-node3
17 [root@k8s-master ~]# 

deployment的回滚操作,如下所示:

[root@k8s-master ~]# kubectl rollout undo deployment nginx-deployment

 1 [root@k8s-master ~]# curl -I 192.168.110.133:36848
 2 HTTP/1.1 200 OK
 3 Server: nginx/1.15.12
 4 Date: Wed, 17 Jun 2020 03:23:53 GMT
 5 Content-Type: text/html
 6 Content-Length: 612
 7 Last-Modified: Tue, 16 Apr 2019 13:08:19 GMT
 8 Connection: keep-alive
 9 ETag: "5cb5d3c3-264"
10 Accept-Ranges: bytes
11 
12 [root@k8s-master ~]# kubectl roll
13 rolling-update  rollout         
14 [root@k8s-master ~]# kubectl rollout undo deployment nginx-deployment
15 deployment "nginx-deployment" rolled back
16 [root@k8s-master ~]# curl -I 192.168.110.133:36848
17 HTTP/1.1 200 OK
18 Server: nginx/1.13.12
19 Date: Wed, 17 Jun 2020 03:25:22 GMT
20 Content-Type: text/html
21 Content-Length: 612
22 Last-Modified: Mon, 09 Apr 2018 16:01:09 GMT
23 Connection: keep-alive
24 ETag: "5acb8e45-264"
25 Accept-Ranges: bytes
26 
27 [root@k8s-master ~]# 

可以查看deployment存在那些历史版本,如下所示:

1 [root@k8s-master ~]# kubectl rollout history deployment nginx-deployment 
2 deployments "nginx-deployment"
3 REVISION    CHANGE-CAUSE
4 2        <none>
5 3        <none>
6 
7 [root@k8s-master ~]# 

如果想要查看到历史版本中的改变记录、镜像版本,需要使用新的方式进行发布。

1 版本发布
2 kubectl run nginx --image=192.168.110.133:5000/nginx:1.13 --replicas=3
3 
4 版本升级
5 kubectl set image deploy nginx nginx=192.168.110.133:5000/nginx:1.15
6 
7 历史版本查询
8 [root@k8s-master ~]# kubectl rollout history deployment nginx

具体操作,如下所示:

 1 [root@k8s-master ~]# kubectl run nginx --image=192.168.110.133:5000/nginx:1.13 --replicas=3 --record 
 2 deployment "nginx" created
 3 [root@k8s-master ~]# kubectl rollout history deployment nginx-deployment 
 4 deployments "nginx-deployment"
 5 REVISION    CHANGE-CAUSE
 6 2        <none>
 7 3        <none>
 8 
 9 [root@k8s-master ~]# kubectl rollout history deployment nginx
10 deployments "nginx"
11 REVISION    CHANGE-CAUSE
12 1        kubectl run nginx --image=192.168.110.133:5000/nginx:1.13 --replicas=3 --record
13 
14 [root@k8s-master ~]# kubectl set image deploy nginx nginx=192.168.110.133:5000/nginx:1.15
15 deployment "nginx" image updated
16 [root@k8s-master ~]# kubectl rollout history deployment nginx
17 deployments "nginx"
18 REVISION    CHANGE-CAUSE
19 1        kubectl run nginx --image=192.168.110.133:5000/nginx:1.13 --replicas=3 --record
20 2        kubectl set image deploy nginx nginx=192.168.110.133:5000/nginx:1.15
21 
22 [root@k8s-master ~]# kubectl get all -o wide
23 NAME                      DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
24 deploy/nginx              3         3         3            3           1m
25 deploy/nginx-deployment   3         3         3            3           1h
26 
27 NAME                   CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE       SELECTOR
28 svc/kubernetes         10.254.0.1      <none>        443/TCP        12d       <none>
29 svc/nginx-deployment   10.254.95.103   <nodes>       80:36848/TCP   32m       app=nginx
30 
31 NAME                             DESIRED   CURRENT   READY     AGE       CONTAINER(S)   IMAGE(S)                          SELECTOR
32 rs/nginx-3525615529              0         0         0         1m        nginx          192.168.110.133:5000/nginx:1.13   pod-template-hash=3525615529,run=nginx
33 rs/nginx-3675430827              3         3         3         23s       nginx          192.168.110.133:5000/nginx:1.15   pod-template-hash=3675430827,run=nginx
34 rs/nginx-deployment-3018768667   3         3         3         1h        nginx          192.168.110.133:5000/nginx:1.13   app=nginx,pod-template-hash=3018768667
35 rs/nginx-deployment-3181297949   0         0         0         27m       nginx          192.168.110.133:5000/nginx:1.15   app=nginx,pod-template-hash=3181297949
36 
37 NAME                                   READY     STATUS    RESTARTS   AGE       IP            NODE
38 po/nginx-3675430827-3gdxl              1/1       Running   0          23s       172.16.59.4   k8s-node2
39 po/nginx-3675430827-8t88l              1/1       Running   0          22s       172.16.16.2   k8s-master
40 po/nginx-3675430827-tbvf9              1/1       Running   0          23s       172.16.32.4   k8s-node3
41 po/nginx-deployment-3018768667-56jw4   1/1       Running   0          11m       172.16.59.3   k8s-node2
42 po/nginx-deployment-3018768667-gl0s6   1/1       Running   0          11m       172.16.16.3   k8s-master
43 po/nginx-deployment-3018768667-vbhp1   1/1       Running   0          11m       172.16.32.3   k8s-node3
44 [root@k8s-master ~]# 

回滚到指定的版本,undo是回滚到上一个版本,操作,如下所示:

 1 [root@k8s-master ~]# kubectl rollout history deployment nginx
 2 deployments "nginx"
 3 REVISION    CHANGE-CAUSE
 4 1        kubectl run nginx --image=192.168.110.133:5000/nginx:1.13 --replicas=3 --record
 5 2        kubectl set image deploy nginx nginx=192.168.110.133:5000/nginx:1.15
 6 
 7 [root@k8s-master ~]# kubectl rollout undo deployment nginx --to-revision=1
 8 deployment "nginx" rolled back
 9 [root@k8s-master ~]# kubectl rollout history deployment nginx
10 deployments "nginx"
11 REVISION    CHANGE-CAUSE
12 2        kubectl set image deploy nginx nginx=192.168.110.133:5000/nginx:1.15
13 3        kubectl run nginx --image=192.168.110.133:5000/nginx:1.13 --replicas=3 --record
14 
15 [root@k8s-master ~]# 

总结:deployment比RC更好使哦,deployment不依赖于配置文件,会成为主流的哦,重点使用。

 

3、k8s中不同类型的pod之间如何相互访问?例如,web服务如何访问db服务呢?

答:在k8s里面,服务与服务之间需要相互访问的时候,需要借助于VIP,因为每个Pod的ip地址是不固定的。可以固定的是VIP(可以理解为是VIP的地址ClusterIp),在k8s中,Pod与Pod之间相互访问就是通过VIP来进行访问的。比如,web服务想要访问db服务,web服务就要知道db服务的VIP(可以理解为是VIP的地址ClusterIp),不然无法进行访问。

 1 [root@k8s-master ~]# cd k8s/
 2 [root@k8s-master k8s]# ls
 3 deploy  pod  rc  svc
 4 [root@k8s-master k8s]# clear
 5 [root@k8s-master k8s]# wget https://www.qstack.com.cn/tomcat_demo.zip
 6 --2020-06-17 11:49:34--  https://www.qstack.com.cn/tomcat_demo.zip
 7 Resolving www.qstack.com.cn (www.qstack.com.cn)... 123.125.46.149, 111.202.85.37
 8 Connecting to www.qstack.com.cn (www.qstack.com.cn)|123.125.46.149|:443... connected.
 9 HTTP request sent, awaiting response... 200 OK
10 Length: 1486 (1.5K) [application/zip]
11 Saving to: ‘tomcat_demo.zip’
12 
13 100%[======================================================================================>] 1,486       --.-K/s   in 0.01s   
14 
15 2020-06-17 11:49:34 (106 KB/s) - ‘tomcat_demo.zip’ saved [1486/1486]
16 
17 [root@k8s-master k8s]# ls
18 deploy  pod  rc  svc  tomcat_demo.zip
19 [root@k8s-master k8s]# unzip tomcat_demo.zip 
20 Archive:  tomcat_demo.zip
21    creating: tomcat_demo/
22   inflating: tomcat_demo/mysql-rc.yml  
23   inflating: tomcat_demo/mysql-svc.yml  
24   inflating: tomcat_demo/tomcat-rc.yml  
25   inflating: tomcat_demo/tomcat-svc.yml  
26 [root@k8s-master k8s]# cd tomcat_demo/
27 [root@k8s-master tomcat_demo]# ls
28 mysql-rc.yml  mysql-svc.yml  tomcat-rc.yml  tomcat-svc.yml
29 [root@k8s-master tomcat_demo]# 

mysql-rc.yml 这个RC保证mysql的Pod高可用。mysql-svc.yml 这个SVC保证tomcat被访问。tomcat-rc.yml 这个RC保证tomcat是高可用的。tomcat-svc.yml 这个svc保证tomcat被外界所访问。

如果是自己向服务器传包,那么可以直接使用docker的命令进行操作即可。如果想从docker的仓库里面下载,需要修改一下这个配置,不然下载不动。

[root@k8s-master ~]# vim /etc/docker/daemon.json

1 {
2   "insecure-registries": ["192.168.110.133:5000"],
3   "registry-mirrors" : ["https://registry.docker-cn.com"]
4 }

使用国内的docker的镜像加速,可以不用配置自己的私有仓库的哈。

 1 [root@k8s-master rc]# docker tag docker.io/mysql:5.7.30 192.168.110.133:5000/mysql:5.7.30
 2 [root@k8s-master rc]# docker push 192.168.110.133:5000/mysql:5.7.30
 3 [root@k8s-master ~]# docker images 
 4 REPOSITORY                                            TAG                 IMAGE ID            CREATED             SIZE
 5 192.168.110.133:5000/mysql                            5.7.30              9cfcce23593a        8 days ago          448 MB
 6 docker.io/mysql                                       5.7.30              9cfcce23593a        8 days ago          448 MB
 7 docker.io/busybox                                     latest              1c35c4412082        2 weeks ago         1.22 MB
 8 docker.io/registry                                    latest              708bc6af7e5e        4 months ago        25.8 MB
 9 docker.io/nginx                                       1.15                53f3fd8007f7        13 months ago       109 MB
10 192.168.110.133:5000/nginx                            1.15                53f3fd8007f7        13 months ago       109 MB
11 192.168.110.133:5000/nginx                            1.13                ae513a47849c        2 years ago         109 MB
12 docker.io/nginx                                       1.13                ae513a47849c        2 years ago         109 MB
13 registry.access.redhat.com/rhel7/pod-infrastructure   latest              99965fb98423        2 years ago         209 MB
14 192.168.110.133:5000/pod-infrastructure               latest              34d3450d733b        3 years ago         205 MB
15 [root@k8s-master ~]# 

创建mysql的RC(Replication Controller)副本控制器。

[root@k8s-master tomcat_demo]# vim mysql-rc.yml

 1 apiVersion: v1
 2 kind: ReplicationController
 3 metadata:
 4   name: mysql
 5 spec:
 6   replicas: 1
 7   selector:
 8     app: mysql
 9   template:
10     metadata:
11       labels:
12         app: mysql
13     spec:
14       containers:
15         - name: mysql
16           image: 192.168.110.133:5000/mysql:5.7.30
17           ports:
18           - containerPort: 3306
19           env:
20           - name: MYSQL_ROOT_PASSWORD   # 数据库的环境变量,设置数据库的密码为123456
21             value: '123456'

操作,如下所示:

执行创建命令,创建 mysql的RC(Replication Controller)副本控制器。

[root@k8s-master tomcat_demo]# kubectl create -f mysql-rc.yml

 

4、插播一个问题,具体就是我三台centos7机器,docker的版本是1.13.1,然后搭了私有仓库,但是呢,每次下载都不好使,除了第一次搭建好,后来都是讲机器挂起了,直接使用的,前几篇都遇到这个问题了,原因是私有仓库的docker进程都没有了。

 1 [root@k8s-master tomcat_demo]# kubectl describe pod mysql-xcth2 
 2 Name:        mysql-xcth2
 3 Namespace:    default
 4 Node:        k8s-node3/192.168.110.135
 5 Start Time:    Wed, 17 Jun 2020 21:25:04 +0800
 6 Labels:        app=mysql
 7 Status:        Pending
 8 IP:        172.16.32.2
 9 Controllers:    ReplicationController/mysql
10 Containers:
11   mysql:
12     Container ID:    
13     Image:        192.168.110.133:5000/mysql:5.7.30
14     Image ID:        
15     Port:        3306/TCP
16     State:        Waiting
17       Reason:        ErrImagePull
18     Ready:        False
19     Restart Count:    0
20     Volume Mounts:    <none>
21     Environment Variables:
22       MYSQL_ROOT_PASSWORD:    123456
23 Conditions:
24   Type        Status
25   Initialized     True 
26   Ready     False 
27   PodScheduled     True 
28 No volumes.
29 QoS Class:    BestEffort
30 Tolerations:    <none>
31 Events:
32   FirstSeen    LastSeen    Count    From            SubObjectPath        Type        Reason            Message
33   ---------    --------    -----    ----            -------------        --------    ------            -------
34   34s        34s        1    {kubelet k8s-node3}                Warning        MissingClusterDNS    kubelet does not have ClusterDNS IP configured and cannot create Pod using "ClusterFirst" policy. Falling back to DNSDefault policy.
35   33s        33s        1    {default-scheduler }                Normal        Scheduled        Successfully assigned mysql-xcth2 to k8s-node3
36   33s        19s        2    {kubelet k8s-node3}    spec.containers{mysql}    Normal        Pulling            pulling image "192.168.110.133:5000/mysql:5.7.30"
37   33s        19s        2    {kubelet k8s-node3}    spec.containers{mysql}    Warning        Failed            Failed to pull image "192.168.110.133:5000/mysql:5.7.30": Error while pulling image: Get http://192.168.110.133:5000/v1/repositories/mysql/images: dial tcp 192.168.110.133:5000: connect: connection refused
38   33s        19s        2    {kubelet k8s-node3}                Warning        FailedSync        Error syncing pod, skipping: failed to "StartContainer" for "mysql" with ErrImagePull: "Error while pulling image: Get http://192.168.110.133:5000/v1/repositories/mysql/images: dial tcp 192.168.110.133:5000: connect: connection refused"
39 
40   32s    6s    2    {kubelet k8s-node3}    spec.containers{mysql}    Normal    BackOff        Back-off pulling image "192.168.110.133:5000/mysql:5.7.30"
41   32s    6s    2    {kubelet k8s-node3}                Warning    FailedSync    Error syncing pod, skipping: failed to "StartContainer" for "mysql" with ImagePullBackOff: "Back-off pulling image \"192.168.110.133:5000/mysql:5.7.30\""

可以使用docker ps查看是否还运行着私有仓库registry。

注意:报错的原因,如下所示:

1 /usr/bin/docker-current: Error response from daemon: Conflict. The container name "/registry" is already in use by container a27987d97039c8596ad2a2150cee9e3fbe7580c8131e9f258aea8a922c22a237. You have to remove (or rename) that container to be able to reuse that name..

大致的意思是:来自守护进程的错误响应:冲突。容器名称“/runoob-nginx-test”为已在容器“a27987d97039c8596ad2a2150cee9e3fbe7580c8131e9f258aea8a922c22a237”中使用。您必须删除(或重命名)该容器才能重用该名称。

 1 [root@k8s-master ~]# docker run -d -p 5000:5000 --restart=always --name registry -v /opt/myregistry:/var/lib/registry registry
 2 /usr/bin/docker-current: Error response from daemon: Conflict. The container name "/registry" is already in use by container a27987d97039c8596ad2a2150cee9e3fbe7580c8131e9f258aea8a922c22a237. You have to remove (or rename) that container to be able to reuse that name..
 3 See '/usr/bin/docker-current run --help'.
 4 [root@k8s-master ~]#  docker ps -l 
 5 CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                  PORTS               NAMES
 6 a27987d97039        registry            "/entrypoint.sh /e..."   11 days ago         Exited (2) 9 days ago                       registry
 7 [root@k8s-master ~]# docker rm a27987d97039
 8 a27987d97039
 9 [root@k8s-master ~]#  docker ps -l 
10 CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES
11 ee95778bd5d9        busybox             "sh"                12 days ago         Exited (127) 12 days ago                       friendly_payne
12 [root@k8s-master ~]# docker run -d -p 5000:5000 --restart=always --name registry -v /opt/myregistry:/var/lib/registry registry
13 5e72b0961647003c757fd41ffe824027c857d1f3938b9a53535645f4f372a40a
14 [root@k8s-master ~]# docker ps 
15 CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
16 5e72b0961647        registry            "/entrypoint.sh /e..."   4 seconds ago       Up 3 seconds        0.0.0.0:5000->5000/tcp   registry
17 [root@k8s-master ~]# 

解决的方法:使用docker ps 时查看发现没有运行,使用 docker ps -l , 可以看到有一个nginx容器 ( -l 是显示最新创建的容器包括所有状态) 。删除容器重名的容器再次运行就行。使用docker ps只能查看正在运行的容器,因为nginx这个容器已经给被停止了所以看不到。

然后将你的镜像上传到私有仓库里面,如下所示:

 1 [root@k8s-master tomcat_demo]# docker tag docker.io/mysql:5.7.30 192.168.110.133:5000/mysql:5.7.30 
 2 [root@k8s-master tomcat_demo]# docker push 192.168.110.133:5000/mysql:5.7.30 
 3 The push refers to a repository [192.168.110.133:5000/mysql]
 4 c90a34afcab0: Pushed 
 5 ac7657905788: Pushed 
 6 8f0182ef7c8c: Pushed 
 7 91ae264962fb: Pushed 
 8 3a2464d8e0c0: Pushed 
 9 44853bb67274: Pushed 
10 61cbb8ea6481: Pushed 
11 66c45123fd43: Pushed 
12 c3f46b20a0d3: Pushed 
13 365386a39e0e: Pushed 
14 13cb14c2acd3: Pushed 
15 5.7.30: digest: sha256:0563b36ec2d1a262f79e1d8562e61f642a0f64f93306d8a709047cdea0444d0a size: 2621
16 [root@k8s-master tomcat_demo]# 

然后可以创建mysql的RC,此时就可以顺利创建成功了。

 1 [root@k8s-master tomcat_demo]# kubectl create -f mysql-rc.yml 
 2 replicationcontroller "mysql" created
 3 [root@k8s-master tomcat_demo]# kubectl get rc 
 4 NAME      DESIRED   CURRENT   READY     AGE
 5 mysql     1         1         1         5s
 6 [root@k8s-master tomcat_demo]# kubectl get all -o wide
 7 NAME       DESIRED   CURRENT   READY     AGE       CONTAINER(S)   IMAGE(S)                            SELECTOR
 8 rc/mysql   1         1         1         11s       mysql          192.168.110.133:5000/mysql:5.7.30   app=mysql
 9 
10 NAME             CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE       SELECTOR
11 svc/kubernetes   10.254.0.1   <none>        443/TCP   13d       <none>
12 
13 NAME             READY     STATUS        RESTARTS   AGE       IP            NODE
14 po/mysql-537xf   1/1       Running       0          11s       172.16.16.3   k8s-master
15 po/mysql-gnws2   1/1       Terminating   0          3m        172.16.32.3   k8s-node3
16 [root@k8s-master tomcat_demo]# 

由于前几篇的文章,没有发现注册中心已经挂了,所以这里再贴一下我的docker加速和私有仓库的配置。

 1 [root@k8s-master tomcat_demo]# cat /etc/docker/daemon.json
 2 {
 3   "insecure-registries": ["192.168.110.133:5000"],
 4   "registry-mirrors" : ["https://tnxkcso1.mirror.aliyuncs.com"]    
 5 }
 6 [root@k8s-master tomcat_demo]# cat /etc/sysconfig/docker
 7 # /etc/sysconfig/docker
 8 
 9 # Modify these options if you want to change the way the docker daemon runs
10 OPTIONS='--selinux-enabled --log-driver=journald --signature-verification=false'
11 # 信任私有仓库,镜像加速
12 # OPTIONS='--selinux-enabled --log-driver=journald --signature-verification=false
13 # --registry-mirror=https://registry.docker-cn.com --insecure-registry=192.168.110.133:5000'
14 
15 
16 
17 if [ -z "${DOCKER_CERT_PATH}" ]; then
18     DOCKER_CERT_PATH=/etc/docker
19 fi
20 
21 # Do not add registries in this file anymore. Use /etc/containers/registries.conf
22 # instead. For more information reference the registries.conf(5) man page.
23 
24 # Location used for temporary files, such as those created by
25 # docker load and build operations. Default is /var/lib/docker/tmp
26 # Can be overriden by setting the following environment variable.
27 # DOCKER_TMPDIR=/var/tmp
28 
29 # Controls the /etc/cron.daily/docker-logrotate cron job status.
30 # To disable, uncomment the line below.
31 # LOGROTATE=false
32 
33 # docker-latest daemon can be used by starting the docker-latest unitfile.
34 # To use docker-latest client, uncomment below lines
35 #DOCKERBINARY=/usr/bin/docker-latest
36 #DOCKERDBINARY=/usr/bin/dockerd-latest
37 #DOCKER_CONTAINERD_BINARY=/usr/bin/docker-containerd-latest
38 #DOCKER_CONTAINERD_SHIM_BINARY=/usr/bin/docker-containerd-shim-latest
39 [root@k8s-master tomcat_demo]# 

mysql的RC创建成功之后,开始创建svc,如下所示:

 1 [root@k8s-master tomcat_demo]# cat mysql-svc.yml 
 2 apiVersion: v1
 3 kind: Service
 4 metadata:
 5   name: mysql
 6 spec:
 7   ports:
 8     - port: 3306
 9       targetPort: 3306
10   selector:
11     app: mysql
12 [root@k8s-master tomcat_demo]# 

创建命令和查看是否创建成功的,命令如下所示:

 1 [root@k8s-master tomcat_demo]# kubectl create -f mysql-svc.yml 
 2 service "mysql" created
 3 [root@k8s-master tomcat_demo]# kubectl get svc 
 4 NAME         CLUSTER-IP       EXTERNAL-IP   PORT(S)    AGE
 5 kubernetes   10.254.0.1       <none>        443/TCP    13d
 6 mysql        10.254.245.194   <none>        3306/TCP   7s
 7 [root@k8s-master tomcat_demo]# kubectl get all -o wide
 8 NAME       DESIRED   CURRENT   READY     AGE       CONTAINER(S)   IMAGE(S)                            SELECTOR
 9 rc/mysql   1         1         1         31m       mysql          192.168.110.133:5000/mysql:5.7.30   app=mysql
10 
11 NAME             CLUSTER-IP       EXTERNAL-IP   PORT(S)    AGE       SELECTOR
12 svc/kubernetes   10.254.0.1       <none>        443/TCP    13d       <none>
13 svc/mysql        10.254.245.194   <none>        3306/TCP   28s       app=mysql
14 
15 NAME             READY     STATUS    RESTARTS   AGE       IP            NODE
16 po/mysql-537xf   1/1       Running   0          31m       172.16.16.3   k8s-master
17 [root@k8s-master tomcat_demo]# 

可以看到RC、SVC是通过selector进行关联起来的,而且pod也已经运行起来了。

mysql是已经创建完毕了,那么tomcat是如何和mysql连接起来的呢,这里还是通过环境变量来做的。服务与服务之间是通过VIP来进行连接的,tomcat要连接mysql就需要配置此环境变量MYSQL_SERVICE_HOST。

注意:如果你的项目已经开发好了,并且已经搞到了tomcat里面了,将这个tomcat打成镜像,然后上传到私有仓库,可以创建Pod这些。我的由于没有项目,这里就不进行tomcat的创建了,和mysql的类似。

 1 apiVersion: v1
 2 kind: ReplicationController
 3 metadata:
 4   name: myweb
 5 spec:
 6   replicas: 1
 7   selector:
 8     app: myweb
 9   template:
10     metadata:
11       labels:
12         app: myweb
13     spec:
14       containers:
15         - name: myweb
16           image: 192.168.110.133:5000/tomcat-app:v2
17           ports:
18           - containerPort: 8080
19           env:
20           - name: MYSQL_SERVICE_HOST
21             value: '10.254.245.194'
22           - name: MYSQL_SERVICE_PORT
23             value: '3306'

创建tomcat的RC命令,如下所示:

首先,需要将镜像下载下来,然后上传到私有仓库才可以的哦。

 1 [root@k8s-master ~]# docker pull docker.io/tomcat
 2 Using default tag: latest
 3 Trying to pull repository docker.io/library/tomcat ... 
 4 latest: Pulling from docker.io/library/tomcat
 5 e9afc4f90ab0: Pull complete 
 6 989e6b19a265: Pull complete 
 7 af14b6c2f878: Pull complete 
 8 5573c4b30949: Pull complete 
 9 fb1a405f128d: Pull complete 
10 612a9f566fdc: Pull complete 
11 cf63ebed1142: Pull complete 
12 fbb20561cd50: Pull complete 
13 e99c920870d7: Pull complete 
14 b7f793f2be47: Pull complete 
15 Digest: sha256:81c2a95e5b1b5867229d75255abe54928d505deb81c8ff8949b61fde1a5d30a1
16 Status: Downloaded newer image for docker.io/tomcat:latest
17 [root@k8s-master ~]# docker images 
18 REPOSITORY                                            TAG                 IMAGE ID            CREATED             SIZE
19 docker.io/tomcat                                      latest              2eb5a120304e        7 days ago          647 MB
20 192.168.110.133:5000/mysql                            5.7.30              9cfcce23593a        8 days ago          448 MB
21 docker.io/mysql                                       5.7.30              9cfcce23593a        8 days ago          448 MB
22 docker.io/busybox                                     latest              1c35c4412082        2 weeks ago         1.22 MB
23 docker.io/registry                                    latest              708bc6af7e5e        4 months ago        25.8 MB
24 192.168.110.133:5000/nginx                            1.15                53f3fd8007f7        13 months ago       109 MB
25 docker.io/nginx                                       1.15                53f3fd8007f7        13 months ago       109 MB
26 192.168.110.133:5000/nginx                            1.13                ae513a47849c        2 years ago         109 MB
27 docker.io/nginx                                       1.13                ae513a47849c        2 years ago         109 MB
28 registry.access.redhat.com/rhel7/pod-infrastructure   latest              99965fb98423        2 years ago         209 MB
29 192.168.110.133:5000/pod-infrastructure               latest              34d3450d733b        3 years ago         205 MB
30 [root@k8s-master ~]# docker tag docker.io/tomcat:latest 192.168.110.133:5000/tomcat:latest
31 [root@k8s-master ~]# docker push 192.168.110.133:5000/tomcat:latest 
32 The push refers to a repository [192.168.110.133:5000/tomcat]
33 123a7175f991: Pushed 
34 68b9387df273: Pushed 
35 a1c4399f9b22: Pushed 
36 4f866e977815: Pushed 
37 f73b2345c404: Pushed 
38 f5181c7ef902: Pushed 
39 2e5b4ca91984: Pushed 
40 527ade4639e0: Pushed 
41 c2c789d2d3c5: Pushed 
42 8803ef42039d: Pushed 
43 latest: digest: sha256:5e96c003ec31d89fa4b241463ee05a66ddc2cc58976dd1ecb54af313394cd19e size: 2421
44 [root@k8s-master ~]# 

这里就不搞了,具体内容可以看下《Kubernetes权威指南:从Docker到Kubernetes实践全接触(第4版)》 这本书,这本书还是比较不错的,很喜欢。

 

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐