從零搭建與運營生產級的 Kubernetes 集群與 KubeSphere


本文將從零開始,在干凈的機器上安裝 Docker、Kubernetes (使用 kubeadm)、Calico、Helm、NFS StorageClass,通過手把手的教程演示如何搭建一個高可用生產級的 Kubernetes,並在 Kubernetes 集群之上安裝開源的 KubeSphere 容器平台可視化運營集群環境。

一、准備環境

開始部署之前,請先確定當前滿足如下條件,本次集群搭建,所有機器處於同一內網網段,並且可以互相通信。

⚠️⚠️⚠️:請詳細閱讀第一部分,后面的所有操作都是基於這個環境的,為了避免后面部署集群出現各種各樣的問題,強烈建議你完全滿足第一部分的環境要求

  • 兩台以上主機
  • 每台主機的主機名、Mac 地址、UUID 不相同
  • CentOS 7(本文用 7.6/7.7)
  • 每台機器最好有 2G 內存或以上
  • Control-plane/Master至少 2U 或以上
  • 各個主機之間網絡相通
  • 禁用交換分區
  • 禁用 SELINUX
  • 關閉防火牆(我自己的選擇,你也可以設置相關防火牆規則)
  • Control-plane/Master和Worker節點分別開放如下端口

Master節點

協議 方向 端口范圍 作用 使用者
TCP 入站 6443* Kubernetes API 服務器 所有組件
TCP 入站 2379-2380 etcd server client API kube-apiserver, etcd
TCP 入站 10250 Kubelet API kubelet 自身、控制平面組件
TCP 入站 10251 kube-scheduler kube-scheduler 自身
TCP 入站 10252 kube-controller-manager kube-controller-manager 自身

Worker節點

協議 方向 端口范圍 作用 使用者
TCP 入站 10250 Kubelet API kubelet 自身、控制平面組件
TCP 入站 30000-32767 NodePort 服務** 所有組件

其他相關操作如下:

友情提示😊,如果集群過多,可以了解下 ansible,批量管理你的多台機器,方便實用的工具。

先進行防火牆、交換分區設置

# 為了方便本操作關閉了防火牆,也建議你這樣操作 systemctl stop firewalld systemctl disable firewalld # 關閉 SeLinux setenforce 0 sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config # 關閉 swap swapoff -a yes | cp /etc/fstab /etc/fstab_bak cat /etc/fstab_bak |grep -v swap > /etc/fstab

更換CentOS YUM源為阿里雲yum源

# 安裝wget yum install wget -y # 備份 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup # 獲取阿里雲yum源 wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo # 獲取阿里雲epel源 wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo # 清理緩存並創建新的緩存 yum clean all && yum makecache # 系統更新 yum update -y

進行時間同步,並確認時間同步成功

timedatectl
timedatectl set-ntp true

⚠️⚠️⚠️以下操作請嚴格按照聲明的版本進行部署,否則將碰到亂七八糟的問題

二、安裝 Docker

2.1、安裝 Docker

您需要在每台機器上安裝 Docker,我這里安裝的是 docker-ce-19.03.4

# 安裝 Docker CE # 設置倉庫 # 安裝所需包 yum install -y yum-utils \ device-mapper-persistent-data \ lvm2 # 新增 Docker 倉庫,速度慢的可以換阿里雲的源。 yum-config-manager \ --add-repo \ https://download.docker.com/linux/centos/docker-ce.repo # 阿里雲源地址 # http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo # 安裝 Docker CE. yum install -y containerd.io-1.2.10 \ docker-ce-19.03.4 \ docker-ce-cli-19.03.4 # 啟動 Docker 並添加開機啟動 systemctl start docker systemctl enable docker

2.2、修改 Cgroup Driver

需要將Docker 的 Cgroup Driver 修改為 systemd,不然在為Kubernetes 集群添加節點時會報如下錯誤:

# 執行 kubeadm join 的 WARNING 信息 [WARNING IsDockerSystemdCheck]: detected "cgroupfs" as the Docker cgroup driver. The recommended driver is "systemd". Please follow the guide at https://kubernetes.io/docs/setup/cri/

目前 Docker 的 Cgroup Driver 看起來應該是這樣的:

