【二】Kubernetes 集群部署-kubeadm方式(親測)


一、概述

本次部署 Kubernetes 集群是通過 kubeadm 工具來進行部署, kubeadm 是 Kubernetes 官⽅提供的⽤於快速部署 Kubernetes 集群的⼯具,利⽤其來部署 Kubernetes 集群操作起來非常簡便。

廢話多說了,反正也是摘自網上,開始操作吧。

二、環境說明

本次部署的環境一共使用四台機器,一台作為 HarBor 容器鏡像倉庫,另外三台作為 Kubernetes 集群,采用一主兩從的一個方式,具體架構如下圖。

image-20210526145034133

版本說明:

操作系統:CentOS -7

Docker版本:20.10.6

Kubernetes版本:1.21.1

都是采用目前最新版本進行部署,CentOS 建議最小化安裝,這樣可以減輕系統重量。

三、准備工作(所有節點)

設置系統主機名以及 Host 文件的相互解析

hostnamectl  set-hostname  k8s-master01
hostnamectl  set-hostname  k8s-node01
hostnamectl  set-hostname  k8s-node02
[root@k8s-master01 ~]# cat >> /etc/hosts <<EOF
192.168.115.11 k8s-master01
192.168.115.12 k8s-node01
192.168.115.13 k8s-node02
EOF

拷貝到另外兩台節點

[root@k8s-master01 ~]# scp /etc/hosts root@k8s-node01:/etc/hosts
[root@k8s-master01 ~]# scp /etc/hosts root@k8s-node02:/etc/hosts

安裝相關依賴包

[root@localhost ~]# yum install -y conntrack ntpdate ntp ipvsadm ipset jq iptables curl sysstat libseccomp wgetvimnet-tools git

設置防火牆為 Iptables 並設置空規則

[root@localhost ~]# systemctl  stop firewalld  &&  systemctl  disable firewall
[root@localhost ~]# yum -y install iptables-services  &&  systemctl  start iptables  &&  systemctl  enable iptables&&  iptables -F  &&  service iptables save

關閉 SELINUX

[root@localhost ~]# swapoff -a && sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
[root@localhost ~]# setenforce 0 && sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config

調整內核參數,對 K8S 起到優化作用

cat > kubernetes.conf <<EOF
net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-ip6tables=1
net.ipv4.ip_forward=1
net.ipv4.tcp_tw_recycle=0
vm.swappiness=0 # 禁止使用 swap 空間,只有當系統 OOM 時才允許使用它
vm.overcommit_memory=1 # 不檢查物理內存是否夠用
vm.panic_on_oom=0 # 開啟 OOM
fs.inotify.max_user_instances=8192
fs.inotify.max_user_watches=1048576
fs.file-max=52706963
fs.nr_open=52706963
net.ipv6.conf.all.disable_ipv6=1
net.netfilter.nf_conntrack_max=2310720
EOF
[root@localhost ~]# cp kubernetes.conf  /etc/sysctl.d/kubernetes.conf
[root@localhost ~]# sysctl -p /etc/sysctl.d/kubernetes.conf

調整系統時區(如果是Asia/Shanghai,則跳過該步驟)

[root@localhost ~]# timedatectl set-timezone Asia/Shanghai
[root@localhost ~]# timedatectl set-local-rtc 0
[root@localhost ~]# systemctl restart crond
[root@localhost ~]# systemctl restart rsyslog.service 

關閉系統不需要服務

[root@localhost ~]# systemctl stop postfix && systemctl disable postfix

設置 rsyslogd 和 systemd journald

設置日志保存方式,默認使用 systemd journald 日志存儲方案。

