Kubernetes(二) 應用部署

  • 2019 年 12 月 20 日
  • 筆記

.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://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發布也可)

kubectl get pods命令是用來查看pod列表的, 使用grep篩選出nginx相關的pod. 此時nginx已經發布完成了. 我們可以從dashboard來直觀地查看到應用狀態.

備註: 刪除pod可使用kubectl delete -f nginx-pod.yaml 命令, 也可直接在dashboard進行操作.

[版權聲明] 本文發佈於朴瑞卿的部落格, 允許非商業用途轉載, 但轉載必須保留原作者朴瑞卿 及鏈接:https://blog.piaoruiqing.com. 如有授權方面的協商或合作, 請聯繫郵箱: [email protected].

如何訪問服務

上一小節我們部署了一個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 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各個節點使用. 本文以阿里雲的容器鏡像服務為例.

首先, 登錄到阿里雲控制台 -> 容器鏡像服務, 創建一個命名空間:

# 登錄, 用於登錄的用戶名為阿里雲帳號全名, 密碼為開通服務時設置的密碼.  [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

參考文獻

© 2019, 朴瑞卿.

[版權聲明] 本文發佈於朴瑞卿的部落格, 允許非商業用途轉載, 但轉載必須保留原作者朴瑞卿 及鏈接:https://blog.piaoruiqing.com. 如有授權方面的協商或合作, 請聯繫郵箱: [email protected].