歡迎訪問我的GitHub
這裡分類和彙總了欣宸的全部原創(含配套原始碼):https://github.com/zq2599/blog_demos
本篇概覽
- 欣宸正在為接下新的Java雲原生實戰系列原創做準備,既然是實戰,少不了一套雲原生環境,以下內容是必不可少的:
- linux作業系統
- kubernetes
- kubernetes的外部儲存,平時資料庫、監控、訊息這些中介軟體的資料不可能放在容器內,需要有個可靠的地方存起來不丟失
- 監控
- 一番操作下來,輕鬆完成了上述工作,這裡將整個過程記錄定下來,這樣可以保證每次重灌都能輕鬆愉快的完成,省下的時間用來寫更多的技術原創
版本資訊
- 本次安裝的版本資訊如下,供您參考
- 作業系統:CentOS 7.6 (騰訊雲輕應用伺服器)
- kubernetes:1.22 (底層容器服務是docker)
- prometheus:2.32.1
- grafana:8.3.3
初始化
- CentOS作業系統的安裝就不在這裡講了,接下來的操作假設您已裝好純淨的CentOS系統
- 本文中的操作都是用root賬號執行的
- 安裝ssh服務
sudo yum install openssh-server -y
- 修改root密碼
sudo passwd root
- 修改ssh配置,允許root遠端登入,檔案是/etc/ssh/sshd_config,注意下圖兩個箭頭指向的配置,確保您的值與之一致
- 安裝常用軟體:
yum install redhat-lsb lrzsz wget -y
- 關閉防火牆
systemctl stop firewalld && \
systemctl disable firewalld && \
setenforce 0
- 接下來可以安裝k8s了,如果網速正常,可以採用k8s安裝(線上下載映象和檔案)章節的方法,如果網路太慢,或者像我這樣使用騰訊雲伺服器時發現下載檔案太慢,可以採用k8s安裝(使用離線的映象和檔案)章節的方法
k8s安裝(線上下載映象和檔案)
- 為了簡單省事兒,本次打算使用sealos安裝K8S單機版,底層容器是docker
- 下載sealos,地址是:https://github.com/labring/sealos/releases/download/v4.1.3/sealos_4.1.3_linux_amd64.tar.gz
- 解壓並存放到指定位置
tar -zxvf sealos_4.1.3_linux_amd64.tar.gz sealos && chmod +x sealos && mv sealos /usr/bin
- 然後一行命令安裝k8s
sealos run labring/kubernetes-docker:v1.22.8-4.1.3 labring/helm:v3.8.2 labring/calico:v3.24.1 --single
- 等待三分鐘左右,K8S單機版安裝完成,控制檯輸出如下
- 檢視系統pod,一切正常
[root@VM-12-12-centos k8s]# kubectl get pods -A
NAMESPACE NAME READY STATUS RESTARTS AGE
calico-apiserver calico-apiserver-67b7856948-bg2wh 1/1 Running 0 12s
calico-apiserver calico-apiserver-67b7856948-fz64n 1/1 Running 0 12s
calico-system calico-kube-controllers-78687bb75f-z2r7m 1/1 Running 0 41s
calico-system calico-node-l6nmw 1/1 Running 0 41s
calico-system calico-typha-b46ff96f6-qqzxb 1/1 Running 0 41s
calico-system csi-node-driver-lv2g2 2/2 Running 0 21s
kube-system coredns-78fcd69978-57r7x 1/1 Running 0 47s
kube-system coredns-78fcd69978-psjcs 1/1 Running 0 46s
kube-system etcd-vm-12-12-centos 1/1 Running 0 60s
kube-system kube-apiserver-vm-12-12-centos 1/1 Running 0 61s
kube-system kube-controller-manager-vm-12-12-centos 1/1 Running 0 62s
kube-system kube-proxy-x8nhg 1/1 Running 0 47s
kube-system kube-scheduler-vm-12-12-centos 1/1 Running 0 60s
tigera-operator tigera-operator-6f669b6c4f-t8t9h 1/1 Running 0 46s
- 由於是單機版,需要去除汙點才能使用,執行以下命令
kubectl taint nodes --all node-role.kubernetes.io/master-
k8s安裝(使用離線的映象和檔案)
- 如果您透過上面一段的操作順利裝好k8s,那麼這一段內容可以直接跳過
- 我用的是騰訊雲輕應用伺服器,在安裝過程中發現下載sealos的檔案非常慢,於是使用了以下方法來提升安裝速度,如果您遇到了同樣問題也可以參考這種方法
- 為了簡單省事兒,本次打算使用sealos安裝K8S單機版,底層容器是docker
- 在CSDN下載四個檔案,它們的下載地址如下,下載後存放在CentOS伺服器上的同一個目錄下(不要積分,免費下載):
- https://download.csdn.net/download/boling_cavalry/86908222
- https://download.csdn.net/download/boling_cavalry/86908229
- https://download.csdn.net/download/boling_cavalry/86908433
- https://download.csdn.net/download/boling_cavalry/86908647
- 確認一下,四個檔名依次是:sealos_4.1.3_linux_amd64.tar.gz、helm.tar、calico.tar、kubernetes.tar
- ssh進入上述四個檔案的存放目錄
- 首先是操作sealos_4.1.3_linux_amd64.tar.gz檔案
tar zxvf sealos_4.1.3_linux_amd64.tar.gz sealos && chmod +x sealos && mv sealos /usr/bin
- 再用sealos工具載入其他三個檔案
sealos load -i kubernetes.tar
sealos load -i helm.tar
sealos load -i calico.tar
- 此時,再執行以下命令安裝k8s
sealos run labring/kubernetes-docker:v1.22.8-4.1.3 labring/helm:v3.8.2 labring/calico:v3.24.1 --single
- 等待三分鐘左右,K8S單機版安裝完成,控制檯輸出如下
- 檢視系統pod,一切正常
[root@VM-12-12-centos k8s]# kubectl get pods -A
NAMESPACE NAME READY STATUS RESTARTS AGE
calico-apiserver calico-apiserver-67b7856948-bg2wh 1/1 Running 0 12s
calico-apiserver calico-apiserver-67b7856948-fz64n 1/1 Running 0 12s
calico-system calico-kube-controllers-78687bb75f-z2r7m 1/1 Running 0 41s
calico-system calico-node-l6nmw 1/1 Running 0 41s
calico-system calico-typha-b46ff96f6-qqzxb 1/1 Running 0 41s
calico-system csi-node-driver-lv2g2 2/2 Running 0 21s
kube-system coredns-78fcd69978-57r7x 1/1 Running 0 47s
kube-system coredns-78fcd69978-psjcs 1/1 Running 0 46s
kube-system etcd-vm-12-12-centos 1/1 Running 0 60s
kube-system kube-apiserver-vm-12-12-centos 1/1 Running 0 61s
kube-system kube-controller-manager-vm-12-12-centos 1/1 Running 0 62s
kube-system kube-proxy-x8nhg 1/1 Running 0 47s
kube-system kube-scheduler-vm-12-12-centos 1/1 Running 0 60s
tigera-operator tigera-operator-6f669b6c4f-t8t9h 1/1 Running 0 46s
- 由於是單機版,需要去除汙點才能使用,執行以下命令
kubectl taint nodes --all node-role.kubernetes.io/master-
安裝本地pv
- 本地pv的作用是給所有pvc提供儲存空間
- 實測發現,安裝本地pv的過程中,有兩個映象經常會拉取失敗,建議您先下載tar到伺服器,在伺服器上透過docker load命令載入後再部署本地pv
- 請在CSDN下載兩個映象的tar檔案,地址如下(不要積分,免費下載)
- https://download.csdn.net/download/boling_cavalry/86908763 (下載後是個zip,解壓後,資料夾裡面才是真正的tar)
- https://download.csdn.net/download/boling_cavalry/86908874 (下載後是個zip,解壓後,資料夾裡面才是真正的tar)
- 上述檔案上傳到CentOS,執行以下命令載入兩個映象
docker load < busybox.tar
docker load < local-pv.tar
- 下載本地pv的配置檔案,地址是:https://raw.githubusercontent.com/rancher/local-path-provisioner/v0.0.22/deploy/local-path-storage.yaml
- 然後開啟此檔案,做以下四步操作
- 第一,如下圖,刪除debug哪一行
- 第二,找到reclaimPolicy,將其值從Delete改為Retain
- 第三,增加下面這句,使當前storageclass成為預設的storageclass
- 第四,修改下圖紅色箭頭位置,指向您自己電腦為pv準備的位置
- 設定完畢後,執行命令kubectl apply -f local-path-storage.yaml即可完成本地pv的建立
- 如下圖紅色箭頭,新增的pv的pod
- 此時,k8s環境中的pvc,都可以使用storageClass=local-path來使用本地磁碟了
安裝Prometheus+Grafana(下載配置檔案)
- 接下來會用operator的方式部署Prometheus+Grafana,這是一種非常簡單使用的方法
- 有幾個映象下載會超時,因此改為下載國內映象,然後用tag命令改為同名映象即可,命令如下:
docker pull docker.io/willdockerhub/prometheus-adapter:v0.9.1
docker tag docker.io/willdockerhub/prometheus-adapter:v0.9.1 k8s.gcr.io/prometheus-adapter/prometheus-adapter:v0.9.1
docker pull bolingcavalry/kube-state-metrics:v2.3.0
docker tag bolingcavalry/kube-state-metrics:v2.3.0 k8s.gcr.io/kube-state-metrics/kube-state-metrics:v2.3.0
- 現在要下載operator的配置檔案了, 開啟Prometheus operator的GitHub主頁,首先確認自己的kubernetes版本應該使用哪個版本的Prometheus operator,如下圖,我這裡的kubernetes是1.22版本,因此使用的operator應該是release-0.9或者release-0.10
- 在operator的release頁面,找到release-0.10版本點選下載
安裝Prometheus+Grafana(修改配置檔案:對外暴露服務)
-
接下來對下載的配置檔案做些修改
-
首先是修改Grafana的service檔案,因為預設的service是ClusterIP型別,無法從kubernetes外部訪問的,這裡改成叢集外也可以訪問service,開啟檔案kube-prometheus-0.10.0/manifests/grafana-service.yaml,新增箭頭所指的兩行,注意31330埠是我隨便找的一個可用埠,您也可以隨意,在30000-32767之間即可
-
如果想透過外部訪問prometheus,可以用上述同樣的方法修改prometheus-service.yaml檔案
-
另外,如果您像我一樣是將服務部署在雲上(我這裡是騰訊雲),就涉及到公網IP的使用,請查詢檔案grafana-networkPolicy.yaml,如果有就刪除(0.10.0-release版本沒有這個檔案),如果不刪除,就無發透過公網IP訪問grafana
-
對於prometheus也是一樣,如果想從公網IP訪問prometheus,需要刪除檔案prometheus-networkPolicy.yaml
安裝Prometheus+Grafana(配置外部儲存)
- 解決了外部訪問的問題,接下來是儲存問題了,如果不將Prometheus和grafana的資料儲存在容器外部的話,只要pod被刪,資料就丟失了,這在很多場景下是不可接受的
- 既然前面我們們已經準備好了pv,那麼這裡就可以把prometheus和grafana的儲存改為pvc,讓它們的資料儲存在pv上
- 首先修改prometheus的儲存配置,開啟檔案prometheus-prometheus.yaml,如下圖,紅框內是新增內容(稍後我會把文字貼出來便於複製)
- 上圖紅框中的內容如下
storage:
volumeClaimTemplate:
spec:
storageClassName: local-path
resources:
requests:
storage: 10Gi
- 接著是grafana的儲存,進入目錄kube-prometheus-0.10.0/manifests/setup,新增名為grafana-pvc.yaml的檔案,內容如下:
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: grafana
namespace: monitoring
spec:
storageClassName: local-path
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
- 然後還要修改deployment配置,開啟檔案grafana-deployment.yaml,找到下圖紅色箭頭所指內容
- 替換成下圖紅框中的內容
安裝Prometheus+Grafana(資料採集許可權)
- 需要給足prometheus許可權,這樣它才能採集到用於展示的資料,開啟檔案prometheus-clusterRole.yaml,新增一些許可權配置,修改完畢後的完整內容如下所示,新增的位置主要在resources和varbs兩處
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
labels:
app.kubernetes.io/component: prometheus
app.kubernetes.io/instance: k8s
app.kubernetes.io/name: prometheus
app.kubernetes.io/part-of: kube-prometheus
app.kubernetes.io/version: 2.32.1
name: prometheus-k8s
namespace: monitoring
rules:
- apiGroups:
- ""
resources:
- nodes/metrics
- services
- endpoints
- pods
verbs:
- get
- list
- watch
- nonResourceURLs:
- /metrics
verbs:
- get
- 再執行以下操作,給prometheus增加管理員身份(可酌情選擇)
kubectl create clusterrolebinding kube-state-metrics-admin-binding \
--clusterrole=cluster-admin \
--user=system:serviceaccount:monitoring:kube-state-metrics
- 至此,配置已經修改完成,可以啟動了
安裝Prometheus+Grafana(安裝和啟動)
- 啟動過程分為兩步:先安裝再啟動
- 首先,回到prometheus/kube-prometheus-0.10.0目錄,執行以下命令開始安裝
kubectl apply --server-side -f manifests/setup
- 可能會遇到以下提示,我這邊放心起見重複執行了一次安裝命令,就沒有此錯誤了
Error from server (NotFound): namespaces "monitoring" not found
- 接下來可以啟動了,執行以下命令
kubectl apply -f manifests/
- 檢視pod情況,如下圖,大部分pod建立得很快,也有一兩個稍微慢一點的,實測兩三分鐘可以全部ready
- 再去看看資料卷使用情況,如下圖,已經分配好三個了
- 最後,如果您用的是雲伺服器,記得在公網放開埠,我這邊是騰訊雲伺服器,放開方式如下圖
訪問grafana
- 現在可以訪問grafana了,輸入IP:埠,會提示輸入賬號密碼,預設的賬號密碼都是admin
- 登入成功後會提示修改初始密碼,按照提示操作即可
- 然後就進入grafana頁面了,裡面已經內建了很多監控資料,這裡挑一個物理伺服器資訊的監控資料看看,如下圖
- 再去看看給pv使用的伺服器磁碟,如下所示,已經建立了三個資料夾,都是容器在用的
[root@VM-12-12-centos local-path-provisioner]# pwd
/opt/local-path-provisioner
[root@VM-12-12-centos local-path-provisioner]# ls -al
total 20
drwxr-xr-x 5 root root 4096 Nov 5 10:02 .
drwxr-xr-x. 7 root root 4096 Oct 31 08:29 ..
drwxrwxrwx 3 root root 4096 Nov 5 10:06 pvc-0b8b93ae-944c-4433-a904-71c00d65c8ad_monitoring_prometheus-k8s-db-prometheus-k8s-0
drwxrwxrwx 6 root root 4096 Nov 5 10:53 pvc-9a5dccda-673f-4db8-a64e-baf4df5006cf_monitoring_grafana
drwxrwxrwx 3 root root 4096 Nov 5 10:06 pvc-bccf40a7-59a5-4472-a6a3-65f4898255d6_monitoring_prometheus-k8s-db-prometheus-k8s-1
-
至此,k8s+pv+prometheus+grafana環境已經搭建完成,這樣的環境離生產環境還差得遠,但是作為日常開發和測試已經基本合格,如果您對雲原生感興趣,想要簡單快速的從零開始搭建一套環境用於學習和研發,希望本文能給您提供一些參考
-
編寫本文時,有些操作步驟參考了這位大佬的,在此表示感謝:http://www.javajun.net/posts/5019/index.html