K8S安装和创建集群终极教程(单master多worker)
前言
本文会以最简单、最直接、最完整的方式记录kubernetes(下面统称K8S)单master多工作节点(worker nodes)的集群步骤基本概念
首先要简单了解一下本文的3个核心概念:Kubelet:K8S工作节点上的重要组件,它的作用是管理Pod,引用官方的一句描述"The kubelet works in terms of a PodSpec";Kubeadm:官方提供的快速创建集群工具;Kubectl:kubectl是K8S的命令行工具,可以管理集群。工作流程我们的工作流程分三大步安装Kubeadm创建集群安装dashboard第一步 安装Kubeadm环境准备
①Linux 主机,配置要求至少拥有2CPU和2GB的内存,本文使用的系统版本是CentOS7.6
内存建议至少4G
②为了完成集群的测试,应准备2台或2台以上的主机,本文使用1台master和2台work
③集群中所有机器的网络连接都是完整的(公网或者内网都可以)
④每个节点拥有唯一主机名、MAC 地址和product_uuid
问:如何查看主机名?
答:执行命令hostname
问:如何修改主机名?
答:永久生效的做法:执行命令vi /etc/hostname,把第一行去掉(不能注释掉,要去掉),然后重新写上自定义的主机名(注意命名规范),保存并重启后生效;
临时生效的做法:执行以下命令hostname 你自定义的主机名
问:如何查看MAC地址?
答:执行命令ip link,然后看你的第一网卡
问:如何查看product_uuid?
答:执行命令sudo cat /sys/class/dmi/id/product_uuid
⑤根据你对不同组件的使用情况需要开放以下端口,并使用telnet测试端口是否打开(如果目的只是为了测试或者条件允许的情况下,直接关闭防火墙即可)master主机(又称为控制平面或者Control plane)需要打开的端口
Protocol
方向
Port Range
Purpose
Used By
TCP
入站
6443
Kubernetes API server
All
TCP
入站
2379-2380
etcd server client API
kube-apiserver, etcd
TCP
入站
10250
Kubelet API
Self, Control plane
TCP
入站
10259
kube-scheduler
Self
TCP
入站
10257
kube-controller-manager
Self 工作节点(又称为worker Node)需要打开的端口
Protocol
方向
Port Range
Purpose
Used By
TCP
入站
10250
Kubelet API
Self, Control plane
TCP
入站
30000-32767
NodePort Services†
All
注意:30000-32767这个端口范围是我们创建服务的端口必须要设置的一个范围(如果设置范围以外的会有限制提示并创建失败),这是K8S规定的。
另外,如果你要直接关闭防火墙可以执行systemctl stop firewalld.service && systemctl disable firewalld.service
⑥必须禁用Swap[root@testmachine01 ~]# free total used free shared buff/cache available Mem: 1863252 759616 92032 25736 1011604 818296 Swap: 2098172 0 2098172
Swap total大于0,说明Swap分区是开启的
问:如何关闭Swap?
答:编辑文件/etc/fstab,在swap行前面加上#号注释,保存并重启服务器 [root@testmachine01 ~]# vi /etc/fstab # UUID=fa5df00e-8eb8-4fd1-9376-ccfc15e32848 swap swap defaults 0 0
再次查看分区状态,已生效[root@testmachine01 ~]# free total used free shared buff/cache available Mem: 1863252 726388 123116 30968 1013748 848484 Swap: 0 0 0
安装容器引擎
常见的容器引擎(Container runtime,简称runtime):containerdCRI-ODocker
本文使用的容器引擎是Docker
安装命令sudo yum install -y yum-utils sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo yum install -y docker-ce docker-ce-cli containerd.io systemctl start docker systemctl enable docker.service
安装完成后查看版本:[root@testmachine01 ~]# docker -v Docker version 20.10.11, build dea9396
如果需要删除旧版本sudo yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine
如果需要卸载Docker引擎
当出现可能跟Docker引擎相关的奇怪异常时可以尝试把Docker卸载干净并重新安装,但一定要注意镜像、容器、卷或配置文件这些是否需要备份。
下面记录卸载Docker引擎的步骤:
①卸载 Docker Engine、CLI 和 Containerd 包:sudo yum remove docker-ce docker-ce-cli containerd.io
②主机上的映像、容器、卷或自定义配置文件不会自动删除。删除所有镜像、容器和卷:sudo rm -rf /var/lib/docker sudo rm -rf /var/lib/containerd
③配置文件如果有不合法的字符时会导致启动失败,我们需要将其删除然后重建[root@testmachine01 ~]# rm -rf /etc/docker/daemon.json
此时Docker引擎已卸载干净
安装kubeadm, kubelet and kubectl
安装yum源cat < --discovery-token-ca-cert-hash sha256:0ab5863d0b42a36e8ef04f174106a9ccfb6927fba3c884052d5a2c9e0de76185 [preflight] Running pre-flight checks [preflight] Reading configuration from the cluster... [preflight] FYI: You can look at this config file with "kubectl -n kube-system get cm kubeadm-config -o yaml" [kubelet-start] Writing kubelet configuration to file "/var/lib/kubelet/config.yaml" [kubelet-start] Writing kubelet environment file with flags to file "/var/lib/kubelet/kubeadm-flags.env" [kubelet-start] Starting the kubelet [kubelet-start] Waiting for the kubelet to perform the TLS Bootstrap... This node has joined the cluster: * Certificate signing request was sent to apiserver and a response was received. * The Kubelet was informed of the new secure connection details. Run "kubectl get nodes" on the control-plane to see this node join the cluster.
master上查看所有节点的状态[root@testmachine01 ~]# kubectl get nodes -o wide NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME testmachine01 Ready control-plane,master 6h7m v1.22.4 192.168.189.128 CentOS Linux 7 (Core) 3.10.0-957.el7.x86_64 docker://20.10.11 testmachine02 Ready 59m v1.22.4 192.168.189.130 CentOS Linux 7 (Core) 3.10.0-957.el7.x86_64 docker://20.10.11 testmachine03 Ready 17m v1.22.4 192.168.189.131 CentOS Linux 7 (Core) 3.10.0-957.el7.x86_64 docker://20.10.11
到这里集群已经创建完成
最后一步 安装dashboard
最后我再安装K8S的可视化界面kubernetes-dashboard,方便我们日常使用
①下载yaml文件wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.4.0/aio/deploy/recommended.yaml --no-check-certificate
②修改yaml文件,新增type和nodePort,使服务能够被外部访问[root@testmachine01 ~]# vi recommended.yaml --- kind: Service apiVersion: v1 metadata: labels: k8s-app: kubernetes-dashboard name: kubernetes-dashboard namespace: kubernetes-dashboard spec: type: NodePort ports: - port: 443 targetPort: 8443 nodePort: 31437 selector: k8s-app: kubernetes-dashboard ---
③安装并查看运行情况[root@testmachine01 ~]# kubectl apply -f recommended.yaml [root@testmachine01 ~]# watch kubectl get pods -n kubernetes-dashboard
④新建用户[root@testmachine01 ~]# vi dashboard-adminuser.yaml apiVersion: v1 kind: ServiceAccount metadata: name: admin-user namespace: kubernetes-dashboard --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: admin-user roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: cluster-admin subjects: - kind: ServiceAccount name: admin-user namespace: kubernetes-dashboard
文件创建完成后保存并apply kubectl apply -f dashboard-adminuser.yaml
⑤获取Token,用于界面登录kubectl -n kubernetes-dashboard get secret $(kubectl -n kubernetes-dashboard get sa/admin-user -o jsonpath="{.secrets[0].name}") -o go-template="{{.data.token | base64decode}}"
⑥登录dashboard
192.168.189.128是我的master服务器ip,另外要注意必须使用https,并且不能使用ie内核模式
复制⑤生成的token到输入框,点击登录
dashboard安装配置完成
Q&A
问:如何在查看资源情况?
答:在master上执行以下命令可查看资源情况(-o wide是显示更详细的信息),
①查看所有节点kubectl get nodes -o wide
②查看所有命名空间kubectl get namespaces -o wide
③查看命名空间下的podkubectl get pods -n 你的命名空间 -o wide
④查看所有命名空间的podkubectl get pods --all-namespaces -o wide
⑤实时查看查看命名空间下的pod运行情况watch kubectl get pods -n 你的命名空间
问:kubeadm join 出现异常[ERROR Port-10250]: Port 10250 is in use,如何解决?
答:这是因为你之前join失败过了,需要先执行kubeadm reset再重新join
问:虚拟机上测试时网卡突然消失如何解决(题外问题记录)?
答:
①确认丢失的网卡信息,ens开头(可选步骤)
ifconfig -a
②执行以下命令解决systemctl stop NetworkManager && systemctl disable NetworkManager && systemctl restart network.service && service network restart
问:如何查看K8S版本?
答:kubectl version
问:join命令忘记或者过期了怎么办?
答:
生成永不过期的kubeadm token create --ttl 0 --print-join-command
生成时效24小时的kubeadm token create --print-join-command
问:Pod不断重启并且无其它报错信息时怎么办?
答:这种情况通常是因为你的集群中只有master,没有worker节点,master的创建默认是有污点的,即不允许调度新的Pod,如果你需要(当然这并不推荐),就需要删除 master 上的污点。删除污点可以执行以下命令,kubectl taint nodes --all node-role.kubernetes.io/master-
它应该返回以下内容。node/ untainted