部署Kubernetes集羣以及KubeSphere

1、部署環境

咱們平時聽到的部署Kubernetes,其實就是指部署一個Kubernetes集羣,請先肯定當前知足以下條件,本次集羣搭建,全部機器處於同一內網網段,而且能夠通訊。node

⚠️⚠️⚠️:請詳細閱讀第一部分,後面的全部操做都是基於這個環境的,爲了不後面部署集羣出現各類各樣的問題,強烈建議你徹底知足第一部分的環境要求linux

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

Master節點git

協議 方向 端口範圍 做用 使用者
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節點github

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

其餘相關操做以下:docker

友情提示😊,若是集羣過多,能夠了解下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源json

# 安裝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

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

timedatectl
timedatectl set-ntp true
⚠️⚠️⚠️如下操做請嚴格按照聲明的版本進行部署,不然將碰到亂七八糟的問題

2、安裝Docker

2.一、安裝 Docker

您須要在每臺機器上安裝Docker,我這裏安裝的是 docker-ce-19.03.4centos

# 安裝 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.二、修改 Cgroup Driver

須要將Docker 的 Cgroup Driver 修改成 systemd,否則在爲Kubernetes 集羣添加節點時會報以下錯誤:api

# 執行 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

3、安裝 kubeadm、kubelet 和 kubectl

3.一、安裝準備

須要在每臺機器上安裝如下的軟件包:

  • 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.二、開始安裝

安裝指定版本 kubeletkubeadmkubectl, 我這裏選擇當前較新的穩定版 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 才能正常啓動

4、使用Kubeadm建立集羣

4.一、初始化 Control-plane/Master 節點

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

在初始化以前,須要先設置一下hosts解析,爲了不可能出現的問題,後面的 Worker 節點我也進行了一樣的操做。注意按照你的實際狀況修改Master節點的IP,而且注意 APISERVER_NAME 的值,若是你將這個apiserver名稱設置爲別的值,下面初始化時候的 --control-plane-endpoint 的值保持一致

# 設置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.二、安裝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.三、將 Worker 節點添加到K8s集羣

請首先確認 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.四、添加Master節點

須要至少2個CPU核心,不然會報錯

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

4.五、補充內容

  • kubeadm init 初始化 Kubernetes 主節點
  • kubeadm token 管理 kubeadm join 的令牌
  • kubeadm resetkubeadm initkubeadm join 對主機的更改恢復到以前狀態,通常與 -f 參數使用

移除 worker 節點

正常狀況下,你無需移除 worker 節點,若是要移除,在準備移除的 worker 節點上執行

kubeadm reset -f

或者在 Control-plane 上執行

kubectl delete node nodename
  • 將 nodename 替換爲要移除的 worker 節點的名字
  • worker 節點的名字能夠經過在 Control-plane 上執行 kubectl get nodes 命令得到

5、Kubernetes 高可用集羣

5.一、環境說明

若是你使用的是以上方法部署你的Kubernetes集羣,想在當前基礎上進行高可用集羣的建立,則能夠按照下面的步驟繼續進行。

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

圖片

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

我準備的機器狀況以下,同志們,你得加幾臺機器了😏,NFS部署步驟我就不贅述了:

機器名稱 機器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.二、高可用擴展

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

6、安裝KubeSphere

6.一、KubeSphere簡介

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

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

KubeSphere 從項目初始階段就採用開源的方式來進行項目的良性發展,相關的項目源代碼和文檔都在GitHub可見。KubeSphere 支持部署和運行在包括公有云、私有云、VM、BM 和 Kubernetes 等任何基礎設施之上,而且支持在線安裝與離線安裝,目前已在阿里雲、騰訊雲、華爲雲、青雲、AWS、Kubernetes上進行過部署測試

KubeSphere 2.1 提供了全棧化容器部署與管理平臺,支持在生產環境安裝與使用,它的核心功能能夠歸納在如下的功能架構圖中,瞭解 2.1 的具體功能說明,能夠在產品功能進行查看。

https://92uu-blog.oss-cn-beijing.aliyuncs.com/2020-03-25-094430.png

6.二、安裝要求

KubeSphere支持直接在Linux上部署集羣,也支持在Kubernetes上部署,我這裏選擇後者,基本的要求以下:

6.三、安裝Helm

6.3.一、Helm簡介

helm基本思想如圖所示

圖片

如下內容引用自 此篇文章

爲何要用Helm?

首先在原來項目中都是基於yaml文件來進行部署發佈的,而目前項目大部分微服務化或者模塊化,會分紅不少個組件來部署,每一個組件可能對應一個deployment.yaml,一個service.yaml,一個Ingress.yaml還可能存在各類依賴關係,這樣一個項目若是有5個組件,極可能就有15個不一樣的yaml文件,這些yaml分散存放,若是某天進行項目恢復的話,很難知道部署順序,依賴關係等,而全部這些包括

  • 基於yaml配置的集中存放
  • 基於項目的打包
  • 組件間的依賴

均可以經過helm來進行解決。

Helm 基本概念

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

  • Chart:一個 Helm 包,其中包含了運行一個應用所須要的鏡像、依賴和資源定義等,還可能包含 Kubernetes 集羣中的服務定義
  • Release: 在 Kubernetes 集羣上運行的 Chart 的一個實例。在同一個集羣上,一個 Chart 能夠安裝不少次。每次安裝都會建立一個新的 release。例如一個 MySQL Chart,若是想在服務器上運行兩個數據庫,就能夠把這個 Chart 安裝兩次。每次安裝都會生成本身的 Release,會有本身的 Release 名稱。
  • Repository:用於發佈和存儲 Chart 的倉庫。

Helm 組件及架構

Helm 採用客戶端/服務器架構,有以下組件組成:

  • Helm CLI 是 Helm 客戶端,能夠在本地執行
  • Tiller 是服務器端組件,在 Kubernetes 羣集上運行,並管理 Kubernetes 應用程序的生命週期
  • Repository 是 Chart 倉庫,Helm客戶端經過HTTP協議來訪問倉庫中Chart的索引文件和壓縮包。

6.3.二、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,對於tiller的官方的解釋以下

Tiller is the server component for helm. Tiller will be present in the kubernetes cluster and the helm client talks to it for deploying applications using helm charts.

先建立 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

建立ac

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.四、安裝StorageClass

Kubernetes支持多種StorageClass,我這選擇NFS做爲集羣的StorageClass。

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

6.4.一、下載所需文件

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

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.二、部署建立

具體的說明能夠去官網查看。

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.三、標記一個默認的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.五、部署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

這個過程根據你實際網速,實際使用時間長度有所不一樣。你能夠經過以下命令查看實時的日誌輸出。當你在日誌充看到 http://192.168.115.49:30880 字樣的輸出時,證實你的集羣安裝成功。

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

NOTES:
  1. After logging into the console, please check the
     monitoring status of service components in
     the "Cluster Status". If the service is not
     ready, please wait patiently. You can start
     to use when all components are ready.
  2. Please modify the default password after login.

#####################################################

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

圖片

https://92uu-blog.oss-cn-beijing.aliyuncs.com/2020-03-25-145648.png

相關文章
相關標籤/搜索