$ docker info|grep "Cgroup Driver" Cgroup Driver: cgroupfs

需要將這個值修改為 systemd ,同時我將registry替換成國內的一些倉庫地址,以免直接在官方倉庫拉取鏡像會很慢,操作如下。

⚠️⚠️⚠️:注意縮進,直接復制的縮進可能有問題,請確保縮進為正確的 Json 格式;如果 Docker 重啟后查看狀態不正常,大概率是此文件縮進有問題,Json格式的縮進自己了解一下。

# Setup daemon. cat > /etc/docker/daemon.json <<EOF { "exec-opts": ["native.cgroupdriver=systemd"], "log-driver": "json-file", "log-opts": { "max-size": "100m" }, "storage-driver": "overlay2", "registry-mirrors":[ "https://kfwkfulq.mirror.aliyuncs.com", "https://2lqq34jg.mirror.aliyuncs.com", "https://pee6w651.mirror.aliyuncs.com", "http://hub-mirror.c.163.com", "https://docker.mirrors.ustc.edu.cn", "https://registry.docker-cn.com" ] } EOF mkdir -p /etc/systemd/system/docker.service.d # Restart docker. systemctl daemon-reload systemctl restart docker

三、安裝 kubeadm、kubelet 和 kubectl

3.1、安裝准備

需要在每台機器上安裝以下的軟件包:

  • kubeadm:用來初始化集群的指令。
  • kubelet:在集群中的每個節點上用來啟動 pod 和容器等。
  • kubectl:用來與集群通信的命令行工具(Worker 節點可以不裝,但是我裝了,不影響什么)。
# 配置K8S的yum源 # 這部分用是阿里雲的源,如果可以訪問Google,則建議用官方的源 cat <<EOF > /etc/yum.repos.d/kubernetes.repo [kubernetes] name=Kubernetes baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64 enabled=1 gpgcheck=1 repo_gpgcheck=1 gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg EOF # 官方源配置如下 cat <<EOF > /etc/yum.repos.d/kubernetes.repo [kubernetes] name=Kubernetes baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64 enabled=1 gpgcheck=1 repo_gpgcheck=1 gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg EOF

3.2、開始安裝

安裝指定版本 kubelet、 kubeadm 、kubectl, 我這里選擇當前較新的穩定版 Kubernetes 1.17.3,如果選擇的版本不一樣,在執行集群初始化的時候,注意 –kubernetes-version 的值。

# 增加配置 cat <<EOF > /etc/sysctl.d/k8s.conf net.ipv4.ip_forward=1 net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 EOF # 加載 sysctl --system # 安裝 yum install -y kubelet-1.17.3 kubeadm-1.17.3 kubectl-1.17.3 --disableexcludes=kubernetes # 啟動並設置 kubelet 開機啟動 systemctl start kubelet systemctl enable --now kubelet

⚠️⚠️⚠️WARNING

如果此時執行 systemctl status kubelet 命令,系統日志將得到 kubelet 啟動失敗的錯誤提示,請忽略此錯誤,因為必須完成后續步驟中 kubeadm init 的操作,kubelet 才能正常啟動

四、使用 Kubeadm 創建集群

4.1、初始化 Control-plane/Master 節點

在第一台 Master 上執行初始化,執行初始化使用 kubeadm init 命令。初始化首先會執行一系列的運行前檢查來確保機器滿足運行 Kubernetes 的條件,這些檢查會拋出警告並在發現錯誤的時候終止整個初始化進程。 然后 kubeadm init 會下載並安裝集群的 Control-plane 組件。

在初始化之前,需要先設置一下 hosts 解析,為了避免可能出現的問題,后面的 Worker 節點我也進行了同樣的操作。注意按照你的實際情況修改Master節點的IP,並且注意 APISERVER_NAME 的值,如果你將這個 apiserver 名稱設置為別的值,下面初始化時候的 –control-plane-endpoint 的值保持一致。

提示:為了使 Kubernetes 集群高可用,建議給集群的控制節點配置負載均衡器,如 HAproxy + Keepalived 或 Nginx,雲上可以使用公有雲的負載均衡器,然后在以下部分設置 MASTER_IP 和 APISERVER_NAME 為負載均衡器的地址(IP:6443) 和域名。

