【二】Kubernetes 群集布署-kubeadm方法(亲自测试)

一、简述

此次布署 Kubernetes 群集是根据 kubeadm 专用工具来开展布署, kubeadm 是 Kubernetes 官⽅给予的⽤于迅速布署 Kubernetes 群集的⼯具,利⽤其来布署 Kubernetes 群集实际操作起來十分简单。

空话多讲了,总之也是节选自在网上,逐渐实际操作吧。

二、自然环境表明

此次布署的自然环境一共应用四台设备,一台做为 HarBor 器皿镜像系统库房,此外三台做为 Kubernetes 群集,选用一主两从的一个方法,实际构架如下图。

image-20210526145034133

版本号表明:

电脑操作系统:CentOS -7

Docker版本号:20.10.6

Kubernetes版本号:1.21.1

全是选用现阶段最新版开展布署,CentOS 提议降到最低安裝,那样能够 缓解系统软件净重。

三、准备工作(全部连接点)

设定系统软件IP地址及其 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

最先应用下边的指令获得 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语句(默认设置不用改动)
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    4359e756b596   11 days ago    131MB
k8s.gcr.io/kube-scheduler            v1.21.1    a4183b88f6e6   11 days ago    50.5MB
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   685kB
k8s.gcr.io/coredns/coredns           v1.8.0     296a6d5035e2   7 months ago   42.5CB
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   8米14s   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   十米   v1.21.1

查询 kube-system pod 情况

[root@k8s-master01 ~]# kubectl get pod -n kube-system
NAME                                   READY   STATUS    RESTARTS   AGE
coredns-559ad4d5db-lwc6f               1/1     Running   1          143M
coredns-559ad4d5db-lws29               1/1     Running   1          143M
etcd-k8s-master01                      1/1     Running   1          142m
kube-apiserver-k8s-master01            1/1     Running   1          142m
kube-controller-manager-k8s-master01   1/1     Running   1          142m
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          142m

额外:查询群集器皿的详尽情况

[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.r3w9f4ph07c6vmre   --discovery-token-ca-cert-hash sha256:ce86e3f986b8ecc716571426d671867be58b9a2b331464454e0730ebcdf65c8d

别的连接点一样加上方法。

查询每一个连接点情况

[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>                 12两米   v1.21.1
[root@k8s-master01 ~]# kubectl get pod -n kube-system
NAME                                   READY   STATUS    RESTARTS   AGE
coredns-559ad4d5db-lwc6f               1/1     Running   1          146m
coredns-559ad4d5db-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          12两米
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          12两米
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.hyk3ghdx2dnodytr
[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)= ce86e3f986b8ecc716571426d671867be58b9a2b331464454e0730ebcdf65c8d

连接点填好文件格式

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

评论(0条)

刀客源码 游客评论