本文將從零開始,在干凈的機器上安裝 Docker敦捧、Kubernetes (使用 kubeadm)纤虽、Calico、Helm绞惦、NFS StorageClass逼纸,通過手把手的教程演示如何搭建一個高可用生產(chǎn)級的 Kubernetes,并在 Kubernetes 集群之上安裝開源的 KubeSphere 容器平臺可視化運營集群環(huán)境济蝉。
一杰刽、準備環(huán)境
開始部署之前,請先確定當前滿足如下條件王滤,本次集群搭建贺嫂,所有機器處于同一內(nèi)網(wǎng)網(wǎng)段,并且可以互相通信雁乡。
??????:請詳細閱讀第一部分第喳,后面的所有操作都是基于這個環(huán)境的,為了避免后面部署集群出現(xiàn)各種各樣的問題踱稍,強烈建議你完全滿足第一部分的環(huán)境要求
- 兩臺以上主機
- 每臺主機的主機名曲饱、Mac 地址、UUID 不相同
- CentOS 7(本文用 7.6/7.7)
- 每臺機器最好有 2G 內(nèi)存或以上
- Control-plane/Master至少 2U 或以上
- 各個主機之間網(wǎng)絡相通
- 禁用交換分區(qū)
- 禁用 SELINUX
- 關(guān)閉防火墻(我自己的選擇珠月,你也可以設置相關(guān)防火墻規(guī)則)
- Control-plane/Master和Worker節(jié)點分別開放如下端口
Master節(jié)點
協(xié)議 | 方向 | 端口范圍 | 作用 | 使用者 |
---|---|---|---|---|
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節(jié)點
協(xié)議 | 方向 | 端口范圍 | 作用 | 使用者 |
---|---|---|---|---|
TCP | 入站 | 10250 | Kubelet API | kubelet 自身、控制平面組件 |
TCP | 入站 | 30000-32767 | NodePort 服務** | 所有組件 |
其他相關(guān)操作如下:
友情提示??啤挎,如果集群過多驻谆,可以了解下 ansible,批量管理你的多臺機器庆聘,方便實用的工具胜臊。
先進行防火墻、交換分區(qū)設置
為了方便本操作關(guān)閉了防火墻伙判,也建議你這樣操作
systemctl stop firewalld
systemctl disable firewalld
# 關(guān)閉 SeLinux setenforce 0
sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config
# 關(guān)閉 swap
swapoff -a
yes | cp /etc/fstab /etc/fstab_bak
cat /etc/fstab_bak |grep -v swap > /etc/fstab</pre>
更換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
# 清理緩存并創(chuàng)建新的緩存
yum clean all && yum makecache
# 系統(tǒng)更新
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</pre>
## 2.2沥邻、修改 Cgroup Driver
需要將Docker 的 Cgroup Driver 修改為 systemd危虱,不然在為Kubernetes 集群添加節(jié)點時會報如下錯誤:
# 執(zhí)行 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替換成國內(nèi)的一些倉庫地址唐全,以免直接在官方倉庫拉取鏡像會很慢埃跷,操作如下。
> ??????:注意縮進邮利,直接復制的縮進可能有問題弥雹,請確保縮進為正確的 Json 格式延届;如果 Docker 重啟后查看狀態(tài)不正常,大概率是此文件縮進有問題方庭,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</pre>
三、安裝 kubeadm械念、kubelet 和 kubectl
3.1头朱、安裝準備
需要在每臺機器上安裝以下的軟件包:
- kubeadm:用來初始化集群的指令。
- kubelet:在集群中的每個節(jié)點上用來啟動 pod 和容器等龄减。
- kubectl:用來與集群通信的命令行工具(Worker 節(jié)點可以不裝项钮,但是我裝了,不影響什么)希停。
# 配置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棍潘, 我這里選擇當前較新的穩(wěn)定版 Kubernetes 1.17.3,如果選擇的版本不一樣崖媚,在執(zhí)行集群初始化的時候亦歉,注意 –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
>
> 如果此時執(zhí)行 systemctl status kubelet 命令畅哑,
系統(tǒng)日志將得到 kubelet 啟動失敗的錯誤提示肴楷,
請忽略此錯誤,因為必須完成后續(xù)步驟中 kubeadm init 的操作荠呐,kubelet 才能正常啟動
四赛蔫、使用 Kubeadm 創(chuàng)建集群
4.1砂客、初始化 Control-plane/Master 節(jié)點
在第一臺 Master 上執(zhí)行初始化,執(zhí)行初始化使用 kubeadm init 命令呵恢。初始化首先會執(zhí)行一系列的運行前檢查來確保機器滿足運行 Kubernetes 的條件婶芭,這些檢查會拋出警告并在發(fā)現(xiàn)錯誤的時候終止整個初始化進程趟大。 然后 kubeadm init 會下載并安裝集群的 Control-plane 組件。
在初始化之前,需要先設置一下 hosts 解析拒炎,為了避免可能出現(xiàn)的問題,后面的 Worker 節(jié)點我也進行了同樣的操作折柠。注意按照你的實際情況修改Master節(jié)點的IP章办,并且注意 APISERVER_NAME 的值,如果你將這個 apiserver 名稱設置為別的值瘫怜,下面初始化時候的 –control-plane-endpoint 的值保持一致术徊。
提示:為了使 Kubernetes 集群高可用,建議給集群的控制節(jié)點配置負載均衡器鲸湃,如 HAproxy + Keepalived 或 Nginx弧关,云上可以使用公有云的負載均衡器,然后在以下部分設置 MASTER_IP 和 APISERVER_NAME 為負載均衡器的地址(IP:6443) 和域名唤锉。
# 設置hosts 注意了世囊,每個機器的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 這個參數(shù)是實驗性質(zhì)的株憾,所以就不用了;我們用其他參數(shù)一樣可以完成 master 的初始化晒衩。
-config string kubeadm 配置文件嗤瞎。 警告:配置文件的使用是試驗性的。
下面有不帶注釋的初始化命令听系,建議先查看帶注釋的每個參數(shù)對應的意義贝奇,確保與你的當前配置的環(huán)境是一致的,然后再執(zhí)行初始化操作靠胜,避免踩雷掉瞳。
# 初始化 Control-plane/Master 節(jié)點
kubeadm init \
--apiserver-advertise-address 0.0.0.0 \
# API 服務器所公布的其正在監(jiān)聽的 IP 地址,指定“0.0.0.0”以使用默認網(wǎng)絡接口的地址
# 切記只可以是內(nèi)網(wǎng)IP,不能是外網(wǎng)IP浪漠,如果有多網(wǎng)卡陕习,可以使用此選項指定某個網(wǎng)卡
--apiserver-bind-port 6443 \
# API 服務器綁定的端口,默認 6443
--cert-dir /etc/kubernetes/pki \
# 保存和存儲證書的路徑,默認值:"/etc/kubernetes/pki"
--control-plane-endpoint kuber4s.api \
# 為控制平面指定一個穩(wěn)定的 IP 地址或 DNS 名稱,
# 這里指定的 kuber4s.api 已經(jīng)在 /etc/hosts 配置解析為本機IP
--image-repository registry.cn-hangzhou.aliyuncs.com/google_containers \
# 選擇用于拉取Control-plane的鏡像的容器倉庫址愿,默認值:"k8s.gcr.io"
# 因 Google被墻该镣,這里選擇國內(nèi)倉庫
--kubernetes-version 1.17.3 \
# 為Control-plane選擇一個特定的 Kubernetes 版本, 默認值:"stable-1"
--node-name master01 \
# 指定節(jié)點的名稱,不指定的話為主機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
不帶注釋的內(nèi)容如下省艳,如果初始化超時,可以修改DNS為8.8.8.8后重啟網(wǎng)絡服務再次嘗試嫁审。
# master1 init
kubeadm init \
--apiserver-advertise-address 0.0.0.0 \
--apiserver-bind-port 6443 \
--cert-dir /etc/kubernetes/pki \
--control-plane-endpoint master1 \
--image-repository registry.cn-hangzhou.aliyuncs.com/google_containers \
--kubernetes-version 1.18.2 \
--pod-network-cidr 10.10.0.0/16 \
--service-cidr 10.20.0.0/16 \
--service-dns-domain cluster.local \
--upload-certs
接下來這個過程有點漫長(初始化會下載鏡像跋炕、創(chuàng)建配置文件、啟動容器等操作)土居,泡杯茶枣购,耐心等待,你也可以執(zhí)行 tailf /var/log/messages 來實時查看系統(tǒng)日志擦耀,觀察 Master 的初始化進展棉圈,期間碰到一些報錯不要緊張,可能只是暫時的錯誤眷蜓,等待最終反饋的結(jié)果即可分瘾。
如果初始化最終成功執(zhí)行,你將看到如下信息:
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 master1:6443 --token ufzav2.4m0l2ryygvn722so \
--discovery-token-ca-cert-hash sha256:542fcea81434d01426117669992325926bd1e7973c4a3705bda31b15cbb772d8 \
--control-plane --certificate-key db9d0b3f9175c9f7624d5844491b8d31023674010de791302129350517eb87b0
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 master1:6443 --token ufzav2.4m0l2ryygvn722so \
--discovery-token-ca-cert-hash sha256:542fcea81434d01426117669992325926bd1e7973c4a3705bda31b15cbb772d8
為普通用戶添加 kubectl 運行權(quán)限吁系,命令內(nèi)容在初始化成功后的輸出內(nèi)容中可以看到德召。
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用戶執(zhí)行的初始化操作汽纤,然后在操作完成后查看集群狀態(tài)的時候上岗,出現(xiàn)如下錯誤:
The connection to the server localhost:8080 was refused - did you specify the right host or port?
這時候請備份好 kubeadm init 輸出中的 kubeadm join 命令,因為將會需要這個命令來給集群添加節(jié)點蕴坪。
??????提示:令牌是主節(jié)點和新添加的節(jié)點之間進行相互身份驗證的肴掷,因此請確保其安全。任何人只要知道了這些令牌背传,就可以隨便給您的集群添加節(jié)點呆瞻。 你可以使用 kubeadm token 命令來查看、創(chuàng)建和刪除這類令牌径玖。
4.2痴脾、安裝 Pod 網(wǎng)絡附加組件
關(guān)于 Kubernetes 網(wǎng)絡,建議讀完這篇 文章梳星,以及文末的其他鏈接赞赖,如這個。
集群必須安裝Pod網(wǎng)絡插件丰泊,以使Pod可以相互通信薯定,只需要在Master節(jié)點操作,其他新加入的節(jié)點會自動創(chuàng)建相關(guān)pod瞳购。
必須在任何應用程序之前部署網(wǎng)絡組件。另外亏推,在安裝網(wǎng)絡之前学赛,CoreDNS將不會啟動(你可以通過命令 kubectl get pods –all-namespaces|grep coredns 查看 CoreDNS 的狀態(tài))年堆。
# 查看 CoreDNS 的狀態(tài),并不是 Running 狀態(tài)
$ 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 支持多種網(wǎng)絡插件,我們選擇 Calico 網(wǎng)絡插件(kubeadm 僅支持基于容器網(wǎng)絡接口(CNI)的網(wǎng)絡(不支持kubenet)变丧。),默認情況下滴劲,它給出的pod的IP段地址是 192.168.0.0/16 ,如果你的機器已經(jīng)使用了此IP段,就需要修改這個配置項,將其值改為在初始化 Master 節(jié)點時使用 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 網(wǎng)絡組件
kubectl apply -f calico.yaml
稍等片刻查詢 pod 詳情,你也可以使用 watch 命令來實時查看 pod 的狀態(tài),等待 Pod 網(wǎng)絡組件部署成功后,就可以看到一些信息了菇肃,包括 Pod 的 IP 地址信息斗忌,這個過程時間可能會有點長陈哑。
watch -n 2 kubectl get pods --all-namespaces -o wide
4.3界酒、將 Worker 節(jié)點添加到 Kubernetes
請首先確認 Worker 節(jié)點滿足第一部分的環(huán)境說明凭疮,并且已經(jīng)安裝了 Docker 和 kubeadm衰腌、kubelet 帕翻、kubectl,并且已經(jīng)啟動 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</pre>
將 Worker 節(jié)點添加到集群,這里注意粥鞋,執(zhí)行后可能會報錯呻粹,有幸的話你會跳進這個坑,這是因為 Worker 節(jié)點加入集群的命令實際上在初始化 master 時已經(jīng)有提示出來了,不過兩小時后會刪除上傳的證書,所以如果你此時加入集群的時候提示證書相關(guān)的錯誤砸脊,請執(zhí)行 kubeadm init phase upload-certs –upload-certs 重新加載證書具篇。
kubeadm join kuber4s.api:6443 --token 0y1dj2.ih27ainxwyib0911 \
--discovery-token-ca-cert-hash sha256:5204b3e358a0d568e147908cba8036bdb63e604d4f4c1c3730398f33144fac61
執(zhí)行加入操作,你可能會發(fā)現(xiàn)卡著不動,大概率是因為令牌ID對此集群無效或已過 2 小時的有效期(通過執(zhí)行 kubeadm join –v=5 來獲取詳細的加入過程埃疫,看到了內(nèi)容為 ”token id “0y1dj2” is invalid for this cluster or it has expired“ 的提示)伏恐,接下來需要在 Master 上通過 kubeadm token create 來創(chuàng)建新的令牌。
$ 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 # 輸出結(jié)果如下 kubeadm join kuber4s.api:6443 --token 1hk9bc.oz7f3lmtbzf15x9b --discovery-token-ca-cert-hash sha256:5e8bcad5ec97c1025e8044f4b8fd0a4514ecda4bac2b3944f7f39ccae9e4921f
在 Worker 節(jié)點上重新執(zhí)行加入集群命令
kubeadm join kuber4s.api:6443 \
--token 1hk9bc.oz7f3lmtbzf15x9b \
--discovery-token-ca-cert-hash sha256:5e8bcad5ec97c1025e8044f4b8fd0a4514ecda4bac2b3944f7f39ccae9e4921f
接下來在Master上查看 Worker 節(jié)點加入的狀況栓霜,直到 Worker 節(jié)點的狀態(tài)變?yōu)?Ready 便證明加入成功翠桦,這個過程可能會有點漫長,30 分鐘以內(nèi)都算正常的胳蛮,主要看你網(wǎng)絡的情況或者說拉取鏡像的速度销凑;另外不要一看到 /var/log/messages 里面報錯就慌了,那也得看具體報什么錯仅炊,看不懂就稍微等一下斗幼,一般在 Master 上能看到已經(jīng)加入(雖然沒有Ready)就沒什么問題。
watch kubectl get nodes -o wide
4.4抚垄、添加 Master 節(jié)點
需要至少2個CPU核心蜕窿,否則會報錯
kubeadm join kuber4s.api:6443 \
--token 1hk9bc.oz7f3lmtbzf15x9b \
--discovery-token-ca-cert-hash sha256:5e8bcad5ec97c1025e8044f4b8fd0a4514ecda4bac2b3944f7f39ccae9e4921f \
--control-plane --certificate-key 5253fc7e9a4e6204d0683ed2d60db336b3ff64ddad30ba59b4c0bf40d8ccadcd
4.5、補充內(nèi)容
- kubeadm init 初始化 Kubernetes 主節(jié)點
- kubeadm token 管理 kubeadm join 的令牌
- kubeadm reset 將 kubeadm init 或 kubeadm join 對主機的更改恢復到之前狀態(tài)呆馁,一般與 -f 參數(shù)使用
移除 worker 節(jié)點
正常情況下桐经,你無需移除 worker 節(jié)點,如果要移除智哀,在準備移除的 worker 節(jié)點上執(zhí)行
kubeadm reset -f
或者在 Control-plane 上執(zhí)行
kubectl delete node nodename
- 將 nodename 替換為要移除的 worker 節(jié)點的名字
- worker 節(jié)點的名字可以通過在 Control-plane 上執(zhí)行 kubectl get nodes 命令獲得
五次询、Kubernetes 高可用集群
5.1、環(huán)境說明
如果你使用的是以上方法部署你的 Kubernetes 集群瓷叫,想在當前基礎上進行高可用集群的創(chuàng)建屯吊,則可以按照下面的步驟繼續(xù)進行。
值得注意的是摹菠,這里沒有將ETCD放在Master外的機器上盒卸,而是使用默認的架構(gòu),即官方的 Stacked etcd topology 方式的集群
你需要至少 3 臺 Master 節(jié)點和 3 臺 Worker 節(jié)點次氨,或者更多的機器蔽介,但要保證是 Master 和 Worker 節(jié)點數(shù)都是奇數(shù)的,以防止 leader 選舉時出現(xiàn)腦裂狀況煮寡。
機器名稱 | 機器IP | 工作內(nèi)容 |
---|---|---|
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 節(jié)點加入到集群中就行了坐儿。加入的指令在你初始化集群時已經(jīng)給出了律胀。
- 添加 Master 節(jié)點:
需要至少 2 個 CPU 核心宋光,否則會報錯
kubeadm join kuber4s.api:6443 \
--token 1hk9bc.oz7f3lmtbzf15x9b \
--discovery-token-ca-cert-hash sha256:5e8bcad5ec97c1025e8044f4b8fd0a4514ecda4bac2b3944f7f39ccae9e4921f \
--control-plane --certificate-key 5253fc7e9a4e6204d0683ed2d60db336b3ff64ddad30ba59b4c0bf40d8ccadcd</pre>
- 添加 Worker 節(jié)點
在 Worker 節(jié)點上重新執(zhí)行加入集群命令
kubeadm join kuber4s.api:6443 \
--token 1hk9bc.oz7f3lmtbzf15x9b \
--discovery-token-ca-cert-hash sha256:5e8bcad5ec97c1025e8044f4b8fd0a4514ecda4bac2b3944f7f39ccae9e4921f
六、安裝 KubeSphere
6.1炭菌、KubeSphere簡介
Kubernetes 官方有提供一套 Dashboard罪佳,但是我這里選擇功能更強大的 KubeSphere,以下內(nèi)容引用自 KubeSphere 官網(wǎng):
KubeSphere 是在 Kubernetes 之上構(gòu)建的以應用為中心的容器平臺黑低,提供簡單易用的操作界面以及向?qū)讲僮鞣绞阶秆蓿诮档陀脩羰褂萌萜髡{(diào)度平臺學習成本的同時,極大減輕開發(fā)投储、測試第练、運維的日常工作的復雜度,旨在解決 Kubernetes 本身存在的存儲玛荞、網(wǎng)絡、安全和易用性等痛點呕寝。除此之外勋眯,平臺已經(jīng)整合并優(yōu)化了多個適用于容器場景的功能模塊,以完整的解決方案幫助企業(yè)輕松應對敏捷開發(fā)與自動化運維下梢、DevOps客蹋、微服務治理、灰度發(fā)布孽江、多租戶管理讶坯、工作負載和集群管理、監(jiān)控告警岗屏、日志查詢與收集辆琅、服務與網(wǎng)絡、應用商店这刷、鏡像構(gòu)建與鏡像倉庫管理和存儲管理等多種場景婉烟。后續(xù)版本將提供和支持多集群管理、大數(shù)據(jù)暇屋、AI 等場景似袁。
6.2、安裝要求
KubeSphere 支持直接在 Linux 上部署集群咐刨,也支持在 Kubernetes 上部署昙衅,我這里選擇后者,基本的要求如下:
- Kubernetes 版本:1.15.x ≤ K8s version ≤ 1.17.x定鸟;
- Helm 版本:2.10.0 ≤ Helm Version < 3.0.0(不支持 helm 2.16.0#6894)而涉,且已安裝了 Tiller,參考 如何安裝與配置 Helm(預計 3.0 支持 Helm v3)仔粥;
- 集群已有默認的存儲類型(StorageClass)婴谱,若還沒有準備存儲請參考安裝 OpenEBS 創(chuàng)建 LocalPV 存儲類型用作開發(fā)測試環(huán)境蟹但。
- 集群能夠訪問外網(wǎng),若無外網(wǎng)請參考 在 Kubernetes 離線安裝 KubeSphere谭羔。
6.3华糖、安裝 Helm
6.3.1、Helm 簡介
Helm 基本思想如圖所示
以下內(nèi)容引用自 此篇文章
Helm 基本概念
Helm 可以理解為 Kubernetes 的包管理工具瘟裸,可以方便地發(fā)現(xiàn)客叉、共享和使用為Kubernetes構(gòu)建的應用,它包含幾個基本概念:
- Chart:一個 Helm 包话告,其中包含了運行一個應用所需要的鏡像兼搏、依賴和資源定義等,還可能包含 Kubernetes 集群中的服務定義
- Release: 在 Kubernetes 集群上運行的 Chart 的一個實例沙郭。在同一個集群上佛呻,一個 Chart 可以安裝很多次。每次安裝都會創(chuàng)建一個新的 release病线。例如一個 MySQL Chart吓著,如果想在服務器上運行兩個數(shù)據(jù)庫,就可以把這個 Chart 安裝兩次送挑。每次安裝都會生成自己的 Release绑莺,會有自己的 Release 名稱。
- Repository:用于發(fā)布和存儲 Chart 的倉庫惕耕。
6.3.2纺裁、Helm安裝
安裝過程如下
# 創(chuàng)建部署目錄并下載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 的服務端浪南。先創(chuàng)建 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
創(chuàng)建 RBAC:
kubectl apply -f helm-rbac.yaml
初始化,這個過程可能不會成功漱受,具體接著往下看
helm init --service-account=tiller --history-max 300
檢查初始化的情況络凿,不出意外的話,墻內(nèi)用戶看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差导、下載所需文件
下載所需文件试躏,并進行內(nèi)容調(diào)整
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、部署創(chuàng)建
具體的說明可以去官網(wǎng)查看设褐。
kubectl create -f rbac.yaml
kubectl create -f class.yaml
kubectl create -f deployment.yaml
如果日志中看到“上有壞超級塊”颠蕴,請在集群內(nèi)所有機器上安裝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
這個過程根據(jù)你實際網(wǎng)速,實際使用時間長度有所不同巫玻。你可以通過如下命令查看實時的日志輸出丛忆。
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诗力,??凰浮!