# 設置hosts echo "127.0.0.1 $(hostname)" >> /etc/hosts export MASTER_IP=192.168.115.49 export APISERVER_NAME=kuber4s.api echo "${MASTER_IP} ${APISERVER_NAME}" >> /etc/hosts

友情提示🙂🙂🙂:

截止2020年01月29日,官方文檔聲明了使用 kubeadm 初始化 master 時,–config 這個參數是實驗性質的,所以就不用了;我們用其他參數一樣可以完成 master 的初始化。

--config string kubeadm 配置文件。 警告:配置文件的使用是試驗性的。

下面有不帶注釋的初始化命令,建議先查看帶注釋的每個參數對應的意義,確保與你的當前配置的環境是一致的,然后再執行初始化操作,避免踩雷。

# 初始化 Control-plane/Master 節點 kubeadm init \ --apiserver-advertise-address 0.0.0.0 \ # API 服務器所公布的其正在監聽的 IP 地址,指定“0.0.0.0”以使用默認網絡接口的地址 # 切記只可以是內網IP,不能是外網IP,如果有多網卡,可以使用此選項指定某個網卡 --apiserver-bind-port 6443 \ # API 服務器綁定的端口,默認 6443 --cert-dir /etc/kubernetes/pki \ # 保存和存儲證書的路徑,默認值:"/etc/kubernetes/pki" --control-plane-endpoint kuber4s.api \ # 為控制平面指定一個穩定的 IP 地址或 DNS 名稱, # 這里指定的 kuber4s.api 已經在 /etc/hosts 配置解析為本機IP --image-repository registry.cn-hangzhou.aliyuncs.com/google_containers \ # 選擇用於拉取Control-plane的鏡像的容器倉庫,默認值:"k8s.gcr.io" # 因 Google被牆,這里選擇國內倉庫 --kubernetes-version 1.17.3 \ # 為Control-plane選擇一個特定的 Kubernetes 版本, 默認值:"stable-1" --node-name master01 \ # 指定節點的名稱,不指定的話為主機hostname,默認可以不指定 --pod-network-cidr 10.10.0.0/16 \ # 指定pod的IP地址范圍 --service-cidr 10.20.0.0/16 \ # 指定Service的VIP地址范圍 --service-dns-domain cluster.local \ # 為Service另外指定域名,默認"cluster.local" --upload-certs # 將 Control-plane 證書上傳到 kubeadm-certs Secret

不帶注釋的內容如下,如果初始化超時,可以修改DNS為8.8.8.8后重啟網絡服務再次嘗試。

kubeadm init \
 --apiserver-advertise-address 0.0.0.0 \ --apiserver-bind-port 6443 \ --cert-dir /etc/kubernetes/pki \ --control-plane-endpoint kuber4s.api \ --image-repository registry.cn-hangzhou.aliyuncs.com/google_containers \ --kubernetes-version 1.17.3 \ --pod-network-cidr 10.10.0.0/16 \ --service-cidr 10.20.0.0/16 \ --service-dns-domain cluster.local \ --upload-certs

接下來這個過程有點漫長(初始化會下載鏡像、創建配置文件、啟動容器等操作),泡杯茶,耐心等待,你也可以執行 tailf /var/log/messages 來實時查看系統日志,觀察 Master 的初始化進展,期間碰到一些報錯不要緊張,可能只是暫時的錯誤,等待最終反饋的結果即可。

如果初始化最終成功執行,你將看到如下信息:

