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版)》 这本书,这本书还是比较不错的,很喜欢。