前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Kubernetes(二) 应用部署

Kubernetes(二) 应用部署

作者头像
草堂笺
发布2019-12-20 17:49:44
9530
发布2019-12-20 17:49:44
举报
文章被收录于专栏:代码如诗代码如诗

.example_responsive_1 { width: 200px; height: 50px; } @media(min-width: 290px) { .example_responsive_1 { width: 270px; height: 50px; } } @media(min-width: 370px) { .example_responsive_1 { width: 339px; height: 50px; } } @media(min-width: 500px) { .example_responsive_1 { width: 468px; height: 50px; } } @media(min-width: 720px) { .example_responsive_1 { width: 655px; height: 50px; } } @media(min-width: 800px) { .example_responsive_1 { width: 728px; height: 50px; } } (adsbygoogle = window.adsbygoogle || []).push({});

Kubernetes(二) 应用部署

目录

Kubernetes教程之应用部署 文章地址: https://cloud.tencent.com/developer/article/1557588

前言

本文将与读者一起, 学习如何在Kubernetes上部署应用. 包括: 如何部署应用、发布文件讲解、将本地项目打包发布等.

阅读这篇文章你能收获到:

  • 学会如何在k8s部署应用
  • 如何打包Docker镜像、上传到私有库

阅读本文你需要:

理解描述文件

首先, 我们通过在Kubernetes部署Nginx来理解描述文件.

一般地, Kubernetes使用yaml(或json)来描述发布配置. 下面是一个简单的描述文件: nginx-pod.yaml

代码语言:javascript
复制
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发布也可)

kubectl get pods命令是用来查看pod列表的, 使用grep筛选出nginx相关的pod. 此时nginx已经发布完成了. 我们可以从dashboard来直观地查看到应用状态.

备注: 删除pod可使用kubectl delete -f nginx-pod.yaml 命令, 也可直接在dashboard进行操作.

版权声明

代码语言:txt
复制
 本文发布于[朴瑞卿的博客](https://blog.piaoruiqing.com/), 允许非商业用途转载, 但转载必须保留原作者[朴瑞卿](https://blog.piaoruiqing.com/) 及链接:[https://blog.piaoruiqing.com](https://blog.piaoruiqing.com/).
代码语言:txt
复制
 如有授权方面的协商或合作, 请联系邮箱: [piaoruiqing@gmail.com](https://blog.piaoruiqing.com/mailto:piaoruiqing@gmail.com). 

如何访问服务

上一小节我们部署了一个Nginx pod, 但我们无法访问到该Nginx.

想要访问到pod中的服务, 最简单的方式就是通过端口转发, 执行如下命令, 将宿主机的9999端口与nginx-pod的80端口绑定:

代码语言:javascript
复制
[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项目:

代码语言:javascript
复制
@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 reference

有了项目, 我们需要将其打包成一个Docker镜像, Dockerfile内容如下:

代码语言:javascript
复制
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 .进行打包. 注意不要遗漏掉命令最后面的. , 它代表当前目录.

代码语言:javascript
复制
[root@nas-centos1 k8s-test]$ docker build -t piaoruiqing/k8s-test .

通过docker images命令可以查看本地镜像列表:

代码语言:javascript
复制
[root@nas-centos1 k8s-test]$ docker images | grep k8s
piaoruiqing/k8s-test     latest         efe9e9625376        4 minutes ago       174MB

推送到远程仓库

docker镜像打包完成后, 需要推送到镜像仓库供Kubernetes各个节点使用. 本文以阿里云的容器镜像服务为例.

首先, 登录到阿里云控制台 -> 容器镜像服务, 创建一个命名空间:

代码语言:javascript
复制
# 登录, 用于登录的用户名为阿里云账号全名, 密码为开通服务时设置的密码.
[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 以支持私有库的访问.

代码语言:javascript
复制
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

代码语言:javascript
复制
[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, 如下:

代码语言:javascript
复制
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了.

代码语言:javascript
复制
[root@nas-centos2 ~]$ curl 10.33.30.95/k8s-test/timestamp
1569512136028

部署集群

现在, 我们已经成功地在Kubernetes上部署了一个应用实例, 生产环境中多数情况下我们的应用需要集群部署, 此时, 我们使用 Deployment 来描述即可:

代码语言:javascript
复制
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 命令发布配置即可.

代码语言:javascript
复制
[root@nas-centos1 k8s-test]$ kubectl apply -f k8s-test.yaml 
deployment.apps/k8s-test created

参考文献

© 2019, 朴瑞卿.

版权声明

代码语言:txt
复制
 本文发布于[朴瑞卿的博客](https://blog.piaoruiqing.com/), 允许非商业用途转载, 但转载必须保留原作者[朴瑞卿](https://blog.piaoruiqing.com/) 及链接:[https://blog.piaoruiqing.com](https://blog.piaoruiqing.com/).      如有授权方面的协商或合作, 请联系邮箱: [piaoruiqing@gmail.com](https://blog.piaoruiqing.com/mailto:piaoruiqing@gmail.com).
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Kubernetes(二) 应用部署
    • 前言
      • 理解描述文件
        • 如何访问服务
          • 部署本地项目
            • 打包Docker镜像
            • 推送到远程仓库
            • 部署
            • 部署集群
          • 参考文献
          相关产品与服务
          容器镜像服务
          容器镜像服务(Tencent Container Registry,TCR)为您提供安全独享、高性能的容器镜像托管分发服务。您可同时在全球多个地域创建独享实例,以实现容器镜像的就近拉取,降低拉取时间,节约带宽成本。TCR 提供细颗粒度的权限管理及访问控制,保障您的数据安全。
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档