Your Kubernetes control-plane has initialized successfully! To start using your cluster, you need to run the following as a regular user: mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config You should now deploy a pod network to the cluster. Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at: https://kubernetes.io/docs/concepts/cluster-administration/addons/ You can now join any number of the control-plane node running the following command on each as root: kubeadm join kuber4s.api:6443 --token 0j287q.jw9zfjxud8w85tis \ --discovery-token-ca-cert-hash sha256:5e8bcad5ec97c1025e8044f4b8fd0a4514ecda4bac2b3944f7f39ccae9e4921f \ --control-plane --certificate-key 528b0b9f2861f8f02dfd4a59fc54ad21e42a7dea4dc5552ac24d9c650c5d4d80 Please note that the certificate-key gives access to cluster sensitive data, keep it secret! As a safeguard, uploaded-certs will be deleted in two hours; If necessary, you can use "kubeadm init phase upload-certs --upload-certs" to reload certs afterward. Then you can join any number of worker nodes by running the following on each as root: kubeadm join kuber4s.api:6443 --token 0j287q.jw9zfjxud8w85tis \ --discovery-token-ca-cert-hash sha256:5e8bcad5ec97c1025e8044f4b8fd0a4514ecda4bac2b3944f7f39ccae9e4921f

為普通用戶添加 kubectl 運行權限,命令內容在初始化成功后的輸出內容中可以看到。

mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config

建議root用戶也進行以上操作,作者使用的是root用戶執行的初始化操作,然后在操作完成后查看集群狀態的時候,出現如下錯誤:

The connection to the server localhost:8080 was refused - did you specify the right host or port?

這時候請備份好 kubeadm init 輸出中的 kubeadm join 命令,因為將會需要這個命令來給集群添加節點。

⚠️⚠️⚠️提示:令牌是主節點和新添加的節點之間進行相互身份驗證的,因此請確保其安全。任何人只要知道了這些令牌,就可以隨便給您的集群添加節點。 你可以使用 kubeadm token 命令來查看、創建和刪除這類令牌。

4.2、安裝 Pod 網絡附加組件

關於 Kubernetes 網絡,建議讀完這篇 文章,以及文末的其他鏈接,如這個

集群必須安裝Pod網絡插件,以使Pod可以相互通信,只需要在Master節點操作,其他新加入的節點會自動創建相關pod。

必須在任何應用程序之前部署網絡組件。另外,在安裝網絡之前,CoreDNS將不會啟動(你可以通過命令 kubectl get pods –all-namespaces|grep coredns 查看 CoreDNS 的狀態)。

# 查看 CoreDNS 的狀態,並不是 Running 狀態 $ kubectl get pods --all-namespaces|grep coredns kube-system coredns-7f9c544f75-bzksd 0/1 Pending 0 14m kube-system coredns-7f9c544f75-mtrwq 0/1 Pending 0 14m

kubeadm 支持多種網絡插件,我們選擇 Calico 網絡插件(kubeadm 僅支持基於容器網絡接口(CNI)的網絡(不支持kubenet)。),默認情況下,它給出的pod的IP段地址是 192.168.0.0/16 ,如果你的機器已經使用了此IP段,就需要修改這個配置項,將其值改為在初始化 Master 節點時使用 kubeadm init –pod-network-cidr=x.x.x.x/x 的IP地址段,即我們上面配置的 10.10.0.0/16 ,大概在625行左右,操作如下:

# 獲取配置文件 mkdir calico && cd calico wget https://docs.projectcalico.org/v3.8/manifests/calico.yaml # 修改配置文件 # 找到 625 行左右的 192.168.0.0/16 ,並修改為我們初始化時配置的 10.10.0.0/16 vim calico.yaml # 部署 Pod 網絡組件 kubectl apply -f calico.yaml

稍等片刻查詢 pod 詳情,你也可以使用 watch 命令來實時查看 pod 的狀態,等待 Pod 網絡組件部署成功后,就可以看到一些信息了,包括 Pod 的 IP 地址信息,這個過程時間可能會有點長。

watch -n 2 kubectl get pods --all-namespaces -o wide

4.3、將 Worker 節點添加到 Kubernetes

請首先確認 Worker 節點滿足第一部分的環境說明,並且已經安裝了 Docker 和 kubeadm、kubelet 、kubectl,並且已經啟動 kubelet。

# 添加 Hosts 解析 echo "127.0.0.1 $(hostname)" >> /etc/hosts export MASTER_IP=192.168.115.49 export APISERVER_NAME=kuber4s.api echo "${MASTER_IP} ${APISERVER_NAME}" >> /etc/hosts