[root@localhost ~]# mkdir /var/log/journa
[root@localhost ~]# mkdir /etc/systemd/journald.conf.d
cat > /etc/systemd/journald.conf.d/99-prophet.conf <<EOF
[Journal]
# 持久化保存到磁盤
Storage=persistent
# 壓縮歷史日志
Compress=yes
SyncIntervalSec=5m
RateLimitInterval=30s
RateLimitBurst=1000
# 最大占用空間 10G
SystemMaxUse=10G
# 單日志文件最大 200M
SystemMaxFileSize=200M
# 日志保存時間 2 周
MaxRetentionSec=2week
# 不將日志轉發到 
syslogForwardToSyslog=no
EOF

重啟 systemd-journald

[root@localhost ~]# systemctl restart systemd-journald

四、組件安裝(所有節點)

Docker安裝

[root@k8s-master01 ~]# yum install -y yum-utils device-mapper-persistent-data lvm2
[root@k8s-master01 ~]# yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
[root@k8s-master01 ~]# yum update -y && yum install -y docker-ce

升級系統內核

CentOS 7.x 系統自帶的 3.10.x 內核存在一些 Bugs,導致運行的 Docker、Kubernetes 不穩定,例如: rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm

[root@localhost ~]# rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm
[root@localhost ~]# yum --enablerepo=elrepo-kernel install -y kernel-lt
# 查看系統可用內核
[root@localhost ~]# cat /boot/grub2/grub.cfg |grep menuentry
# 設置開機從新內核啟動
[root@localhost ~]# grub2-set-default 'CentOS Linux (5.4.121-1.el7.elrepo.x86_64) 7 (Core)'

這里需要注意的是修改成你升級的版本,可能內核更新了導致版本和我的教程不一致。

安裝完成后,重啟所以節點,查看內核是否已經更改

[root@k8s-master01 ~]# uname -r
5.4.121-1.el7.elrepo.x86_64

配置 daemon.json

[root@k8s-master01 ~]# mkdir /etc/docker
cat > /etc/docker/daemon.json <<EOF
{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
    "max-size": "100m"  
}
}
EOF

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

重啟 Docker 服務

[root@k8s-master01 ~]# systemctl daemon-reload && systemctl restart docker && systemctl enable docker

准備一下 Kubernetes 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.gpghttp://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

kubelet、 kubeadm、 kubectl 安裝

這里安裝最新版本的,也可以指定版本安裝。

[root@k8s-master01 ~]# yum -y  install  kubeadm kubectl kubelet
...省略輸出信息
[root@k8s-master01 ~]# systemctl enable kubelet.service

指定版本安裝可能會出現報錯

具體如下:

[root@k8s-master01 ~]# yum install kubelet-1.13.3 kubeadm-1.13.3 kubectl-1.13.3
已加載插件:fastestmirror
Loading mirror speeds from cached hostfile
 * base: mirrors.aliyun.com
 * elrepo: hkg.mirror.rackspace.com
 * extras: mirrors.aliyun.com
 * updates: mirrors.aliyun.com
正在解決依賴關系
--> 正在檢查事務
---> 軟件包 kubeadm.x86_64.0.1.13.3-0 將被 安裝
--> 正在處理依賴關系 kubernetes-cni >= 0.6.0,它被軟件包 kubeadm-1.13.3-0.x86_64 需要
---> 軟件包 kubectl.x86_64.0.1.13.3-0 將被 安裝
---> 軟件包 kubelet.x86_64.0.1.13.3-0 將被 安裝
--> 正在處理依賴關系 kubernetes-cni = 0.6.0,它被軟件包 kubelet-1.13.3-0.x86_64 需要
--> 正在檢查事務
---> 軟件包 kubelet.x86_64.0.1.13.3-0 將被 安裝
--> 正在處理依賴關系 kubernetes-cni = 0.6.0,它被軟件包 kubelet-1.13.3-0.x86_64 需要
---> 軟件包 kubernetes-cni.x86_64.0.0.8.7-0 將被 安裝
--> 解決依賴關系完成
錯誤:軟件包:kubelet-1.13.3-0.x86_64 (kubernetes)
          需要:kubernetes-cni = 0.6.0
          可用: kubernetes-cni-0.3.0.1-0.07a8a2.x86_64 (kubernetes)
              kubernetes-cni = 0.3.0.1-0.07a8a2
          可用: kubernetes-cni-0.5.1-0.x86_64 (kubernetes)
              kubernetes-cni = 0.5.1-0
          可用: kubernetes-cni-0.5.1-1.x86_64 (kubernetes)
              kubernetes-cni = 0.5.1-1
          可用: kubernetes-cni-0.6.0-0.x86_64 (kubernetes)
              kubernetes-cni = 0.6.0-0
          可用: kubernetes-cni-0.7.5-0.x86_64 (kubernetes)
              kubernetes-cni = 0.7.5-0
          可用: kubernetes-cni-0.8.6-0.x86_64 (kubernetes)
              kubernetes-cni = 0.8.6-0
          正在安裝: kubernetes-cni-0.8.7-0.x86_64 (kubernetes)
              kubernetes-cni = 0.8.7-0
 您可以嘗試添加 --skip-broken 選項來解決該問題
 您可以嘗試執行:rpm -Va --nofiles --nodigest

