实战-kubeadm方式搭建k8s集群-v1-20-0-20210605-测试成功-mk
实战:kubeadm方式搭建k8s集群(k8s-v1.20.0,docker-20.10.7-ce)-2021.6.5(部署成功-mk)
目录
[TOC]
前言
本人博客宗旨:
1.本人提供的实战文档过程超详细,拿着我的博客,每个人最终都可以成功测试出实验现象,完全避免网上的一些埋着很多坑的博客(特别浪费时间,个人深有感触);
2.自己博客主张以实战为主,但同时会辅助一些理论知识,理论部分请主要查看基础知识章节;
3.博客力求排版美观、组织语言简明扼要;
4.提供实验涉及软件、源码;
5.实验过程如有遇到任何问题或者文章中有任何不足之处,欢迎留言或随时联系鄙人,微信:x2675263825,QQ:2675263825,在it学习的道路上,让我们一起共同成长!
鸣谢
这里,非常感谢IT学神MK老师
分享的优良且细致的公开课,及阿良老师
的优质课程。本篇文章是从老师公开课及文档整理而来的,欢迎小伙伴查阅。
一.基础知识
本片文章主要介绍了kubeadm部署k8s(离线软件源)的实验过程,大家可以get到一个如何制作离线安装包的方式。具体详细关于kubeadm部署k8s文章,可参考我的另一篇博客:[避坑实战-快速部署一个kubernetes集群(超详细-已成功测试)-20210605](https://www.onlyonexl.cn/2021/06/05/12-%E9%81%BF%E5%9D%91%E5%AE%9E%E6%88%98-%E5%BF%AB%E9%80%9F%E9%83%A8%E7%BD%B2%E4%B8%80%E4%B8%AAkubernetes%E9%9B%86%E7%BE%A4(%E8%B6%85%E8%AF%A6%E7%BB%86-%E5%B7%B2%E6%88%90%E5%8A%9F%E6%B5%8B%E8%AF%95)-20210605/)。
二.实验过程
实验环境
1、硬件环境
3台虚机 2c2g,20g。(nat模式,可访问外网)
角色 | 主机名 | ip |
---|---|---|
master节点 | k8s-master | 172.29.9.31 |
node节点 | k8s-node1 | 172.29.9.32 |
node节点 | k8s-node2 | 172.29.9.33 |
2、软件环境
软件 | 版本 |
---|---|
操作系统 | centos7.7_x64 1908 mini(一定要是这个系统才行) |
docker | 20.10.7 |
kubernetes | v1.20.0 |
注意:
本次是采用kubeadm以离线安装包方式部署k8s,因此,操作系统版本一定要和我的保持一致,否则可能因一些软件包版本问题导致实验测试失败。
实验软件
链接:https://pan.baidu.com/s/1WTjyTRnvHvdpQjOCPnDX1w
提取码:j7dd
百度云盘位置:
特别注意
想要用kubeadm离线部署k8s,就需要先制作离线yum源和镜像离线包:
1.关于yum离线包制作:具体做法请阅读我的博客:14-实战-如何使用网络上下载的软件包做一个自己的yum源仓-2010606
yum install -y yum-utils device-mapper-persistent-data lvm2 --downloadonly --downloaddir=k8s-docker
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum install -y docker-ce docker-ce-cli containerd.io --downloadonly --downloaddir=k8s-docker
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
yum install -y kubelet-1.20.0 kubeadm-1.20.0 kubectl-1.20.0 --downloadonly --downloaddir=k8s-docker
2.但是,想要制作镜像离线包,就需要先以kubeadms部署一套k8s,然后再导出本地所有镜像。
具体如何搭建,请看我的博客文章避坑实战-快速部署一个kubernetes集群(超详细-已成功测试)-20210605。
具体如何导出所有本地镜像,请看我的博客文章实战-离线docker镜像包制作方法-20210605。
本次,我已经提前准备好了以上2个离线包,大家直接使用即可。
接下来,就开始使用kubeadm以离线安装包方式部署k8s了,基本步骤和我的上面提到的博客文档:避坑实战-快速部署一个kubernetes集群(超详细-已成功测试)-20210605。类似,大家可以参考。
0.集群环境配置(all节点均要配置)
(1)配置互信
说明:这边配置互信,是为了后续在从k8s-master节点往node节点传输文件时比较方便;
在k8s-master上生成ssh密钥对:
[root@k8s-master ~]#ssh-keygen #一路回车即可
把公钥文件赋值到自己及2个node节点:
[root@k8s-master ~]#ssh-copy-id 172.29.9.31
[root@k8s-master ~]#ssh-copy-id 172.29.9.32
[root@k8s-master ~]#ssh-copy-id 172.29.9.33
测试互信是否配置成功?-->经测试,互信配置成功!
(2)Linux基础环境配置
关闭且禁用如下服务:firewalld、NetworkManager、selinux
systemctl stop firewalld && systemctl disable firewalld
systemctl stop NetworkManager && systemctl disable NetworkManager
setenforce 0
sed -i s/SELINUX=enforcing/SELINUX=disabled/ /etc/selinux/config
(3)关闭swap分区
说明:以下提供了2种关闭swap分区的方法,这里2条命令都刷一下!
swapoff -a
sed -ri 's/.*swap.*/#&/' /etc/fstab
#说明
kubelet,它是不支持你启动swap的,如果你不把它关掉,kubelet是起不来的;
可能kublet考虑到用swap做数据交换的话,对性能影响比较大;
swap必须关,否则kubelet起不来,k8s集群起不来;
(4)设置主机名
hostnamectl --static set-hostname k8s-master
bash
hostnamectl --static set-hostname k8s-node1
bash
hostnamectl --static set-hostname k8s-node2
bash
(5)所有节点添加hosts内容
cat >> /etc/hosts << EOF
172.29.9.31 k8s-master
172.29.9.32 k8s-node1
172.29.9.33 k8s-node2
EOF
(6)将桥接的IPv4流量传递到iptables的链
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system
说明:这个是一定要配置的;不配置的话,在安装过程中会有warning的;
(7)时间同步
yum install ntpdate -y
ntpdate time.windows.com
说明:
因为里面涉及到证书,而证书对时间是很敏感的,里面的校验都是需要用到时间的,因此这3台机器必须保持时间同步;
- 到此,集群初始化工作已经完成了,此时对3台机器做一个快照。
1.配置 kubeadm、docker-ce 的离线 yum 源(all节点都要配置)
(1)在master节点配置 kubeadm、docker-ce 的离线 yum 源
上传文件到mster节点的/root/目录下:
解压yum离线安装并配置repo文件:
注意:此时已经不需要本地yum源了,为了现象更直观,这里建议把原有yum仓库给屏蔽掉;
[root@k8s-master ~]#cd /etc/yum.repos.d/
[root@k8s-master yum.repos.d]#ls
backup-2021-05-30 CentOS-CR.repo CentOS-fasttrack.repo CentOS-Sources.repo
CentOS-Base.repo CentOS-Debuginfo.repo CentOS-Media.repo CentOS-Vault.repo
[root@k8s-master yum.repos.d]#mv * backup-2021-05-30/
mv: cannot move ‘backup-2021-05-30’ to a subdirectory of itself, ‘backup-2021-05-30/backup-2021-05-30’
[root@k8s-master yum.repos.d]#ls
backup-2021-05-30
[root@k8s-master yum.repos.d]#
再配置本次的离线Yum仓库:
tar xf k8s-docker.tar.gz -C /opt/
tee /etc/yum.repos.d/k8s-docker.repo << 'EOF'
[k8s-docker]
name=k8s-docker
baseurl=file:///opt/k8s-docker
enabled=1
gpgcheck=0
EOF
(2)在node1节点配置 kubeadm、docker-ce 的离线 yum 源
[root@k8s-master ~]#scp /etc/yum.repos.d/k8s-docker.repo root@172.29.9.32:/etc/yum.repos.d/
[root@k8s-master ~]#scp -r /opt/k8s-docker/ root@172.29.9.32:/opt/
(3)同理,在node2节点配置 kubeadm、docker-ce 的离线 yum 源
[root@k8s-master ~]#scp /etc/yum.repos.d/k8s-docker.repo root@172.29.9.33:/etc/yum.repos.d/
[root@k8s-master ~]#scp -r /opt/k8s-docker/ root@172.29.9.33:/opt/
2.离线yum安装docker软件(all节点都要配置)
这里利用多窗口方式批量配置如下命令;
我们已经配置了 docker 本地源,这里直接安装 docker-ce 软件即可。
安装依赖包:
yum install -y yum-utils device-mapper-persistent-data lvm2
安装docker:
yum install -y docker-ce docker-ce-cli containerd.io
systemctl start docker && systemctl enable docker
mkdir -p /etc/docker
tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors":["https://dockerhub.azk8s.cn","http://hub-mirror.c.163.com","http://qtid6917.mirror.aliyuncs.com"]
}
EOF
systemctl daemon-reload
systemctl restart docker
docker安装后验证是否安装成功?
3.离线yum安装kubeadm/kuebctl/kubelet软件(all节点都要配置)
在 master 和 node 上安装 kubeadm 组件,用于后期安装 k8s 使用,现在还没有安装 k8s,注意
安装 kubelet 的软件包在我们离线 yum 源中已经包含,可以直接安装,如需安装其他版本 k8s 可以配
置在线源进行安装。
yum install -y kubelet-1.20.0 kubeadm-1.20.0 kubectl-1.20.0
systemctl enable kubelet
4.导入下离线镜像(all节点都要配置)
上传镜像文件到master节点:
在master 上,离线导入 docker 镜像。3 台机器都导入一下,避免 node 节点找不到镜像。
[root@k8s-master ~]#docker load -i k8s-images-v1.20.0.tar.gz #我已经把所有 k8s 镜像,都导成一个包了。
[root@k8s-master ~]#gzip -dc k8s-images-v1.20.0.tar.gz |ssh root@172.29.9.32 'cat | docker load'
[root@k8s-master ~]#gzip -dc k8s-images-v1.20.0.tar.gz |ssh root@172.29.9.33 'cat | docker load'
#注:gzip 参数: -c 将输出写到标准输出上,并保留原有文件。-d 将压缩文件解压。
导入完成后,本地查看镜像:
5.使用 kubeadm 初始化 k8s 集群(master节点)
在master节点执行如下命令:
kubeadm init \
--apiserver-advertise-address=172.29.9.31 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.20.0 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16 \
--ignore-preflight-errors=all
#注:
--image-repository registry.aliyuncs.com/google_containers 为保证拉取镜像不到国外站点拉取,手动指定仓库地址为 registry.aliyuncs.com/google_containers。kubeadm 默认从k8ss.grc.io 拉取镜像。
安装完成:
节点注册命令我们保存下来稍后我们需要:
kubeadm join 172.29.9.31:6443 --token r7p5jz.b7qxahhbvy5o2kgk \
--discovery-token-ca-cert-hash sha256:664cccf826d417c762fdc8503d9091af9a49236269c6d460843e73f39ec5d514
配置 kubectl 的配置文件,保存一个证书,这样 kubectl 命令可以使用这个证书对 k8s 集群进行管
理:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
查看集群状态:
6.将Node节点加入到当前集群中(在node节点执行)
- 注意:如果当时忘记复制那个join命令了,该怎么办呢?
默认token有效期为24小时,当过期之后,该token就不可用了。这时就需要重新创建token,可以直接使用命令快捷生成:(注意:如果token还在有效期的话,那么就会打印出原来的token)
#在master节点上查看加入节点的命令:
[root@k8s-master ~]#kubeadm token create --print-join-command
kubeadm join 172.29.9.31:6443 --token r7p5jz.b7qxahhbvy5o2kgk \
--discovery-token-ca-cert-hash sha256:664cccf826d417c762fdc8503d9091af9a49236269c6d460843e73f39ec5d514
[root@k8s-master ~]
- 开始join进群
#在2个node节点执行如下命令:
kubeadm join 172.29.9.31:6443 --token r7p5jz.b7qxahhbvy5o2kgk \
--discovery-token-ca-cert-hash sha256:664cccf826d417c762fdc8503d9091af9a49236269c6d460843e73f39ec5d514
- 执行过程截图如下
- 此时,再到master节点查看下集群状态,发现已经多出了2个node节点了。
7.安装 kubernetes 网络组件-Calico
上传 calico.yaml 到 linux 中,使用 yaml 文件安装 calico 网络插件 :
Calico是一个纯三层的数据中心网络方案,是目前Kubernetes主流的网络方案。(工作中:calico用的比较多)
- 下载YAML:
wget https://docs.projectcalico.org/manifests/calico.yaml #这个需要科学上网,建议直接使用我这边提供的calico.yaml文件
- 编辑calicao的yaml文件
将下载好的calico.yaml文件传到/root/目录下,进行编辑:
下载完后还需要修改里面定义Pod网络(CALICO_IPV4POOL_CIDR),与前面kubeadm init的 --pod-network-cidr指定的一样。
[root@k8s-master ~]#ll -h calico.yaml
-rw-r--r-- 1 root root 185K Jun 2 06:23 calico.yaml
[root@k8s-master ~]#vim calico.yaml
- 修改完后文件后,部署:
[root@k8s-master ~]#kubectl apply -f calico.yaml
- 验证
我们可以用如下命令来看一下这4个pod是否准备就绪,等Calico Pod都Running,节点也会准备就绪:
[root@k8s-master ~]#kubectl get pods -n kube-system
8.实战-安装 kubernetes-dashboard-2.0
Dashboard是官方提供的一个UI,可用于基本管理K8s资源。
- 下载
wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.3/aio/deploy/recommended.yaml
#需要科学上网下载
- 这里使用我下载好的就行
课件中文件名是:kubernetes-dashboard.yaml
这里手动上传kubernetes-dashboard.yaml
文件到系统上:
- 修改yaml文件
默认Dashboard只能集群内部访问,修改Service为NodePort类型,暴露到外部:
[root@k8s-master ~]#vim kubernetes-dashboard.yaml
vi recommended.yaml
...
kind: Service
apiVersion: v1
metadata:
labels:
k8s-app: kubernetes-dashboard
name: kubernetes-dashboard
namespace: kubernetes-dashboard
spec:
ports:
- port: 443
targetPort: 8443
nodePort: 30001 #更改位置1
selector:
k8s-app: kubernetes-dashboard
type: NodePort #更改位置2
...
#说明:
只需要在service字段添加nodePort: 30001即可;
配置后内容:
- 改完之后,我们直接apply一下就好:
[root@k8s-master ~]#kubectl apply -f kubernetes-dashboard.yaml
- 验证
执行kubectl get pods -n kubernetes-dashboard
命令:
[root@k8s-master ~]#kubectl get pods -n kubernetes-dashboard
NAME READY STATUS RESTARTS AGE
dashboard-metrics-scraper-7b59f7d4df-68hj8 1/1 Running 0 97s
kubernetes-dashboard-74d688b6bc-bkw4h 1/1 Running 0 97s
[root@k8s-master ~]#
#说明
dashboard-metrics-scraper-7b59f7d4df-68hj8(收集指标的容器)
kubernetes-dashboard-74d688b6bc-bkw4h(主容器),只要主容器启动了的话,我们就可以访问了;
#注意,这个kubernetes-dashboard叫做命名空间;
浏览访问
访问地址:https://NodeIP:30001
此时你访问集群内的任意ip:30001的话,就可以访问了ui界面了:
这里需要注意的是必须是https,如果是httpd的话,会报如下错误:
- 创建service account并绑定默认cluster-admin管理员集群角色:
# 创建用户
$ kubectl create serviceaccount dashboard-admin -n kube-system
# 用户授权
$ kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin
# 获取用户Token
$ kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret | awk '/dashboard-admin/{print $1}')
eyJhbGciOiJSUzI1NiIsImtpZCI6ImVGcjgxMFVRY3NISWlsbmpzTHdkLWFXRVFVcmFiUTkxRkI1M0gzdFFEUEUifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJkYXNoYm9hcmQtYWRtaW4tdG9rZW4tcDQycnIiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoiZGFzaGJvYXJkLWFkbWluIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQudWlkIjoiNjEzMmJmMjAtYTY2NS00MmRhLWE4ZmMtZmZjZDNlMjgxYzk2Iiwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50Omt1YmUtc3lzdGVtOmRhc2hib2FyZC1hZG1pbiJ9.Yyo-ojbezUjcbsvvepwhHj5yeuak16y0GHPXbbccJTdV7fqnAoU7OUAjfisvvmpci03R71PZFhuU3Vmv4cUuiRchDSUnuMucDSyYa5_sysiMhS5Jenm46CYEg7ljuy73v8iFvXf5uAPIJbxyIwf_C95pdBK22qpzZCqOyk1WuOisfCFxUA5-APjXSKJhczmLIB0iU5uqet-yHbWx-qKsAxuyarvA4b2TB-ckToC98OFipVWMColjv18h7GkxfS0i6CM4u_bA7_76xGrDEVRDgOenbKizzmXxPn_PpzXBXkIkGL9X3_fB7w6uureb4TPTFyxaQenA0Fba0GPJUXRjpQ
将用户token粘贴到如下位置:
实验现象成功,完美!
- 这边需要注意的是,如果从集群的另一个节点再次打开k8s ui的话,这边还需要再次输入token:
接下来,我们启一个pod做下测试,看看效果。
9.测试:牛刀小试,快速部署一个网站(在master节点执行)
1、使用Deployment控制器部署镜像:
[root@k8s-master ~]#kubectl create deployment web --image=nginx
deployment.apps/web created
[root@k8s-master ~]#
此时用kubectl get pods
命令查看pod是否是运行的:
[root@k8s-master ~]#kubectl get pods
[root@k8s-master ~]#kubectl get deploy
2、使用Service将Pod暴露出去:
[root@k8s-master ~]#kubectl expose deployment web --port=80 --target-port=80 --type=NodePort
#备注:第一个--port是宿主机端号,第二个--target--port是容器服务的端口号;
用kubectl get service
命令查看刚才创建的service:
[root@k8s-master ~]#kubectl get service
[root@k8s-master ~]#kubectl get svc
3、访问应用:(实验现象符合预期,完美!)
http://NodeIP:Port # 端口随机生成,通过get svc获取
#注意:此时你通过任意的nodeip:端口都可访问nginx应用;(masterip:端口是不行的)
- 此时,再做一个实验快照。
三.总结
以上就是如何用kubeadm以离线方式部署k8s的实验过程了,欢迎大家阅读。
关于我
我的博客主旨:
- 排版美观,语言精炼;
- 文档即手册,步骤明细,拒绝埋坑,提供源码;
- 本人实战文档都是亲测成功的,各位小伙伴在实际操作过程中如有什么疑问,可随时联系本人帮您解决问题,让我们一起进步!
🍀 微信二维码 x2675263825 (舍得), qq:2675263825。
🍀 微信公众号 《云原生架构师实战》
🍀 个人博客站点
🍀 csdn
https://blog.csdn.net/weixin_39246554?spm=1010.2135.3001.5421
🍀 知乎
https://www.zhihu.com/people/foryouone
最后
好了,关于本次就到这里了,感谢大家阅读,最后祝大家生活快乐,每天都过的有意义哦,我们下期见!