安裝說明
透過 docker desktop 可以安裝適用於單機和開發環境單機版的 K8S,如果 docker desktop 無法啟動 Kubernates 透過以下方式解決:
一:新增國內映象源
為 Docker 的 daemon.json
新增配置:
{
"registry-mirrors": [
"https://docker.mirrors.ustc.edu.cn",
"https://registry.docker-cn.com"
]
}
二:透過指令碼下載 Kubernetrs 所需要的映象
在 GitHub 中的 k8s-for-docker-desktop 專案中下載 Kubernetes 版本對應的分支,然後執行指令碼即可,啟動完成後,驗證 K8S 叢集狀態:
$ kubectl cluster-info
$ kubectl get nodes
$ kubectl describe node
理解 Pod
先透過一個簡單的示例理解 Pod,Pod 是 Kubernetes 中的基本部署單元,這裡看看如何用 Pod 建立一個 nginx
服務。
使用 kubectl
命令部署一個 nginx
的服務:
$ kubectl create deployment nginx-arm --image=nginx
建立部署後,您可以使用以下命令檢查 Pod 的狀態:
$ kubectl get pods
這將列出所有 Pod,您可以檢視 nginx-arm
部署建立的 Pod 的狀態。
如果 Pod 狀態不是 Running
,您可以使用以下命令檢視日誌,以幫助診斷問題:
$ kubectl logs [POD_NAME]
將 [POD_NAME]
替換為您的 Pod 名稱。
如果您想讓 nginx
服務可以從叢集外部訪問,您可以建立一個服務來暴露它:
$ kubectl expose deployment nginx-arm --port=80 --type=LoadBalancer
這將建立一個負載均衡器,將流量轉發到 nginx
Pod 的 80 埠。
最後請求服務,進行驗證:
$ curl 127.0.0.1:80
響應 Welcome to nginx!
代表服務訪問完成。
理解 ConfigMap
ConfigMap 是 Kubernetes 中的一個 API 物件,主要用於儲存非機密性的鍵值對資料。因為 Kubernetes 的理念是推崇應用程式和配置分離,所以你可以使用 ConfigMap 將配置資訊從應用程式程式碼中分離出來,使得容器化應用程式的配置更加靈活和可管理。
建立
你可以透過一下命令從指定的 *.yaml
檔案裡面建立一個 ConfigMap,示例:
$ kubectl create configmap envoy-config --from-file=envoy.yaml
以上命令建立一個名稱為 envoy-config
的 ConfigMap 物件,建立後,它可以用於配置 Kubernetes 中的容器化應用,可以將這個 ConfigMap 掛載到 Pod 中,使得 Pod 內的應用能夠讀取並使用 envoy.yaml
檔案中定義的配置。
檢視
在當前名稱空間中列出所有 ConfigMap,您可以使用:
$ kubectl get configmap
這將顯示所有 ConfigMap 的基本資訊:
NAME DATA AGE
envoy-config 1 47h
要獲取特定 ConfigMap 的詳細資訊,可以使用:
$ kubectl describe configmap [CONFIGMAP_NAME]
使用
啟動一個 Envoy Deployment 並且使用剛才建立的 ConfigMap 物件:
$ kubectl create -f envoy-deploy.yaml
$ kubectl expose deploy envoy --selector run=envoy --port=10000 --type=NodePort
在 envoy-deploy.yaml
的 spec
中是這樣引用外部的配置檔案的
spec:
containers:
- image: envoyproxy/envoy-dev
name: envoy
volumeMounts:
- name: envoy-config
mountPath: "/etc/envoy"
readOnly: true
volumes:
- name: envoy-config
configMap:
name: envoy-config
以上配置在 volumeMounts
中定義了卷的掛載名稱和掛載目錄,並且設定為只讀。在 volumes
中可以看到卷的來源是名稱為 envoy-config
的 ConfigMap ,就是我們剛才建立的物件。
然後,可以使用以下命令,調整剛才建立 Pod 的數量:
kubectl scale deploy envoy --replicas=3
透過 kubectl get pods
可以確認:
NAME READY STATUS RESTARTS AGE
envoy-747c876c74-lss78 1/1 Running 1 13h
envoy-747c876c74-tmklv 1/1 Running 0 8h
envoy-747c876c74-vdh99 1/1 Running 0 8h
環境變數
使用 --from-env-file
選項引數,可以建立特別用於環境變數配置示例:
$ kubectl create configmap game-env-config --from-env-file=game.properties
使用 -o yaml
引數可以指定 configMap 物件輸出格式為 YAML 示例:
$ kubectl get configmap -oyaml [CONFIGMAP_NAME]
命令列鍵值對
使用 --from-literal
引數可以直接在命令列中定義鍵值對的 ConfigMap:
$ kubectl create configmap special-config --from-literal=special.how=very --from-literal=special.type=charm
這裡的 ConfigMap 建立了兩個鍵值對:special.how=very
和 special.type=charm
。你可以用上面的命令列印它。
引用配置
和其他 ConfigMap 物件一樣,可以在部署物件引用賦值 Pod 的環境變數,Deploymen 配置:
# ......
spec:
containers:
- name: test-container
image: nginx
#command: [ "/bin/sh", "-c", "env" ]
env:
# Define the environment variable
- name: SPECIAL_LEVEL_KEY
valueFrom:
configMapKeyRef:
# The ConfigMap containing the value you want to assign to SPECIAL_LEVEL_KEY
name: special-config
# Specify the key associated with the value
key: special.how
說明:以上 Pod 透過 configMapKeyRef
引用 special-config
中鍵為 special.how
的值,並將其賦給了名為 SPECIAL_LEVEL_KEY
的環境變數。
驗證:可以先建立部署,然後透過 env
命令列印環境變數檢視 Pod 的載入情況:
# create deployment
$ kubectl create -f downward-api-pod.yaml
# check pod
$ kubectl exec downward-api-pod -- env | grep "SPECIAL_LEVEL_KEY"
輸出結果:
# output
SPECIAL_LEVEL_KEY=very
掛載
在 Deploymen 配置中也可以宣告 volume
以掛載的方式訪問 ConfigMap 物件,示例:
apiVersion: v1
kind: Pod
metadata:
name: configmap-volume-pod
spec:
containers:
- name: test-container
image: k8s.gcr.io/busybox
command: [ "/bin/sh", "-c", "ls /etc/config/" ]
volumeMounts:
- name: config-volume
mountPath: /etc/config
volumes:
- name: config-volume
configMap:
# Provide the name of the ConfigMap containing the files you want
# to add to the container
name: special-config
說明:
volumeMounts
定義容器內的卷掛載點,引用的卷名稱是config-volume
,指定路徑是/etc/confg
volumes
定義卷的名稱。指明這個捲來源 ConfigMap,透過name
指定special-config
的 ConfigMap 內容會將被對映到卷中
驗證:參考上面的方式,在建立部署後,透過 env
命令檢視 Pod 環境變數即可。
就緒探針
Readiness Probe(就緒探針)是用來檢測容器是否已經啟動並且準備好被使用的機制。主要用於提高系統的可靠性和穩定性。
基本定義探針配置示例:
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
run: centos
name: centos
spec:
replicas: 1
selector:
matchLabels:
run: centos
template:
metadata:
labels:
run: centos
spec:
containers:
- command:
- tail
- -f
- /dev/null
image: centos
name: centos
readinessProbe:
exec:
command:
- cat
- /tmp/healthy
initialDelaySeconds: 5
periodSeconds: 5
說明:這個 Deployment 配置了一個就緒探針,這個探針是執行的命令是 cat /tmp/healthy
。如果該命令成功執行(返回狀態碼 0),則認為容器就緒。
- readinessProbe:定義了就緒探針(Readiness Probe)
- exec:定義透過指定執行命令來檢查就緒狀態,
command
是具體執行的命令。 - initialDelaySeconds:容器啟動後 5 秒開始執行就緒探針。
- periodSeconds:每 5 秒執行一次就緒探針。
啟動 Pod 驗證:
$ kubectl create -f centos-readiness.yaml
啟動後發現該 Pod 遲遲無法 READY
:
NAME READY STATUS RESTARTS AGE
centos-54bc4f8766-m54hd 0/1 Running 0 4m21s
原因在於就緒探針的作用,想要 Pod 進入就緒狀態,可以進入容器進行操作:
# Enter Pod
$ kubectl exec -it [POD_NAME] -- /bin/bash
# Create a file
$ echo "0" > /tmp/healthy
$ cat /tmp/healthy # # output 0
新增探針檢查的檔案,返回正常的狀態碼,然後再檢視 Pod:
$ kubectl get po
輸出:
NAME READY STATUS RESTARTS AGE
centos-54bc4f8766-m54hd 1/1 Running 0 5m24s
可以看到剛才的 Pod 已經進入 READY 狀態。