前言
通过前几篇文章完成了 MicroK8s 的部署。可以说 MicroK8s 和完整版本的 Kubernetes 基本是一样的,之所以使用 MicroK8s 主要是因为他部署简单。多年的学习经验告诉我,万事开头难,然后一直难,但是终究还是开头最难,而且大部分人学习一个新东西开头遇到困难都很难找到解决方案,导致无法继续下去。
既然 MicroK8s 部署好了,就来部署一个简单的 nginx 应用并访问,仅此来体验一下部署的过程。
部署nginx应用
首先我们需要创建一个3副本的 Deployment ,然后在创建一个 Service 来提供对外访问。同时通过删除一个副本来看看nginx应用的高可用。
Deployment
1
vi nginx-deployment.yaml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 3 # 设置副本数量
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:latest #镜像拉取地址
ports:
- containerPort: 80 #监听端口
1
microk8s kubectl apply -f nginx-deployment.yaml
1
2
3
4
5
6
7
8
9
10
11
12
13
# 查看default命名空间下所有资源
microk8s@microk8s-01:~$ microk8s kubectl get all -n default
NAME READY STATUS RESTARTS AGE
pod/nginx-deployment-7c79c4bf97-4rjvl 1/1 Running 0 13m
pod/nginx-deployment-7c79c4bf97-kk572 1/1 Running 0 13m
pod/nginx-deployment-7c79c4bf97-lwt4z 1/1 Running 0 13m
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/nginx-deployment 3/3 3 3 13m
NAME DESIRED CURRENT READY AGE
replicaset.apps/nginx-deployment-7c79c4bf97 3 3 3 13m
microk8s@microk8s-01:~$
从上面结果可以看出,他创建了三类资源:pod
、deployment
、replicaset
。
- Pod:Kubernetes 系统中可以创建和管理的最小单元,是资源对象模型中由用户创建或部署的最小资源对象模型,也是在 Kubernetes 上运行容器化应用的资源对象,其它的资源对象都是用来支撑或者扩展 Pod 对象功能的。Pod与容器是不同的,一个Pod可以包含一个或多个容器。当前情况下在yml文件中制定了3个副本,可以认为每一个pod就是一个nginx的容器。而系统创建了三个pod,即三个副本。
- Replicaset:控制管理Pod,保证指定数量的Pod运行,并支持pod数量变更,镜像版本变更,三个副本就是由他来控制的。
- Deployment:管理Replicaset,并支持滚动升级,版本回退。
我们只是创建了一个 Deployment ,系统却做了这么多,这三者关系为: Deployment
控制 Replicaset
控制 Pod
,可以看到其实nginx应用只在Pod里,而其他的都是为了更好地管理Pod
注: 如果已经用平台创建过其他服务,这里的结果可能会多一些其他的资源,可以通过创建时间进行区分。
这里创建的时候没有指定namespace,所有是default。
Service
1
vi nginx-service.yaml
1
2
3
4
5
6
7
8
9
10
11
12
13
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
selector:
app: nginx
ports:
- protocol: TCP
port: 80
targetPort: 80
nodePort: 30080 #nortPort开在主机的端口,范围30000-32767,不指定会随机分配,建议不指定,避免冲突导致错误
type: NodePort
1
microk8s kubectl apply -f nginx-service.yaml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 查看default命名空间下所有资源
microk8s@microk8s-01:~$ microk8s kubectl get all -n default
NAME READY STATUS RESTARTS AGE
pod/nginx-deployment-7c79c4bf97-4rjvl 1/1 Running 0 55m
pod/nginx-deployment-7c79c4bf97-kk572 1/1 Running 0 55m
pod/nginx-deployment-7c79c4bf97-lwt4z 1/1 Running 0 55m
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/nginx-service NodePort 10.152.183.90 <none> 80:30080/TCP 56s
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/nginx-deployment 3/3 3 3 55m
NAME DESIRED CURRENT READY AGE
replicaset.apps/nginx-deployment-7c79c4bf97 3 3 3 55m
microk8s@microk8s-01:~$
引入 Service
主要是解决 Pod 的动态变化,通过创建 Service,可以为一组具有相同功能的容器应用提供一个统一的入口地址,并且将请求负载分发到后端的各个容器应用上。若提供服务的容器应用是分布式,所以存在多个 pod 副本,而 Pod 副本数量可能在运行过程中动态改变,比如水平扩缩容,或者服务器发生故障 Pod 的 IP 地址也有可能发生变化。当 pod 的地址端口发生改变后,客户端再想连接访问应用就得人工干预,很麻烦,这时就可以通过 service 来解决问题。
访问
现在可以通过集群中任何一台机器的ip对外提供服务了,[http://192.168.1.248:30080/],[http://192.168.1.249:30080/],[http://192.168.1.250:30080/]都可以.
高可用
删除Pod
上面创建了一个三副本的nginx应用,通过删除其中的一个或两个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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
# 查看当前状态
microk8s@microk8s-01:~$ microk8s kubectl get all -n default
NAME READY STATUS RESTARTS AGE
pod/nginx-deployment-7c79c4bf97-4rjvl 1/1 Running 0 66m
pod/nginx-deployment-7c79c4bf97-kk572 1/1 Running 0 66m
pod/nginx-deployment-7c79c4bf97-lwt4z 1/1 Running 0 66m
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/nginx-service NodePort 10.152.183.90 <none> 80:30080/TCP 11m
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/nginx-deployment 3/3 3 3 66m
NAME DESIRED CURRENT READY AGE
replicaset.apps/nginx-deployment-7c79c4bf97 3 3 3 66m
microk8s@microk8s-01:~$
# 删除一个pod nginx-deployment-7c79c4bf97-4rjvl
microk8s@microk8s-01:~$ microk8s kubectl delete pod/nginx-deployment-7c79c4bf97-4rjvl
pod "nginx-deployment-7c79c4bf97-4rjvl" deleted
# 再次查看,发现nginx-deployment-7c79c4bf97-4rjvl没了,但是有一个新pod正在创建。现在访问nginx也正常。
microk8s@microk8s-01:~$ microk8s kubectl get all -n default
NAME READY STATUS RESTARTS AGE
pod/nginx-deployment-7c79c4bf97-8rmr7 0/1 ContainerCreating 0 27s
pod/nginx-deployment-7c79c4bf97-kk572 1/1 Running 0 69m
pod/nginx-deployment-7c79c4bf97-lwt4z 1/1 Running 0 69m
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/nginx-service NodePort 10.152.183.90 <none> 80:30080/TCP 14m
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/nginx-deployment 2/3 3 2 69m
NAME DESIRED CURRENT READY AGE
replicaset.apps/nginx-deployment-7c79c4bf97 3 3 2 69m
microk8s@microk8s-01:~$
# 一段时间后,容器创建成功,又维持到了3个pod
microk8s@microk8s-01:~$ microk8s kubectl get all -n default
NAME READY STATUS RESTARTS AGE
pod/nginx-deployment-7c79c4bf97-8rmr7 1/1 Running 0 2m
pod/nginx-deployment-7c79c4bf97-kk572 1/1 Running 0 71m
pod/nginx-deployment-7c79c4bf97-lwt4z 1/1 Running 0 71m
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/nginx-service NodePort 10.152.183.90 <none> 80:30080/TCP 16m
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/nginx-deployment 3/3 3 3 71m
NAME DESIRED CURRENT READY AGE
replicaset.apps/nginx-deployment-7c79c4bf97 3 3 3 71m
microk8s@microk8s-01:~$
会发现不管怎么删除Pod,最终都会自动维持3个Pod。
删除Replicaset
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
# 删除 replicaset
microk8s@microk8s-01:~$ microk8s kubectl delete replicaset.apps/nginx-deployment-7c79c4bf97
replicaset.apps "nginx-deployment-7c79c4bf97" deleted
# 查看状态,注意pod、deployment、replicaset的状态值
microk8s@microk8s-01:~$ microk8s kubectl get all -n default
NAME READY STATUS RESTARTS AGE
pod/nginx-deployment-7c79c4bf97-8rmr7 1/1 Terminating 0 6m3s
pod/nginx-deployment-7c79c4bf97-kk572 1/1 Terminating 0 75m
pod/nginx-deployment-7c79c4bf97-lwt4z 1/1 Terminating 0 75m
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/nginx-service NodePort 10.152.183.90 <none> 80:30080/TCP 20m
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/nginx-deployment 3/3 3 3 75m
NAME DESIRED CURRENT READY AGE
replicaset.apps/nginx-deployment-7c79c4bf97 3 0 0 6s
# 再次查看
microk8s@microk8s-01:~$ microk8s kubectl get all -n default
NAME READY STATUS RESTARTS AGE
pod/nginx-deployment-7c79c4bf97-8rmr7 1/1 Terminating 0 6m16s
pod/nginx-deployment-7c79c4bf97-kk572 1/1 Terminating 0 75m
pod/nginx-deployment-7c79c4bf97-kmmbq 0/1 Pending 0 6s
pod/nginx-deployment-7c79c4bf97-lwt4z 1/1 Terminating 0 75m
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/nginx-service NodePort 10.152.183.90 <none> 80:30080/TCP 20m
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/nginx-deployment 0/3 0 0 75m
NAME DESIRED CURRENT READY AGE
replicaset.apps/nginx-deployment-7c79c4bf97 3 0 0 19s
# 再次查看
microk8s@microk8s-01:~$ microk8s kubectl get all -n default
NAME READY STATUS RESTARTS AGE
pod/nginx-deployment-7c79c4bf97-8rmr7 1/1 Terminating 0 6m18s
pod/nginx-deployment-7c79c4bf97-cs2tl 0/1 Pending 0 3s
pod/nginx-deployment-7c79c4bf97-kk572 1/1 Terminating 0 75m
pod/nginx-deployment-7c79c4bf97-kmmbq 0/1 Pending 0 8s
pod/nginx-deployment-7c79c4bf97-lwt4z 1/1 Terminating 0 75m
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/nginx-service NodePort 10.152.183.90 <none> 80:30080/TCP 20m
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/nginx-deployment 0/3 0 0 75m
NAME DESIRED CURRENT READY AGE
replicaset.apps/nginx-deployment-7c79c4bf97 3 0 0 21s
# 最终
microk8s@microk8s-01:~$ microk8s kubectl get all -n default
NAME READY STATUS RESTARTS AGE
pod/nginx-deployment-7c79c4bf97-9lfzb 1/1 Running 0 47s
pod/nginx-deployment-7c79c4bf97-cs2tl 1/1 Running 0 47s
pod/nginx-deployment-7c79c4bf97-kmmbq 1/1 Running 0 52s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/nginx-service NodePort 10.152.183.90 <none> 80:30080/TCP 21m
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/nginx-deployment 3/3 3 3 76m
NAME DESIRED CURRENT READY AGE
replicaset.apps/nginx-deployment-7c79c4bf97 3 3 3 65s
microk8s@microk8s-01:~$
如果删除Replicaset将导致其下的所有Pod都将重新创建。而且Replicaset也会被创建,但是和Pod不同的是,Pod的名字会变,而Replicaset的名字不会变,通过连续执行查看命令可以看到Replicaset不存在的过程,然后很快就又出来了。
上面的每一步操作都是通过命令来创建的,其实也是可以通过 Dashboard 来达到相同的目的。因为是图形操作界面,使用上更加简单方便,这里不做介绍。