接下來終於要進入 K8s 的攻擊環節了,不過再進行前先來了解一下使用 K8s 的目的、架構以及一些基本操作。那因為這系列著重在安全議題上面,所以操作都已能夠架設出基本的環境為主,如果要學習開發、部署、維運 K8s 相關的話,就麻煩自行參考其他資源,因為我對這部分完全沒有著墨。
Kubernetes(常簡稱為K8s)是用於自動部署、擴充和管理「容器化(containerized)應用程式」的開源系統,也就是說關於容器的負載平衡、自我異常的檢測這些事情都可以透過 K8s 幫忙管理。一個 K8s 的基本架構參考如下圖 :
從圖上可以看到有兩個角色,一個是 Developer,透過向 API Server 傳送控制命令去做容器的部署以及服務的開放。另一個角色則是 Users,也就是一般使用者,可以透過開放的介面去存取服務。
這邊先針對 K8s Master Node 的幾個元件做簡單的介紹 :
再來是 K8s Worker Node 的部分 :
以上就是這次鐵人賽會碰到的 K8s 相關元件部分,當然針對開發維運還有很多其他的細節,這邊就不屬於這次的範圍了(而且我也沒研究)。
那要如何架設出一個自己的 K8s 環境呢? 有很多不同的軟體可以達成,每個軟體的設計架構雖然都遵循上面講的元件,但實際運行的方式卻有很大的差異,我一開始學的時候也是一頭霧水。以下就參考 MiniKube, Kubeadm, Kind, K3S, how to get started on Kubernetes? 這邊文章來做說明。
Minikube
優點 : 好安裝、輕量
缺點 : 架構太簡單
Kubeadm
優點 : 完整架構、可以使用 Docker 作為容器
缺點 : 安裝複雜、耗費資源、只能有一個 Master Node
以目前鐵人賽的資源來說還是 minikube 比較多,功能上來講也都還算齊全,除了最後有個補充汙染橫向移動手法無法呈現。所以我這邊最後還是挑選它作為這次比賽的使用平台。
接下來先退回 Day01快照,然後來安裝minikube,資料參考 minikube 安裝方式。
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64 ;
sudo install minikube-linux-amd64 /usr/local/bin/minikube ;
rm minikube-linux-amd64 ;
#啟動 minikube
minikube start ;
#列出安裝的 addons
minikube addons list ;
# 操作 minikube 容器
minikube ssh ;
#停止 minikube
minikube stop ;
#刪除 minikube
minikube delete ;
然後要對 K8s 的 kube-apiserver 下達命令都是透過 kubectl 這隻程式來做的,而且最後套用一下 auto-completion 使用起來會更順手。安裝方式參考如下 :
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl" ;
curl -LO "https://dl.k8s.io/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl.sha256" ;
echo "$(cat kubectl.sha256) kubectl" | sha256sum --check ;
sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl ;
chmod +x kubectl
mkdir -p ~/.local/bin
mv ./kubectl ~/.local/bin/kubectl
# and then append (or prepend) ~/.local/bin to $PATH ;
# PATH=$PATH:~/.local/bin
kubectl get po -A ;
echo 'source <(kubectl completion bash)' >>~/.bashrc ;
source ~/.bashrc ;
openssl x509 -in [client.crt 檔案位置] -text -noout ;
在建立第一個 pods 之前記得先建立一個 [Day 09 Minikube 架設] 快照方便之後期中考還原用。
接下來就要建立第一個 pods (參考資料 : 在 Minikube 上跑起你的 Docker Containers - Pod & kubectl 常用指令)。K8s 下達操作命令統一都是透過 YAML 格式去做操作的,再透過 kubectl create 或是 kubectl apply 指令去做套用。
apiVersion: v1
kind: Pod
metadata:
name: my-first-pod
labels:
app: shell-server
spec:
containers:
- name: my-shell
image: aeifkz/my-ubuntu:v1.0
ports:
- containerPort: 30089
- name: my-nginx
image: nginx
執行方式 :
#新增 yaml 資源
kubectl create -f pod.yaml ;
#觀看 pod 資源
kubectl get pods ;
#查看 pod 資源狀態
kubectl describe pods my-first-pod ;
# 進到 pod 執行命令,如果 pod 內有多個容器
# 則需要 --container 去指定在哪個容器執行命令
kubectl exec -it pods/my-first-pod --container my-shell -- bash ;
# 觀察一下開了那些 port
netstat -tlupn ;
# 依照 yaml 刪除資源
kubectl delete -f pod.yaml ;