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
文件,將其中主機名修改為master和node1,并編輯/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 集群概覽頁。
Tips:
詳情可參考原文:https://kuboard.cn/install/install-dashboard.html