將 Worker 節點添加到集群,這里注意,執行后可能會報錯,有幸的話你會跳進這個坑,這是因為 Worker 節點加入集群的命令實際上在初始化 master 時已經有提示出來了,不過兩小時后會刪除上傳的證書,所以如果你此時加入集群的時候提示證書相關的錯誤,請執行 kubeadm init phase upload-certs –upload-certs 重新加載證書。

kubeadm join kuber4s.api:6443 --token 0y1dj2.ih27ainxwyib0911 \ --discovery-token-ca-cert-hash sha256:5204b3e358a0d568e147908cba8036bdb63e604d4f4c1c3730398f33144fac61 \

執行加入操作,你可能會發現卡着不動,大概率是因為令牌ID對此集群無效或已過 2 小時的有效期(通過執行 kubeadm join –v=5 來獲取詳細的加入過程,看到了內容為 ”token id “0y1dj2” is invalid for this cluster or it has expired“ 的提示),接下來需要在 Master 上通過 kubeadm token create 來創建新的令牌。

$ kubeadm token create --print-join-command W0129 19:10:04.842735 15533 validation.go:28] Cannot validate kube-proxy config - no validator is available W0129 19:10:04.842808 15533 validation.go:28] Cannot validate kubelet config - no validator is available # 輸出結果如下 kubeadm join kuber4s.api:6443 --token 1hk9bc.oz7f3lmtbzf15x9b --discovery-token-ca-cert-hash sha256:5e8bcad5ec97c1025e8044f4b8fd0a4514ecda4bac2b3944f7f39ccae9e4921f

在 Worker 節點上重新執行加入集群命令

kubeadm join kuber4s.api:6443 \ --token 1hk9bc.oz7f3lmtbzf15x9b \ --discovery-token-ca-cert-hash sha256:5e8bcad5ec97c1025e8044f4b8fd0a4514ecda4bac2b3944f7f39ccae9e4921f

接下來在Master上查看 Worker 節點加入的狀況,直到 Worker 節點的狀態變為 Ready 便證明加入成功,這個過程可能會有點漫長,30 分鍾以內都算正常的,主要看你網絡的情況或者說拉取鏡像的速度;另外不要一看到 /var/log/messages 里面報錯就慌了,那也得看具體報什么錯,看不懂就稍微等一下,一般在 Master 上能看到已經加入(雖然沒有Ready)就沒什么問題。

watch kubectl get nodes -o wide

4.4、添加 Master 節點

需要至少2個CPU核心,否則會報錯

kubeadm join kuber4s.api:6443 \ --token 1hk9bc.oz7f3lmtbzf15x9b \ --discovery-token-ca-cert-hash sha256:5e8bcad5ec97c1025e8044f4b8fd0a4514ecda4bac2b3944f7f39ccae9e4921f \ --control-plane --certificate-key 5253fc7e9a4e6204d0683ed2d60db336b3ff64ddad30ba59b4c0bf40d8ccadcd

4.5、補充內容

  • kubeadm init 初始化 Kubernetes 主節點
  • kubeadm token 管理 kubeadm join 的令牌
  • kubeadm reset 將 kubeadm init 或 kubeadm join 對主機的更改恢復到之前狀態,一般與 -f 參數使用

移除 worker 節點

正常情況下,你無需移除 worker 節點,如果要移除,在准備移除的 worker 節點上執行

kubeadm reset -f

或者在 Control-plane 上執行

kubectl delete node nodename
  • 將 nodename 替換為要移除的 worker 節點的名字
  • worker 節點的名字可以通過在 Control-plane 上執行 kubectl get nodes 命令獲得

五、Kubernetes 高可用集群

5.1、環境說明

如果你使用的是以上方法部署你的 Kubernetes 集群,想在當前基礎上進行高可用集群的創建,則可以按照下面的步驟繼續進行。

值得注意的是,這里沒有將ETCD放在Master外的機器上,而是使用默認的架構,即官方的 Stacked etcd topology 方式的集群

你需要至少 3 台 Master 節點和 3 台 Worker 節點,或者更多的機器,但要保證是 Master 和 Worker 節點數都是奇數的,以防止 leader 選舉時出現腦裂狀況。

