Kubernetes(二) 應用部署

Kubernetes教程之應用部署java

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

前言

本文將與讀者一塊兒, 學習如何在Kubernetes上部署應用. 包括: 如何部署應用、發佈文件講解、將本地項目打包發佈等.web

閱讀這篇文章你能收穫到:spring

  • 學會如何在k8s部署應用
  • 如何打包Docker鏡像、上傳到私有庫

閱讀本文你須要:docker

理解描述文件

首先, 咱們經過在Kubernetes部署Nginx來理解描述文件.json

通常地, Kubernetes使用yaml(或json)來描述發佈配置. 下面是一個簡單的描述文件: nginx-pod.yamlcentos

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

[版權聲明]
本文發佈於 樸瑞卿的博客, 容許非商業用途轉載, 但轉載必須保留原做者 樸瑞卿 及連接: 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, 須要將項目打包成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
複製代碼

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

參考文獻

系列文章

歡迎關注公衆號(代碼如詩):

[版權聲明]
本文發佈於 樸瑞卿的博客, 容許非商業用途轉載, 但轉載必須保留原做者 樸瑞卿 及連接: blog.piaoruiqing.com. 若有受權方面的協商或合做, 請聯繫郵箱: piaoruiqing@gmail.com.
相關文章
相關標籤/搜索