使用kubeadmin配合calico快速搭建kubernetes集群

Tips:
a.原文可參考https://kuboard.cn/install/install-k8s.html,真的是非常詳細的一個關于學習kubernetes的地方,新大陸!
b.另外在搜索資料的時候發現了github上的一個kubeasz項目,項目的目標是致力于提供快速部署高可用k8s集群的工具, 同時也努力成為k8s實踐、使用的參考書。我還沒有嘗試過,各位大佬可以吃個瓜先。
c.此次部署使用kubeadmin和calico的方式部署,k8s的另外覆蓋網絡的方式flannel請參考:https://www.cnblogs.com/Liuxz/p/13254617.html 進行部署。
d.對于初學者來說或,有很多新的概念,容易混淆??梢酝ㄟ^Deployment和DaemonSet、calico與flannel對比一些資料更好的幫助自己去了解概念的差異。
e.使用YUM配合flannel部署K8S的案例可參考利用Centos7 YUM 快速搭建Kubernetes集群,部署完成但是沒有實際跑容器進行測試,各位大佬可以完善一下。

1. 部署架構

角色 IP 服務 VCPU 內存
master 192.168.199.30 etcd、kube-apiserver、kube-scheduler、kube-controller-manager、kube-proxy、calico-node 4 4
node1 192.168.199.31 kube-proxy、calico-node 4 4

2. 設置主機名及相關環境準備

(1) 在兩臺主機上執行以下操作

  • 編輯/etc/hostname文件,將其中主機名修改為masternode1,并編輯/etc/hosts文件,修改內容為:
192.168.199.31  node1
192.168.199.30  master
192.168.199.30  etcd
192.168.199.30  apiserver.k8s
  • 關閉防火墻
[root@master yum.repos.d]# systemctl stop firewalld
[root@master yum.repos.d]# systemctl disable firewalld
  • 關閉swap
    swap,這個當內存不足時,linux會自動使用swap,將部分內存數據存放到磁盤中,這個這樣會使性能下降,為了性能考慮推薦關掉
[root@master yum.repos.d]# swapoff -a
  • 關閉selinux
    vi /etc/selinux/config ,關閉SELINUX
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#     enforcing - SELinux security policy is enforced.
#     permissive - SELinux prints warnings instead of enforcing.
#     disabled - No SELinux policy is loaded.
SELINUX=disabled
# SELINUXTYPE= can take one of three two values:
#     targeted - Targeted processes are protected,
#     minimum - Modification of targeted policy. Only selected processes are protected.
#     mls - Multi Level Security protection.
SELINUXTYPE=targeted
  • 配置yum源,此處配置的是阿里的Centos 7的yum源和kubernetes源
    Tips:可以在配置之前將/etc/yum.repos.d/ 下的文件都備份到bak目錄下
[root@master ~]# cd /etc/yum.repos.d/  &&  curl -O http://mirrors.aliyun.com/repo/Centos-7.repo
[root@master yum.repos.d]# vi kubernetes.repo

[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg" 

[root@master yum.repos.d]yum clean all

[root@master yum.repos.d]#yum makecache

  • reboot重啟操作系統,使hostname、SELINUX配置生效

3. 安裝docker及kubelet(每個節點都需要安裝,本案例即master和node1)

命令安裝(效果等同于手動腳本安裝)

# 在 master 節點和 worker 節點都要執行
# 最后一個參數 1.19.2 用于指定 kubenetes 版本,支持所有 1.19.x 版本的安裝
# 騰訊云 docker hub 鏡像
# export REGISTRY_MIRROR="https://mirror.ccs.tencentyun.com"
# DaoCloud 鏡像
# export REGISTRY_MIRROR="http://f1361db2.m.daocloud.io"
# 華為云鏡像
# export REGISTRY_MIRROR="https://05f073ad3c0010ea0f4bc00b7105ec20.mirror.swr.myhuaweicloud.com"
# 阿里云 docker hub 鏡像
export REGISTRY_MIRROR=https://5xcgs6ii.mirror.aliyuncs.com
curl -sSL https://kuboard.cn/install-script/v1.19.x/install_kubelet.sh | sh -s 1.19.2

手動腳本安裝

也可以選擇手動安裝部署,將install_kubelet.sh下載到本地之后,修改其中的${1}為將要安裝的kubernetes版本,本案例修改為1.19.2 。注意在手動運行腳本之前先聲明變量REGISTRY_MIRROR。 修改好的腳本內容:

#!/bin/bash

# 在 master 節點和 worker 節點都要執行

export REGISTRY_MIRROR=https://5xcgs6ii.mirror.aliyuncs.com

# 安裝 docker
# 參考文檔如下
# https://docs.docker.com/install/linux/docker-ce/centos/ 
# https://docs.docker.com/install/linux/linux-postinstall/

# 卸載舊版本
yum remove -y docker \
docker-client \
docker-client-latest \
docker-ce-cli \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-selinux \
docker-engine-selinux \
docker-engine

# 設置 yum repository
yum install -y yum-utils \
device-mapper-persistent-data \
lvm2
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

# 安裝并啟動 docker
yum install -y docker-ce-19.03.11 docker-ce-cli-19.03.11 containerd.io-1.2.13

mkdir /etc/docker || true

cat > /etc/docker/daemon.json <<EOF
{
  "registry-mirrors": ["${REGISTRY_MIRROR}"],
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "storage-driver": "overlay2",
  "storage-opts": [
    "overlay2.override_kernel_check=true"
  ]
}
EOF

mkdir -p /etc/systemd/system/docker.service.d

# Restart Docker
systemctl daemon-reload
systemctl enable docker
systemctl restart docker

# 安裝 nfs-utils
# 必須先安裝 nfs-utils 才能掛載 nfs 網絡存儲
yum install -y nfs-utils
yum install -y wget

# 關閉 防火墻
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

# 修改 /etc/sysctl.conf
# 如果有配置,則修改
sed -i "s#^net.ipv4.ip_forward.*#net.ipv4.ip_forward=1#g"  /etc/sysctl.conf
sed -i "s#^net.bridge.bridge-nf-call-ip6tables.*#net.bridge.bridge-nf-call-ip6tables=1#g"  /etc/sysctl.conf
sed -i "s#^net.bridge.bridge-nf-call-iptables.*#net.bridge.bridge-nf-call-iptables=1#g"  /etc/sysctl.conf
sed -i "s#^net.ipv6.conf.all.disable_ipv6.*#net.ipv6.conf.all.disable_ipv6=1#g"  /etc/sysctl.conf
sed -i "s#^net.ipv6.conf.default.disable_ipv6.*#net.ipv6.conf.default.disable_ipv6=1#g"  /etc/sysctl.conf
sed -i "s#^net.ipv6.conf.lo.disable_ipv6.*#net.ipv6.conf.lo.disable_ipv6=1#g"  /etc/sysctl.conf
sed -i "s#^net.ipv6.conf.all.forwarding.*#net.ipv6.conf.all.forwarding=1#g"  /etc/sysctl.conf
# 可能沒有,追加
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
echo "net.bridge.bridge-nf-call-ip6tables = 1" >> /etc/sysctl.conf
echo "net.bridge.bridge-nf-call-iptables = 1" >> /etc/sysctl.conf
echo "net.ipv6.conf.all.disable_ipv6 = 1" >> /etc/sysctl.conf
echo "net.ipv6.conf.default.disable_ipv6 = 1" >> /etc/sysctl.conf
echo "net.ipv6.conf.lo.disable_ipv6 = 1" >> /etc/sysctl.conf
echo "net.ipv6.conf.all.forwarding = 1"  >> /etc/sysctl.conf
# 執行命令以應用
sysctl -p

# 配置K8S的yum源
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=0
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
       http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

# 卸載舊版本
yum remove -y kubelet kubeadm kubectl

# 安裝kubelet、kubeadm、kubectl
# 將 ${1} 替換為 kubernetes 版本號,例如 1.19.2
yum install -y kubelet-1.19.2 kubeadm-1.19.2 kubectl-1.19.2

# 重啟 docker,并啟動 kubelet
systemctl daemon-reload
systemctl restart docker
systemctl enable kubelet && systemctl start kubelet

docker version

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

4. 初始化 master 節點

Tips:
關于初始化時用到的環境變量

  • APISERVER_NAME 不能是 master 的 hostname
  • APISERVER_NAME 必須全為小寫字母、數字、小數點,不能包含減號
  • POD_SUBNET 所使用的網段不能與 master節點/worker節點 所在的網段重疊。該字段的取值為一個 CIDR 值,如果您對 CIDR 這個概念還不熟悉,請仍然執行 export POD_SUBNET=10.100.0.1/16 命令,不做修改.

命令行初始化(效果等同手動腳本初始化)

# 只在 master 節點執行
# 替換 x.x.x.x 為 master 節點實際 IP(請使用內網 IP)
# export 命令只在當前 shell 會話中有效,開啟新的 shell 窗口后,如果要繼續安裝過程,請重新執行此處的 export 命令
export MASTER_IP=x.x.x.x
# 替換 apiserver.demo 為 您想要的 dnsName
export APISERVER_NAME=apiserver.demo
# Kubernetes 容器組所在的網段,該網段安裝完成后,由 kubernetes 創建,事先并不存在于您的物理網絡中
export POD_SUBNET=10.100.0.1/16
echo "${MASTER_IP}    ${APISERVER_NAME}" >> /etc/hosts
curl -sSL https://kuboard.cn/install-script/v1.19.x/init_master.sh | sh -s 1.19.2

手動腳本初始化

將init_master.sh下載到本地之后,修改其中的${1}為將要安裝的kubernetes版本,本案例修改為1.19.2 。 修改好的腳本內容:

#!/bin/bash

# 只在 master 節點執行
# 替換 x.x.x.x 為 master 節點的內網IP
# export 命令只在當前 shell 會話中有效,開啟新的 shell 窗口后,如果要繼續安裝過程,請重新執行此處的 export 命令
export MASTER_IP=x.x.x.x
# 替換 apiserver.demo 為 您想要的 dnsName
export APISERVER_NAME=apiserver.demo
# Kubernetes 容器組所在的網段,該網段安裝完成后,由 kubernetes 創建,事先并不存在于您的物理網絡中
export POD_SUBNET=10.100.0.1/16
echo "${MASTER_IP}    ${APISERVER_NAME}" >> /etc/hosts


# 腳本出錯時終止執行
set -e

if [ ${#POD_SUBNET} -eq 0 ] || [ ${#APISERVER_NAME} -eq 0 ]; then
  echo -e "\033[31;1m請確保您已經設置了環境變量 POD_SUBNET 和 APISERVER_NAME \033[0m"
  echo 當前POD_SUBNET=$POD_SUBNET
  echo 當前APISERVER_NAME=$APISERVER_NAME
  exit 1
fi


# 查看完整配置選項 https://godoc.org/k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/v1beta2
rm -f ./kubeadm-config.yaml
cat <<EOF > ./kubeadm-config.yaml
apiVersion: kubeadm.k8s.io/v1beta2
kind: ClusterConfiguration
kubernetesVersion: v1.19.2
imageRepository: registry.aliyuncs.com/k8sxio
controlPlaneEndpoint: "${APISERVER_NAME}:6443"
networking:
  serviceSubnet: "10.96.0.0/16"
  podSubnet: "${POD_SUBNET}"
  dnsDomain: "cluster.local"
EOF

# kubeadm init
# 根據您服務器網速的情況,您需要等候 3 - 10 分鐘
kubeadm init --config=kubeadm-config.yaml --upload-certs

# 配置 kubectl
rm -rf /root/.kube/
mkdir /root/.kube/
cp -i /etc/kubernetes/admin.conf /root/.kube/config

# 安裝 calico 網絡插件
# 參考文檔 https://docs.projectcalico.org/v3.13/getting-started/kubernetes/self-managed-onprem/onpremises
echo "安裝calico-3.13.1"
rm -f calico-3.13.1.yaml
wget https://kuboard.cn/install-script/calico/calico-3.13.1.yaml
kubectl apply -f calico-3.13.1.yaml

檢查master初始化結果

# 只在 master 節點執行

# 執行如下命令,等待 3-10 分鐘,直到所有的容器組處于 Running 狀態
watch kubectl get pod -n kube-system -o wide

# 查看 master 節點初始化結果
kubectl get nodes -o wide

Tips:如果 watch kubectl get pod -n kube-system -o wide 的輸出結果中出現 ImagePullBackoff 或者長時間處于 Pending 的情況,可以參考 查看鏡像抓取進度。其中很大幾率的原因是在pull calico的時候去Registry上拉取calico/cni:v3.13.1、calico/pod2daemon-flexvol:v3.13.1、calico/node:v3.13.1、calico/kube-controllers:v3.13.1四個鏡像出了問題。我雖然在之前安裝的時候都做了國內docker鏡像倉庫加速,但是在實驗的時候還是卡在這個步驟??梢試L試以下幾種解決辦法:

  • 修改為倉庫加速路徑為:imageRepository: gcr.azk8s.cn/google-containers
[root@master ~]kubectl delete -f calico-3.13.1.yaml
[root@master ~]watch kubectl get pods -n kube-system -o wide
# 確保所有的calico pod都刪除之后繼續運行以下命令
[root@master ~]docker pull calico/cni:v3.13.1
[root@master ~]docker pull calico/pod2daemon-flexvol:v3.13.1
[root@master ~]docker pull calico/node:v3.13.1
[root@master ~]docker pull calico/kube-controllers:v3.13.1
[root@master ~]rm -f calico-3.13.1.yaml
[root@master ~]wget https://kuboard.cn/install-script/calico/calico-3.13.1.yaml
[root@master ~]kubectl apply -f calico-3.13.1.yaml

5. 初始化 worker節點

Tips:如果之前在init master的步驟的時候沒有記錄加入的token和命令,那么可以執行以下命令獲取加入集群的命令

在 master 節點上執行

# 只在 master 節點執行
kubeadm token create --print-join-command

可獲取kubeadm join 命令及參數,如下所示:

kubeadm join apiserver.k8s:6443 --token s5161o.c2e5k40x9ho0g92z     --discovery-token-ca-cert-hash sha256:bada8ae90761ce9427d5331cce13d5d31106836489c9dd4c952f4fd49471dad5

Tips:有效時間
該 token 的有效時間為 2 個小時,2小時內,您可以使用此 token 初始化任意數量的 worker 節點

檢查初始化結果

# 只在 master 節點執行
[root@master ~]# kubeadm token create --print-join-command
W1114 07:09:31.680441   26133 configset.go:348] WARNING: kubeadm cannot validate component configs for API groups [kubelet.config.k8s.io kubeproxy.config.k8s.io]
kubeadm join apiserver.k8s:6443 --token s5161o.c2e5k40x9ho0g92z     --discovery-token-ca-cert-hash sha256:bada8ae90761ce9427d5331cce13d5d31106836489c9dd4c952f4fd49471dad5 
[root@master ~]# kubectl get nodes -o wide
NAME     STATUS   ROLES    AGE     VERSION   INTERNAL-IP      EXTERNAL-IP   OS-IMAGE                KERNEL-VERSION           CONTAINER-RUNTIME
master   Ready    master   7h1m    v1.19.2   192.168.199.30   <none>        CentOS Linux 7 (Core)   3.10.0-1127.el7.x86_64   docker://19.3.11
node1    Ready    <none>   6h27m   v1.19.2   192.168.199.31   <none>        CentOS Linux 7 (Core)   3.10.0-1127.el7.x86_64   docker://19.3.11
[root@master ~]# kubectl get nodes
NAME     STATUS   ROLES    AGE     VERSION
master   Ready    master   7h2m    v1.19.2
node1    Ready    <none>   6h28m   v1.19.2
[root@master ~]#

以上, 整個kubernetes的兩臺集群部署已經完成。下面我們可以用過部署kuboard來驗證k8s的正常運行,并對整個k8s的集群狀態進行監控和管理。

6. 部署kuboard

運行以下兩條命令進行部署

kubectl apply -f https://kuboard.cn/install-script/kuboard.yaml
kubectl apply -f https://addons.kuboard.cn/metrics-server/0.3.7/metrics-server.yaml

查看 Kuboard 運行狀態:

[root@master ~]# kubectl get pods -l k8s.kuboard.cn/name=kuboard -n kube-system
NAME                       READY   STATUS    RESTARTS   AGE
kuboard-74c645f5df-8b92n   1/1     Running   0          3h55m
[root@master ~]# 

6.1 獲取Token進行頁面登陸

  • 管理員用戶
    此Token擁有 ClusterAdmin 的權限,可以執行所有操作。
# 如果您參考 www.kuboard.cn 提供的文檔安裝 Kuberenetes,可在第一個 Master 節點上執行此命令
echo $(kubectl -n kube-system get secret $(kubectl -n kube-system get secret | grep kuboard-user | awk '{print $1}') -o go-template='{{.data.token}}' | base64 -d)
  • 只讀用戶

擁有的權限:
view 可查看名稱空間的內容
system:node 可查看節點信息
system:persistent-volume-provisioner 可查看存儲類和存儲卷聲明的信息

執行如下命令可以獲得 只讀用戶 的 Token

# 如果您參考 www.kuboard.cn 提供的文檔安裝 Kuberenetes,可在第一個 Master 節點上執行此命令
echo $(kubectl -n kube-system get secret $(kubectl -n kube-system get secret | grep kuboard-viewer | awk '{print $1}') -o go-template='{{.data.token}}' | base64 -d)

6.2 訪問Kuboard

Kuboard Service 使用了 NodePort 的方式暴露服務,NodePort 為 32567??梢园慈缦路绞皆L問 Kuboard:

http://任意一個Worker節點的IP地址:32567/

輸入前一步驟中獲得的 token,可進入 Kuboard 集群概覽頁。


kuboard集群概覽圖

master節點詳情

Tips:
詳情可參考原文:https://kuboard.cn/install/install-dashboard.html

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,406評論 6 538
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,034評論 3 423
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 177,413評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,449評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,165評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,559評論 1 325
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,606評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,781評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,327評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,084評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,278評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,849評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,495評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,927評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,172評論 1 291
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,010評論 3 396
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,241評論 2 375

推薦閱讀更多精彩內容