指定版本安裝報錯解決辦法:

[root@k8s-master01 ~]# yum install  kubelet-1.13.3 kubeadm-1.13.3 kubectl-1.13.3 kubernetes-cni-0.6.0

首先使用下面的命令獲取 K8s 需求的鏡像版本

[root@k8s-master01 ~]# kubeadm config images list
k8s.gcr.io/kube-apiserver:v1.21.1
k8s.gcr.io/kube-controller-manager:v1.21.1
k8s.gcr.io/kube-scheduler:v1.21.1
k8s.gcr.io/kube-proxy:v1.21.1
k8s.gcr.io/pause:3.4.1
k8s.gcr.io/etcd:3.4.13-0
k8s.gcr.io/coredns/coredns:v1.8.0

由於國內網絡原因 kubeadm init 會卡住不動,一卡就是半個小時,然后報出這種問題

[ERROR ImagePull]: failed to pull image k8s.gcr.io/kube-apiserver:v1.21.1: output: Error response from daemon: Get https://k8s.gcr.io/v2/: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)

解決辦法,編寫 Shell 腳本自動拉取並修改鏡像名稱

[root@k8s-master01 k8s-install]# cat pull_k8s_images.sh 
set -o errexit
set -o nounset
set -o pipefail
# 修改你剛剛獲取到的版本信息
KUBE_VERSION=v1.21.1
KUBE_PAUSE_VERSION=3.4.1
ETCD_VERSION=3.4.13-0
DNS_VERSION=v1.8.0
# update line 修改下載鏡像的源(默認不需要修改)
GCR_URL=k8s.gcr.io
# 這里就是寫你要使用的倉庫(默認不需要修改)
DOCKERHUB_URL=gotok8s
# 這里是鏡像列表(默認不需要修改)
images=(
kube-proxy:${KUBE_VERSION}
kube-scheduler:${KUBE_VERSION}
kube-controller-manager:${KUBE_VERSION}
kube-apiserver:${KUBE_VERSION}
pause:${KUBE_PAUSE_VERSION}
etcd:${ETCD_VERSION}
coredns:${DNS_VERSION}
)
##這里是拉取和改名的循環語句(默認不需要修改)
for imageName in ${images[@]} ; do
  docker pull $DOCKERHUB_URL/$imageName
  docker tag $DOCKERHUB_URL/$imageName $GCR_URL/$imageName
  docker rmi $DOCKERHUB_URL/$imageName
done

執行腳本拉取鏡像

