rancher安裝及部署k8s

2023-11-14 12:01:38

一、安裝docker

參考:https://www.cnblogs.com/uestc2007/p/15598527.html

二、安裝rancher 

1、Rancher概述

  • rancher官方檔案
  • Rancher 是一個 Kubernetes 管理工具,讓你能在任何地方和任何提供商上部署和執行叢集。
  • Rancher 可以建立來自 Kubernetes 託管服務提供商的叢集,建立節點並安裝 Kubernetes,或者匯入在任何地方執行的現有 Kubernetes 叢集。
  • Rancher 基於 Kubernetes 新增了新的功能,包括統一所有叢集的身份驗證和 RBAC,讓系統管理員從一個位置控制全部叢集的存取。
  • 此外,Rancher 可以為叢集和資源提供更精細的監控和告警,將紀錄檔傳送到外部提供商,並通過應用商店(Application Catalog)直接整合 Helm。如果你擁有外部 CI/CD 系統,你可以將其與 Rancher 對接。沒有的話,你也可以使用 Rancher 提供的 Fleet 自動部署和升級工作負載。
  • Rancher 是一個 全棧式 的 Kubernetes 容器管理平臺,為你提供在任何地方都能成功執行 Kubernetes 的工具。

2、安裝環境

軟體版本
cnetos7 20.04.2
docker 20.10.6

 3、環境初始化

1、關閉swap分割區
sudo swapoff -a

#驗證
free -m

2、 確保時區,時間正確
sudo timedatectl

3、確保虛機不會自動suspend
sudo systemctl mask sleep.target suspend.target hibernate.target hybrid-sleep.target

4、載入核心模組br_netfilter,並調整引數
#執行
sudo modprobe br_netfilter

#確認已載入
lsmod | grep br_netfilter 


#調整核心引數,修改 /etc/sysctl.conf
#將橋接的IPv4流量傳遞到iptables的鏈

vim /etc/sysctl.conf

cat > /etc/sysctl.conf << EFO
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EFO

#使設定生效,執行:
sudo sysctl --system

5、設定rp_filter的值
#執行
sudo vi /etc/sysctl.d/10-network-security.conf

#將檔案中如下兩個引數的值從2修改為1
net.ipv4.conf.default.rp_filter=1 
net.ipv4.conf.all.rp_filter=1


#使設定生效,執行:
sudo sysctl --system

4、建立rancher掛載目錄

#建立rancher的持久化目錄
mkdir -p /opt/data/rancher_data

#建立SSL根目錄 mkdir
-p /opt/data/rancher_ssl

#建立審計紀錄檔目錄 mkdir
-p /opt/data/rancher_auditlog

 5、下載安全證書(如果有ssl證書請使用)Apache 下載證書

  對應關係(阿里雲ssl證書):public.crt-->cert.pem  xxxx.com.key->key.pem  chain.crt-->cacerts.pem

docker run -d --restart=unless-stopped \
-p 80:80 -p 443:443 \
-v /opt/data/rancher_ssl/xxx.com_public.crt:/etc/rancher/ssl/cert.pem \
-v /opt/data/rancher_ssl/xxx.com.key:/etc/rancher/ssl/key.pem \
-v /opt/data/rancher_ssl/xxx.com_chain.crt:/etc/rancher/ssl/cacerts.pem \
--privileged \
-v /opt/data/rancher_data:/var/lib/rancher \
-v /opt/data/rancher_auditlog:/var/log/auditlog \
-e AUDIT_LEVEL=1 \
rancher/rancher:v2.7.5

注:版本自定義

7、通過命令檢視rancher是否啟動

檢視STATUS 如果1分鐘內,沒有出現重啟之類的問題,那麼這個docker便已經啟動成功。

 docker ps

8、存取rancher

在瀏覽器存取 https://IP:port即可看到效果

 9、通過命令獲取密碼

1、通過docker ps 獲取容器iD

