摘要
用kubeadm布署Kubernetes群集,简单又方便。让我们开始吧!
正文
【二】Kubernetes 群集布署-kubeadm方法(亲自测试)
一、简述
此次布署 Kubernetes 群集是根据 kubeadm 专用工具来开展布署, kubeadm 是 Kubernetes 官⽅给予的⽤于迅速布署 Kubernetes 群集的⼯具,利⽤其来布署 Kubernetes 群集实际操作起來十分简单。
空话多讲了,总之也是节选自在网上,逐渐实际操作吧。
二、自然环境表明
此次布署的自然环境一共应用四台设备,一台做为 HarBor 器皿镜像系统库房,此外三台做为 Kubernetes 群集,选用一主两从的一个方法,实际构架如下图。
版本号表明:
电脑操作系统: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