Docker 与 K8S学习笔记(十七)—— 在K8S集群中部署应用
我们今天来通过在在K8S集群中部署web应用来体验一下K8S的使用,我们需要提前准备一个基于springboot的web应用镜像,这个应用也很简单,就一个hello接口:
@RestController @RequestMapping("/api") public class ApiController { @GetMapping("/hello") public String hello() { return "Hello my friend"; } }
一、创建Deployment
我们首先创建Deployment文件webapp.yaml,内容如下:
apiVersion: apps/v1 kind: Deployment metadata: labels: app: webapp name: webapp spec: replicas: 2 selector: matchLabels: app: webapp template: metadata: labels: app: webapp spec: containers: - name: webapp image: 172.16.194.135:5000/webapp:latest ports: - containerPort: 4567
对于这个文件,这里有几个属性需要说明下:
- replicas:定义Pod的副本数量
- selector:目标Pod的标签选择器
- template:用于自动创建新Pod副本的模板
接着我们使用如下命令创建Deployment对象:
$ sudo kubectl apply -f webapp.yaml deployment.apps/webapp created
我们来看下Deployment的信息:
$ sudo kubectl get deployments NAME READY UP-TO-DATE AVAILABLE AGE webapp 2/2 2 2 5s
- READY:当前Pod数与期望Pod数
- UP-TO-DATE:最新版本的Pod数量,用于指示在滚动升级的过程中,有多少个Pod副本已经成功升级
- AVAILABLE:当前集群中可用的Pod副本数量,即当前集群中存储的Pod数量
我们通过Deployment信息可以看到Pod都启动完毕,通过一下命令可以查看Pod信息:
$ sudo kubectl get pods NAME READY STATUS RESTARTS AGE webapp-5fb8547b77-d9txl 1/1 Running 0 8m7s webapp-5fb8547b77-jtmt7 1/1 Running 0 8m7s
我们还可以通过docker命令查看正在运行的容器信息,我们可以发现除了webapp容器外还有pause容器,这个就是Pod的根容器:
$ sudo docker ps | grep webapp f098a5f6e54e 172.16.194.135:5000/webapp "java -jar /opt/soft…" 8 minutes ago Up 8 minutes k8s_webapp_webapp-5fb8547b77-d9txl_default_cc7450ec-3949-4051-9c4b-b955195fcb87_0 7146447c160e 172.16.194.135:5000/webapp "java -jar /opt/soft…" 8 minutes ago Up 8 minutes k8s_webapp_webapp-5fb8547b77-jtmt7_default_fbf22e91-f72a-439e-ac92-74f1ec76487b_0 332672e7ad5a registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.2 "/pause" 8 minutes ago Up 8 minutes k8s_POD_webapp-5fb8547b77-d9txl_default_cc7450ec-3949-4051-9c4b-b955195fcb87_0 816e9e983d7c registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.2 "/pause" 8 minutes ago Up 8 minutes
Deployment资源对象其实还与ReplicaSet资源对象密切相关,Kubernetes内部会根据Deployment对象自动创建相关联的ReplicaSet对象,我们通过以下命令来看看ReplicaSet对象信息:
$ sudo kubectl get replicasets NAME DESIRED CURRENT READY AGE webapp-5fb8547b77 2 2 2 4m48s
二、创建Service
最后我们创建一个Service文件webapp_service.yaml,其文件内容如下:
apiVersion: v1 kind: Service metadata: name: webapp spec: type: NodePort ports: - port: 4567 nodePort: 30001 selector: app: webapp
其中,metadata.name是Service的服务名,spec.type设置为NodePort意味着这个服务开启了NodePort格式的外网访问模式,这样在集群外就可以通过客户端访问此服务,spec.selector确定了哪些Pod关联于本服务。接下来我们通过如下命令创建Service对象:
$ sudo kubectl create -f webapp_service.yaml service/webapp created
我们来看看所创建的Service的信息:
$ sudo kubectl get svc webapp NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE webapp ClusterIP 10.108.237.8 <none> 4567/TCP 2m32s
我们可以看到kubernetes集群为webapp服务分配了一个10.108.237.8地址,这意味着在集群中其它Pod都可以通过此IP+端口号来访问。
截至目前我们的webapp应用已经部署上去了,我们通过浏览器访问对应URL:
分类: 容器技术