2、docker logs 容器id 2>&1 | grep "Bootstrap Password:"

設定密碼,最少12位元

至此,Rancher安裝完成!

 三、使用Rancher搭建K8S叢集

 3.1、匯入k8s叢集

如果已經存在k8s叢集,可以匯入已存在

3.1.1 生成kubeconfig檔案(可選)

vi restore-kube-config.sh

#!/bin/bash

help ()
{
    echo  ' ================================================================ '
    echo  ' --master-ip: 指定Master節點IP,任意一個K8S Master節點IP即可。'
    echo  ' 使用範例:bash restore-kube-config.sh --master-ip=1.1.1.1 '
    echo  ' ================================================================'
}

case "$1" in
    -h|--help) help; exit;;
esac

if [[ $1 == '' ]];then
    help;
    exit;
fi

CMDOPTS="$*"
for OPTS in $CMDOPTS;
do
    key=$(echo ${OPTS} | awk -F"=" '{print $1}' )
    value=$(echo ${OPTS} | awk -F"=" '{print $2}' )
    case "$key" in
        --master-ip) K8S_MASTER_NODE_IP=$value ;;
    esac
done

# 獲取Rancher Agent映象
RANCHER_IMAGE=$( sudo docker images --filter=label=io.cattle.agent=true |grep 'v2.' | \
grep -v -E 'rc|alpha|<none>' | head -n 1 | awk '{print $3}' )

if [ -d /opt/rke/etc/kubernetes/ssl ]; then
  K8S_SSLDIR=/opt/rke/etc/kubernetes/ssl
else
  K8S_SSLDIR=/etc/kubernetes/ssl
fi

CHECK_CLUSTER_STATE_CONFIGMAP=$( sudo docker run --rm --entrypoint bash --net=host \
-v $K8S_SSLDIR:/etc/kubernetes/ssl:ro $RANCHER_IMAGE -c '\
if kubectl --kubeconfig /etc/kubernetes/ssl/kubecfg-kube-node.yaml \
-n kube-system get configmap full-cluster-state | grep full-cluster-state > /dev/null; then \
echo 'yes'; else echo 'no'; fi' )

if [ $CHECK_CLUSTER_STATE_CONFIGMAP != 'yes' ]; then

  sudo docker run --rm --net=host \
  --entrypoint bash \
  -e K8S_MASTER_NODE_IP=$K8S_MASTER_NODE_IP \
  -v $K8S_SSLDIR:/etc/kubernetes/ssl:ro \
  $RANCHER_IMAGE \
  -c '\
  kubectl --kubeconfig /etc/kubernetes/ssl/kubecfg-kube-node.yaml \
  -n kube-system \
  get secret kube-admin -o jsonpath={.data.Config} | base64 --decode | \
  sed -e "/^[[:space:]]*server:/ s_:.*_: \"https://${K8S_MASTER_NODE_IP}:6443\"_"' > kubeconfig_admin.yaml

  if [ -s kubeconfig_admin.yaml ]; then
    echo '恢復成功,執行以下命令測試:'
    echo ''
    echo "kubectl --kubeconfig kubeconfig_admin.yaml get nodes"
  else
    echo "kubeconfig恢復失敗。"
  fi

else

  sudo docker run --rm --entrypoint bash --net=host \
  -e K8S_MASTER_NODE_IP=$K8S_MASTER_NODE_IP \
  -v $K8S_SSLDIR:/etc/kubernetes/ssl:ro \
  $RANCHER_IMAGE \
  -c '\
  kubectl --kubeconfig /etc/kubernetes/ssl/kubecfg-kube-node.yaml \
  -n kube-system \
  get configmap full-cluster-state -o json | \
  jq -r .data.\"full-cluster-state\" | \
  jq -r .currentState.certificatesBundle.\"kube-admin\".config | \
  sed -e "/^[[:space:]]*server:/ s_:.*_: \"https://${K8S_MASTER_NODE_IP}:6443\"_"' > kubeconfig_admin.yaml

  if [ -s kubeconfig_admin.yaml ]; then
    echo '恢復成功,執行以下命令測試:'
    echo ''
    echo "kubectl --kubeconfig kubeconfig_admin.yaml get nodes"
  else
    echo "kubeconfig恢復失敗。"
  fi
