安裝說明
通過 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 狀態。