kubernetes實踐錄 - 使用Baget部署一個私有Nuget倉庫
Reference:
目錄書接上回 kubernetes實踐錄 - 在ubuntu上搭建k8s叢集. 本回將在上次安裝好的kubernetes叢集上部署一個Baget
應用. 其實就是通過部署Baget
來學習下kubernetes
裡面的一些基本的概念, 包括Node
, Pod
Deployment
Service
Ingress
.
本文只是記錄自己實踐過程, 若有錯誤或不當之處, 敬請指正或討論.
Node
節點(Node)是kubernetes叢集中的一臺物理伺服器或虛擬機器, 節點大致可以分為主節點(master)和其他節點. 主節點主要負責提供一系列管理介面方便對叢集進行管理. 而其他節點一般會被排程執行工作負載, 通常來說pod
就是跑在這些其他節點上的. 當然你也可以讓主節點執行指定的pod, 這是可以通過配置實現的, 通常本地開發時可能會這麼做, 此時主節點就相當於被汙染了(tainted
).
Pod和Deployment
如果我們要在kubernetes中執行我們自己的應用, 那麼首先我們就需要構建pod. 一個pod中可以包含一個或多個(通常是一個)容器(container).
pod是kubernetes中最小的排程單元, 當pod啟動或停止時, pod中的容器會跟著一起啟動或停止.
pod這個名字的由來: 大家應該都知道, Docker的圖示上是一隻鯨魚, pod之意其實就是一群鯨魚.
那Deployment和Pod有什麼關係呢? 通過Deployment我們可以構建出一個Pod, 配置pod中的容器和容器使用的硬體資源等.
比如我們要部署一個Baget應用, 那麼我們需要先建立baget-deployment.yaml
檔案, 這個檔案中定義了一個Deployment資源, 然後執行kubectl apply -f baget-deployment.yaml
kubectl get pods --all-namespaces
檢視當前kubernetes叢集中正在執行的pod.
點選檢視 baget-deployment.yaml 檔案
apiVersion: apps/v1
kind: Deployment
metadata:
name: baget
namespace: baget
labels:
app: baget
spec:
selector:
matchLabels:
app: baget
replicas: 1
strategy:
rollingUpdate:
maxUnavailable: 1
maxSurge: 2
type: RollingUpdate
template:
metadata:
labels:
app: baget
spec:
containers:
- name: baget
image: loicsharma/baget:latest
resources:
requests:
cpu: 100m
memory: 100Mi
limits:
cpu: 100m
memory: 100Mi
livenessProbe:
httpGet:
path: /v3/index.json
port: 80
initialDelaySeconds: 30
timeoutSeconds: 30
successThreshold: 1
failureThreshold: 3
periodSeconds: 30
envFrom:
- configMapRef:
name: baget-config
ports:
- containerPort: 80
protocol: TCP
volumeMounts:
- name: baget-data
mountPath: /var/baget
volumes:
- name: baget-data
hostPath:
path: /laplus/data/baget
restartPolicy: Always
這是一個yaml格式的配置檔案, 頂層包括了apiVersion
kind
metadata
spec
這幾個物件. 幾乎每個kubernetes配置檔案都會有apiVersion
kind
metadata
這幾個東西;
apiVersion
用來用來說明這個配置檔案適用的kubernetes api;
apiVersion: apps/v1
kind
表示這個資源的型別, 這裡是Deployment
;
kind: Deployment
metadata
表示的是資源的元資料, 通常有name
和labels
這兩個屬性, 我這裡還多定義了一個namespace.
metadata:
name: baget
namespace: baget
labels:
app: baget
重點看下.spec.template.spec
這段
spec:
containers:
- name: baget
image: loicsharma/baget:latest
resources:
requests:
cpu: 100m
memory: 100Mi
limits:
cpu: 100m
memory: 100Mi
livenessProbe:
httpGet:
path: /v3/index.json
port: 80
initialDelaySeconds: 30
timeoutSeconds: 30
successThreshold: 1
failureThreshold: 3
periodSeconds: 30
envFrom:
- configMapRef:
name: baget-config
ports:
- containerPort: 80
protocol: TCP
volumeMounts:
- name: baget-data
mountPath: /var/baget
volumes:
- name: baget-data
hostPath:
path: /laplus/data/baget
這段中我們定義了容器的映象, 容器可以排程的硬體資源的限制, 容器的健康檢查, 環境變數, 磁碟掛載等內容.
最後執行kubectl apply -f baget-deployment.yaml
讓kubernetes建立我們定義的資源, 執行 kubectl get pods -n baget
可以列出baget
名稱空間下的所有pod
NAME READY STATUS RESTARTS AGE
baget-5576d6fc79-n8k2s 1/1 Running 0 20h
用Service在叢集內部轉發請求到指定的pod
有了pod之後, 經過容器化的應用就可以在pod中運行了. 下面我們要通過Service在叢集內部暴露pod中的應用.
一個Service相當於叢集內部的負載均衡器, 建立Service後, kubernetes中的其他pod就可以通過http://baget/v3/index.json
訪問到剛剛建立的叫Baget
的pod了.
apiVersion: v1
kind: Service
metadata:
name: baget
namespace: baget
labels:
app: baget
spec:
type: ClusterIP
selector:
app: baget
ports:
- port: 80
targetPort: 80
protocol: TCP
上面的Service配置清單中的.spec.type
指明瞭服務的型別, 除了這個用的ClusterIP
, 另外還有LoadBalancer
,NodePort
等; 如果用NodePort
的話, 那麼可以直接將應用暴露到叢集外, 也就是說可以直接使用宿主機ip + nodePort埠訪問到應用了, 比如我這裡就可以用http://192.168.124.66:<NodePort-Port>/v3/index.json
訪問到部署的Baget應用.
用Ingress負載均衡外部的請求
Ingress可以理解為kubernetes中的外部負載均衡器和一個反向代理伺服器. 它通常被部署在叢集的邊緣節點上, 負責處理來自kubernetes叢集外部的請求, 把請求轉發給指定的Service等服務.
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: baget
namespace: baget
annotations:
kubernetes.io/ingress.class: nginx
spec:
tls:
- hosts:
- "baget.inner.laplus.com"
rules:
- host: "baget.inner.laplus.com"
http:
paths:
- path: "/"
pathType: Prefix
backend:
service:
name: baget
port:
number: 80
執行 kubectl apply -f baget-ingress.yaml
部署上面的配置清單後, 本地解析baget.inner.laplus.com
這個域名到安裝了nginx-ingress
的邊緣伺服器ip
192.168.124.66 baget.inner.laplus.com
然後用瀏覽器訪問https://baget.inner.laplus.com
就可以訪問到Baget的首頁啦.
小結
理解了Pod
Development
Service
Ingress
的相關概念後, 要在kubernetes上部署一個容器化的web應用其實還是挺容易的.
本文來自部落格園,作者:Laggage,轉載請註明原文連結:https://www.cnblogs.com/laggage/p/15490880.html