实战-kubeadm方式搭建k8s集群-v1-20-0-20210530-测试成功-良哥-荐(CRI-Docker)
实战:kubeadm方式搭建k8s集群(k8s-v1.20.0,docker-20.10.7-ce)-2021.5.30(部署成功-良哥)【荐】
目录
[toc]
实验环境
1、硬件环境
3台虚机 2c2g,20g。(nat模式,可访问外网)
角色 | 主机名 | ip | 显示名称 |
---|---|---|---|
master节点 | k8s-master | 172.29.9.31 | k8s-master-172.29.9.31 |
node节点 | k8s-node1 | 172.29.9.32 | k8s-node1-172.29.9.32 |
node节点 | k8s-node2 | 172.29.9.33 | k8s-node2-172.29.9.33 |
2、软件环境
软件 | 版本 |
---|---|
操作系统 | centos7.7_x64 1908 mini(其他centos7.x版本也行) |
docker | 20.10.7-ce |
kubernetes | v1.20.0 |
3、架构图
- 注意:在将要做实验之前,请准备好如上3台虚机,并做好基础网络配置。然后做一个快照,方便后期回滚。
实验软件
(2)关闭swap分区
说明:以下提供了2种关闭swap分区的方法,这里2条命令都刷一下!
swapoff-ased-ri's/.*swap.*/#&/'/etc/fstab#呃呃呃,这个要重启机器才会生效的!!!
(3)设置主机名
hostnamectl--staticset-hostnamek8s-master1bashhostnamectl--staticset-hostnamek8s-node1bashhostnamectl--staticset-hostnamek8s-node2bash
(4)添加hosts
cat>>/etc/hosts<<EOF172.29.9.31 k8s-master1172.29.9.32 k8s-node1172.29.9.33 k8s-node2EOF
#注意:本次实验,这个只需要在master节点执行就好了;因为我们后面在用kubectl去连接容器时,会用到这个主机名与它的对应关系;因为k8s使用这个主机名去注册到k8s集群,用主机名去连接kubelet。而有的文档这里都对所有节点添加了此项内容;#个人建议对all节点均配置这个hosts文件内容;
(5)将桥接的IPv4流量传递到iptables的链
cat>/etc/sysctl.d/k8s.conf<<EOFnet.bridge.bridge-nf-call-ip6tables =1net.bridge.bridge-nf-call-iptables =1EOFsysctl--system
说明:这个是一定要配置的;不配置的话,在安装过程中会有warning的;
(6)时间同步
yuminstallntpdate-yntpdatetime.windows.com
说明: 因为里面涉及到证书,而证书对时间是很敏感的,里面的校验都是需要用到时间的,因此这3台机器必须保持时间同步;
- 到此,集群初始化工作已经完成了,此时对3台机器做一个快照。
接下来,将在all节点安装Docker/kubeadm/kubelet。
1.安装Docker/kubeadm/kubelet(所有节点均要配置)
(1)安装Docker
- 执行如下代码
yuminstall-yyum-utilsdevice-mapper-persistent-datalvm2yum-config-manager--add-repohttp:#yum install docker-ce -y#本次安装docker指定版本yuminstall-yyuminstalldocker-ce-20.10.7docker-ce-cli-20.10.7containerd.iosystemctlstartdocker&&systemctlenabledockermkdir-p/etc/dockertee/etc/docker/daemon.json<<-'EOF'{"registry-mirrors":["https:}EOFecho"net.ipv4.ip_forward =1">>/etc/sysctl.confsysctl-psystemctldaemon-reloadsystemctlrestartdocker
- 安装后验证
[root@k8s-master ~]#rpm -qa|grepdocker[root@k8s-master ~]#docker version[root@k8s-master ~]#docker info
(2)添加阿里云YUM软件源
cat>/etc/yum.repos.d/kubernetes.repo<<EOF[kubernetes]name=Kubernetesbaseurl=https:enabled=1gpgcheck=0repo_gpgcheck=0gpgkey=https:EOF
这边注意:
(3)安装kubeadm,kubelet和kubectl
由于版本更新频繁,这里指定版本号部署:
yummakecachefastyuminstall-ykubelet-1.20.0kubeadm-1.20.0kubectl-1.20.0--disableexcludes=kubernetes#注意,这些好都是阿里云kubernetes.repo仓库里的包 #--disableexcludes 禁掉除了kubernetes之外的别的仓库kubeadmversionsystemctlenablekubelet
- 说明:这里要特别注意
我们不需要去启动kubelet服务,只要设置开机自启就好(此时,启动也启动不起来的);
因为要生成配置文件,这样才可以把kubelet拉起;
2.创建Master节点(在master节点执行)
- 执行如下代码
kubeadminit\--apiserver-advertise-address=172.29.9.31\--image-repositoryregistry.aliyuncs.com/google_containers\--kubernetes-versionv1.20.0\--service-cidr=10.96.0.0/12\--pod-network-cidr=10.244.0.0/16\--ignore-preflight-errors=all
#说明:kubeadminit\--apiserver-advertise-address=172.29.9.31\ #这里的ip填自己masterip就好--image-repositoryregistry.aliyuncs.com/google_containers\ #修改为阿里云的地址--kubernetes-versionv1.20.0\ #指定版本--service-cidr=10.96.0.0/12\--pod-network-cidr=10.244.0.0/16\ #与下面部署的CNI网络组件yaml中保持一致--ignore-preflight-errors=all--apiserver-advertise-address集群通告地址--image-repository由于默认拉取镜像地址k8s.gcr.io国内无法访问,这里指定阿里云镜像仓库地址--kubernetes-versionK8s版本,与上面安装的kubeadm/kubectl/kubelet一致--service-cidr集群内部虚拟网络,Pod统一访问入口--pod-network-cidrPod网络,与下面部署的CNI网络组件yaml中保持一致--ignore-preflight-errors=all忽略不核心的报错;
#说明初始化的时候会拉取镜像,--kubernetes-versionv1.20.0这里指定了版本,就指明了要拉取哪个版本的镜像;版本一定要和组件版本`yum install -y kubelet-1.20.0 kubeadm-1.20.0 kubectl-1.20.0`保持一致,否则会出现一些问题;它以容器的方式启动一个组件:[root@k8s-master ~]#docker imagesREPOSITORYTAGregistry.aliyuncs.com/google_containers/kube-proxyv1.20.0registry.aliyuncs.com/google_containers/kube-apiserverv1.20.0registry.aliyuncs.com/google_containers/kube-controller-managerv1.20.0registry.aliyuncs.com/google_containers/kube-schedulerv1.20.0registry.aliyuncs.com/google_containers/etcd3.4.13-0registry.aliyuncs.com/google_containers/coredns1.7.0registry.aliyuncs.com/google_containers/pause3.2[root@k8s-master ~]#
- 执行过程截图
- 拉取到的镜像内容如下
- 注意:kubeadm init工作流程
1、[preflight]环境检查,拉取镜像(注意:拉取镜像是发生在这一步!!!)2、[certs]证书生成3、[kubeconfig]kubeconfig文件生成(kubeconfig文件是其他组件连接api-server所需要用到的文件;)4、[kubelet-start]生成kubelet配置文件并启动(注意:/var/lib/kubelet/config.yaml)5、[control-plane]静态pod启动master组件,包括了etcd6、[mark-control-plane]给master节点打一个roles和污点7、[bootstrap-token]引导kubelet生成证书8、[addons]安装coredns和kube-proxy
- 注意:此时再次查看kubelet服务,发现已经启动成功了
- 拷贝kubectl使用的连接k8s认证文件到默认路径
mkdir-p$HOME/.kubesudocp-i/etc/kubernetes/admin.conf$HOME/.kube/configsudochown$(id-u):$(id-g) $HOME/.kube/config
- 生成了用于工作节点连接master的命令
初始化完成后,最后会输出一个join命令,先记住,下面用。
kubeadmjoin172.29.9.31:6443--tokenc7j1ek.pbljaz6acf43ygay\--discovery-token-ca-cert-hashsha256:0b2baffe590188fe3628fa767d6ba1afd2d48c4e08b561e61eb1b8b824464a92
- 注意:在拷贝kubectl所需的配置文件后,我们可以用
kubectl get nodes
命令来查看master状态
[root@k8s-master ~]#kubectl get nodes#注:由于网络插件还没有部署,还没有准备就绪 NotReady
- 注意 一般在执行了kubeadm int后,只要能看到如下就代表集群部署已经没什么问题了:
接下来我们来执行在node节点join命令。
3.将Node节点加入到当前集群中(在node节点执行)
- 注意:如果当时忘记复制那个join命令了,该怎么办呢?
默认token有效期为24小时,当过期之后,该token就不可用了。这时就需要重新创建token,可以直接使用命令快捷生成:(注意:如果token还在有效期的话,那么就会打印出原来的token)
#在master节点上查看加入节点的命令:[root@k8s-master ~]#kubeadm token create --print-join-commandkubeadmjoin172.29.9.31:6443--tokenc7j1ek.pbljaz6acf43ygay\--discovery-token-ca-cert-hashsha256:0b2baffe590188fe3628fa767d6ba1afd2d48c4e08b561e61eb1b8b824464a92[root@k8s-master ~]
- 开始join进群
#在2个node节点执行如下命令:kubeadmjoin172.29.9.31:6443--tokenc7j1ek.pbljaz6acf43ygay\--discovery-token-ca-cert-hashsha256:0b2baffe590188fe3628fa767d6ba1afd2d48c4e08b561e61eb1b8b824464a92
- 执行过程截图如下
- 注意:这里报这个域名解析时没有任何影响的。(你不想警告的话,就在all节点均填一下域名解析配置)
- 此时,再到master节点查看下集群状态,发现已经多出了2个node节点了。
后续步骤基本在master节点进行操作了,到此,node节点已配置完成。
下面,我们将配置网络组件-calico。
4.部署容器网络(CNI)-Calico(在master节点执行)
Calico是一个纯三层的数据中心网络方案,是目前Kubernetes主流的网络方案。(工作中:calico用的比较多)
- 下载YAML:
wgethttps:-rw-r--r--1rootroot185KJun206:23calico.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
- 注意:或者我们可以把calico的镜像离线给下载下来,这样就省事儿了。
接下来,我们将部署一下web ui dashboard。
5.部署Web UI(Dashboard)(在master节点执行)
Dashboard是官方提供的一个UI,可用于基本管理K8s资源。 说实话:ui在工作汇总用的还是很少的;它这些功能只满足一些最基本的要求;企业的需求还是挺多的; ui这用来观察下集群的资源罢了;
- 下载
wgethttps:#需要科学上网下载
- 这里使用我下载好的就行
课件中文件名是:kubernetes-dashboard.yaml
这里手动上传kubernetes-dashboard.yaml
文件到系统上:
- 修改yaml文件
默认Dashboard只能集群内部访问,修改Service为NodePort类型,暴露到外部:
[root@k8s-master ~]#vim kubernetes-dashboard.yamlvirecommended.yaml...kind:ServiceapiVersion:v1metadata:labels:k8s-app:kubernetes-dashboardname:kubernetes-dashboardnamespace:kubernetes-dashboardspec:ports:-port:443targetPort:8443nodePort:30001#更改位置1selector:k8s-app:kubernetes-dashboardtype: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-dashboardNAMEREADYSTATUSRESTARTSAGEdashboard-metrics-scraper-7b59f7d4df-68hj81/1Running097skubernetes-dashboard-74d688b6bc-bkw4h1/1Running097s[root@k8s-master ~]##说明dashboard-metrics-scraper-7b59f7d4df-68hj8(收集指标的容器)kubernetes-dashboard-74d688b6bc-bkw4h(主容器),只要主容器启动了的话,我们就可以访问了;#注意,这个kubernetes-dashboard叫做命名空间;
浏览访问
eyJhbGciOiJSUzI1NiIsImtpZCI6ImVGcjgxMFVRY3NISWlsbmpzTHdkLWFXRVFVcmFiUTkxRkI1M0gzdFFEUEUifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJkYXNoYm9hcmQtYWRtaW4tdG9rZW4tcDQycnIiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoiZGFzaGJvYXJkLWFkbWluIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQudWlkIjoiNjEzMmJmMjAtYTY2NS00MmRhLWE4ZmMtZmZjZDNlMjgxYzk2Iiwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50Omt1YmUtc3lzdGVtOmRhc2hib2FyZC1hZG1pbiJ9.Yyo-ojbezUjcbsvvepwhHj5yeuak16y0GHPXbbccJTdV7fqnAoU7OUAjfisvvmpci03R71PZFhuU3Vmv4cUuiRchDSUnuMucDSyYa5_sysiMhS5Jenm46CYEg7ljuy73v8iFvXf5uAPIJbxyIwf_C95pdBK22qpzZCqOyk1WuOisfCFxUA5-APjXSKJhczmLIB0iU5uqet-yHbWx-qKsAxuyarvA4b2TB-ckToC98OFipVWMColjv18h7GkxfS0i6CM4u_bA7_76xGrDEVRDgOenbKizzmXxPn_PpzXBXkIkGL9X3_fB7w6uureb4TPTFyxaQenA0Fba0GPJUXRjpQ
将用户token粘贴到如下位置:
实验现象成功,完美!
- 这边需要注意的是,如果从集群的另一个节点再次打开k8s ui的话,这边还需要再次输入token:
5.1 ui全貌
- 工作量
- 发现和负载均衡
- 配置和存储
- 定义自定义资源
- 设置
- 集群
- 命名空间
5.2 这里有几个好的功能可以介绍给你
- 这里pods,可以进去到容器终端里面去:
- deployment
接下来,我们启一个pod做下测试,看看效果。
6.测试:牛刀小试,快速部署一个网站(在master节点执行)
1、使用Deployment控制器部署镜像:
[root@k8s-master ~]#kubectl create deployment web --image=nginxdeployment.apps/webcreated[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是k8s集群内部访问端口,通过集群内部访问的ip,clusterip;第二个--target--port是镜像里服务跑的端口号;
用kubectl get service
命令查看刚才创建的service:
[root@k8s-master ~]#kubectl get service[root@k8s-master ~]#kubectl get svc
3、访问应用:(实验现象符合预期,完美!) http: 版权:此文章版权归 One 所有,如有转载,请注明出处! 链接:可点击右上角分享此页面复制文章链接