Kubernetes 教學 初章(microk8s 篇)
k8s 是個容器化管理技術,那我們直接開始吧!
與其直接開始講述 k8s 的各種技術細節,不如先帶大家體驗一下功能,可能會更好一點,所以我們先來安裝 microk8s 吧!
由於我們這邊使用的是 Debian 12,而安裝 microk8s 需要使用 snap,所以我們還需要先安裝 snap:
sudo apt update
sudo apt install snapd
接著按照官方説明,安裝 microk8s:
sudo snap install microk8s --classic
接著為自己的使用者增加使用權限:
sudo usermod -a -G microk8s $(whoami)
microk8s status --wait-ready
sudo chown -R $(whoami) ~/.kube
打開你想要開啓的服務:
microk8s enable dashboard
microk8s enable dns
microk8s enable registry
microk8s enable istio
可以用 microk8s enable --help
來列舉其他可用服務,或是用 microk8s disable <name>
來關閉服務。
接著我們可以透過以下指令查看 k8s cluster 的狀態:
microk8s kubectl get all --all-namespaces
我們可以透過 microk8s dashboard-proxy
來取得我們的 token,并且透過 microk8s {start, stop}
來開啓、結束整個 cluster。
接著我們就可以 deploy 我們第一個服務了,如下:
apiVersion: apps/v1
kind: Deployment
metadata:
name: flask-hello-world
spec:
replicas: 1
selector:
matchLabels:
app: flask-hello-world
template:
metadata:
labels:
app: flask-hello-world
spec:
containers:
- name: flask-container
image: rin0913/flask-hello-world:latest
ports:
- containerPort: 5000
---
apiVersion: v1
kind: Service
metadata:
name: flask-service
spec:
selector:
app: flask-hello-world
ports:
- protocol: TCP
port: 80
targetPort: 5000
type: NodePort
接下來:
microk8s kubectl apply -f deployment.yaml
就可以驗收了:
microk8s kubectl get services
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
flask-service NodePort 10.152.183.215 <none> 80:32046/TCP 102s
kubernetes ClusterIP 10.152.183.1 <none> 443/TCP 34m
$ curl http://10.152.183.215
Hello, World!
注意到這個 image 是我上傳的 rin0913/flask-hello-world:latest
,如果想看原始碼,可以看這裏。
上傳過程簡略寫在這裏:
sudo docker build .
sudo docker login
sudo docker tag 54abf4d3c08b rin0913/flask-hello-world:latest
sudo docker push rin0913/flask-hello-world:latest
重點來了!
事實上,上面那個 YAML 包含了兩個不同的 k8s 資源,一個是 deployment
,另一個是 service
。先看 deployment
:
apiVersion: apps/v1
kind: Deployment
metadata:
name: flask-hello-world
spec:
replicas: 1
selector:
matchLabels:
app: flask-hello-world # 注意這裏
template:
metadata:
labels:
app: flask-hello-world
spec:
containers:
- name: flask-container
image: rin0913/flask-hello-world:latest
ports:
- containerPort: 5000
他宣告了一個叫做 flask-hello-world
的 Pod
,并且透過 replicas
指定來了要運行多少個副本,根據 k8s 的機制,哪怕某個 Pod 崩潰了,也會將 Pod 重啓至規定數量。
接下來這個 Pod 中有一個 Container,從 rin0913/flask-hello-world:latest
拉取,并且會在 Container 内部的 port 5000 内部提供服務。
接下來看 service
:
apiVersion: v1
kind: Service
metadata:
name: flask-service
spec:
selector:
app: flask-hello-world # 會去尋找相符的 matchLabels
ports:
- protocol: TCP
port: 80
targetPort: 5000
type: NodePort
Service
會根據 selector
尋找匹配的 Pod,並將流量轉發給它們。
將 Container 内的 port 5000 轉發到 container 外的 port 80,并且分配一個 NodePort 給他。
flask-service NodePort 10.152.183.215 <none> 80:32046/TCP 102s
就是此處的 32046。
