因爲在國內網絡問題,咱們沒法很好的使用minikube進行部署k8s實驗環境,因此可使用阿里提供的minikube進行搭建。除了minikube,也可使用kubeasz進行部署。html
下面我基於kubeaze給出部署方法。node
Ubuntu 16.04 server
或者CentOS 7 Minimal
注意: 確保在乾淨的系統上開始安裝,不能使用曾經裝過kubeadm或其餘k8s發行版的環境nginx
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
./easzup -P
上述腳本運行成功後,全部文件(kubeasz代碼、二進制、離線鏡像)均已整理好放入目錄/etc/ansible
github
/etc/ansible
包含 kubeasz 版本爲 ${release} 的發佈代碼/etc/ansible/bin
包含 k8s/etcd/docker/cni 等二進制文件/etc/ansible/down
包含集羣安裝時須要的離線容器鏡像/etc/ansible/down/packages
包含集羣安裝時須要的系統基礎軟件./easzup -S
docker exec -it kubeasz easzctl start-aio
若是提示kubectl: command not found,退出從新ssh登陸一下,環境變量生效便可docker
$ kubectl version # 驗證集羣版本 $ kubectl get node # 驗證節點就緒 (Ready) 狀態 $ kubectl get pod -A # 驗證集羣pod狀態,默認已安裝網絡插件、coredns、metrics-server等 $ kubectl get svc -A # 驗證集羣服務狀態
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。
在理解完上面的知識後,咱們能夠運行起來:
$ 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裏面。
若是咱們要對這個 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 文件的內容變化,自動進行具體的處理。
在 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