機器名稱 機器IP 工作內容
master01 192.168.115.49 master、etcd
master02 192.168.115.41 master、etcd
master03 192.168.115.42 master、etcd
node01 192.168.115.46 worker
node02 192.168.115.47 worker
node03 192.168.115.48 worker
nfs 192.168.115.50 存儲

5.2、高可用擴展

Kubernetes 的高可用擴展其實挺簡單,你只需要將不同的 Master 和 Worker 節點加入到集群中就行了。加入的指令在你初始化集群時已經給出了。

  • 添加 Master 節點:

需要至少 2 個 CPU 核心,否則會報錯

kubeadm join kuber4s.api:6443 \ --token 1hk9bc.oz7f3lmtbzf15x9b \ --discovery-token-ca-cert-hash sha256:5e8bcad5ec97c1025e8044f4b8fd0a4514ecda4bac2b3944f7f39ccae9e4921f \ --control-plane --certificate-key 5253fc7e9a4e6204d0683ed2d60db336b3ff64ddad30ba59b4c0bf40d8ccadcd
  • 添加 Worker 節點

在 Worker 節點上重新執行加入集群命令

kubeadm join kuber4s.api:6443 \ --token 1hk9bc.oz7f3lmtbzf15x9b \ --discovery-token-ca-cert-hash sha256:5e8bcad5ec97c1025e8044f4b8fd0a4514ecda4bac2b3944f7f39ccae9e4921f

六、安裝 KubeSphere

6.1、KubeSphere簡介

Kubernetes 官方有提供一套 Dashboard,但是我這里選擇功能更強大的 KubeSphere,以下內容引用自 KubeSphere 官網:

KubeSphere 是在 Kubernetes 之上構建的以應用為中心的容器平台,提供簡單易用的操作界面以及向導式操作方式,在降低用戶使用容器調度平台學習成本的同時,極大減輕開發、測試、運維的日常工作的復雜度,旨在解決 Kubernetes 本身存在的存儲、網絡、安全和易用性等痛點。除此之外,平台已經整合並優化了多個適用於容器場景的功能模塊,以完整的解決方案幫助企業輕松應對敏捷開發與自動化運維、DevOps、微服務治理、灰度發布、多租戶管理、工作負載和集群管理、監控告警、日志查詢與收集、服務與網絡、應用商店、鏡像構建與鏡像倉庫管理和存儲管理等多種場景。后續版本將提供和支持多集群管理、大數據、AI 等場景。

6.2、安裝要求

KubeSphere 支持直接在 Linux 上部署集群,也支持在 Kubernetes 上部署,我這里選擇后者,基本的要求如下:

6.3、安裝 Helm

6.3.1、Helm 簡介

Helm 基本思想如圖所示

以下內容引用自 此篇文章

Helm 基本概念

Helm 可以理解為 Kubernetes 的包管理工具,可以方便地發現、共享和使用為Kubernetes構建的應用,它包含幾個基本概念:

  • Chart:一個 Helm 包,其中包含了運行一個應用所需要的鏡像、依賴和資源定義等,還可能包含 Kubernetes 集群中的服務定義
  • Release: 在 Kubernetes 集群上運行的 Chart 的一個實例。在同一個集群上,一個 Chart 可以安裝很多次。每次安裝都會創建一個新的 release。例如一個 MySQL Chart,如果想在服務器上運行兩個數據庫,就可以把這個 Chart 安裝兩次。每次安裝都會生成自己的 Release,會有自己的 Release 名稱。
  • Repository:用於發布和存儲 Chart 的倉庫。

6.3.2、Helm安裝

安裝過程如下

# 創建部署目錄並下載Helm mkdir tiller cd tiller # 先使用官方的方式安裝,如果安裝不了,可以看到下載文件的地址,然后手動下載解壓 curl -L https://git.io/get_helm.sh | bash # 獲取到下載地址后,想辦法下載 wget https://get.helm.sh/helm-v2.16.3-linux-amd64.tar.gz tar zxf helm-v2.16.3-linux-amd64.tar.gz mv linux-amd64/helm /usr/local/bin/helm # 驗證 helm version

部署 Tiller,即 Helm 的服務端。先創建 SA

