天天看點

k8s (一) 學習環境 Kubernetes 叢集搭建

一、安裝 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

遇到的報錯:
  1. Sorry, Kubernetes 1.20.0 requires conntrack to be installed in root’s path
    ## 安裝 conntrack:
    yum install conntrack
               
  2. /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 中的容器,即使運作在同個工作節點上,也會出現在不同的節點上。
    k8s (一) 學習環境 Kubernetes 叢集搭建
    可以通過下面指令檢視 pod 清單:
    kubectl get pods
    kubectl get pods -o wide # 顯示 pod 運作的 IP 和所運作的節點
               

    3.2. 建立服務對象

    每個 pod 都有自己的 IP 位址,但是這個位址是叢集内部的,不能從叢集外部通路。要讓 pod 能夠從外部通路,需要通過服務對象公開它,要建立一個特殊的 LoadBalancer 類型的服務。因為如果你建立一個正常服務(一個 ClusterIP 服務),比如 pod,它隻能從叢集内部通路。通過建立 LoadBalancer 類型的服務,将建立一個外部的負載均衡,可以通過負載均衡的公共 IP 通路 pod

    kubectl 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
           
參考:
  1. 《Kubernetes in Action》
  2. Install and Set Up kubectl
  3. minikube start