fi

執行sh

sudo bash restore-kube-config.sh --master-ip=K8S Master節點IP

3.1.2點選 匯入已有叢集:

 選擇 匯入 Kubernetes 叢集:

 輸入叢集名稱:

 執行下圖命令:

 3.2部署k8s

3.2.1準備開始建立 k8s

3.2.2 建立叢集,下邊資料預設就行

 3.2.3 在master主節點執行,選中 etcd、 Control Plane、Worker, 複製下邊程式碼到master節點執行

3.2.4 在node節點執行,只需要選中 Worker 複製下邊程式碼到node節點

 有多個node節點,每個節點都要執行

 3.2.5 如果之前有安裝過,需要將之前安裝的容器刪除,並清空掛載卷目錄

rm -rf /etc/ceph \
       /etc/cni \
       /etc/kubernetes \
       /opt/cni \
       /opt/rke \
       /run/secrets/kubernetes.io \
       /run/calico \
       /run/flannel \
       /var/lib/calico \
       /var/lib/etcd \
       /var/lib/cni \
       /var/lib/kubelet \
       /var/lib/rancher/rke/log \
       /var/log/containers \
       /var/log/pods \
       /var/run/calico

3.2.6 檢視叢集是否正常

3.2.7測試叢集

我們來建立一個工作負載,執行一個 nginx,看一下最終效果。進入叢集,建立 Deployment ,設定好對映埠、映象,點選建立:

等待安裝完成,在瀏覽器存取 http://IP:30080, 即可看到 nginx 的歡迎頁面

四 Rancher的使用

4.1 建立名稱空間

建立專案:

 根據需求建立名稱空間和設定資源

4.2 Secret

首先建立Harbor私庫的金鑰
選擇 儲存=> Secrets(密文) =>建立

 名稱空間選擇之前自己建立的,填寫名稱,然後選擇 Custom,倉庫地址就是Harbor的地址,再輸入Habor的使用者名稱和密碼。

Harbor的搭建參考:https://blog.csdn.net/zhilianxian2212/article/details/127412858?spm=1001.2014.3001.5501

 4.3Deployment

4.3.1 概述一個 Deployment 為 Pod 和 ReplicaSet 提供宣告式的更新能力。

你負責描述 Deployment 中的 目標狀態,而 Deployment 控制器(Controller) 以受控速率更改實際狀態, 使其變為期望狀態。你可以定義 Deployment 以建立新的 ReplicaSet,或刪除現有 Deployment, 並通過新的 Deployment 收養其資源。

說明:
不要管理 Deployment 所擁有的 ReplicaSet 。 如果存在下面未覆蓋的使用場景,請考慮在 Kubernetes 倉庫中提出 Issue。

4.3.2 用例

以下是 Deployments 的典型用例:

  • 建立 Deployment 以將 ReplicaSet 上線。ReplicaSet 在後臺建立 Pod。 檢查 ReplicaSet 的上線狀態,檢視其是否成功。
  • 通過更新 Deployment 的 PodTemplateSpec,宣告 Pod 的新狀態 。 新的ReplicaSet 會被建立,Deployment 以受控速率將 Pod 從舊 ReplicaSet 遷移到新 ReplicaSet。每個新的 ReplicaSet 都會更新 Deployment 的修訂版本。
  • 如果 Deployment 的當前狀態不穩定,回滾到較早的Deployment 版本。 每次回滾都會更新 Deployment 的修訂版本。
  • 擴大 Deployment 規模以承擔更多負載。 暫停Deployment 以應用對 PodTemplateSpec 所作的多項修改, 然後恢復其執行以啟動新的上線版本。
  • 使用Deployment 狀態來判定上線過程是否出現停滯。
  • 清理較舊的不再需要的 ReplicaSet 。

