一、部署一个 tomcat
- 创建一个部署叫tomcat6 用docker hub的镜像 tomcat:6.0.53-jre8这个镜像带了JRE8的环境的
kubectl create deployment tomcat6 --image=tomcat:6.0.53-jre8
- 获取K8S里面的所有资源
kubectl get all
资源分为四张表
前面是资源类型,相当于现在要部署一个pod ,pod 是tomcat6-5f7ccf4cb9-wlrdc 带了一些其他唯一标识5f7cc..., ready0/1,这个tomcat pod里面有一个容器,但是它还没准备好 容器正在创建中ContainerCreating
当前还有一个Service 我们说的服务 后来我们说一下Service是什么
那么,这次就是我们的deployment,我们的这次部署tomcat6,做了一次部署,但是呢,零个成功,那还没有成功呢。
还有我们的replicaset, 那这个呢,就是我们的复制,我们这个应用呢,要复制几份?我们现在要复制一份,但是呢,还没有一个ready状态。
而且,我们现在既然让master来调度给我们来要部署一个pod了,那相当于这个pod就得在我们的其他节点note2或者note3来部署,那么怎么知道master放在哪个节点了呢?
我们可以kubectl get all -o wide,我们让它打印出更宽泛的内容
kubectl get all -o wide
那么在这儿呢,可以看到我们这个tomcat6里边的这个pod,它部署的节点是k8s-node2, 然后呢,它正在running,说明呢,它在node2节点已经部署好了。
我先用这个命令来验证一件事情,我们docker images看我们note2节点下载了哪些镜像,发现呢,这有一个镜像叫tomcat
那说明我们现在他们刚的部署,那分配给note2节点了。Note2节点先下载镜像,那它肯定要启动容器啊。来打开PS看一下正在运行中的容器,
有一个容器呢,那就叫tomcat,它也把这个容器启动了。这容器的名字超长,那就在这儿lt_747ac6ea-4b9f-402e-a824-adbdc7933362_0,所以们这个容器也都启动了,所有的东西呢,都准备好了。
那我们这一块看到的这个kubectl get pods 来获取它默认名称空间的,因为如果我们是kubectl get pods --all-namespaces是获取所有的
来获取它到它默认名称空间
kubectl get pods
kubectl get pods --all-namespaces
我们默认的其他系统的服务都在kube-system 名称空间里面
部署的所有应用都在默认的命名空间 default
kubectl get pods -o wide
确实能看到在k8s-node2节点已经创建这次部署
那这次部署呢,就牵扯到我们之前的说的这么各种资源,我们再来看一下,kubectl get all
我们一个pod一个service,还有一个deployment,还有一个replicaset 这些东西是什么,我们来后来再说
现在模拟node2宕机,会是什么效果
第一种:node2 docker stop tomcat6,主动关闭它也会重新再拉起一个新的
这就是由于我们这个部署规定东西总是得有一份
第二种:现在为了模仿node2宕机,直接关机node2
master就感知到
kubectl get nodes
这里是需要一段时间才能感应到,在测试的同学不要着急 现在可以看到node2在发送Terminating node3在拉取镜像
中途看了一下拉取镜像有失败,但是我去node3节点docker images 又看到了tomcat6 再回到主节点在看就是running了
node2节点还在运行是因为Terminating中断命令发出去node2无法接收,所以没有关闭
可以看到它会在node3再拉取创建一个tomcat,这就是容灾恢复,一旦我们有一个节点出现了宕机,它可以帮我们自动恢复
此时再把node2开机,就会恢复到只有一个tomcat了,因为node2开机接收到Terminating命令会关闭
二、暴露 nginx 访问
tomcat6,既然已经创建好了,如果想要暴露给外面访问tomcat6,接下来可以使用这个命令将
kubectl expose deployment tomcat6 --port=80 --target-port=8080 --type=NodePort
要暴露一个部署,暴露哪个部署呢?我们的这个tomcat6,那接下来呢,有一个--port 80, 然后--port 8080, 然后--type=NodePort这是什么意思?
就是我们都知道,Tomcat默认暴露的端口是8080。但如果是使用docker容器的话,以前是把8080映射一个端口。
现在docker,又是用pod封装的,就指的是我们这个pod里边的这个容器,它暴露的端口是8080。访问pod用哪个端口?用80,然后访问到我们的8080。
接下来整个pod,要作为一个我们称为叫service,要暴露出去。暴露出去以后用的是什么模式,有一个叫NodePort, 叫这个节点端口的模式,那这种模式就相当咱们这个pod作为一个service,它随机分配一个端口帮我来暴露出去,
也可以使用--node port=自己来指定一个端口。最终效果就是这样,如果指定30778,去外界访问30778,那么就会访问到pod的这个80,那pod的80就会带到它容器里面的8080。
一个pod里面可能还会有多个容器,这也是可能的
先来测试一下,具体它们都写什么值,后来再说好
发现有一个东西叫service,就暴露了一个service,现在来使用这个命令获取所有的service
kubectl get svc
之前有个默认service叫kubernetes,现在还有个tomcat6,它随机分配了一个叫31738。想要看更广泛的信息
kubectl get svc -o wide
其实就可以使用31738来访问了
获取到所有的service是kubectl get svc,也可以来kubectl get all,就能看到所有的信息。
kubectl get all
这个pod,被封装成一个service,对外暴露的是31738。这个pod产生是由于这次部署产生的。这次部署呢,最终还有一个副本,副本相当运行几份,运行一份,我们就相当一台机器一份就行。
三、动态扩容
kubectl scale --replicas=3 deployment tomcat6
kubectl get pods -o wide
可以看到 node2节点运行两个 node3节点运行一个
kubectl get svc -o wide
在任何节点访问31738都访问到tomcat
四、缩容
缩容也是一样的,把副本数变为1
kubectl scale --replicas=1 deployment tomcat6
五、删除
Kubectl get all
kubectl delete deploy/nginx
kubectl delete service/nginx-service
[root@k8s-node1 ~]# kubectl get all
NAME READY STATUS RESTARTS AGE
pod/tomcat6-5f7ccf4cb9-xd4cx 1/1 Running 0 58m
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.96.0.1 443/TCP 15h
service/tomcat6 NodePort 10.96.58.120 80:31738/TCP 25m
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/tomcat6 1/1 1 1 96m
NAME DESIRED CURRENT READY AGE
replicaset.apps/tomcat6-5f7ccf4cb9 1 1 1 96m
[root@k8s-node1 ~]# kubectl delete deployment.apps/tomcat6
deployment.apps "tomcat6" deleted
[root@k8s-node1 ~]# kubectl get all
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.96.0.1 443/TCP 15h
service/tomcat6 NodePort 10.96.58.120 80:31738/TCP 26m
[root@k8s-node1 ~]# kubectl get pods
No resources found in default namespace.
[root@k8s-node1 ~]# kubectl delete service/tomcat6
service "tomcat6" deleted
[root@k8s-node1 ~]# kubectl get all
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.96.0.1 443/TCP 15h