# yaml文件如下 $ cat /root/tiller/helm-rbac.yaml apiVersion: v1 kind: ServiceAccount metadata: name: tiller namespace: kube-system --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: tiller roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: cluster-admin subjects: - kind: ServiceAccount name: tiller namespace: kube-system

創建 RBAC:

kubectl apply -f helm-rbac.yaml

初始化,這個過程可能不會成功,具體接着往下看

helm init --service-account=tiller --history-max 300

檢查初始化的情況,不出意外的話,牆內用戶看pod詳情可以看到獲取不到鏡像的錯誤。

kubectl get deployment tiller-deploy -n kube-system

如果一直獲取不到鏡像,可以通過更換到Azure中國鏡像源來解決,操作步驟如下:

# 編輯 deploy kubectl edit deploy tiller-deploy -n kube-system # 查找到image地址,替換為如下地址,保存退出 gcr.azk8s.cn/kubernetes-helm/tiller:v2.16.3

接下來稍等片刻,再次查看deployment和pod詳情,就正常了

kubectl get deployment tiller-deploy -n kube-system

6.4、安裝 StorageClass

Kubernetes 支持多種 StorageClass,我這選擇 NFS 作為集群的 StorageClass。

參考地址:https://github.com/kubernetes-incubator/external-storage/tree/master/nfs-client

6.4.1、下載所需文件

下載所需文件,並進行內容調整

mkdir nfsvolume && cd nfsvolume for file in class.yaml deployment.yaml rbac.yaml ; do wget https://raw.githubusercontent.com/kubernetes-incubator/external-storage/master/nfs-client/deploy/$file ; done

修改 deployment.yaml 中的兩處 NFS 服務器 IP 和目錄

... env: - name: PROVISIONER_NAME value: fuseim.pri/ifs - name: NFS_SERVER value: 192.168.115.50 - name: NFS_PATH value: /data/k8s volumes: - name: nfs-client-root nfs: server: 192.168.115.50 path: /data/k8s

6.4.2、部署創建

具體的說明可以去官網查看。

kubectl create -f rbac.yaml kubectl create -f class.yaml kubectl create -f deployment.yaml

如果日志中看到“上有壞超級塊”,請在集群內所有機器上安裝nfs-utils並啟動。

yum -y install nfs-utils systemctl start nfs-utils systemctl enable nfs-utils rpcinfo -p

查看storageclass

$ kubectl get storageclass NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE managed-nfs-storage fuseim.pri/ifs Delete Immediate false 10m

6.4.3、標記一個默認的 StorageClass

操作命令格式如下

kubectl patch storageclass  -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'

請注意,最多只能有一個 StorageClass 能夠被標記為默認。

驗證標記是否成功

$ kubectl get storageclass NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE managed-nfs-storage (default) fuseim.pri/ifs Delete Immediate false 12m

6.5、部署 KubeSphere

過程很簡單,如果你的機器資源足夠,建議你進行完整安裝,操作步驟如下。如果你的資源不是很充足,則可以進行最小化安裝,參考地址。我當然是選擇完整安裝了,香!

# 下載 yaml 文件 mkdir kubesphere && cd kubesphere wget https://raw.githubusercontent.com/kubesphere/ks-installer/master/kubesphere-complete-setup.yaml # 部署 KubeSphere kubectl apply -f kubesphere-complete-setup.yaml

這個過程根據你實際網速,實際使用時間長度有所不同。你可以通過如下命令查看實時的日志輸出。

kubectl logs -n kubesphere-system $(kubectl get pod -n kubesphere-system -l app=ks-install -o jsonpath='{.items[0].metadata.name}') -f

當你看到如下日志輸出,證明你的 KubeSphere 部署成功

************************************************** task monitoring status is successful task notification status is successful task devops status is successful task alerting status is successful task logging status is successful task openpitrix status is successful task servicemesh status is successful total: 7 completed:7 ************************************************** ##################################################### ### Welcome to KubeSphere! ### ##################################################### Console: http://192.168.115.49:30880 Account: admin Password: P@88w0rd #####################################################

確認 Pod 都正常運行后,可使用IP:30880訪問 KubeSphere UI 界面,默認的集群管理員賬號為admin/P@88w0rd,Enjoy it,😏!

K8S中文社區微信公眾號


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM