前情提要
可视化操作面板对于开发、运维绝对是提升工作效率的一大利器,因此很有必要搭建一套可视化操作来管理Kubernetes。

可视化面板有多种:

1.Kubernetes官方提供的默认面板:dashboard,用处不大,放弃;
2.Kuboard 也很不错, 集群要求不高,可通过访问https://kuboard.cn/support/作进一步了解;3.Kubesphere 集成了很多套件, 集群要求较高,可通过访问https://kubesphere.io/作进一步了解。

本文主要围绕KubeSphere进行讲解。

简介

KubeSphere 是一款面向云原生设计的开源项目, 在目前主流容器调度平台 Kubernetes 之上构建的分布式多租户容器管理平台, 提供简单易用的操作界面以及向导式操作方式, 在降低用户使用容器调度平台学习成本的同时, 极大降低开发、 测试、 运维的日常工作的复杂度。

安装前置环境
主要是安装helm,tiller和openebs,这个在上一篇中已完成。

然后是最小化安装 kubesphere,本文要介绍的。

须确保集群可用的资源符合 CPU > 1 Core, 可用内存 > 2 G

下面具体的搭建的过程

搭建过程

1.创建一个kubesphere-mini.yaml文件
并写入下面的内容 :


apiVersion: v1
kind: Namespace
metadata:
name: kubesphere-system


apiVersion: v1
data:
ks-config.yaml: |

---
persistence:
  storageClass: ""
etcd:
  monitoring: False
  endpointIps: 192.168.0.7,192.168.0.8,192.168.0.9
  port: 2379
  tlsEnable: True
common:
  mysqlVolumeSize: 20Gi
  minioVolumeSize: 20Gi
  etcdVolumeSize: 20Gi
  openldapVolumeSize: 2Gi
  redisVolumSize: 2Gi
metrics_server:
  enabled: False
console:
  enableMultiLogin: False  # enable/disable multi login
  port: 30880
monitoring:
  prometheusReplicas: 1
  prometheusMemoryRequest: 400Mi
  prometheusVolumeSize: 20Gi
  grafana:
    enabled: False
logging:
  enabled: False
  elasticsearchMasterReplicas: 1
  elasticsearchDataReplicas: 1
  logsidecarReplicas: 2
  elasticsearchMasterVolumeSize: 4Gi
  elasticsearchDataVolumeSize: 20Gi
  logMaxAge: 7
  elkPrefix: logstash
  containersLogMountedPath: ""
  kibana:
    enabled: False
openpitrix:
  enabled: False
devops:
  enabled: False
  jenkinsMemoryLim: 2Gi
  jenkinsMemoryReq: 1500Mi
  jenkinsVolumeSize: 8Gi
  jenkinsJavaOpts_Xms: 512m
  jenkinsJavaOpts_Xmx: 512m
  jenkinsJavaOpts_MaxRAM: 2g
  sonarqube:
    enabled: False
    postgresqlVolumeSize: 8Gi
servicemesh:
  enabled: False
notification:
  enabled: False
alerting:
  enabled: False

kind: ConfigMap
metadata:
name: ks-installer
namespace: kubesphere-system


apiVersion: v1
kind: ServiceAccount
metadata:
name: ks-installer
namespace: kubesphere-system


apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
creationTimestamp: null
name: ks-installer
rules:

  • apiGroups:

    • ""
      resources:
    • '*'
      verbs:
    • '*'
  • apiGroups:

    • apps
      resources:
    • '*'
      verbs:
    • '*'
  • apiGroups:

    • extensions
      resources:
    • '*'
      verbs:
    • '*'
  • apiGroups:

    • batch
      resources:
    • '*'
      verbs:
    • '*'
  • apiGroups:

    • rbac.authorization.k8s.io
      resources:
    • '*'
      verbs:
    • '*'
  • apiGroups:

    • apiregistration.k8s.io
      resources:
    • '*'
      verbs:
    • '*'
  • apiGroups:

    • apiextensions.k8s.io
      resources:
    • '*'
      verbs:
    • '*'
  • apiGroups:

    • tenant.kubesphere.io
      resources:
    • '*'
      verbs:
    • '*'
  • apiGroups:

    • certificates.k8s.io
      resources:
    • '*'
      verbs:
    • '*'
  • apiGroups:

    • devops.kubesphere.io
      resources:
    • '*'
      verbs:
    • '*'
  • apiGroups:

    • monitoring.coreos.com
      resources:
    • '*'
      verbs:
    • '*'
  • apiGroups:

    • logging.kubesphere.io
      resources:
    • '*'
      verbs:
    • '*'
  • apiGroups:

    • jaegertracing.io
      resources:
    • '*'
      verbs:
    • '*'
  • apiGroups:

    • storage.k8s.io
      resources:
    • '*'
      verbs:
    • '*'
  • apiGroups:

    • admissionregistration.k8s.io
      resources:
    • '*'
      verbs:
    • '*'

kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: ks-installer
subjects:

  • kind: ServiceAccount
    name: ks-installer
    namespace: kubesphere-system
    roleRef:
    kind: ClusterRole
    name: ks-installer
    apiGroup: rbac.authorization.k8s.io

apiVersion: apps/v1
kind: Deployment
metadata:
name: ks-installer
namespace: kubesphere-system
labels:

app: ks-install

spec:
replicas: 1
selector:

matchLabels:
  app: ks-install

template:

metadata:
  labels:
    app: ks-install
spec:
  serviceAccountName: ks-installer
  containers:
  - name: installer
    image: kubesphere/ks-installer:v2.1.1
    imagePullPolicy: "Always"

2.执行apply命令

KubeSphere 最小化安装:

kubectl apply -f kubesphere-mini.yaml
3.检查kubesphere pod启动运行情况
执行下面的命令,观察kubesphere相关pods启动情况,确保所有的都处于Running状态

kubectl get pods --all-namespaces

如果哪个pod失败,使用下面的命令找出失败的原因

pod替换为失败的pod名,n后面的参数换成对应的命名空间

kubectl describe pod default-http-backend-5d464dd566-wtr98 -n kubesphere-controls-system
如果失败的原因是ImagePullBackOff,可以使用这个命令,找到需要的镜像

pod和n 后面的参数替换为失败的pod名和对应的命名空间

kubectl describe pod node-exporter-kjs4p -n kubesphere-monitoring-system | grep -A5 "Containers"
像上图中出现一个pod:default-http-backend镜像拉取失败,最后试了这个才拉取到本地

registry.cn-beijing.aliyuncs.com/kubesphereio/defaultbackend-amd64:1.4

拉取到以后需要打标签,伪装成mirrorgooglecontainers/defaultbackend-amd64:1.4

拉取和打标签通过下面的命令来实现:

拉镜像

docker pull registry.cn-beijing.aliyuncs.com/kubesphereio/defaultbackend-amd64:1.4

打标签

docker tag registry.cn-beijing.aliyuncs.com/kubesphereio/defaultbackend-amd64:1.4 mirrorgooglecontainers/defaultbackend-amd64:1.4

然后删除失败的pod进行重建,注意替换pod后面的参数自己的Pod名,n后面的参数为自己的命名空间

kubectl delete pod default-http-backend-5d464dd566-z2bt2 -n kubesphere-controls-system

删除后重建如果还是失败上面提到的命令再次查看原因,注意查看输出的原因分析的Event部分

Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled <unknown> default-scheduler Successfully assigned kubesphere-controls-system/default-http-backend-5d464dd566-9dqlz to k8s-node2
Warning Failed 74s (x2 over 3m38s) kubelet, k8s-node2 Failed to pull image "mirrorgooglecontainers/defaultbackend-amd64:1.4": rpc error: code = Unknown desc = Error response from daemon: Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)
Warning Failed 74s (x2 over 3m38s) kubelet, k8s-node2 Error: ErrImagePull
Normal BackOff 59s (x2 over 3m37s) kubelet, k8s-node2 Back-off pulling image "mirrorgooglecontainers/defaultbackend-amd64:1.4"
Warning Failed 59s (x2 over 3m37s) kubelet, k8s-node2 Error: ImagePullBackOff
Normal Pulling 47s (x3 over 6m4s) kubelet, k8s-node2 Pulling image "mirrorgooglecontainers/defaultbackend-amd64:1.4"

从上面输出可以看出

Pod 被调度到了 node2,但 node2 去拉镜像时失败了(因为网络问题,连不上 Docker Hub)。

问题本质

只在 k8s-node1 上 docker pull 和 docker tag 了镜像,
但是 k8s-node2 也要这个镜像,它自己本地没有,所以还会去拉。
Kubernetes 不会自动把 node1 的镜像复制给 node2

因此需要在k8s-node2上执行下面的命令

拉镜像

docker pull registry.cn-beijing.aliyuncs.com/kubesphereio/defaultbackend-amd64:1.4

打标签

docker tag registry.cn-beijing.aliyuncs.com/kubesphereio/defaultbackend-amd64:1.4 mirrorgooglecontainers/defaultbackend-amd64:1.4

验证本地是否有相关镜像

docker images | grep defaultbackend

输出下图的提示才正常

[root@k8s-node2 ~]# docker images | grep defaultbackend
mirrorgooglecontainers/defaultbackend-amd64 1.4 846921f0fe0e 7 years ago 4.84MB
registry.cn-beijing.aliyuncs.com/kubesphereio/defaultbackend-amd64 1.4 846921f0fe0e 7 years ago 4.84MB

如果本地有镜像但还是ImagePullBackOff,需要使用下面的命令指定imagePullPolicy: IfNotPresent

kubectl -n kubesphere-controls-system patch deployment default-http-backend -p '{"spec":{"template":{"spec":{"containers":[{"name":"default-http-backend","imagePullPolicy":"IfNotPresent"}]}}}}'

经过上面的处理,再次查看kubesphere所有pod的状态,全部变为Running状态了

还可以使用下面的命令查看安装日志,整个过程所需时间跟网络紧密相关, 请耐心等待安装成功:

kubectl logs -n kubesphere-system $(kubectl get pod -n kubesphere-system -l app=ks-install -o jsonpath='{.items[0].metadata.name}') -f
当所有kubesphere pod都处于Running状态时,就可以使用浏览器访问kubesphere了,kubeSphere v2.x默认的账号为admin,密码为P@88w0rd,因此使用这个它们即可登录


小刘要努力
0 声望0 粉丝