4.3.3 建立 Deployment

4.3.3.1 使用表單編輯建立Deployment

 

4.3.3.2 使用YAML檔案建立Deployment

  • YAML檔案包含四個部分:**

apiVersion: 表示版本
kind: 表示資源
metadata: 表示元資訊
spec: 資源規範欄位

下面是具體的欄位說明:

apiVersion: apps/v1         # 指定api版本,此值必須在kubectl api-versions中
kind: Deployment            # 指定建立資源的角色/型別
metadata:                   # 資源的後設資料/屬性
  name: dnehsa-bizc         # 資源的名字,在同一個namespace中必須唯一
  namespace: gdfw           # 部署在哪個namespace中
  labels:                   # 設定資源的標籤
    app: dnehsa-bizc
spec:                       # 資源規範欄位
  replicas: 1               # 宣告副本數目
  revisionHistoryLimit: 10  # 保留歷史版本
  selector:                 # 選擇器
    matchLabels:            # 匹配標籤
      app: dnehsa-bizc
  strategy:                 # 策略
    rollingUpdate:          # 捲動更新
      maxSurge: 25%         # 最大額外可以存在的副本數,可以為百分比,也可以為整數
      maxUnavailable: 25%   # 表示在更新過程中能夠進入不可用狀態的 Pod 的最大值,可以為百分比,也可以為整數
    type: RollingUpdate     # 捲動更新策略
  template:                 # 模版
    metadata:               # 資源的後設資料/屬性
      labels:               # 設定資源的標籤
        app: dnehsa-bizc
    spec:                   # 資源規範欄位
      containers:
        - name: dnehsa-bizc   # 容器的名字
          image: 192.168.20.4:8930/library/dnehsa_bizc:v1.0  # 容器使用的映象地址
          imagePullPolicy: Always   # 每次Pod啟動拉取映象策略,三個選擇 Always、Never、IfNotPresent
          # Always,每次都檢查;Never,每次都不檢查(不管本地是否有);IfNotPresent,如果本地有就不檢查,如果沒有就拉取

          resources: # 資源管理
            limits: # 最大使用
              cpu: 300m # CPU,1核心 = 1000m
              memory: 500Mi # 記憶體,1G = 1000Mi
            requests:  # 容器執行時,最低資源需求,也就是說最少需要多少資源容器才能正常執行
              cpu: 100m
              memory: 100Mi
          livenessProbe:  #存活探針器設定
            httpGet: #1.存活探針器三種方式 1.cmd命令方式進行探測 2.http 狀態碼方式 3.基於tcp埠探測
              path: /healthy #k8s原始碼中healthz 實現 https://github.com/kubernetes/kubernetes/blob/master/test/images/agnhost/liveness/server.go
              port: 32189    #應用程式監聽埠
            failureThreshold: 3 #處於成功時狀態時,探測操作至少連續多少次的失敗才被視為檢測不通過,顯示為#failure屬性.預設值為3,最小值為 1,存活探測情況下的放棄就意味著重新啟動容器。
            initialDelaySeconds: 600 #存活性探測延遲時長,即容器啟動多久之後再開始第一次探測操作,顯示為delay屬性.預設值為0,即容器啟動後立刻便開始進行探測.
            periodSeconds: 10  #執行探測的時間間隔(單位是秒)。預設是 10 秒。最小值是 1秒,過高的頻率會對Pod物件帶來較大的額外開銷,而過低的頻率又會使得對錯誤的反應不及時.
            successThreshold: 1 #處於失敗狀態時,探測操作至少連續多少次的成功才被人為是通過檢測,顯示為#success屬性,預設值為1,最小值也是1
            timeoutSeconds: 3 #存活性探測的超時時長,顯示為timeout屬性,預設值1s,最小值也是1s
          readinessProbe:  #定義就緒探測器
            failureThreshold: 3 #處於成功時狀態時,探測操作至少連續多少次的失敗才被視為檢測不通過,顯示為#failure屬性.預設值為3,最小值為  就緒探測情況下的放棄 Pod 會被打上未就緒的標籤.
            tcpSocket: # 1.就緒探針三種方式 1.cmd命令方式進行探測 2.http 狀態碼方式 3.基於tcp埠探測
              port: 32189 #應用程式監聽埠
            initialDelaySeconds: 10 #執行探測的時間間隔(單位是秒)。預設是 10 秒。最小值是 1秒,過高的頻率會對Pod物件帶來較大的額外開銷,而過低的頻率又會使得對錯誤的反應不及時.
            periodSeconds: 10  #執行探測的時間間隔(單位是秒)。預設是 10 秒。最小值是 1秒,過高的頻率會對Pod物件帶來較大的額外開銷,而過低的頻率又會使得對錯誤的反應不及時
            successThreshold: 1 #處於失敗狀態時,探測操作至少連續多少次的成功才被人為是通過檢測,顯示為#success屬性,預設值為1,最小值也是1
            timeoutSeconds: 3  #存活性探測的超時時長,顯示為timeout屬性,預設值1s,最小值也是1s
          env:  #環境變數
            - name: TZ
              value: Asia/Shanghai
            # JVM env
            - name: JAVA_OPTS
              value: -Xms1024m -Xmx2048m -Dfile.encoding=UTF-8
            # profile
            - name: PROFILE
              value: dev
          volumeMounts:              # 使用儲存卷
            - mountPath: /var/logs   # 將儲存卷掛載到容器內部路徑
              name: log-volume
      dnsPolicy: ClusterFirst   # 使用宿主機dns  ; None 無任何策略 ;ClusterFirst 叢集DNS優先;ClusterFirstWithHostNet 叢集 DNS 優先,並伴隨著使用宿主機網路
      imagePullSecrets: # 映象倉庫拉取金鑰
        - name: harbor # 映象Secrets需要在叢集中手動建立
      restartPolicy: Always # 重啟策略
      volumes:              # 定義儲存卷
        - name: log-volume  # 卷名稱
          hostPath:         # 卷型別詳細見:https://kubernetes.io/zh/docs/concepts/storage/volumes/
            path: /data/logs/prod/dnehsa_bizc  # 宿主機存在的目錄路徑
            type: DirectoryOrCreate # 如果在給定路徑上什麼都不存在,那麼將根據需要建立空目錄,許可權設定為 0755,具有與 kubelet 相同的組和屬主資訊
        - name: sidecar  #
          emptyDir: {} #emptyDir 卷的儲存媒介(磁碟、SSD 等)是由儲存 kubelet 資料的根目錄 (通常是 /var/lib/kubelet)的檔案系統的媒介確定。

