Kubernetes(二) 應用部署

草堂箋發表於2019-09-28

Kubernetes教程之應用部署

文章地址: blog.piaoruiqing.com/2019/09/28/…

前言

本文將與讀者一起, 學習如何在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釋出也可)

Kubernetes(二) 應用部署

Kubernetes(二) 應用部署

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

Kubernetes(二) 應用部署

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

[版權宣告]
本文釋出於樸瑞卿的部落格, 允許非商業用途轉載, 但轉載必須保留原作者樸瑞卿 及連結:blog.piaoruiqing.com. 如有授權方面的協商或合作, 請聯絡郵箱: piaoruiqing@gmail.com.

如何訪問服務

上一小節我們部署了一個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(二) 應用部署

部署本地專案

將本地開發的專案釋出到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各個節點使用. 本文以阿里雲的容器映象服務為例.

首先, 登入到阿里雲控制檯 -> 容器映象服務, 建立一個名稱空間:

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(二) 應用部署

部署

私庫支援

由於筆者使用了私庫, 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檢視.

Kubernetes(二) 應用部署

使用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
複製程式碼

Kubernetes(二) 應用部署

如果這篇文章對您有幫助,請點個贊吧 ( ̄▽ ̄)"

參考文獻

系列文章

歡迎關注公眾號(程式碼如詩):

Kubernetes(二) 應用部署

[版權宣告]
本文釋出於樸瑞卿的部落格, 允許非商業用途轉載, 但轉載必須保留原作者樸瑞卿 及連結:blog.piaoruiqing.com. 如有授權方面的協商或合作, 請聯絡郵箱: piaoruiqing@gmail.com.

相關文章