在 k8s 集群中部署第一個應(yīng)用

原文地址:https://alphahinex.github.io/2020/10/18/deploy-first-app-in-k8s/

cover

description: "萬事開頭難"
date: 2020.10.18 10:26
categories:
- Cloud
- DevOps
- K8s
tags: [Cloud, DevOps, Docker, K8s]
keywords: Kubernetes, K8s, Deploy, Deployment, Service, Kuboard


使用 kubeasz 離線安裝 k8s 集群 中,我們完成了 k8s 集群的搭建,接下來,可以開始在集群中部署第一個應(yīng)用了。

目標(biāo)

在集群中啟動一個最簡單的 nginx 服務(wù),并能夠通過 http 進行訪問。

預(yù)熱

回憶 docker 環(huán)境下,要實現(xiàn)這個目標(biāo),需要做的事情很簡單,一行命令即可:

$ docker run --name some-nginx -d -p 8080:80 nginx

之后便可訪問 http://localhost:8080 看到 nginx 的歡迎頁面。

也可以使用 docker-compose 配置文件來實現(xiàn)此目標(biāo):

some-nginx:
  image: nginx
  ports:
    - "8080:80"

準備

Kubernetes 官方提供了一個 Kompose 工具,可以方便的將 Docker Compose 的配置文件轉(zhuǎn)換成 k8s 所需的形式。讓我們來看看官網(wǎng)上的例子:

It’s as simple as 1-2-3

  1. Use an example docker-compose.yaml file or your own
  2. Run kompose up
  3. Check your Kubernetes cluster for your newly deployed containers!
$ wget https://raw.githubusercontent.com/kubernetes/kompose/master/examples/docker-compose-v3.yaml -O docker-compose.yaml

$ kompose up
We are going to create Kubernetes Deployments, Services and PersistentVolumeClaims for your Dockerized application.
If you need different kind of resources, use the 'kompose convert' and 'kubectl create -f' commands instead.

INFO Successfully created Service: redis          
INFO Successfully created Service: web            
INFO Successfully created Deployment: redis       
INFO Successfully created Deployment: web         

Your application has been deployed to Kubernetes. You can run 'kubectl get deployment,svc,pods,pvc' for details.

$ kubectl get po
NAME                            READY     STATUS              RESTARTS   AGE
frontend-591253677-5t038        1/1       Running             0          10s
redis-master-2410703502-9hshf   1/1       Running             0          10s
redis-slave-4049176185-hr1lr    1/1       Running             0          10s

什嘛?這就結(jié)束啦?這也太快了啪?

我們還是慢慢來,自己掌握一下節(jié)奏吧。

看到 kompose up 下面的提示內(nèi)容,我們可以通過 kompose convert 命令將 Docker Compose 的文件轉(zhuǎn)換為 k8s 格式的內(nèi)容:

$ kompose convert -f docker-compose.yml

轉(zhuǎn)換后得到兩個 yaml 文件:some-nginx-deployment.yaml 和 some-nginx-service.yaml 。

部署

kompose 將 docker-compose.yml 轉(zhuǎn)換生成了兩個 yaml 文件,一個 Deployment 和一個 Service。

Deployment 包含了創(chuàng)建一個容器所必須的信息,如鏡像、端口、資源需求、副本數(shù)等。k8s 會依據(jù) Deployment 中的 template 定義創(chuàng)建必需數(shù)量的容器。

Service 用來將 k8s 集群中的服務(wù)暴露出來,供外部進行訪問。類似在 docker 環(huán)境中映射端口至宿主機的操作。k8s 提供了四種 ServiceTypes 來發(fā)布服務(wù),但實際在非云提供商大部分的 k8s 環(huán)境中,只能選擇 NodePort 類型。指定了 nodePort 端口后,k8s 集群中每個節(jié)點都會將此端口代理至該 Service,不論這個 Serivce 部署在哪個節(jié)點上。Service 通過 selector 與 Deployment 進行關(guān)聯(lián)。

查看 kompose 生成的文件內(nèi)容,發(fā)現(xiàn)里面會包含一些 annotations 信息,以及并沒有設(shè)定 ServiceType。所以在 kompose 的主頁上有這樣一段描述:

Transformation of the Docker Compose format to Kubernetes resources manifest may not be exact, but it helps tremendously when first deploying an application on Kubernetes.

可以基于 Docker Compose 文件通過轉(zhuǎn)換工具自動生成基礎(chǔ)版本,再基于基礎(chǔ)版本進行調(diào)整,獲得最終使用的版本,可參考如下配置文件 nginx.yml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 1
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.17.9
        resources:
          requests:
            cpu: 100m
            memory: 100Mi
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  type: NodePort
  ports:
  - name: nginx
    port: 80
    nodePort: 30080
  selector:
    app: nginx

將該配置文件應(yīng)用至集群中:

$ kubectl apply -f nginx.yml

之后,即可通過集群中任意節(jié)點的 ip,加配置文件中 nodePort 指定的端口(30080),訪問集群中的 nginx 服務(wù)。

配置文件參考手冊可見 這里

清理

可對配置文件執(zhí)行 delete 操作清理其中包括的資源,如:

$ kubectl delete -f nginx.yml

可視化界面

使用 k8s 提供的命令行工具,可完成對集群的各項操作。同時也可借助可視化界面,更簡便的操作集群,比如: Kuboard 。

Kuboard 在線演示

Kuboard 提供了 Docker 鏡像,可使用官方提供的 kuboard.yaml 方便的將其部署到 k8s 集群中,進行使用。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容