快捷菜单
常用功能一站直达
更多功能请点顶栏「快捷菜单」

[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、架构图


链接:https://pan.baidu.com/s/1bJwyaQlXX5ZL8Bq_9tNZBQ 提取码:iokw

百度云盘位置:

👉 (all节点均要配置)
关闭且禁用如下服务:firewalld、NetworkManager、selinux
1systemctl stop firewalld && systemctl disable firewalld
2systemctl stop NetworkManager && systemctl disable NetworkManager
3
4setenforce 0
5sed -i s/SELINUX=enforcing/SELINUX=disabled/ /etc/selinux/config说明:以下提供了2种关闭swap分区的方法,这里2条命令都刷一下!
1swapoff -a
2sed -ri 's/.*swap.*/#&/' /etc/fstab #呃呃呃,这个要重启机器才会生效的!!!1hostnamectl --static set-hostname k8s-master1
2bash
3
4hostnamectl --static set-hostname k8s-node1
5bash
6
7hostnamectl --static set-hostname k8s-node2
8bash1cat >> /etc/hosts << EOF
2172.29.9.31 k8s-master1
3172.29.9.32 k8s-node1
4172.29.9.33 k8s-node2
5EOF1#注意:
2本次实验,这个只需要在master节点执行就好了;
3因为我们后面在用kubectl去连接容器时,会用到这个主机名与它的对应关系;因为k8s使用这个主机名去注册到k8s集群,用主机名去连接kubelet。
4
5而有的文档这里都对所有节点添加了此项内容;
6#个人建议对all节点均配置这个hosts文件内容;1cat > /etc/sysctl.d/k8s.conf << EOF
2net.bridge.bridge-nf-call-ip6tables = 1
3net.bridge.bridge-nf-call-iptables = 1
4EOF
5sysctl --system说明:这个是一定要配置的;不配置的话,在安装过程中会有warning的;
1yum install ntpdate -y
2ntpdate time.windows.com说明: 因为里面涉及到证书,而证书对时间是很敏感的,里面的校验都是需要用到时间的,因此这3台机器必须保持时间同步;

接下来,将在all节点安装Docker/kubeadm/kubelet。
1yum install -y yum-utils device-mapper-persistent-data lvm2
2
3yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
4
5#yum install docker-ce -y
6#本次安装docker指定版本
7yum install -y yum install docker-ce-20.10.7 docker-ce-cli-20.10.7 containerd.io
8
9systemctl start docker && systemctl enable docker
10
11mkdir -p /etc/docker
12tee /etc/docker/daemon.json <<-'EOF'
13{
14 "registry-mirrors":["https://dockerhub.azk8s.cn","http://hub-mirror.c.163.com","http://qtid6917.mirror.aliyuncs.com"]
15}
16EOF
17
18echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
19sysctl -p
20
21systemctl daemon-reload
22systemctl restart docker1[root@k8s-master ~]#rpm -qa|grep docker
2[root@k8s-master ~]#docker version
3[root@k8s-master ~]#docker info



1cat > /etc/yum.repos.d/kubernetes.repo << EOF
2[kubernetes]
3name=Kubernetes
4baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
5enabled=1
6gpgcheck=0
7repo_gpgcheck=0
8gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
9EOF这边注意:
由于版本更新频繁,这里指定版本号部署:
1yum makecache fast
2yum install -y kubelet-1.20.0 kubeadm-1.20.0 kubectl-1.20.0 --disableexcludes=kubernetes #注意,这些好都是阿里云kubernetes.repo仓库里的包 #--disableexcludes 禁掉除了kubernetes之外的别的仓库
3kubeadm version
4
5systemctl enable kubelet我们不需要去启动kubelet服务,只要设置开机自启就好(此时,启动也启动不起来的);
因为要生成配置文件,这样才可以把kubelet拉起;

1kubeadm init \
2 --apiserver-advertise-address=172.29.9.31 \
3 --image-repository registry.aliyuncs.com/google_containers \
4 --kubernetes-version v1.20.0 \
5 --service-cidr=10.96.0.0/12 \
6 --pod-network-cidr=10.244.0.0/16 \
7 --ignore-preflight-errors=all 1#说明:
2kubeadm init \
3 --apiserver-advertise-address=172.29.9.31 \ #这里的ip填自己master ip就好
4 --image-repository registry.aliyuncs.com/google_containers \ #修改为阿里云的地址
5 --kubernetes-version v1.20.0 \ #指定版本
6 --service-cidr=10.96.0.0/12 \
7 --pod-network-cidr=10.244.0.0/16 \ #与下面部署的CNI网络组件yaml中保持一致
8 --ignore-preflight-errors=all
9
10--apiserver-advertise-address 集群通告地址
11--image-repository 由于默认拉取镜像地址k8s.gcr.io国内无法访问,这里指定阿里云镜像仓库地址
12--kubernetes-version K8s版本,与上面安装的kubeadm/kubectl/kubelet一致
13--service-cidr 集群内部虚拟网络,Pod统一访问入口
14--pod-network-cidr Pod网络,与下面部署的CNI网络组件yaml中保持一致
15--ignore-preflight-errors=all 忽略不核心的报错; 1#说明
2初始化的时候会拉取镜像,--kubernetes-version v1.20.0 这里指定了版本,就指明了要拉取哪个版本的镜像;
3版本一定要和组件版本`yum install -y kubelet-1.20.0 kubeadm-1.20.0 kubectl-1.20.0`保持一致,否则会出现一些问题;
4它以容器的方式启动一个组件:
5[root@k8s-master ~]#docker images
6REPOSITORY TAG
7registry.aliyuncs.com/google_containers/kube-proxy v1.20.0
8registry.aliyuncs.com/google_containers/kube-apiserver v1.20.0
9registry.aliyuncs.com/google_containers/kube-controller-manager v1.20.0
10registry.aliyuncs.com/google_containers/kube-scheduler v1.20.0
11registry.aliyuncs.com/google_containers/etcd 3.4.13-0
12registry.aliyuncs.com/google_containers/coredns 1.7.0
13registry.aliyuncs.com/google_containers/pause 3.2
14[root@k8s-master ~]#




11、[preflight] 环境检查,拉取镜像(注意:拉取镜像是发生在这一步!!!)
22、[certs] 证书生成
33、[kubeconfig] kubeconfig文件生成 (kubeconfig文件是其他组件连接api-server所需要用到的文件;)
44、[kubelet-start] 生成kubelet配置文件并启动 (注意:/var/lib/kubelet/config.yaml)
55、[control-plane] 静态pod启动master组件,包括了etcd
66、[mark-control-plane] 给master节点打一个roles和污点
77、[bootstrap-token] 引导kubelet生成证书
88、[addons] 安装coredns和kube-proxy
1mkdir -p $HOME/.kube
2sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
3sudo chown $(id -u):$(id -g) $HOME/.kube/config初始化完成后,最后会输出一个join命令,先记住,下面用。
1kubeadm join 172.29.9.31:6443 --token c7j1ek.pbljaz6acf43ygay \
2 --discovery-token-ca-cert-hash sha256:0b2baffe590188fe3628fa767d6ba1afd2d48c4e08b561e61eb1b8b824464a92kubectl get nodes命令来查看master状态1[root@k8s-master ~]#kubectl get nodes
2#注:由于网络插件还没有部署,还没有准备就绪 NotReady


接下来我们来执行在node节点join命令。
默认token有效期为24小时,当过期之后,该token就不可用了。这时就需要重新创建token,可以直接使用命令快捷生成:(注意:如果token还在有效期的话,那么就会打印出原来的token)
1#在master节点上查看加入节点的命令:
2
3[root@k8s-master ~]#kubeadm token create --print-join-command
4kubeadm join 172.29.9.31:6443 --token c7j1ek.pbljaz6acf43ygay \
5 --discovery-token-ca-cert-hash sha256:0b2baffe590188fe3628fa767d6ba1afd2d48c4e08b561e61eb1b8b824464a92
6[root@k8s-master ~]1#在2个node节点执行如下命令:
2
3kubeadm join 172.29.9.31:6443 --token c7j1ek.pbljaz6acf43ygay \
4 --discovery-token-ca-cert-hash sha256:0b2baffe590188fe3628fa767d6ba1afd2d48c4e08b561e61eb1b8b824464a92



后续步骤基本在master节点进行操作了,到此,node节点已配置完成。
下面,我们将配置网络组件-calico。
Calico是一个纯三层的数据中心网络方案,是目前Kubernetes主流的网络方案。(工作中:calico用的比较多)
1wget https://docs.projectcalico.org/manifests/calico.yaml #这个需要科学上网,建议直接使用我这边提供的calico.yaml文件
将下载好的calico.yaml文件传到/root/目录下,进行编辑:
下载完后还需要修改里面定义Pod网络(CALICO_IPV4POOL_CIDR),与前面kubeadm init的 –pod-network-cidr指定的一样。
1[root@k8s-master ~]#ll -h calico.yaml
2-rw-r--r-- 1 root root 185K Jun 2 06:23 calico.yaml
3[root@k8s-master ~]#vim calico.yaml


1[root@k8s-master ~]#kubectl apply -f calico.yaml
我们可以用如下命令来看一下这4个pod是否准备就绪,等Calico Pod都Running,节点也会准备就绪:
1[root@k8s-master ~]#kubectl get pods -n kube-system


接下来,我们将部署一下web ui dashboard。
Dashboard是官方提供的一个UI,可用于基本管理K8s资源。 说实话:ui在工作汇总用的还是很少的;它这些功能只满足一些最基本的要求;企业的需求还是挺多的; ui这用来观察下集群的资源罢了;
1wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.3/aio/deploy/recommended.yaml
2
3#需要科学上网下载课件中文件名是:kubernetes-dashboard.yaml
这里手动上传kubernetes-dashboard.yaml文件到系统上:

默认Dashboard只能集群内部访问,修改Service为NodePort类型,暴露到外部:
1[root@k8s-master ~]#vim kubernetes-dashboard.yaml
2
3vi recommended.yaml
4...
5kind: Service
6apiVersion: v1
7metadata:
8 labels:
9 k8s-app: kubernetes-dashboard
10 name: kubernetes-dashboard
11 namespace: kubernetes-dashboard
12spec:
13 ports:
14 - port: 443
15 targetPort: 8443
16 nodePort: 30001 #更改位置1
17 selector:
18 k8s-app: kubernetes-dashboard
19 type: NodePort #更改位置2
20...
21
22#说明:
23只需要在service字段添加nodePort: 30001即可;
配置后内容:

1[root@k8s-master ~]#kubectl apply -f kubernetes-dashboard.yaml
执行kubectl get pods -n kubernetes-dashboard命令:
1[root@k8s-master ~]#kubectl get pods -n kubernetes-dashboard
2NAME READY STATUS RESTARTS AGE
3dashboard-metrics-scraper-7b59f7d4df-68hj8 1/1 Running 0 97s
4kubernetes-dashboard-74d688b6bc-bkw4h 1/1 Running 0 97s
5[root@k8s-master ~]#
6
7
8#说明
9dashboard-metrics-scraper-7b59f7d4df-68hj8(收集指标的容器)
10kubernetes-dashboard-74d688b6bc-bkw4h(主容器),只要主容器启动了的话,我们就可以访问了;
11#注意,这个kubernetes-dashboard叫做命名空间;
浏览访问
访问地址:https://NodeIP:30001
此时你访问集群内的任意ip:30001的话,就可以访问了ui界面了:
这里需要注意的是必须是https,如果是httpd的话,会报如下错误:



1# 创建用户
2$ kubectl create serviceaccount dashboard-admin -n kube-system
3
4# 用户授权
5$ kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin
6
7# 获取用户Token
8$ kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret | awk '/dashboard-admin/{print $1}')
1eyJhbGciOiJSUzI1NiIsImtpZCI6ImVGcjgxMFVRY3NISWlsbmpzTHdkLWFXRVFVcmFiUTkxRkI1M0gzdFFEUEUifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJkYXNoYm9hcmQtYWRtaW4tdG9rZW4tcDQycnIiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoiZGFzaGJvYXJkLWFkbWluIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQudWlkIjoiNjEzMmJmMjAtYTY2NS00MmRhLWE4ZmMtZmZjZDNlMjgxYzk2Iiwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50Omt1YmUtc3lzdGVtOmRhc2hib2FyZC1hZG1pbiJ9.Yyo-ojbezUjcbsvvepwhHj5yeuak16y0GHPXbbccJTdV7fqnAoU7OUAjfisvvmpci03R71PZFhuU3Vmv4cUuiRchDSUnuMucDSyYa5_sysiMhS5Jenm46CYEg7ljuy73v8iFvXf5uAPIJbxyIwf_C95pdBK22qpzZCqOyk1WuOisfCFxUA5-APjXSKJhczmLIB0iU5uqet-yHbWx-qKsAxuyarvA4b2TB-ckToC98OFipVWMColjv18h7GkxfS0i6CM4u_bA7_76xGrDEVRDgOenbKizzmXxPn_PpzXBXkIkGL9X3_fB7w6uureb4TPTFyxaQenA0Fba0GPJUXRjpQ将用户token粘贴到如下位置:

