一、安裝 Docker
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
鏡像加速(本文使用阿里雲鏡像):
## vi /etc/docker/daemon.json
{"registry-mirrors":["https://<你的ID>.mirror.aliyuncs.com"]}
## systemctl daemon-reload
## systemctl restart docker
備註:本文使用的鏡像爲 luksa/kubia,是《Kubernetes in Action》中使用的鏡像,其爲一個簡單的 Node.js 應用:
const http = require('http'); const os = require('os'); console.log("Kubia server starting..."); var handler = function(request, response) { console.log("Received request form " + request.connection.remoteAddress); response.writeHead(200); response.end("You've hit " + os.hostname() + "\n"); }; var www = http.createServer(handler); www.listen(8080);
Dockerfile 文件的內容爲:
FROM node:7 ADD app.js /app.js ENTRYPOINT ["node", "app.js"]
二、配置 k8s 集羣
Minikube 是一個構建單節點集羣的工具,是運行 Kubemetes 集羣最簡單、最快捷的途徑
2.1. 安裝 kubectl
官方給出地址是:https://storage.googleapis.com ,需要梯子才能使用,改爲使用阿里雲的下載地址:
curl -Lo kubectl http://kubernetes.oss-cn-hangzhou.aliyuncs.com/kubernetes-release/release/v1.20.0/bin/linux/amd64/kubectl && chmod +x ./kubectl && mv ./kubectl /usr/local/bin/kubectl
驗證是否成功:kubectl version --client
2.2. 安裝 minikube
同樣使用阿里雲的下載地址:
curl -Lo minikube http://kubernetes.oss-cn-hangzhou.aliyuncs.com/minikube/releases/v1.16.0/minikube-linux-amd64 && chmod +x ./minikube && mv ./minikube /usr/local/bin/minikube
啓動集羣:minikube start --driver=none
查看集羣(前提是已經安裝了 kubectl):kubectl get pod -A # pod 可以縮寫爲 po
遇到的報錯:
- Sorry, Kubernetes 1.20.0 requires conntrack to be installed in root’s path
## 安裝 conntrack: yum install conntrack
- /proc/sys/net/bridge/bridge-nf-call-iptables contents are not set to 1
echo "1" >/proc/sys/net/bridge/bridge-nf-call-iptables #/pro的配置文件根據實際環境來
三、部署應用
3.1. 部署應用
kubectl create deployment hello-minikube --image=luksa/kubia
3.1.1. pod
一個 pod 是一組緊密相關的容器,它們總是一起運行在同一個工作節上,以及同一個 Linux 命名空間中。每個 pod 就像一個獨立的邏輯機器,擁有自己的 IP、主機名、進程等,運行一個獨立的應用程序。應用程序可以是單個進程,運行在單個容器中,也可以是一個主應用進程或者其他支持進程,每個進程都在自己的容器中運行一個 pod 的所有容器都運行在同一個邏輯機器上,而其他 pod 中的容器,即使運行在同個工作節點上,也會出現在不同的節點上。
可以通過下面命令查看 pod 列表:kubectl get pods kubectl get pods -o wide # 顯示 pod 運行的 IP 和所運行的節點
3.2. 創建服務對象
每個 pod 都有自己的 IP 地址,但是這個地址是集羣內部的,不能從集羣外部訪問。要讓 pod 能夠從外部訪問,需要通過服務對象公開它,要創建一個特殊的 LoadBalancer 類型的服務。因爲如果你創建一個常規服務(一個 ClusterIP 服務),比如 pod,它只能從集羣內部訪問。通過創建 LoadBalancer 類型的服務,將創建一個外部的負載均衡,可以通過負載均衡的公共 IP 訪問 podkubectl expose deployment hello-minikube --type=NodePort --port=8080
可以通過下面命令查看服務列表:kubectl get services
如果執行上面的命令可以看到服務是沒有外部 IP 的,可以使用下面命令爲其分配端口:也可以使用下面命令指定端口:minikube service hello-minikube # 本文分配的端口爲:31526
kubectl port-forward service/hello-minikube 7080:8080 # 可以通過 http://localhost:7080 訪問
3.3. 水平伸縮應用
可以通過下面命令查看 Deployment 列表:kubectl get deployments
默認只有 1 個 pod 副本,可以增加 pod 副本的數量:kubectl scale deployment hello-minikube --replicas 3
再次執行查看 Deployment 列表命令,可以看到目標數量變成了 3(需要等待一段時間 3 個 pod 才能都啓動),等 3 個 pod 都成功啓動後,多次調用接口,可以看到有不同的輸出:
curl http://192.168.12.130:31526 # 31526 爲本文分配的端口
## You've hit hello-minikube-6895494d6d-wsfmx
## You've hit hello-minikube-6895494d6d-cbsnz
## You've hit hello-minikube-6895494d6d-rvgvw
參考:
- 《Kubernetes in Action》
- Install and Set Up kubectl
- minikube start