Win10 docker desktop Kubernetes v1.19.7部署Zabbix

mi_zy發表於2021-03-14


1、github下載kubernetes.yaml (Zabbix 5.2 release prepare),直接建立資源,有報錯:

$ kubectl create -f zabbix.yaml

namespace/zabbix created

service/mysql-server created

service/zabbix-proxy-sqlite3 created

service/zabbix-proxy-mysql created

service/zabbix-java-gateway created

service/zabbix-agent created

replicationcontroller/zabbix-web created

replicationcontroller/mysql-server created

replicationcontroller/zabbix-server created

replicationcontroller/zabbix-proxy-sqlite3 created

replicationcontroller/zabbix-proxy-mysql created

replicationcontroller/zabbix-java-gateway created

daemonset.apps/zabbix-agent created

horizontalpodautoscaler.autoscaling/zabbix-web created

persistentvolume/zabbix-mysql-data created

persistentvolumeclaim/zabbix-mysql-data-claim created

secret/db-secret created

Error from server (Invalid): error when creating "zabbix.yaml": Service "zabbix-web" is invalid: spec.externalIPs[0]: Invalid value: "<Specify external IP here>": must be a valid IP address, (e.g. 10.9.8.7)

Error from server (Invalid): error when creating "zabbix.yaml": Service "zabbix-server" is invalid: spec.externalIPs[0]: Invalid value: "<Specify external IP here>": must be a valid IP address, (e.g. 10.9.8.7)


$ kubectl get pod,service

NAME                             READY   STATUS    RESTARTS   AGE

pod/mysql-server-8hnv2           0/1      Pending   0          2m17s

pod/zabbix-agent-9cg2f           1/1     Running   0          2m17s

pod/zabbix-java-gateway-5tfkj    1/1     Running   0          2m17s

pod/zabbix-proxy-mysql-pxfrg     1/1     Running   0          2m17s

pod/zabbix-proxy-sqlite3-vqltl   1/1     Running   0          2m17s

pod/zabbix-server-6lfzq          1/2     Running   0          2m17s

pod/zabbix-web-pcgdg             0/1     Running   1          2m17s

pod/zabbix-web-qdqwg             0/1     Running   0          2m17s

NAME                           TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)             AGE

service/mysql-server            ClusterIP   10.103.160.211   <none>        3306/TCP            2m17s

service/zabbix-agent           ClusterIP   10.99.68.135     <none>        10050/TCP           2m17s

service/zabbix-java-gateway    ClusterIP   10.98.194.191    <none>        10052/TCP           2m17s

service/zabbix-proxy-mysql     ClusterIP   10.103.8.208     <none>        10051/TCP,162/UDP   2m17s

service/zabbix-proxy-sqlite3    ClusterIP   10.109.172.46    <none>        10051/TCP,162/UDP   2m17s

這裡services "zabbix-web" 和 "zabbix-server"not found


$ kubectl describe pod mysql-server-8hnv2

......

Events:

  Type     Reason            Age   From               Message

  ----     ------            ----  ----               -------

  Warning  FailedScheduling  4m6s  default-scheduler  persistentvolumeclaim "zabbix-mysql-data-claim" not found

  Warning  FailedScheduling  4m6s  default-scheduler  persistentvolumeclaim "zabbix-mysql-data-claim" not found

  Warning  FailedScheduling  4m4s  default-scheduler  0/1 nodes are available: 1 pod has unbound immediate PersistentVolumeClaims.


2、排查一:修改  kubernetes.yaml 

1)將Service資源物件zabbix-web和mysql-server的預設type:ClusterIP( 叢集內的私有ip)修改為type: NodePort( 在node 埠暴露服務,將向該埠的流量匯入到kube-proxy,然後由kube-proxy進一步導給對應的pod),否則Win10主機無法訪問。

2)註釋掉externalIPs相關項: 在Service的Spec中, 當把IP地址填入 externalIPs欄位後, kube-proxy 會增加對應的 iptables 規則, 當有以對應IP為目標的流量傳送到Node節點時, iptables 將進行NAT,將流量轉發到對應的服務上, 可以實現給Service繫結外部IP的效果

3) 註釋掉 ReplicationController資源物件 mysql-server的volumes:和volumeMounts:相關項,解決該Pod/mysql-server 狀態Pending的問題。

4)為了能登入mysql,修改List/Secret資源物件db-secret的db-root-pass、db-zbx-user、db-zbx-pass密碼為"emFiYml4",即zabbix(由命令得到:echo -n 'zabbix' | base64)


3、完成以上步驟,pod/mysql-server恢復running,但是pod/zabbix-server出現 CrashLoopBackOff狀態

$ kubectl get pod,service

NAME                             READY   STATUS             RESTARTS   AGE

pod/mysql-server-xvtbn           1/1      Running            0          2m42s

pod/zabbix-agent-7dks2           1/1     Running            0          2m42s

pod/zabbix-java-gateway-bmn46    1/1     Running            0          2m42s