实验现象成功,完美!


















接下来,我们启一个pod做下测试,看看效果。
1、使用Deployment控制器部署镜像:
1[root@k8s-master ~]#kubectl create deployment web --image=nginx
2deployment.apps/web created
3[root@k8s-master ~]#
此时用kubectl get pods命令查看pod是否是运行的:
1[root@k8s-master ~]#kubectl get pods
2[root@k8s-master ~]#kubectl get deploy
2、使用Service将Pod暴露出去:
1[root@k8s-master ~]#kubectl expose deployment web --port=80 --target-port=80 --type=NodePort
2
3#备注
4第一个--port是k8s集群内部访问端口,通过集群内部访问的ip, cluster ip;
5第二个--target--port是镜像里服务跑的端口号;
用kubectl get service命令查看刚才创建的service:
1[root@k8s-master ~]#kubectl get service
2[root@k8s-master ~]#kubectl get svc

3、访问应用:(实验现象符合预期,完美!) http://NodeIP:Port # 端口随机生成,通过get svc获取
1#注意:此时你通过任意的nodeip:端口都可访问nginx应用;(masterip:端口是不行的)



关于快速部署一个Kubernetes集群的步骤可以概括如下:
0.集群环境配置
1.安装Docker
2.创建一个Master节点:kubeadm init
3.将一个Node节点加入到当前集群中:kubeadm join <Master节点的IP和端口>
4.部署容器网络(CNI): kubectl apply -f calico.yaml
5.部署Web UI(Dashboard)
以上就是如何快速搭建一个kubernetets集群的方法了,其实过程挺简单的,初次搭建,可能会遇到一些问题,并且对一些概念不清楚,但是先把实验结果做出来,后续再进一步学习k8s理论等。
我的博客主旨:
🍀 微信二维码 x2675263825 (舍得), qq:2675263825。

🍀 微信公众号 《云原生架构师实战》

🍀 个人博客站点


🍀 csdn
https://blog.csdn.net/weixin_39246554?spm=1010.2135.3001.5421

🍀 知乎
https://www.zhihu.com/people/foryouone

好了,关于本次就到这里了,感谢大家阅读,最后祝大家生活快乐,每天都过的有意义哦,我们下期见!

日历 · 精选 · 友链 · 更多
如果内容对你有帮助,欢迎请我喝杯咖啡 ☕



One的公众号
爱折腾博客的小白