建立一個Deployment後,還會自動建立一個Pod。
這邊狀態顯示為Active,說明建立成功。

 

4.4 Pod

Pod 是可以在 Kubernetes 中建立和管理的、最小的可部署的計算單元。

Pod(就像在鯨魚莢或者豌豆莢中)是一組(一個或多個) 容器; 這些容器共用儲存、網路、以及怎樣執行這些容器的宣告。 Pod 中的內容總是並置(colocated)的並且一同排程,在共用的上下文中執行。 Pod 所建模的是特定於應用的 「邏輯主機」,其中包含一個或多個應用容器, 這些容器相對緊密地耦合在一起。 在非雲環境中,在相同的物理機或虛擬機器器上執行的應用類似於在同一邏輯主機上執行的雲應用。

除了應用容器,Pod 還可以包含在 Pod 啟動期間執行的 Init 容器。 你也可以在叢集支援臨時性容器的情況下, 為偵錯的目的注入臨時性容器。

4.4.1 什麼是 Pod?

說明: 除了 Docker 之外,Kubernetes 支援很多其他容器執行時, Docker 是最有名的執行時, 使用 Docker 的術語來描述 Pod 會很有幫助。
Pod 的共用上下文包括一組 Linux 名稱空間、控制組(cgroup)和可能一些其他的隔離方面, 即用來隔離容器的技術。 在 Pod 的上下文中,每個獨立的應用可能會進一步實施隔離。

