在 通過k8s dashboard 部署 nginx 文中,介紹了通過dashboard創建nginx應用。在該文中,已經初步接觸了k8s的部署文件。文件中已經開始瞭解到一些kubernates的基本核心概念,本文將會結合實踐,進一步瞭解k8s的核心概念。
Pod
Pod是k8的最小操作單元,它是對容器(container)的封裝,管理容器。一個Pod裏可以管理有一個或多個容器,但一般是一個。Pod裏的所有容器都共享Pod的資源和網絡。當一個Pod不能滿足用戶需求時,你可以把Pod作爲複製的最小單元來複製出一個同樣的Pod來處理用戶請求。Pod支持多種容器,不過一般是用Docker。你可以用單獨的Pod配置文件創建Pod, 也可以把Pod的配置信息嵌入到其他的對象(例如Deployment)的配置文件裏面,並與其他對象一起創建。
下面通過pod的描述文件創建一個nginx pod。
配置文件 nginx-pod.yaml 如下:
apiVersion: v1
kind: Pod
metadata:
name: nginx-app
labels:
app: nginx-app
spec:
containers:
- name: nginx-app # docker容器的名稱
image: nginx:latest # docker鏡像名
ports:
- containerPort: 80 # 容器的端口
restartPolicy: Never
- restartPolicy: Always:只要退出就重啓;OnFailure:失敗退出時(exit code不爲0)才重啓;Never:永遠不重啓
使用命令創建資源:
kubectl create -f nginx-pod.yaml
獲取pod的IP地址,並登陸到minikube虛擬機,訪問該pod的容器
kubectl get pods -o=custom-columns=NAME:.metadata.name,IP:.status.podIP
NAME IP
nginx-app 172.17.0.5
pod已經部署成功並且擁有了IP地址,這時候kubernates節點外是不能訪問的,但我們可以登陸到minikube虛擬機,也就是節點中,通過上面的IP地址訪問pod 中的 nginx。
控制器
容器在Pod裏運行,Pod是K8S裏最小的管理單元,控制器就是用於管理Pod的狀態和生命週期的資源對象。
Kubernetes中,應用一般分爲無狀態應用、有狀態應用、守護型應用、批處理應用這四種。
- 無狀態應用:應用實例不涉及事務交互,不產生持久化數據存儲在本地,並且多個應用實例對於同一個請求響應的結果是完全一致的。舉例:nginx或者tomcat
- 有狀態應用:有狀態服務可以說是需要數據存儲功能的服務或者指多線程類型的服務、隊列等。舉例:mysql數據庫、kafka、redis、zookeeper等。
- 守護型應用:類似守護進程一樣,長期保持運行,監聽持續的提供服務。舉例:ceph、logstash、fluentd等。
- 批處理應用:工作任務型的服務,通常是一次性的。舉例:運行一個批量改文件夾名字的腳本。
這裏主要介紹 deployment 這種控制器,其他控制器請查看 https://v1-17.docs.kubernetes.io/docs/concepts/workloads/controllers 。
deployment 擁有以下特點:
• 部署無狀態應用
• 管理Pod 和 ReplicaSet(用於管理pod副本數,版本的控制 一個隱藏控制器)
• 具有上線部署、副本設定、滾動升級、回滾等功能
• 提供聲明式更新(指定更新某個字段,兩個用戶同時更新會合並更新)
我們使用deployment以及pod模板聲明兩個pod,這裏的Pod將會有deployment控制器進行創建。
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-app # 部署名稱
namespace: default # 命名空間
labels:
app: nginx-app
spec:
replicas: 2 # 副本數
selector:
matchLabels:
app: nginx-app # 綁定pod的名稱
# pod的模板
template:
metadata:
labels:
app: nginx-app # pod的名稱
spec:
containers:
- name: nginx-app # docker容器的名稱
image: nginx:latest # docker鏡像名
ports:
- containerPort: 80 # 容器的端口
kubectl get pods -o=custom-columns=NAME:.metadata.name,IP:.status.podIP
NAME IP
nginx-app-5998d7cbc5-p2l2x 172.17.0.7
nginx-app-5998d7cbc5-zlrgr 172.17.0.6
Service
pod 是有可能掛掉並且重啓的,銷燬創建或者重啓後,它的IP地址也會發生改變。 service 是定義一系列Pod以及訪問這些Pod的策略的一層抽象。Service通過Label找到Pod組,也就是DNS。DNS在k8s集羣內部實現了基於服務名的尋址。在接下來的 service 配置文件中,Service通過“selector”來與Pod進行綁定,這裏它把請求轉發給標籤“app:nginx-app”的Pod。“nodePort”給服務創建了一個外部可以訪問的端口,這樣可以通過虛擬機的ip地址訪問服務。
nginx-service.yaml
apiVersion: v1
kind: Service
metadata:
name: nginx-app
namespace: default
labels:
app: nginx-app
spec:
type: NodePort # 請求可以從外部訪問
ports:
- name: nginx-app # 端口別名
port: 8000 # service暴露在cluster ip上的端口,通過<cluster ip>:port訪問服務,通過此端口集羣內的服務可以相互訪問
targetPort: 80 # 容器內部端口
nodePort: 30163 # 外部通過這個端口訪問服務(與type爲NodePort匹配)
selector:
app: nginx-app # 請求轉發到 app 爲 nginx-app 的pod
發佈成功後,可以通過命令獲取到service的信息
kubectl get services
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 23h
nginx-app NodePort 10.103.64.33 <none> 8000:30163/TCP 24m
在節點(minikube虛擬機)內部通過 CLUSTER-IP 和端口的方式可以訪問服務。端口是上面service聲明中的8000端口
通過minikube虛擬機的IP地址也可以訪問