Kubernetes(二) 应用部署
Kubernetes教程之应用部署
文章地址: https://blog.piaoruiqing.com/blog/2019/09/28/kubernetes应用部署/
前言
本文将与读者一起, 学习如何在Kubernetes上部署应用. 包括: 如何部署应用、发布文件讲解、将本地项目打包发布等.
阅读这篇文章你能收获到:
- 学会如何在k8s部署应用
- 如何打包Docker镜像、上传到私有库
阅读本文你需要:
- 熟悉Linux命令.
- 有一个Kubernetes环境 (可参考《跟着官方文档从零搭建K8S》在本地部署一套Kubernetes测试环境)
理解描述文件
首先, 我们通过在Kubernetes部署Nginx来理解描述文件.
一般地, Kubernetes使用yaml(或json)来描述发布配置. 下面是一个简单的描述文件: nginx-pod.yaml
1 | apiVersion: v1 # 描述文件所遵循KubernetesAPI的版本 |
我们登录Master节点, 使用kubectl
命令来部署这个文件所描述的应用. (当然, 使用dashboard发布也可)
kubectl get pods
命令是用来查看pod列表的, 使用grep
筛选出nginx相关的pod. 此时nginx已经发布完成了. 我们可以从dashboard来直观地查看到应用状态.
备注: 删除pod可使用
kubectl delete -f nginx-pod.yaml
命令, 也可直接在dashboard进行操作.
本文发布于朴瑞卿的博客, 允许非商业用途转载, 但转载必须保留原作者朴瑞卿 及链接:http://blog.piaoruiqing.com. 如有授权方面的协商或合作, 请联系邮箱: piaoruiqing@gmail.com.
如何访问服务
上一小节我们部署了一个Nginx pod, 但我们无法访问到该Nginx.
想要访问到pod中的服务, 最简单的方式就是通过端口转发, 执行如下命令, 将宿主机的9999
端口与nginx-pod的80
端口绑定:
1 | [root@nas-centos1 ~]$ kubectl port-forward --address 0.0.0.0 nginx-pod 9999:80 |
此时, 我们可以通过访问宿主机9999端口来访问Nginx.
部署本地项目
将本地开发的项目发布到Kubernetes, 需要将项目打包成Docker镜像, 然后将镜像推送到仓库(公开/私有仓库都可).
首先, 我们需要一个可以运行的本地项目, 笔者使用spring-boot构建了一个简单的web项目:
1 |
|
打包Docker镜像
有了项目, 我们需要将其打包成一个Docker镜像, Dockerfile
内容如下:
1 | FROM java:8-alpine |
FROM java:8-alpine
: 该镜像基于java-8-alpine
镜像.COPY ./target/k8s-test-0.0.1-SNAPSHOT.jar /usr/app/
: 将编译打包好的jar拷贝到镜像的/usr/app
目录下.WORKDIR /usr/app
: 工作目录指定为/usr/app
.ENTRYPOINT ["java", "-jar", "k8s-test-0.0.1-SNAPSHOT.jar"]
: 启动docker时执行java -jar k8s-test-0.0.1-SNAPSHOT.jar
命令
进入到Dockerfile所在目录执行docker build -t piaoruiqing/k8s-test .
进行打包. 注意不要遗漏掉命令最后面的.
, 它代表当前目录.
1 | [root@nas-centos1 k8s-test]$ docker build -t piaoruiqing/k8s-test . |
通过docker images
命令可以查看本地镜像列表:
1 | [root@nas-centos1 k8s-test]$ docker images | grep k8s |
推送到远程仓库
docker镜像打包完成后, 需要推送到镜像仓库供Kubernetes各个节点使用. 本文以阿里云的容器镜像服务为例.
首先, 登录到阿里云控制台 -> 容器镜像服务, 创建一个命名空间:
1 | # 登录, 用于登录的用户名为阿里云账号全名, 密码为开通服务时设置的密码. |
部署
私库支持
由于笔者使用了私库, Kubernetes无法直接访问, 发布前需要先创建secret 以支持私有库的访问.
1 | kubectl create secret docker-registry docker-registry-secret --docker-server=registry.cn-hangzhou.aliyuncs.com --docker-username=[用户名] --docker-password=[密码] --docker-email=[邮箱] |
docker-registry-secret
: 指定密钥的键名称, 可自行定义.docker-server
: 指定 Docker 仓库地址.docker-username
: 指定 Docker 仓库用户名.docker-password
: 指定 Docker 仓库登录密码.docker-email
: 指定邮件地址(选填).
可通过kubectl get secrets
查看全部secret
1 | [root@nas-centos1 k8s-test]$ kubectl get secrets |
开始部署
访问私库时, 描述文件中需要指定secret, 如下:
1 | apiVersion: v1 |
执行命令kubectl apply -f k8s-test-pod.yaml
进行部署, 完成后我们可以在dashboard查看.
使用kubectl port-forward --address 0.0.0.0 k8s-test-pod 80:8080
可绑定主机(master) 80端口和pod的8080端口. 如此我们就可以访问 http://10.33.30.95/k8s-test/timestamp了.
1 | [root@nas-centos2 ~]$ curl 10.33.30.95/k8s-test/timestamp |
部署集群
现在, 我们已经成功地在Kubernetes上部署了一个应用实例, 生产环境中多数情况下我们的应用需要集群部署, 此时, 我们使用 Deployment 来描述即可:
1 | apiVersion: apps/v1 |
同样地, 使用kubectl apply -f
命令发布配置即可.
1 | [root@nas-centos1 k8s-test]$ kubectl apply -f k8s-test.yaml |
参考文献
推荐阅读:
本文发布于朴瑞卿的博客, 允许非商业用途转载, 但转载必须保留原作者朴瑞卿 及链接:http://blog.piaoruiqing.com. 如有授权方面的协商或合作, 请联系邮箱: piaoruiqing@gmail.com.