深刻k8s:k8s部署&在k8s中運行第一個程序

搭建k8s集羣

因爲在國內網絡問題,咱們沒法很好的使用minikube進行部署k8s實驗環境,因此可使用阿里提供的minikube進行搭建。除了minikube,也可使用kubeasz進行部署。html

下面我基於kubeaze給出部署方法。node

1.基礎系統配置

  • 準備一臺虛機配置內存2G/硬盤30G以上
  • 最小化安裝Ubuntu 16.04 server或者CentOS 7 Minimal
  • 配置基礎網絡、更新源、SSH登陸等

注意: 確保在乾淨的系統上開始安裝,不能使用曾經裝過kubeadm或其餘k8s發行版的環境nginx

2.下載文件

  • 下載工具腳本easzup,舉例使用kubeasz版本2.2.1
export release=2.2.1
curl -C- -fLO --retry 3 https://github.com/easzlab/kubeasz/releases/download/${release}/easzup
chmod +x ./easzup
  • 使用工具腳本下載

默認下載最新推薦k8s/docker等版本,使用命令./easzup 查看工具腳本的幫助信息git

# 舉例使用 k8s 版本 v1.18.2,docker 19.03.5
./easzup -D -d 19.03.5 -k v1.18.2
  • 可選下載離線系統包 (適用於沒法使用yum/apt倉庫情形)
./easzup -P

上述腳本運行成功後,全部文件(kubeasz代碼、二進制、離線鏡像)均已整理好放入目錄/etc/ansiblegithub

  • /etc/ansible 包含 kubeasz 版本爲 ${release} 的發佈代碼
  • /etc/ansible/bin 包含 k8s/etcd/docker/cni 等二進制文件
  • /etc/ansible/down 包含集羣安裝時須要的離線容器鏡像
  • /etc/ansible/down/packages 包含集羣安裝時須要的系統基礎軟件

3.安裝集羣

  • 容器化運行 kubeasz,詳見文檔
./easzup -S
  • 使用默認配置安裝 aio 集羣
docker exec -it kubeasz easzctl start-aio

4.驗證安裝

若是提示kubectl: command not found,退出從新ssh登陸一下,環境變量生效便可docker

$ kubectl version         # 驗證集羣版本     
$ kubectl get node        # 驗證節點就緒 (Ready) 狀態
$ kubectl get pod -A      # 驗證集羣pod狀態,默認已安裝網絡插件、coredns、metrics-server等
$ kubectl get svc -A      # 驗證集羣服務狀態

在k8s中運行一個程序

編寫YAML文件

Kubernetes 跟 Docker 等不少項目最大的不一樣,就在於它不推薦你使用命令行的方式直接運行容器,而是但願你用 YAML 文件的方式,而後用這樣一句指令把它運行起來:api

$ kubectl create -f 個人配置文件

yaml以下:bash

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 2
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.7.9
        ports:
        - containerPort: 80

Kind 字段,指定了這個 API 對象的類型(Type),是一個 Deployment。Deployment,是一個定義多副本應用的對象,Deployment 還負責在 Pod 定義發生變化時,對每一個副本進行滾動更新。網絡

像這樣使用一種 API 對象(Deployment)管理另外一種 API 對象(Pod)的方法,在Kubernetes 中,叫做「控制器」模式(controller pattern)。app

一個 Kubernetes 的 API 對象的定義,大多能夠分爲 Metadata 和 Spec 兩個部分。前者存放的是這個對象的元數據,對全部 API 對象來講,這一部分的字段和格式基本上是同樣的;然後者存放的,則是屬於這個對象獨有的定義,用來描述它所要表達的功能。

spec.replicas是2,表示定義的 Pod 副本個數。

spec.template做用是描述了我想要建立的 Pod 的細節。spec.containers.image表示容器鏡像是nginx:1.7.9,containerPort表示監聽的端口是80。

Labels 字段能夠用來過濾控制對象,在上面這個 YAML 文件中,Deployment 會把全部正在運行的、攜帶「app: nginx」標籤的 Pod 識別爲被管理的對象,並確保這些 Pod 的總數嚴格等於兩個。

spec.selector.matchLabels是用來定義過濾規則的,通常稱之爲:Label Selector。

建立一個pod

在理解完上面的知識後,咱們能夠運行起來:

$ kubectl create -f nginx-deployment.yaml

而後,經過 kubectl get 命令檢查這個 YAML 運行起來的狀態是否是與咱們預期的一致:

$ kubectl get pods -l app=nginx
NAME                                READY     STATUS    RESTARTS   AGE
nginx-deployment-67594d6bf6-9gdvr   1/1       Running   0          10m
nginx-deployment-67594d6bf6-v6j7w   1/1       Running   0          10m

-l表示獲取全部匹配 app: nginx 標籤的 Pod。

注意:在命令行中,全部 key-value 格式的參數,都使用「=」而非「:」表示。