[root@k8s-master01 ~]# chmod +x pull_k8s_images.sh 
[root@k8s-master01 ~]# ./pull_k8s_images.sh
[root@k8s-master01 ~]# docker images
REPOSITORY                           TAG        IMAGE ID       CREATED        SIZE
k8s.gcr.io/kube-apiserver            v1.21.1    771ffcf9ca63   11 days ago    126MB
k8s.gcr.io/kube-proxy                v1.21.1    4359e752b596   11 days ago    131MB
k8s.gcr.io/kube-scheduler            v1.21.1    a4183b88f6e6   11 days ago    50.6MB
k8s.gcr.io/kube-controller-manager   v1.21.1    e16544fd47b0   11 days ago    120MB
k8s.gcr.io/pause                     3.4.1      0f8457a4c2ec   4 months ago   683kB
k8s.gcr.io/coredns/coredns           v1.8.0     296a6d5035e2   7 months ago   42.5MB
k8s.gcr.io/etcd                      3.4.13-0   0369cf4303ff   8 months ago   253MB

在 K8s 初始化的時候,可能會遇到的報錯

failed to pull image k8s.gcr.io/coredns/coredns:v1.21.1: output: Error response from daemon: Get https://k8s.gcr.io/v2/: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers) 

解決辦法

由於新版本改名了,后面多了一個“/coredns”,所以 tag 改名要改成 k8s.gcr.io/coredns/coredns:xxx

[root@k8s-master01 ~]# docker tag k8s.gcr.io/coredns:v1.8.0 k8s.gcr.io/coredns/coredns:v1.8.0

其他鏡像拉取失敗問題可以參考該文檔:
https://blog.csdn.net/weixin_43168190/article/details/107227626

五、K8s-master01上配置

執行初始化

[root@k8s-master01 ~]# kubeadm init --kubernetes-version=v1.21.1 --apiserver-advertise-address 192.168.115.11 --pod-network-cidr=10.244.0.0/16 | tee kubeadm-init.log

--kubernetes-version : ⽤於指定 k8s 版本;
--apiserver-advertise-address :⽤於指定使⽤ Master 的哪個 network interface 進⾏通信,若不指定,則 kubeadm 會⾃動選擇具有默認⽹關的 interface;
--pod-network-cidr :⽤於指定 Pod 的⽹絡范圍。該參數使⽤依賴於使⽤的⽹絡⽅案,本⽂將使⽤經典的flannel ⽹絡⽅案;

| tee kubeadm-init.log 是將初始化過程輸出到 kubeadm-init.log 日志文件中方便我們后續查看。

初始化完成之后按照提示執行

[root@k8s-master01 ]# mkdir -p $HOME/.kube
[root@k8s-master01 ]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@k8s-master01 ]# sudo chown $(id -u):$(id -g) $HOME/.kube/config

在 Master上⽤ root⽤戶執⾏下列命令來配置 kubectl

[root@k8s-master01 ]# echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> /etc/profile
[root@k8s-master01 ]# source /etc/profile
[root@k8s-master01 ]# echo $KUBECONFIG

查看K8s節點狀態

[root@k8s-master01 flannel]# kubectl get nodes
NAME           STATUS     ROLES                  AGE     VERSION
k8s-master01   NotReady   control-plane,master   8m14s   v1.21.1

我們發現已經可以成功查詢node節點信息了,但是節點的狀態卻是NotReady,不是Runing的狀態。
原因是此時我們使用ipvs+flannel的方式進行網絡通信,但是flannel網絡插件還沒有部署,因此節點狀態為NotReady。

安裝Pod⽹絡

wget https://xxxx.kube-flannel.yml 的時候可能會顯示連接失敗;
是因為網站被牆了,建議在/etc/hosts文件添加一條。

199.232.68.133 raw.githubusercontent.com
[root@k8s-master01 ]# wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
[root@k8s-master01 flannel]# kubectl apply -f kube-flannel.yml

如果可以FQ另外一種方式

[root@k8s-master01 ]# kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

再次查看節點狀態,k8s-master01 已經 Ready

[root@k8s-master01 ]# kubectl get nodes
NAME           STATUS   ROLES                  AGE   VERSION
k8s-master01   Ready    control-plane,master   10m   v1.21.1

