1. 安裝要求
1.1 服務器節點要求
部署Kubernetes集群機器需要滿足以下幾個條件:
- 一台或多台機器,操作系統 CentOS7.x-86_x64
- 硬件配置:2GB或更多RAM,2個CPU或更多CPU,硬盤30GB或更多
- 可以訪問外網,需要拉取鏡像,如果服務器不能上網,需要提前下載鏡像並導入節點
- 禁止swap分區
1.2對於kubeEdge
KubeEdge由雲和邊緣組成。它建立在Kubernetes之上,為聯網、應用部署和雲與邊緣之間的元數據同步提供核心基礎設施支持。所以如果我們想要設置KubeEdge,我們需要設置Kubernetes集群(可以使用現有的集群),雲端和邊緣端。
在cloud side, 我們需要安裝:
- Docker,
- Kubernetes cluster
- cloudcore
在 edge side, 我們需要安裝:
- Docker,
- MQTT (We can also use internal MQTT broker) (配置可以選用,不是一定需要)
- edgecore
2.准備環境
角色 | IP | 工作負載 |
---|---|---|
master(雲端) | 192.168.16.100 | k8s、docker、cloudcore |
node(邊緣端) | 192.168.16.x | docker、edgecore |
1) 關閉防火牆:
systemctl stop firewalld
設置開機禁用防火牆:
systemctl disable firewalld
2) 關閉selinux:
臨時禁用:setenforce 0
永久禁用:
vi /etc/selinux/config # 或者修改/etc/sysconfig/selinux
SELINUX=disabled
查看:getenforce
3) 關閉swap:(K8S 1.8版本后必須關閉)
臨時關閉:swapoff -a
永久關閉:vi /etc/fstab,注釋掉swap行
# sed -i 's/.*swap.*/#&/' /etc/fstab #/dev/mapper/centos-swap swap swap defaults 0 0
通過free查看swap開關情況:
4)根據規划設置主機名
hostnamectl set-hostname <hostname>
5) 在master添加hosts
cat >> /etc/hosts << EOF 192.168.16.100 master EOF
6) 時區配置和時間同步
查看:date +"%Z %z" 查看當前時區信息
設置:tzselect根據提示進行設置
時間同步:
yum install ntpdate -y ntpdate
time.windows.com
7)將橋接的IPV4流量傳遞到iptables 的鏈
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
# 生效
[root@master-node kubeedge]# sysctl --system
3.安裝Docker
所有節點安裝Docker
1) 更新yum
yum update
2) 安裝 yum-utils,它提供了 yum-config-manager,可用來管理yum源
yum install -y yum-utils wget
3)添加yum源
方式一:
sudo yum-config-manager \ --add-repo \ http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
方式二:
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
3) 安裝docker
sudo yum install -y docker-ce
yum -y install docker-ce-18.06.1.ce-3.el7
4) 啟動docker
設置開機啟動:systemctl enable docker
立即啟動服務:systemctl start docker
查看docker狀態:
systemctl status docker
5)配置/etc/docker/daemon.json
[root@master-node kubeedge]cat > /etc/docker/daemon.json << EOF
{
"registry-mirrors": ["https://b9pmyelo.mirror.aliyuncs.com"],
"insecure-registries": ["harbor.domain.io"]
}
EOF
[root@master-node kubeedge]systemctl daemon-reload && systemctl restart docker
注:registry-mirrors(國內鏡像倉庫)、insecure-registries(私有鏡像倉庫)
4.kubeedge框架部署
master(雲端)節點安裝/kubeadm/kubelet,Kubernetes默認CRI(容器運行時)為Docker,因此先安裝Docker
4.1 K8s安裝
1)添加阿里雲YUM軟件源
cat > /etc/yum.repos.d/kubernetes.repo << EOF [kubernetes] name=Kubernetes baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64 enabled=1 gpgcheck=0 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 EOF
2)安裝kubeadm,kubelet和kubectl
由於版本更新頻繁,這里指定版本號部署:
yum install -y kubelet-1.19.10 kubeadm-1.19.10 kubectl-1.19.10
啟動kubelet並設置開機啟動服務:
#重新加載配置文件 systemctl daemon-reload #啟動kubelet systemctl start kubelet #查看kubelet啟動狀態 systemctl status kubelet #沒啟動成功,報錯先不管,后面的kubeadm init會拉起 #設置開機自啟動 systemctl enable kubelet #查看kubelet開機啟動狀態 enabled:開啟, disabled:關閉 systemctl is-enabled kubelet #查看日志 journalctl -xefu kubelet
#查看kubelet的日志
journalctl -xef -u kubelet -n 20
3)部署Kubernetes Master
使用kubeadm init命令進行集群初始化
在192.168.16.100(Master)執行
kubeadm init \ --apiserver-advertise-address=192.168.16.100 \ --image-repository registry.aliyuncs.com/google_containers \ --kubernetes-version v1.19.10 \ --service-cidr=10.96.0.0/20 \ --pod-network-cidr=10.244.0.0/16
由於默認拉取鏡像地址k8s.gcr.io國內無法訪問,這里指定阿里雲鏡像倉庫地址
4)使用kubectl工具:
配置kubectl命令執行環境
a.未配置環境前,執行kubectl get nodes指令,會顯示如下結果
b.配置kubectl執行環境:
mkdir -p $HOME/.kube cp -i /etc/kubernetes/admin.conf $HOME/.kube/config chown $(id -u):$(id -g) $HOME/.kube/config
此時再執行kubectl get nodes會得到如下結果:
問題1:kubeadm reset
后kubeadm init
出現的問題
# kubectl get node Unable to connect to the server: x509: certificate signed by unknown authority (possibly because of "crypto/rsa: verification error" while trying to verify candidate authority certificate "kubernetes")`
問題1解決辦法:
I got the same error while running $ kubectl get nodes as a root user. I fixed it by exporting kubelet.conf to environment variable.
設置環境變量
export KUBECONFIG=/etc/kubernetes/kubelet.conf kubectl get nodes
5) 部署CNI網絡插件(flannel)
a.下載kube-flannel.yml
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
若出現以下錯誤:
修改hosts文件vi /etc/hosts
# GitHub Start
199.232.28.133 raw.githubusercontent.com
再執行wget命令,可以得到如下結果:
b.執行kube-flannel部署操作
kubectl apply -f kube-flannel.yml 或 kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
通過命令查看系統pods運行情況,查看kube-flannel是否正常運行
kubectl get pods -n kube-system
注意:若flannel出現ImagePullBackOff狀態,可嘗試下面方法:
查看kube-flannel.yml內容
cat kube-flannel.yml |grep image|uniq
根據結果,手動拉取flannel的docker鏡像
docker pull quay.io/coreos/flannel:v0.15.1
查看master節點狀態
kubeadm reset重置集群
在重置后在Master重復步驟4
#在master節點之外的節點進行操作 kubeadm reset systemctl stop kubelet systemctl stop docker rm -rf /var/lib/cni/ rm -rf /var/lib/kubelet/* rm -rf /etc/cni/ ifconfig cni0 down ifconfig flannel.1 down ifconfig docker0 down ip link delete cni0 ip link delete flannel.1 ##重啟kubelet systemctl restart kubelet ##重啟docker systemctl restart docker
5.kubeedge cloudcore部署
雲端部署cloudcore
安裝有兩種方式,一種源碼編譯手動安裝,還有一種是使用kubeedge提供的工具-keadm。手動安裝比較繁瑣,主要是編譯X509經常是個噩夢,有些編譯報錯網上搜索不到解決方案。對於新手而言是一種很大的心智負擔,所以我還是用keadm這個工具去安裝。
但是,這種方式安裝最大的問題就是國內的牆的問題會導致很多某些資源無法下載,比如說 CRD的yaml,cloudcore啟動的service,所以我會結合兩者,采用半手動半工具的安裝方式去幫助大家順利的完成ke的集群搭建
5.1 下載 keadm
wget https://github.com/kubeedge/kubeedge/releases/download/v1.7.0/keadm-v1.7.0-linux-amd64.tar.gz
下載下來之后執行
tar -zxvf keadm-v1.7.0-linux-amd64.tar.gz # 解壓keadm的tar.gz的包 cd keadm-v1.7.0-linux-amd64/keadm/ cp keadm /usr/sbin/ #將其配置進入環境變量,方便使用
5.2 使用keadm安裝cloudcore
keadm init --advertise-address=192.168.16.100 --kubeedge-version=1.7.0
或
keadm init --kubeedge-version=1.7.0 --kube-config=$HOME/.kube/config
注意:
–advertise-address=xxx.xx.xx.xx 這里的xxx.xx.xx.xx換成你master機器的ip,可以是內網地址,也可以是公網ip地址,–kubeedge-version=1.7.0 意思是指定安裝的kubeEdge的版本,如果你默認不指定那么keadm會自動去下載最新的版本
5.3 keadm init
失敗解決方案
網絡被牆了,特別是在公有雲的虛擬機上,出現這種問題的概率特別大
1)在/etc/hosts下添加如下內容
解決keadm初始化過程中可能無法解析raw.githubusercontent.com的問題
# GitHub Start 52.74.223.119 github.com 192.30.253.119 gist.github.com 54.169.195.247 api.github.com 185.199.111.153 assets-cdn.github.com 151.101.76.133 raw.githubusercontent.com 151.101.108.133 user-images.githubusercontent.com 151.101.76.133 gist.githubusercontent.com 151.101.76.133 cloud.githubusercontent.com 151.101.76.133 camo.githubusercontent.com 151.101.76.133 avatars0.githubusercontent.com 151.101.76.133 avatars1.githubusercontent.com 151.101.76.133 avatars2.githubusercontent.com 151.101.76.133 avatars3.githubusercontent.com 151.101.76.133 avatars4.githubusercontent.com 151.101.76.133 avatars5.githubusercontent.com 151.101.76.133 avatars6.githubusercontent.com 151.101.76.133 avatars7.githubusercontent.com 151.101.76.133 avatars8.githubusercontent.com # GitHub End
2)半手動安裝
錯誤一:
devices_v1alpha2_device.yaml(用於設備接入的CRD)下載失敗,
F0608 11:40:15.689702 5530 keadm.go:27] failed to exec 'bash -c cd /etc/kubeedge/crds/devices && wget -k --no-check-certificate --progress=bar:force https://raw.githubusercontent.com/kubeedge/kubeedge/release-1.7/build/crds/devices/devices_v1alpha2_device.yaml', err: --2021-06-08 11:39:54-- https://raw.githubusercontent.com/kubeedge/kubeedge/release-1.7/build/crds/devices/devices_v1alpha2_device.yaml
手動下載
wget https://raw.githubusercontent.com/kubeedge/kubeedge/release-1.7/build/crds/devices/devices_v1alpha2_device.yaml
mkdir -p /etc/kubeedge/crds/devices && mkdir -p /etc/kubeedge/crds/reliablesyncs
cp devices_v1alpha2_device.yaml /etc/kubeedge/crds/devices/
錯誤二:
devices_v1alpha2_devicemodel.yaml下載失敗,
F0608 14:10:11.700467 42153 keadm.go:27] failed to exec 'bash -c cd /etc/kubeedge/crds/devices && wget -k --no-check-certificate --progress=bar:force https://raw.githubusercontent.com/kubeedge/kubeedge/release-1.7/build/crds/devices/devices_v1alpha2_devicemodel.yaml', err: --2021-06-08 14:10:11-- https://raw.githubusercontent.com/kubeedge/kubeedge/release-1.7/build/crds/devices/devices_v1alpha2_devicemodel.yaml
手動下載
wget https://raw.githubusercontent.com/kubeedge/kubeedge/release-1.7/build/crds/devices/devices_v1alpha2_devicemodel.yaml
cp devices_v1alpha2_devicemodel.yaml /etc/kubeedge/crds/devices/
錯誤三:
其他xxx..yaml下載失敗
將下載文件放到/etc/kubeedge/crds/
里面對應的文件夾
https://raw.githubusercontent.com/kubeedge/kubeedge/release-1.7/build/crds/reliablesyncs/cluster_objectsync_v1alpha1.yaml#例如,由該網站可知,文件應該共享到reliablesyncs https://raw.githubusercontent.com/kubeedge/kubeedge/release-1.7/build/crds/reliablesyncs/objectsync_v1alpha1.yaml https://raw.githubusercontent.com/kubeedge/kubeedge/release-1.7/build/crds/router/router_v1_rule.yaml https://raw.githubusercontent.com/kubeedge/kubeedge/release-1.7/build/crds/router/router_v1_ruleEndpoint.yaml
錯誤四:
使用keadm安裝cloudcore,關於yaml的配置文件配置完了,現在要配置cloudcore.service
,此處提醒文件應該存在/etc/kubeedge
里面,不是crds
里面
F0608 14:27:07.887553 45073 keadm.go:27] fail to download service file,error:{failed to exec 'bash -c cd /etc/kubeedge/ && sudo -E wget -t 5 -k --no-check-certificate https://raw.githubusercontent.com/kubeedge/kubeedge/release-1.7/build/tools/cloudcore.service', err: --2021-06-08 14:27:07-- https://raw.githubusercontent.com/kubeedge/kubeedge/release-1.7/build/tools/cloudcore.service
手動下載
下載文件放到/etc/kubeedge
https://raw.githubusercontent.com/kubeedge/kubeedge/release-1.7/build/tools/cloudcore.service https://github.com/kubeedge/kubeedge/releases/download/v1.7.0/kubeedge-v1.7.0-linux-amd64.tar.gz
5.4 初始化成功
keadm init --advertise-address=192.168.107.138 --kubeedge-version=1.7.0
輸出:
Kubernetes version verification passed, KubeEdge installation will start... Expected or Default KubeEdge version 1.7.0 is already downloaded and will checksum for it. kubeedge-v1.7.0-linux-amd64.tar.gz checksum: checksum_kubeedge-v1.7.0-linux-amd64.tar.gz.txt content: kubeedge-v1.7.0-linux-amd64.tar.gz in your path checksum failed and do you want to delete this file and try to download again? [y/N]: 此處輸入N,checksum失敗不影響配置,不必擔心。選擇y通過不了。
安裝成功:
5.5 檢查cloudcore是否啟動
ps -ef|grep cloudcore
未啟動執行:
nohup cloudcore > /var/log/kubeedge/cloudcore.log 2>&1 &
檢查是否報錯
journalctl -xe
5.6獲取雲端令牌token
keadm gettoken
獲取的token,在部署edgecore時需要使用
6.edge端的Mosquitto安裝
可選,不安裝也不影響配置
1)添加EPEL軟件庫
yum -y install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
下載mosquitto
yum -y install mosquitto
6.kubeedge edgecore部署(邊緣節點)
具備Docker環境即可安裝
下載keadm
wget https://github.com/kubeedge/kubeedge/releases/download/v1.7.0/keadm-v1.7.0-linux-amd64.tar.gz
解壓
tar -zxvf keadm-v1.7.0-linux-amd64.tar.gz
進入目錄
cd keadm-v1.7.0-linux-amd64/keadm
加入cloud
./keadm join --cloudcore-ipport=192.168.16.100:10000 --edgenode-name=node --kubeedge-version=1.7.0 --token=3dc13e89ee6b907f7346786d018d0fa4c1efa7ddb0017607c7512bc1b4926449.eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2MjM5OTg0ODd9.hTQMyupZd5d_e5uOVtz3RVsfe9H_BSFnwuLzPRy2ZUg
上面keadm gettoken里面的返回內容
輸出:
F0608 15:03:13.805669 3177 keadm.go:27] failed to exec 'bash -c cd /etreleases/download/v1.7.0/kubeedge-v1.7.0-linux-F0608 15:05:37.624302 3197 keadm.go:27] failed to exec 'bash -c cd /etc/kubeedge/ && wget -k --no-check-certificate --progress=bar:force https://github.com/kubeedge/kubeedge/releases/download/v1.7.0/kubeedge-v1.7.0-linux-amd64.tar.gz', err: --2021-06-08 15:05:37-- https://github.com/kubeedge/kubeedge/releases/download/v1.7.0/kubeedge-v1.7.0-linux-amd64.tar.gz 正在解析主機 github.com (github.com)... 13.250.177.223 正在連接 github.com (github.com)|13.250.177.223|:443... 已連接。 無法建立 SSL 連接。 已轉換了 0 個文件,用時 0 秒。 amd64.tar.gz', err: --2021md64.tar.gz 正在解析主機 github.com (github.com)... 13.229.188.59 正在連接 github.com (github.com)|13.229.188.59|:443... 已連接。 無法建立 SSL 連接。 已轉換了 0 個文件,用時 0 秒。
同樣類似於cloudcore,將下面對應文件共享到配置目錄/etc/kubeedge
https://github.com/kubeedge/kubeedge/releases/download/v1.7.0/kubeedge-v1.7.0-linux-amd64.tar.gz https://raw.githubusercontent.com/kubeedge/kubeedge/release-1.7/build/tools/edgecore.service
檢查edgecore是否安裝成功並啟動:
ps -ef|grep edgecore
edgecore啟動失敗定位原因:
journalctl -xe
journalctl -u edgecore.service -f
刪除邊緣結點
# cloud $ keadm reset # --kube-config=$HOME/.kube/config # edge $ keadm reset # 節點 keadm reset 將停止 edgecore ,並且不會卸載/刪除任何先決條件。 # 逐個停止進程,刪除相關文件依賴 rm -rf /var/lib/kubeedge /var/lib/edged /etc/kubeedge rm -rf /etc/systemd/system/edgecore.service rm -rf /usr/local/bin/edgecoreps
7.檢查Edge節點配置是否成功
在Master上驗證是否成功,使用
輸入:
kubectl get nodes
或
kubectl get nodes -owide
輸出:
如果出現版本中帶有kubeedge的node,則說明部署成功
8、測試 kubernetes 集群
在 Kubernetes 集群中創建一個 pod,驗證是否正常運行:
$ kubectl create deployment nginx --image=nginx
$ kubectl expose deployment nginx --port=80 --type=NodePort
$ kubectl get pod,svc
訪問地址:http://NodeIP:Port