Pod 類似於共用名稱空間並共用檔案系統卷的一組容器。

4.4.2 使用Pod

Pod 通常不是直接建立的,而是使用工作負載資源建立的。
這邊狀態顯示為Running,說明正在執行。
Execute Shell 可以進入Pod的容器中,相當於執行命令:kubectl exec -it podName -n namespaceName – /bin/sh
View Logs 檢視紀錄檔,相當於執行命令:kubectl logs -f --tail 500 podName -n namespaceName

 

4.5 Service

將執行在一組 Pods 上的應用程式公開為網路服務的抽象方法。
使用 Kubernetes,你無需修改應用程式即可使用不熟悉的服務發現機制。 Kubernetes 為 Pod 提供自己的 IP 地址,併為一組 Pod 提供相同的 DNS 名, 並且可以在它們之間進行負載均衡。

動機
建立和銷燬 Kubernetes Pod 以匹配叢集的期望狀態。 Pod 是非永久性資源。 如果你使用 Deployment 來執行你的應用程式,則它可以動態建立和銷燬 Pod。
每個 Pod 都有自己的 IP 地址,但是在 Deployment 中,在同一時刻執行的 Pod 集合可能與稍後執行該應用程式的 Pod 集合不同。
這導致了一個問題: 如果一組 Pod(稱為「後端」)為叢集內的其他 Pod(稱為「前端」)提供功能, 那麼前端如何找出並跟蹤要連線的 IP 地址,以便前端可以使用提供工作負載的後端部分?
進入 Services。

具體可看服務(Service)

4.5.1 建立Service

建立Service成功後,就可以存取到服務了。說明:如果你將 type 欄位設定為 NodePort,則 Kubernetes 控制平面將在 --service-node-port-range 標誌指定的範圍內分配埠(預設值:30000-32767)。詳情請看:釋出服務(服務型別)

4.5.1.1 使用表單編輯建立Service

 

4.5.1.2 使用YAML檔案建立Service

下面是具體的欄位說明: 

apiVersion: v1            # 指定api版本,此值必須在kubectl api-versions中
kind: Service             # 指定建立資源的角色/型別 
metadata:                 # 資源的後設資料/屬性
  name: dnehsa-bizc-svc   # 資源的名字,在同一個namespace中必須唯一
  namespace: gdfw         # 部署在哪個namespace中
  labels:                 # 設定資源的標籤
    app: dnehsa-bizc-svc
spec:                     # 資源規範欄位
  type: NodePort          # 型別:叢集IP,外部DNS服務名稱,Headless,負載均衡器,節點埠
  ports:
  - name: dnehsa-bizc-svc # 埠名稱
    nodePort: 30006       # 節點埠
    port: 30006           # 監聽埠
    protocol: TCP         # 協定
    targetPort: 30006     # 目標埠
  selector:               # 選擇器
    app: dnehsa-bizc

4.6動態擴縮容 

##kubectl scale --replicas=3 資源型別/資源名稱
kubectl scale --replicas=3 deploy/test-deploy

圖形化操作

 4.7回滾/升級 專案

 4.8建立PV掛載(PersistentVolume)

 4.9 建立PVC掛載(PersistentVolumeClaim)

 

 

5. 進入rancher控制檯

 通過部署rancher的容器進入

docker exec -it rancher bash