33

Kubernetes(二) 应用部署 - 草堂笺

 4 years ago
source link: https://blog.piaoruiqing.com/blog/2019/09/28/kubernetes%E5%BA%94%E7%94%A8%E9%83%A8%E7%BD%B2/?
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

Kubernetes(二) 应用部署

Kubernetes教程之应用部署

文章地址: https://blog.piaoruiqing.com/2019/09/28/kubernetes-2-deploy/

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

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

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

阅读本文你需要:

理解描述文件

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

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

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发布也可)

发布POD
使用dashboard发布POD

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

2019-09-24-k8s-3.jpg

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

如何访问服务

上一小节我们部署了一个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.

2019-09-26-k8s-4.jpg

部署本地项目

将本地开发的项目发布到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 reference

有了项目, 我们需要将其打包成一个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各个节点使用. 本文以阿里云的容器镜像服务为例.

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

2019-09-26-k8s-5.jpg
# 登录, 用于登录的用户名为阿里云账号全名, 密码为开通服务时设置的密码.
[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
2019-09-26-k8s-6.jpg

由于笔者使用了私库, 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查看.

2019-09-26-k8s-7.jpg

使用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
2019-09-28-k8s-8.jpg

欢迎关注公众号(代码如诗)

代码如诗(poetic_code)

© 2019, 朴瑞卿.

Article Rating

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK