容器云平台KubeSphere:安装KubeSphere

白话

这里的安装方式是以kubesphere v2.1 版本安装主要结合官方文档安装指南,和自己一些亲身经验所及,你也可以直接用官方的安装方式。这个安装方式是在已有的Kubenetes集群上安装。

结合官方https://kubesphere.com.cn/docs/v2.0/zh-CN/installation/install-on-k8s/

安装

1.Kubernetes版本要求为 1.13.0 ≤ K8s Version < 1.16,KubeSphere 依赖 Kubernetes 1.13.0版本之后的新特性,可以在执行 kubectl version来确认 :

$ kubectl version | grep Server
Server Version: version.Info{Major:"1", Minor:"13", GitVersion:"v1.13.5", GitCommit:"2166946f41b36dea2c4626f90a77706f426cdea2", GitTreeState:"clean", BuildDate:"2019-03-25T15:19:22Z", GoVersion:"go1.11.5", Compiler:"gc", Platform:"linux/amd64"}

说明:注意输出结果中的 Server Version这行,如果显示 GitVersion大于 v1.13.0,Kubernetes 的版本是可以安装的。如果低于 v1.13.0,可以查看 Upgrading kubeadm clusters from v1.12 to v1.13 先升级下 K8s 版本。

  1. 确认已安装 Helm,并且 Helm的版本至少为 2.10.0。在终端执行 helm version,得到类似下面的输出
$ helm version
Client: &version.Version{SemVer:"v2.13.1", GitCommit:"618447cbf203d147601b4b9bd7f8c37a5d39fbb4", GitTreeState:"clean"}
Server: &version.Version{SemVer:"v2.13.1", GitCommit:"618447cbf203d147601b4b9bd7f8c37a5d39fbb4", GitTreeState:"clean"}

3.集群现有的可用内存至少在 10G以上。 如果是执行的 allinone安装,那么执行 free -g可以看下可用资源

root@kubernetes:~# free -g
              total        used        free      shared  buff/cache   available
Mem:              16          4          10           0           3           2
Swap:             0           0           0
  1. (非必须) KubeSphere 非常建议配合持久化存储使用,执行 kubectl get sc看下当前是否设置了默认的 storageclass

    root@kubernetes:~$ kubectl get sc
    NAME                      PROVISIONER               AGE
    ceph                      kubernetes.io/rbd         3d4h
    csi-qingcloud (default)   disk.csi.qingcloud.com    54d
    glusterfs                 kubernetes.io/glusterfs   3d4h
    

提示:若未设置持久化存储,安装将默认使用 hostpath,该方式能顺利安装,但可能会由于 Pod 漂移带来其它问题,正式环境建议配置 StorageClass 使用持久化存储。

不满足上面几点需要从头开始安装所需要组件,如果你的集群都满足这几点直接跳到3.部署 KubeSphere安装就可以。

环境

IPHostnameCPUMemoryDisk
192.168.181.100Master-00122G40G
192.168.181.101Node-00122G40G
192.168.181.102Node-00222G40G
192.168.181.103Node-00322G40G

1. 安装Helm

下载

Helm是一个二进制文件,我们直接到github的release去下载就可以,地址如下:
https://github.com/helm/helm/releases

由于国内网络原因,无法科学上网的同学可以到我的网盘上下载,版本是2.13.1-linux-amd64。
链接: https://pan.baidu.com/s/1bu-cpjVaSVGVXuWvWoqHEw
提取码: 5wds

安装
# 解压
$ tar -zxvf helm-v2.13.1-linux-amd64.tar.gz
$ mv linux-amd64/helm /usr/local/bin/

# 没配置环境变量的需要先配置好
$ export PATH=$PATH:/usr/local/bin/

# 验证
$ helm version
Tiller安装

Tiller 是以 Deployment 方式部署在 Kubernetes 集群中的,由于 Helm 默认会去 storage.googleapis.com 拉取镜像,我们这里就默认无法科学上网的情况:

# 指向阿里云的仓库
$ helm init --client-only --stable-repo-url https://aliacs-app-catalog.oss-cn-hangzhou.aliyuncs.com/charts/
$ helm repo add incubator https://aliacs-app-catalog.oss-cn-hangzhou.aliyuncs.com/charts-incubator/
$ helm repo update

# 因为官方的镜像无法拉取,使用-i指定自己的镜像
$ helm init --service-account tiller --upgrade -i registry.cn-hangzhou.aliyuncs.com/google_containers/tiller:v2.13.1  --stable-repo-url https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts

# 创建TLS认证服务端
$ helm init --service-account tiller --upgrade -i registry.cn-hangzhou.aliyuncs.com/google_containers/tiller:v2.13.1 --tiller-tls-cert /etc/kubernetes/ssl/tiller001.pem --tiller-tls-key /etc/kubernetes/ssl/tiller001-key.pem --tls-ca-cert /etc/kubernetes/ssl/ca.pem --tiller-namespace kube-system --stable-repo-url https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts

对于 Kubernetes v1.16.0 以上的版本,有可能会碰到 Error: error installing: the server could not find the requested resource 的错误。这是由于 extensions/v1beta1 已经被 apps/v1 替代。相信在2.15 或者 3 版本发布之后, 应该就不会遇到这个问题了。

解决方法是使用如下语句安装

$ helm init -i registry.cn-hangzhou.aliyuncs.com/google_containers/tiller:v2.13.1 --stable-repo-url http://mirror.azure.cn/kubernetes/charts/ --service-account tiller --override spec.selector.matchLabels.'name'='tiller',spec.selector.matchLabels.'app'='helm' --output yaml | sed 's@apiVersion: extensions/v1beta1@apiVersion: apps/v1@' | kubectl apply -f -

给Tiller授权
# 创建serviceaccount
$ kubectl create serviceaccount --namespace kube-system tiller
# 创建角色绑定
$ kubectl create clusterrolebinding tiller-cluster-rule --clusterrole=cluster-admin --serviceaccount=kube-system:tiller
验证
# 查看Tiller的serviceaccount,需要跟我们创建的名字一致:tiller
$ kubectl get deploy --namespace kube-system tiller-deploy -o yaml|grep serviceAccount

# 验证pods
$ kubectl -n kube-system get pods|grep tiller

# 验证版本
$ helm version

2. 安装NFS

用nfs 作为存储比较简单实用

安装到node 节点或者其他机器总之不要安装到master,master节点安装后始终提示无法连接

安装
$  yum install nfs-utils rpcbind -y
配置共享文件
$ vim /etc/exports
# 粘贴进去
/home/data *(insecure,rw,async,no_root_squash) 
#保存后创建文件
$ mkdir /home/data
# 设置权限
$ chmod 777  /home/data
启动服务
#先启动rpc服务
$ systemctl start rpcbind 
#设置开机启动
$ systemctl enable rpcbind  
# 启动nfs服务
$ systemctl start nfs-server
 #设置开机启动
$ systemctl enable nfs-server
安装storageclass

storageclass.yaml

---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: nfs-provisioner
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
   name: nfs-provisioner-runner
   namespace: default
rules:
   -  apiGroups: [""]
      resources: ["persistentvolumes"]
      verbs: ["get", "list", "watch", "create", "delete"]
   -  apiGroups: [""]
      resources: ["persistentvolumeclaims"]
      verbs: ["get", "list", "watch", "update"]
   -  apiGroups: ["storage.k8s.io"]
      resources: ["storageclasses"]
      verbs: ["get", "list", "watch"]
   -  apiGroups: [""]
      resources: ["events"]
      verbs: ["watch", "create", "update", "patch"]
   -  apiGroups: [""]
      resources: ["services", "endpoints"]
      verbs: ["get","create","list", "watch","update"]
   -  apiGroups: ["extensions"]
      resources: ["podsecuritypolicies"]
      resourceNames: ["nfs-provisioner"]
      verbs: ["use"]
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: run-nfs-provisioner
subjects:
  - kind: ServiceAccount
    name: nfs-provisioner
    namespace: default
roleRef:
  kind: ClusterRole
  name: nfs-provisioner-runner
  apiGroup: rbac.authorization.k8s.io
---
kind: Deployment
apiVersion: apps/v1
metadata:
  name: nfs-client-provisioner
spec:
  selector:
    matchLabels:
      app: nfs-client-provisioner
  replicas: 1
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: nfs-client-provisioner
    spec:
      serviceAccount: nfs-provisioner
      containers:
        - name: nfs-client-provisioner
          image: quay.io/external_storage/nfs-client-provisioner:latest
          imagePullPolicy: IfNotPresent
          volumeMounts:
            - name: nfs-client
              mountPath: /persistentvolumes
          env:
            - name: PROVISIONER_NAME
              value: fuseim.pri/ifs
            - name: NFS_SERVER
              value: 此处修改为nfs服务器ip
            - name: NFS_PATH
              value: /home/data
      volumes:
        - name: nfs-client
          nfs:
            server: 此处修改为nfs服务器ip
            path: /home/data
---
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: nfs-storage
provisioner: fuseim.pri/ifs
reclaimPolicy: Retain

创建一下

$ kubectl apply -f storageclass.yaml
设置默认storageclass
$ kubectl patch storageclass nfs-storage -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'

3. 部署 KubeSphere

  1. 在 Kubernetes 集群中创建名为 kubesphere-systemkubesphere-monitoring-systemnamespace

    $ cat <<EOF | kubectl create -f -
    ---
    apiVersion: v1
    kind: Namespace
    metadata:
        name: kubesphere-system
    ---
    apiVersion: v1
    kind: Namespace
    metadata:
        name: kubesphere-monitoring-system
    EOF
    
  2. 创建 Kubernetes 集群 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 已经配置过证书,则参考如下创建:

    $ 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
    
  • 若 etcd 没有配置证书,则创建空 Secret(以下命令适用于 Kubeadm 创建的 Kubernetes 集群环境):

    $ kubectl -n kubesphere-monitoring-system create secret generic kube-etcd-client-certs
    
  1. 克隆 kubesphere-installer 仓库至本地。

    $ git clone https://github.com/kubesphere/ks-installer.git
    
  2. 进入 ks-installer,修改配置

    根据下面的参数说明列表修改

    $ cd deploy
    
    $ vim kubesphere-installer.yaml
    # 1. 修改镜像地址 这是我自己的阿里云镜像
    image: registry.cn-shenzhen.aliyuncs.com/zahngchengji/ks-installer:v2.1.0
    # 2. 保存后,拷贝同级目录的config.yaml所有配置信息到kubesphere-installer.yaml里面,可以放在最后。config.yaml的配置是配置了所有组件的开关,默认都是False,如果想开启改为True即可
    #3. 修改etcd 配置
    ---
    apiVersion: v1
    data:
      ks-config.yaml: |
        ---
        persistence:
          storageClass: "" # 默认为空“”,则使用 default StorageClass
        etcd:
          monitoring: True
          endpointIps: 192.168.181.101 # etcd地址,如etcd为集群,地址以逗号分离
          port: 2379
          tlsEnable: False # 是否开启etcd TLS证书认证(True / False)
    

    保存

  3. 然后在 Kubernetes 集群部署 KubeSphere

    $ kubectl apply -f kubesphere-installer.yaml
    
  4. 查看部署信息

    $ kubectl get pod -n kubesphere-system
    ks-installer-76d4fcf7cb-4zsfz            1/1     Running   0          7h56m
    

    启动成功之后查看日志

  5. 查看部署日志。

    $ kubectl logs -n kubesphere-system $(kubectl get pod -n kubesphere-system -l job-name=kubesphere-installer -o jsonpath='{.items[0].metadata.name}') -f
    
  6. 查看控制台的服务端口,使用 IP:30880访问 KubeSphere UI 界面,默认的集群管理员账号为 admin/P@88w0rd

    # 查看 ks-console 服务的端口  默认为 NodePort: 30880
    $ kubectl get svc -n kubesphere-system  
    NAME            TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
    ks-account      ClusterIP   10.110.150.185   <none>        80/TCP         7h36m
    ks-apigateway   ClusterIP   10.106.157.145   <none>        80/TCP         7h36m
    ks-apiserver    ClusterIP   10.104.176.104   <none>        80/TCP         7h36m
    ks-console      NodePort    10.106.168.150   <none>        80:30880/TCP   7h36m
    openldap        ClusterIP   10.105.165.136   <none>        389/TCP        7h37m
    redis           ClusterIP   10.111.64.46     <none>        6379/TCP       7h37m
    
  7. 最后浏览器访问 http://192.168.181.103:30880/

    image-20200212221830232

参数说明

参数描述默认值
kube_apiserver_host当前集群kube-apiserver地址(ip:port)
etcd_tls_enable是否开启etcd TLS证书认证(True / False)True
etcd_endpoint_ipsetcd地址,如etcd为集群,地址以逗号分离(如:192.168.0.7,192.168.0.8,192.168.0.9)
etcd_portetcd端口 (默认2379,如使用其它端口,请配置此参数)2379
disableMultiLogin是否关闭多点登录 (True / False)True
elk_prefix日志索引logstash
keep_log_days日志留存时间(天)7
metrics_server_enable是否安装metrics_server (True / False)True
istio_enable是否安装istio (True / False)True
persistenceenable是否启用持久化存储 (True / False)(非测试环境建议开启数据持久化)
storageClass启用持久化存储要求环境中存在已经创建好的 StorageClass(默认为空,则使用 default StorageClass)“”
containersLogMountedPath(可选)容器日志挂载路径“/var/lib/docker/containers”
external_es_url(可选)外部es地址,支持对接外部es用
external_es_port(可选)外部es端口,支持对接外部es用
local_registry (离线部署使用)离线部署时,对接本地仓库 (使用该参数需将安装镜像使用scripts/download-docker-images.sh导入本地仓库中)

✏️写作不易,往留下您宝贵的赞。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