查看 kube-system pod 狀態

[root@k8s-master01 ~]# kubectl get pod -n kube-system
NAME                                   READY   STATUS    RESTARTS   AGE
coredns-558bd4d5db-lwc6f               1/1     Running   1          143m
coredns-558bd4d5db-lws29               1/1     Running   1          143m
etcd-k8s-master01                      1/1     Running   1          144m
kube-apiserver-k8s-master01            1/1     Running   1          144m
kube-controller-manager-k8s-master01   1/1     Running   1          144m
kube-flannel-ds-wvjvx                  1/1     Running   2          120m
kube-proxy-m7ssr                       1/1     Running   1          120m
kube-scheduler-k8s-master01            1/1     Running   1          144m

附加:查看集群容器的詳細狀態

[root@k8s-master01 ]# kubectl get pod -n kube-system -o wide

六、K8s 集群添加 SLAVE 節點

可以通過我們初始化的時候輸出的日志來復制添加,kubeadm-init.log 文件中。

[root@k8s-node01 ~]# kubeadm join 192.168.115.11:6443 --token idetsu.r3w9f4ph06c6vmre   --discovery-token-ca-cert-hash sha256:ce86e3f982b8ecc716571426d671867be58b9a2b331464454e0730ebcdf65c8d

其他節點一樣添加方式。

查看每個節點狀態

[root@k8s-master01 ~]# kubectl get nodes
NAME           STATUS   ROLES                  AGE    VERSION
k8s-master01   Ready    control-plane,master   146m   v1.21.1
k8s-node01     Ready    <none>                 123m   v1.21.1
k8s-node02     Ready    <none>                 122m   v1.21.1
[root@k8s-master01 ~]# kubectl get pod -n kube-system
NAME                                   READY   STATUS    RESTARTS   AGE
coredns-558bd4d5db-lwc6f               1/1     Running   1          146m
coredns-558bd4d5db-lws29               1/1     Running   1          146m
etcd-k8s-master01                      1/1     Running   1          146m
kube-apiserver-k8s-master01            1/1     Running   1          146m
kube-controller-manager-k8s-master01   1/1     Running   1          146m
kube-flannel-ds-lp9ns                  1/1     Running   1          140m
kube-flannel-ds-t694v                  1/1     Running   2          122m
kube-flannel-ds-wvjvx                  1/1     Running   2          123m
kube-proxy-gs4mk                       1/1     Running   2          146m
kube-proxy-m7ssr                       1/1     Running   1          123m
kube-proxy-xsxhl                       1/1     Running   1          122m
kube-scheduler-k8s-master01            1/1     Running   1          146m

到此 Kubernetes 集群已經部署完成了,你部署的過程中有什么疑問可以在下方留言,讓大家一起幫你解決。

由於一遍文章太長了,HarBor 私有倉庫部署、 K8s Dashboard(K8s Web管理界面)部署另起一篇來記錄。

以上有不恰當或者講得不對的地方,希望各位留言指正,如果對你有幫助麻煩 點贊 一下哦,謝謝!

七、附加操作

7.1 找不到 Token

如果 token 找不到,則可以去 Master上執⾏如下命令來獲取

[root@k8s-master01 ~]#  kubeadm token create
srlmuw.hyk2ghdx2dnodytr
[root@k8s-master01 ~]# openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^ .* //'
(stdin)= ce86e3f982b8ecc716571426d671867be58b9a2b331464454e0730ebcdf65c8d

節點填寫格式

kubeadm join 192.168.115.11:6443 --token <token> --discoverytoken-ca-cert-hash sha256:<hash>

7.2 拆卸集群

⾸先處理各節點

kubectl drain <node name> --delete-local-data --force --ignore-daemonsets
kubectl delete node <node name>

⼀旦節點移除之后,則可以執⾏如下命令來重置集群

kubeadm reset


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM