KubeSphere 是在 Kubernetes 之上構建的開源的企業級容器平台,提供簡單易用的操作界面以及向導式操作方式,在降低用戶使用容器調度平台學習成本的同時,極大減輕開發、測試、運維的日常工作的復雜度,旨在解決 Kubernetes 本身存在的存儲、網絡、安全和易用性等痛點。 |
除此之外,平台已經整合並優化了多個適用於容器場景的功能模塊,以完整的解決方案幫助企業輕松應對敏捷開發與自動化運維、微服務治理、多租戶管理、工作負載和集群管理、服務與網絡管理、應用編排與管理、鏡像倉庫管理和存儲管理等業務場景。
KubeSphere 源代碼和安裝使用文檔已在 GitHub 上開放,歡迎關注:https://github.com/kubesphere/kubesphere
KubeSphere 一開始就推出了開源的社區版本,只是之前提供的安裝方式比較單一,在已有的 Kubernetes 集群上要想安裝相對較麻煩,本文將為你演示如何在已有的 Kubernetes 集群上安裝 KubeSphere。
本文安裝 KubeSphere 使用到的相關環境及工具如下:
使用 kubeadm 搭建的 Kubernetes 1.15.2 版本集群
Helm v2.14.1 版本
使用 NFS 作為集群存儲后端
使用到的安裝腳本地址:https://github.com/kubesphere/ks-installer
首先需要確保集群中有一個默認的 StorageClass 資源對象,關於 StorageClass 的使用可以查看前面的文章介紹:
apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: dynamic-data annotations: storageclass.kubernetes.io/is-default-class: "true" provisioner: fuseim.pri/ifs
其中 annotations 下面的 storageclass.kubernetes.io/is-default-class: “true” 是必須的:
$ kubectl get sc NAME PROVISIONER AGE dynamic-data (default) fuseim.pri/ifs 4h41m
首先將上面安裝倉庫 Clone 到 Kubernetes 集群中的 master 節點上,因為我們需要使用到 master 節點上的一些證書文件。
1.首先,在集群中創建名為 kubesphere-system 和 kubesphere-monitoring-system 的namespace:
$ cat EOF | kubectl create -f - --- apiVersion: v1 kind: Namespace metadata: name: kubesphere-system --- apiVersion: v1 kind: Namespace metadata: name: kubesphere-monitoring-system EOF
2.創建集群ca證書secret
注:按照當前集群 ca.crt 和 ca.key 證書路徑創建(kubeadm 創建集群的證書路徑一般為/etc/kubernetes/pki)
$ kubectl -n kubesphere-system create secret generic kubesphere-ca \ --from-file=ca.crt=/etc/kubernetes/pki/ca.crt \ --from-file=ca.key=/etc/kubernetes/pki/ca.key
3.創建etcd證書secret
注:以集群實際 etcd 證書位置創建;若 etcd 沒有配置證書,則創建空secret
$ kubectl -n kubesphere-monitoring-system create secret generic kube-etcd-client-certs \ --from-file=etcd-client-ca.crt=/etc/kubernetes/pki/etcd/ca.crt \ --from-file=etcd-client.crt=/etc/kubernetes/pki/etcd/healthcheck-client.crt \ --from-file=etcd-client.key=/etc/kubernetes/pki/etcd/healthcheck-client.key
由於我這里使用的是 kubeadm 搭建的集群,所以我們可以查看 etcd 的資源清單文件:
$ cat /etc/kubernetes/manifests/etcd.yaml ...... livenessProbe: exec: command: - /bin/sh - -ec - ETCDCTL_API=3 etcdctl --endpoints=https://[127.0.0.1]:2379 --cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/etcd/healthcheck-client.crt --key=/etc/kubernetes/pki/etcd/healthcheck-client.key get foo ......
從這里我們就可以獲得 etcd 集群相關的證書。
4.修改部署文件 由於 KubeSphere 部署過程中涉及到的組件非常多,所以安裝過程中難免會有一些奇奇怪怪的問題,下面是我在安裝過程中遇到的一些問題:
問題1:openldap 這個組件啟動報錯,因為 ks-account 組件又是依賴 openldap 這個組件的,所以同樣啟動報錯,在安裝過程中 openldap 出現了類似如下錯誤信息。
...... rm: cannot remove ‘/container/service/slapd/assets/config/bootstrap/ldif/readonly-user’: Directory not empty rm: cannot remove ‘/container/service/slapd/assets/config/bootstrap/schema/mmc’: Directory not empty rm: cannot remove ‘/container/service/slapd/assets/config/replication’: Directory not empty rm: cannot remove ‘/container/service/slapd/assets/config/tls’: Directory not empty *** /container/run/startup/slapd failed with status 1
解決方法:修改配置文件roles/ks-core/prepare/templates/ks-account-init.yaml.j2文件,在 openldap 這個 Deployment 下面容器中添加啟動參數--copy-service
...... image: {{ openldap_repo }}:{{ openldap_tag }} imagePullPolicy: IfNotPresent args: # 添加該啟動參數 - --copy-service name: openldap ......
問題2:如果現有集群中已經安裝有 metrics_server,需要在配置文件中將 metrics_server_enable 設置為 False
問題3:在安裝過程中卡死在Waitting for ks-sonarqube port to become open部分,節點上通過 NodePort 已經可以正常訪問 sonarqube ,該問題沒有解決,由於是一個不影響全局安裝的一個操作,所以同樣在配置文件中將 sonarqube_enable 設置為 False
問題4:在安裝過程中 istio 安裝不上,由於我當前的集群資源不是很足,所以也臨時取消掉 istio 的安裝,后續在開啟 istio 的支持。
最終用於安裝 KubeSphere 的配置文件如下所示:(deploy/kubesphere.yaml)
--- apiVersion: v1 data: ks-config.yaml: | kube_apiserver_host: 10.151.30.11:6443 etcd_tls_enable: True etcd_endpoint_ips: 10.151.30.11 disableMultiLogin: True elk_prefix: logstash metrics_server_enable: False sonarqube_enable: False istio_enable: False kind: ConfigMap metadata: name: kubesphere-config namespace: kubesphere-system ......
只需要修改 ConfigMap 的值即可,其中 kube_apiserver_host 就是現有集群的 APIServer 地址,etcd_endpoint_ips 就是 etcd 的所在節點 IP,默認端口為 2379,如果你是集群模式 etcd,這里可以填寫多個節點 IP,中間用,隔開,下面就是不需要安裝的組件設置為 False。
到這里執行安裝命令即可:
$ kubectl apply -f deploy/kubesphere.yaml $ kubectl get pods -n kubesphere-system NAME READY STATUS RESTARTS AGE ks-account-575d4fd8f-r5476 1/1 Running 0 44m ks-apigateway-5c56f79976-jxmd4 1/1 Running 0 44m ks-apiserver-5d56bc8976-678hj 1/1 Running 0 41m ks-console-75b6cb84c-ldsn7 1/1 Running 0 42m ks-console-75b6cb84c-pzqcx 1/1 Running 0 42m ks-controller-manager-78bfd56fbf-dtcg2 1/1 Running 0 43m ks-docs-65bd89559b-58lpp 1/1 Running 0 3h16m kubesphere-installer-x7q8z 0/1 Completed 0 45m openldap-5bd67c84c6-gw8f5 1/1 Running 0 114m redis-6cf6fc98b5-nsqfn 1/1 Running 0 3h19m
在安裝過程中可能會因為拉取鏡像過慢導致安裝校驗失敗,這種情況我們可以先手動在節點上拉取鏡像,然后再重新創建一個新的用於安裝的 Job 即可。通過如下命令可以查看部署過程中的完整日志:
$ kubectl logs -n kubesphere-system $(kubectl get pod -n kubesphere-system -l job-name=kubesphere-installer -o jsonpath='{.items[0].metadata.name}') -f
如果上面用於安裝的 Job 是完成狀態的話,證明 KubeSphere 已經安裝成功了。
最后,可以創建一個 Ingress 對象來訪問 KubeSphere:(kubesphere-ingress.yaml)
$ apiVersion: extensions/v1beta1 kind: Ingress metadata: name: kubesphere namespace: kubesphere-system annotations: kubernetes.io/ingress.class: nginx spec: rules: - host: ks.qikqiak.com http: paths: - path: backend: serviceName: ks-console servicePort: 80
直接創建即可:
$ kubectl create -f kubesphere-ingress.yaml
最后做好域名解析,在瀏覽器中就可以訪問了:
默認的登錄信息為:
用戶名:admin 密碼:P@88w0rd
KubeSphere 還在持續迭代和快速發展,歡迎大家在 GitHub 關注和下載體驗。