此外,咱們還可使用kubectl describe 命令,查看一個 API 對象的細節:

$ kubectl describe pod nginx-deployment-67594d6bf6-9gdvr
Name:               nginx-deployment-67594d6bf6-9gdvr
Namespace:          default
Priority:           0
PriorityClassName:  <none>
Node:               node-1/10.168.0.3
Start Time:         Thu, 16 Aug 2018 08:48:42 +0000
Labels:             app=nginx
                    pod-template-hash=2315082692
Annotations:        <none>
Status:             Running
IP:                 10.32.0.23
Controlled By:      ReplicaSet/nginx-deployment-67594d6bf6
...
Events:

  Type     Reason                  Age                From               Message

  ----     ------                  ----               ----               -------
  
  Normal   Scheduled               1m                 default-scheduler  Successfully assigned default/nginx-deployment-67594d6bf6-9gdvr to node-1
  Normal   Pulling                 25s                kubelet, node-1    pulling image "nginx:1.7.9"
  Normal   Pulled                  17s                kubelet, node-1    Successfully pulled image "nginx:1.7.9"
  Normal   Created                 17s                kubelet, node-1    Created container
  Normal   Started                 17s                kubelet, node-1    Started container

上面詳細信息中,在 Kubernetes 執行的過程當中,對 API 對象的全部重要操做都會記錄到Events裏面。

爲pod進行版本升級

若是咱們要對這個 Nginx 服務進行升級,把它的鏡像版本從 1.7.9 升級爲 1.8,那麼咱們能夠修改一下YAML文件:

...    
    spec:
      containers:
      - name: nginx
        image: nginx:1.8 #這裏被從1.7.9修改成1.8
        ports:
      - containerPort: 80

而後使用kubectl replace 指令來完成k8s集羣中更新:

$ kubectl replace -f nginx-deployment.yaml

咱們也可使用kubectl apply 命令,來統一進行 Kubernetes 對象的建立和更新操做,具體作法以下所示:

$ kubectl apply -f nginx-deployment.yaml

# 修改nginx-deployment.yaml的內容

$ kubectl apply -f nginx-deployment.yaml

使用kubectl apply 命令是 Kubernetes「聲明式 API」所推薦的使用方法。也就是說,做爲用戶,你沒必要關心當前的操做是建立,仍是更新,你執行的命令始終是 kubectl apply,而 Kubernetes 則會根據 YAML 文件的內容變化,自動進行具體的處理。

聲明一個 Volume

在 Kubernetes 中,Volume 是屬於 Pod 對象的一部分。因此,咱們就須要修改這個 YAML 文件裏的 template.spec 字段,以下所示:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 2
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.8
        ports:
        - containerPort: 80
        volumeMounts:
        - mountPath: "/usr/share/nginx/html"
          name: nginx-vol
      volumes:
      - name: nginx-vol
        emptyDir: {}

咱們在上面定義了volumes字段,名字叫作nginx-vol,類型是 emptyDir。Pod 中的容器,使用的是 volumeMounts 字段來聲明本身要掛載哪一個 Volume,並經過 mountPath 字段來定義容器內的 Volume 目錄,好比:/usr/share/nginx/html。

emptyDir表示,Kubernetes 也會在宿主機上建立一個臨時目錄,這個目錄未來就會被綁定掛載到容器所聲明的 Volume 目錄上。

而後使用kubectl apply 指令,更新這個Deployment,而後使用 kubectl describe 查看一下最新的 Pod:

...
Containers:
  nginx:
    Container ID:   docker://07b4f89248791c2aa47787e3da3cc94b48576cd173018356a6ec8db2b6041343
    Image:          nginx:1.8
    ...
    Environment:    <none>
    Mounts:
      /usr/share/nginx/html from nginx-vol (rw)
...
Volumes:
  nginx-vol:
    Type:    EmptyDir (a temporary directory that shares a pod's lifetime)

最後,你還可使用 kubectl exec 指令,進入到這個 Pod 當中(即容器的 Namespace 中)查看這個 Volume 目錄:

$ kubectl exec -it nginx-deployment-5c678cfb6d-lg9lw -- /bin/bash
# ls /usr/share/nginx/html

若是要刪除這個Nginx Deployment 的話,直接執行:

$ kubectl delete -f nginx-deployment.yaml

總結

  1. 與k8s進行交互儘可能選擇yaml文件交互;
  2. 咱們可使用kubectl create 命令建立一個pod;
  3. 想要獲取目前pod的狀態可使用kubectl get pods命令;
  4. 使用kubectl describe pod 能夠查看某個pod的詳細信息;
  5. 若是想要對pod更新最好使用kubectl apply -f ,這樣能夠作到更加無感的建立pod或更新;
  6. 咱們可使用Volumes來掛載卷;
  7. 使用kubectl delete -f能夠刪除一個pod;
相關文章
相關標籤/搜索