Kubernetes教程之应用部署java
文章地址: blog.piaoruiqing.com/2019/09/28/…nginx
本文将与读者一块儿, 学习如何在Kubernetes上部署应用. 包括: 如何部署应用、发布文件讲解、将本地项目打包发布等.web
阅读这篇文章你能收获到:spring
阅读本文你须要:docker
首先, 咱们经过在Kubernetes部署Nginx来理解描述文件.json
通常地, Kubernetes使用yaml(或json)来描述发布配置. 下面是一个简单的描述文件: nginx-pod.yaml
centos
apiVersion: v1 # 描述文件所遵循KubernetesAPI的版本 kind: Pod # 描述的类型是pod metadata: name: nginx-pod # pod的名称 labels: # 标签 app: nginx-pod env: test spec: containers: - name: nginx-pod # 容器名 image: nginx:1.15 # 镜像名称及版本 imagePullPolicy: IfNotPresent # 若是本地不存在就去远程仓库拉取 ports: - containerPort: 80 # pod对外端口 restartPolicy: Always 复制代码
咱们登陆Master节点, 使用kubectl
命令来部署这个文件所描述的应用. (固然, 使用dashboard发布也可)api
kubectl get pods
命令是用来查看pod列表的, 使用grep
筛选出nginx相关的pod. 此时nginx已经发布完成了. 咱们能够从dashboard来直观地查看到应用状态.bash
备注: 删除pod可以使用
kubectl delete -f nginx-pod.yaml
命令, 也可直接在dashboard进行操做.markdown
上一小节咱们部署了一个Nginx pod, 但咱们没法访问到该Nginx.
想要访问到pod中的服务, 最简单的方式就是经过端口转发, 执行以下命令, 将宿主机的9999
端口与nginx-pod的80
端口绑定:
[root@nas-centos1 ~]$ kubectl port-forward --address 0.0.0.0 nginx-pod 9999:80 Forwarding from 0.0.0.0:9999 -> 80 Handling connection for 9999 复制代码
此时, 咱们能够经过访问宿主机9999端口来访问Nginx.
将本地开发的项目发布到Kubernetes, 须要将项目打包成Docker镜像, 而后将镜像推送到仓库(公开/私有仓库均可).
首先, 咱们须要一个能够运行的本地项目, 笔者使用spring-boot构建了一个简单的web项目:
@RestController @RequestMapping(value = "/k8s-test") @SpringBootApplication public class K8sTestApplication { @GetMapping(value = "/timestamp") public ResponseEntity<?> getTimestamp() { return ResponseEntity.ok(System.currentTimeMillis() + "\n"); } public static void main(String[] args) { SpringApplication.run(K8sTestApplication.class, args); } } 复制代码
有了项目, 咱们须要将其打包成一个Docker镜像, Dockerfile
内容以下:
FROM java:8-alpine COPY ./k8s-test-0.0.1-SNAPSHOT.jar /usr/app/ WORKDIR /usr/app ENTRYPOINT ["java", "-jar", "k8s-test-0.0.1-SNAPSHOT.jar"] 复制代码
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 .
进行打包. 注意不要遗漏掉命令最后面的.
, 它表明当前目录.
[root@nas-centos1 k8s-test]$ docker build -t piaoruiqing/k8s-test .
复制代码
经过docker images
命令能够查看本地镜像列表:
[root@nas-centos1 k8s-test]$ docker images | grep k8s
piaoruiqing/k8s-test latest efe9e9625376 4 minutes ago 174MB
复制代码
docker镜像打包完成后, 须要推送到镜像仓库供Kubernetes各个节点使用. 本文以阿里云的容器镜像服务为例.
首先, 登陆到阿里云控制台 -> 容器镜像服务, 建立一个命名空间:
# 登陆, 用于登陆的用户名为阿里云帐号全名, 密码为开通服务时设置的密码. [root@nas-centos1 k8s-test]$ docker login --username=[用户名] registry.cn-hangzhou.aliyuncs.com # 打标签, 镜像ID能够经过 docker images 命令查看 [root@nas-centos1 k8s-test]$ docker tag efe9e9625376 registry.cn-hangzhou.aliyuncs.com/piaoruiqing/k8s-test:0.0.1 # 推送到阿里云镜像仓库 [root@nas-centos1 k8s-test]$ docker push registry.cn-hangzhou.aliyuncs.com/piaoruiqing/k8s-test:0.0.1 复制代码
因为笔者使用了私库, Kubernetes没法直接访问, 发布前须要先建立secret 以支持私有库的访问.
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
[root@nas-centos1 k8s-test]$ kubectl get secrets NAME TYPE DATA AGE default-token-s7bps kubernetes.io/service-account-token 3 13d docker-registry-secret kubernetes.io/dockerconfigjson 1 2m50s 复制代码
访问私库时, 描述文件中须要指定secret, 以下:
apiVersion: v1 kind: Pod metadata: name: k8s-test-pod labels: app: k8s-test-pod spec: containers: - name: k8s-test-pod image: registry.cn-hangzhou.aliyuncs.com/piaoruiqing/k8s-test:0.0.1 imagePullPolicy: IfNotPresent restartPolicy: Always imagePullSecrets: - name: docker-registry-secret # 这里就是前文中建立的secret, 用来访问私库 复制代码
执行命令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了.
[root@nas-centos2 ~]$ curl 10.33.30.95/k8s-test/timestamp
1569512136028
复制代码
如今, 咱们已经成功地在Kubernetes上部署了一个应用实例, 生产环境中多数状况下咱们的应用须要集群部署, 此时, 咱们使用 Deployment 来描述便可:
apiVersion: apps/v1 kind: Deployment metadata: name: k8s-test labels: app: k8s-test spec: replicas: 3 # 副本数量 template: metadata: name: k8s-test labels: app: k8s-test env: test spec: containers: - name: k8s-test image: registry.cn-hangzhou.aliyuncs.com/piaoruiqing/k8s-test:0.0.1 imagePullPolicy: IfNotPresent ports: - name: http-port containerPort: 8080 imagePullSecrets: - name: docker-registry-secret restartPolicy: Always selector: matchLabels: app: k8s-test 复制代码
一样地, 使用kubectl apply -f
命令发布配置便可.
[root@nas-centos1 k8s-test]$ kubectl apply -f k8s-test.yaml deployment.apps/k8s-test created 复制代码
若是这篇文章对您有帮助,请点个赞吧 ( ̄▽ ̄)"
欢迎关注公众号(代码如诗):