pod/zabbix-proxy-mysql-47wh6     1/1     Running            0          2m42s

pod/zabbix-proxy-sqlite3-qsxcb   1/1     Running            0          2m42s

pod/zabbix-server-sj584          1/2     CrashLoopBackOff   3          2m42s

pod/zabbix-web-8rbmc             1/1     Running            0          2m42s

pod/zabbix-web-9znhb             1/1     Running            0          2m42s

NAME                           TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)                      AGE

service/mysql-server           NodePort    10.110.160.252   <none>        3306: 32130/TCP               2m42s

service/zabbix-agent           ClusterIP   10.111.34.4      <none>        10050/TCP                    2m42s

service/zabbix-java-gateway    ClusterIP   10.99.175.58     <none>        10052/TCP                    2m42s

service/zabbix-proxy-mysql     ClusterIP   10.101.232.209   <none>        10051/TCP,162/UDP            2m42s

service/zabbix-proxy-sqlite3   ClusterIP   10.105.63.0      <none>        10051/TCP,162/UDP            2m42s

service/zabbix-server          ClusterIP   10.108.177.103   <none>        10051/TCP,162/UDP            2m42s

service/zabbix-web             NodePort    10.99.166.170    <none>        80: 31153/TCP,443:32148/TCP   2m42s

而且瀏覽器localhost: 31153,出現Database error不能選擇配置檔案報錯。


4、 排查二

    $ kubectl logs  zabbix-server-sj584  -c zabbix-server

     ......

     8:20210314:123345.722 cannot use database "zabbix": its "users" table is empty (is this the Zabbix proxy database?)

    $mysql -uzabbix -pzabbix -h 127.0.0.1 -P 32130 zabbix

        mysql> use zabbix

                    Database changed

        mysql> select *from users;

                    Empty set (0.02 sec)

判斷原因是雖然mysql中建立了表結構,但是沒有資料。下載原始碼包zabbix-5.2.5.tar.gz,在zabbix-5.2.5.tar.gz\zabbix-5.2.5\database\mysql解壓出data.sql,匯入zabbix資料庫中:

    $ mysql -uzabbix -pzabbix -h 127.0.0.1 -P 32130 zabbix  < data.sql

        mysql: [Warning] Using a password on the command line interface can be insecure.

檢查 pod/zabbix-server-sj584狀態恢復running, 瀏覽器localhost: 31153出現正常登入介面(Admin/zabbix)。


5、後續需解決資料庫持久化儲存的問題

    在Kubernetes Pod中的容器系統儲存檔案是臨時的,Pod如果異常重啟將會恢復到映象的原始狀態從而會丟失所有的狀態包括系統儲存檔案,或者同一個Pod中多個容器需要共享資料。資料卷誕生就是為了解決這一類資料持久化及資料共享的場景,並與容器的生命週期分離開。

PV(PersistentVolume): PV是定義儲存資料的方式,例如儲存類、儲存實現等,是由叢集管理員定義的叢集資源中的物件。

PVC (PersistentVolumeClaim): 是宣告定義儲存資料使用的請求,被掛載到Pod中進行使用。通常由開發人員進行配置使用,不用關心資料儲存底層具體的實現方式,只關心與業務相關的資料儲存大小,訪問方式等。

PV與PVC是一對一關係,一個PVC只能繫結到一個PV,如果PV被繫結後,其他PVC則無法在使用此PV。

$ kubectl get pv -o wide

NAME                CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   REASON   AGE

   VOLUMEMODE

zabbix-mysql-data   1Gi        RWO            Retain            Available                                   33m   Filesystem

Retain(保留) 當PVC與PV解除繫結關係後PV處於保留狀態,如果有同樣宣告的PVC時PV將繼續可以被繫結使用,期間資料不會被刪除。

ReadWriteOnce(RWO)允許被單個節點以讀寫的模式進行掛載。 ReadWriteMany(RWX)允許被多個節點以讀寫的模式進行掛載。

PV Phase 執行狀態:Available PV處於可用狀態,可以被PVC繫結。

                                Bound PV已被PVC所繫結。

                                Released PVC已刪除,但PV還未被叢集回收。 Failed PV自動回收失敗。

$ kubectl describe pv      // 檢視PV詳細資訊

檢視PVC詳細資訊

$ kubectl describe pvc

Name:          zabbix-mysql-data-claim

Namespace:     zabbix

StorageClass:  hostpath

Status:        Pending

Volume:        zabbix-mysql-data

Labels:        <none>

Annotations:   <none>

Finalizers:    [kubernetes.io/pvc-protection]

Capacity:      0

Access Modes:

VolumeMode:    Filesystem

Mounted By:    <none>

Events:

  Type     Reason          Age                   From                         Message

  ----     ------          ----                  ----                         -------

  Warning  VolumeMismatch  2m49s (x44 over 42m)  persistentvolume-controller  Cannot bind to requested volume "zabbix-mysql-data": storageClassName does not match



來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/7970627/viewspace-2762773/,如需轉載,請註明出處,否則將追究法律責任。

相關文章