行业知识
K8S简介和安装部署详细教程
目录
一、K8S简介
Kubernetes集群组件逻辑图
Master节点组件及功能
Slave节点组件及功能
安装部署
二进制包
kubeadm工具
二、准备工作
软硬件要求
集群规划
环境配置
修改hosts配置
配置SSH免密登录
关闭Swap分区
禁用SELinux
关闭防火墙
修改内核参数
配置集群时钟同步
配置k8s的Yum源
三、安装Docker
四、安装K8S集群
安装三大组件-kubeadm、kubelet、kubectl
初始化k8s集群
加入节点
安装网络插件
五、测试K8S集群
创建nginx pod
对外暴露访问
访问nginx
六、安装Dashboard
通过kubectl命令安装
创建访问账号
获取token
登录界面
一、K8S简介
Kubernetes中文官网:Kubernetes
GitHub:github.com/kubernetes/kubernetes
Kubernetes简称为K8s,是用于自动部署、扩缩和管理容器化应用程序的开源系统,起源于Google 集群管理工具Borg。
Kubernetes集群组件逻辑图
k8s集群属于Master-Slave主从架构,Master节点负责集群管理和资源调度,用于运行控制平面组件(Control Plane Components),Slave节点就是工作负载节点,一般称为Node节点,也叫Worker节点,主要负责运行Pod,一个Pod里可以同时运行多个容器,而容器一般封装的就是基于Dokcer打包的应用,Pod英文叫豌豆荚,每个容器就像是一颗豌豆,简单来说Pod就是一组容器。
Master节点组件及功能
| 组件名称 | 功能用途 |
| kube-apiserver | 负责处理接受请求。 |
| etcd | 高可用键值存储,用于k8s集群的后台数据库。 |
| kube-scheduler | 负责选择Worker节点运行新创建的Pod,需要考虑的因素包括资源需求,软硬件及策略约束,亲和性和反亲和性规范、数据位置等。 |
| kube-controller-manager | 负责运行不同类型的控制器进程,每个控制器都是一个单独进程,常见的控制器有节点控制器(Node Controller)、任务控制器(Job Controller)、端点分片控制器(EndpointSlice controller)、服务账号控制器(ServiceAccount controller)等。 |
| cloud-controller-manager | 用于嵌入特定的云平台的控制器。 |
Slave节点组件及功能
| 组件名称 | 功能用途 |
| kubelet | 负责管理Node节点上容器的健康运行,通过接收一组PodSpecs来实现,每个Node节点上都会运行一个kubelet,不会管理不是由 Kubernetes 创建的容器。 |
| kube-proxy | 负责Node节点上的网络代理,用于维护网络规则,这些规则允许从集群内部或外部与Pod进行网络通信,每个Node节点上都会运行一个kube-proxy,k8s的Service就是利用该组件实现的。 |
| Container Runtime | 负责管理容器的执行和生命周期。支持多种类型的容器运行时环境,比如 containerd、 CRI-O及CRI自定义实现,k8s使用容器运行时接口(CRI)和用户选择的容器运行时交互。 |
安装部署
生产环境部署k8s主要有两种方式:
二进制包
Github下载稳定版的二进制包,手动部署每个组件组成k8s集群。
kubeadm工具
使用Kubeadm工具可以快速搭建一个k8s集群,主要包括初始化控制平面节点和加入Worker节点,提供的主要功能如下:
- kubeadm init:初始化一个Master节点
- kubeadm join:将Worker节点加入集群
- kubeadm upgrade:升级K8s版本
- kubeadm token:管理 kubeadm join 使用的令牌
- kubeadm reset:清空 kubeadm init 或者 kubeadm join 对主机所做的任何更改
- kubeadm version:打印 kubeadm 版本
- kubeadm alpha:预览可用的新功能
二、准备工作
软硬件要求
- Linux操作系统,Ubuntu 或 CentOS
- 每台节点至少2G
- Master节点至少2C
- 集群节点网络互通
集群规划
软件环境
操作系统 CentOS Linux release 7.9.2009 x86_64
Docker v24.0.6 k8s v1.20.9 kubeadm v1.20 节点配置
主机 角色 IP CPU 内存 node1 Master 192.168.5.10
16C 40G node2 Node 192.168.5.11
16C 40G node3 Node 192.168.5.12
16C 40G 环境配置
修改hosts配置
配置所有节点的IP和域名映射
# vim /etc/hosts192.168.5.10 node1192.168.5.11 node2192.168.5.12 node3
配置SSH免密登录
先生成公钥对,再把公钥远程复制到所有节点。
[root@node1 ~]# ssh-keygen[root@node1 ~]# ssh-copy-id node1[root@node1 ~]# ssh-copy-id node2[root@node1 ~]# ssh-copy-id node3[root@node1 ~]# ssh node2Last login: Mon Oct 2 17:18:39 2023 from 192.168.5.117
关闭Swap分区
kubelet要求必须禁用交换分区,所以kubeadm初始化时回检测swap是否关闭,如果没有关闭会报错,如果不想关闭安装时命令行可以指定-ignore-preflight-errors=Swap,关闭Swap分区在所有节点上执行如下命令:
# 临时关闭,重启恢复[root@node1 ~]# swapoff -a# 永久关闭echo vm.swappiness = 0 >> /etc/sysctl.conf[root@node1 ~]# sysctl -p[root@node1 ~]# cat /etc/fstab/dev/mapper/centos-swap swap swap defaults 0 0
禁用SELinux
所有节点执行如下命令:
[root@node1 ~]# sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/sysconfig/selinux
关闭防火墙
所有节点执行如下命令:
[root@node1 ~]# systemctl disable firewalld[root@node1 ~]# systemctl stop firewalld
修改内核参数
[root@node1 ~]# modprobe br_netfilter[root@node1 ~]# echo "modprobe br_netfilter" >> /etc/profile[root@node1 ~]# tee /etc/sysctl.d/k8s.conf > /etc/hosts# 只在主节点执行kubeadm init \--apiserver-advertise-address=192.168.5.10 \--control-plane-endpoint=cluster-endpoint \--image-repository registry.cn-hangzhou.aliyuncs.com/google_containers \--kubernetes-version v1.20.9 \--service-cidr=10.96.0.0/12 \--pod-network-cidr=172.20.0.0/16
初始化需要下载多个镜像,可能时间比较久,最终安装的镜像如下:
[root@node1 ~]# docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEregistry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy v1.20.9 8dbf9a6aa186 2 years ago 99.7MBregistry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager v1.20.9 eb07fd4ad3b4 2 years ago 116MBregistry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver v1.20.9 0d0d57e4f64c 2 years ago 122MBregistry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler v1.20.9 295014c114b3 2 years ago 47.3MBregistry.cn-hangzhou.aliyuncs.com/google_containers/etcd 3.4.13-0 0369cf4303ff 3 years ago 253MBregistry.cn-hangzhou.aliyuncs.com/google_containers/coredns 1.7.0 bfe3a36ebd25 3 years ago 45.2MBregistry.cn-hangzhou.aliyuncs.com/google_containers/pause 3.2 80d28bedfe5d 3 years ago 683kB
成功界面:
Your Kubernetes control-plane has initialized successfully!To start using your cluster, you need to run the following as a regular user: mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/configAlternatively, if you are the root user, you can run: export KUBECONFIG=/etc/kubernetes/admin.confYou should now deploy a pod network to the cluster.Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at: https://kubernetes.io/docs/concepts/cluster-administration/addons/Then you can join any number of worker nodes by running the following on each as root:kubeadm join 192.168.5.10:6443 --token kdy4ka.jz5otwd1l3l2of5v \ --discovery-token-ca-cert-hash sha256:d40fe1c0af2bef8143106d27d418a4b7026f1f79a6dfe30cb4691d35755719ad
要使非root用户运行kubectl,请执行以下命令,这也是上面kubeadm init输出的一部分:
mkdir -p $HOME/.kubesudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/configsudo chown $(id -u):$(id -g) $HOME/.kube/config
如果是root用户,则可以执行以下命令:
export KUBECONFIG=/etc/kubernetes/admin.conf
记住上面输出的kubeadm join命令,下面用该命令将节点加入集群。
加入节点
所有Node节点执行如下命令:
kubeadm join 192.168.5.10:6443 --token kdy4ka.jz5otwd1l3l2of5v \ --discovery-token-ca-cert-hash sha256:d40fe1c0af2bef8143106d27d418a4b7026f1f79a6dfe30cb4691d35755719ad
查看token列表,可观察到每个token的剩余有效时间
[root@node1 ~]# kubeadm token listTOKEN TTL EXPIRES USAGES DESCRIPTION EXTRA GROUPSkdy4ka.jz5otwd1l3l2of5v 7h 2023-10-03T19:46:32+08:00 authentication,signing The default bootstrap token generated by 'kubeadm init'. system:bootstrappers:kubeadm:default-node-token
默认token有效期为24小时,过期之后token失效,可重新生成token:
kubeadm token create --print-join-command
修改角色:
# node节点执行[root@node1 ~]# kubectl label node node2 node-role.kubernetes.io/worker=worker# master节点执行[root@node1 ~]# kubectl get nodesNAME STATUS ROLES AGE VERSIONnode1 Ready control-plane,master 16h v1.20.9node2 Ready worker 15h v1.20.9node3 Ready worker 15h v1.20.9
安装网络插件
Calico是一套开源的纯三层的虚拟化网络解决方案,是目前K8s主流的网络方案。它把每个节点都作为一个虚拟路由器,把Pod当做路由器上一个终端设备为其分配一个IP地址,通过BGP协议生成路由规则,实现不同节点上的Pod网络互通。
# 下载calico.yaml并保存到本地[root@node1 ~]# curl https://docs.projectcalico.org/v3.15/manifests/calico.yaml -O修改配置3888行 - name: CALICO_IPV4POOL_CIDR3889行 value: "172.20.0.0/16"# 提交[root@node1 ~]# kubectl apply -f calico.yaml# 验证是否成功[root@node1 ~]# kubectl get pod -A | grep calicokube-system calico-kube-controllers-577f77cb5c-s6zfl 1/1 Running 0 15hkube-system calico-node-7gsfr 1/1 Running 0 15hkube-system calico-node-hb2k8 1/1 Running 0 15hkube-system calico-node-xt4bl 1/1 Running 0 15h
五、测试K8S集群
创建nginx pod
默认会在默认命名空间default中创建一个名称为mynignx的deployment,同时会创建一个名称以myniginx为前缀,叫mynginx-5b686ccd46-wshz6的Pod。
[root@node1 ~]# kubectl create deployment mynginx --image=nginxdeployment.apps/mynginx created# 查看pod[root@node1 ~]# kubectl get pod,svcNAME READY STATUS RESTARTS AGEpod/mynginx-5b686ccd46-wshz6 1/1 Running 0 39sNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEservice/kubernetes ClusterIP 10.96.0.1 443/TCP 17h
对外暴露访问
基于第一步创建的deployment再创建一个名叫mynginx的Service,资源类型由--type=ClusterIP修改为--type=NodePort,会在每个Node节点上监听30161端口,用于接收集群外部访问。
[root@node1 ~]# kubectl expose deployment mynginx --port=80 --type=NodePortservice/mynginx exposed# 查看[root@node1 ~]# kubectl get pod,svcNAME READY STATUS RESTARTS AGEpod/mynginx-5b686ccd46-wshz6 1/1 Running 0 5m24sNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEservice/kubernetes ClusterIP 10.96.0.1 443/TCP 17hservice/mynginx NodePort 10.105.55.49 80:30161/TCP 50s
访问nginx
浏览器输入:,都可以访问nginx首页表示测试成功。
六、安装Dashboard
k8s官方提供了一个简单的Dashboard,主要提供工作负载,服务,配置和存储,集群等管理功能。
Github:github.com/kubernetes/dashboard
通过kubectl命令安装
kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.3.1/aio/deploy/recommended.yaml
对外暴露访问端口,由--type=ClusterIP修改为--type=NodePort
kubectl edit svc kubernetes-dashboard -n kubernetes-dashboard
查看service
[root@node1 ~]# kubectl get svc -A|grep dashboardkubernetes-dashboard dashboard-metrics-scraper ClusterIP 10.102.247.36 8000/TCP 16hkubernetes-dashboard kubernetes-dashboard NodePort 10.96.38.129 443:31128/TCP 16h
浏览器输入访问地址:https://192.168.5.10:31128/,需要token才能访问。
创建访问账号
[root@node1 ~]# vim dashboard-token.yamlapiVersion: v1kind: ServiceAccountmetadata: name: admin-user namespace: kubernetes-dashboard---apiVersion: rbac.authorization.k8s.io/v1beta1kind: ClusterRoleBindingmetadata: name: admin-userroleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: cluster-adminsubjects:- kind: ServiceAccount name: admin-user namespace: kubernetes-dashboard[root@node1 ~]# kubectl apply -f dashboard-token.yamlserviceaccount/admin-user created
获取token
[root@node1 ~]# kubectl get secret -n kubernetes-dashboardNAME TYPE DATA AGEadmin-user-token-vfj8s kubernetes.io/service-account-token 3 10sdefault-token-w8jgn kubernetes.io/service-account-token 3 15mkubernetes-dashboard-certs Opaque 0 15mkubernetes-dashboard-csrf Opaque 1 15mkubernetes-dashboard-key-holder Opaque 2 15mkubernetes-dashboard-token-xjt6l kubernetes.io/service-account-token 3 15m# 查看名为admin-user-token-vfj8s的secret[root@node1 ~]# kubectl describe secret admin-user-token-vfj8s -n kubernetes-dashboardName: admin-user-token-vfj8sNamespace: kubernetes-dashboardLabels: Annotations: kubernetes.io/service-account.name: admin-user kubernetes.io/service-account.uid: 36b4e5f5-2f46-488d-960c-899cb4309d50Type: kubernetes.io/service-account-tokenData====ca.crt: 1066 bytesnamespace: 20 bytestoken: eyJhbGciOiJSUzI1NiIsImtpZCI6IkhMMXFCMGVaVHVrV0hHampTRExxdHlMcjBvTVlXRHd0Vl9hc29lSXU0TG8ifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlcm5ldGVzLWRhc2hib2FyZCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJhZG1pbi11c2VyLXRva2VuLXZmajhzIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQubmFtZSI6ImFkbWluLXVzZXIiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC51aWQiOiIzNmI0ZTVmNS0yZjQ2LTQ4OGQtOTYwYy04OTljYjQzMDlkNTAiLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6a3ViZXJuZXRlcy1kYXNoYm9hcmQ6YWRtaW4tdXNlciJ9.ZoE_jz20Jf3ImLl9BwTmk5VM7Y_VacRI3ZaTbaD8ipdsDV7CCBjE9edrVtQ-L86HOU0Qb_SA3HHqO0wtGagfAVHahHJaNLcr-MAOURWmIyLg8A2K07OT_5Qr9BJC-xxFym25sOc04Cyj-Z86-LsECSbIKLhUwsxXSzAQKuPmD471MMO-_JL-FWAJ-3jdZ8E4uAMD-mhJrKyORqMgoRxPJXPgwkzd2PRPrHoiaunbxiGo6qWhONGiMITjfCW77or32TbPIDuxy94j64tWvJyVDbmyGq1J0WeOzjfobdnbyM6BRGdjP86F_P-DyTXWSfOJHbAVYcgpDcqYO_DImtg8_g
登录界面
输入上面的token,进入dashboard首页
下一篇:怎么与服务器连接蓝牙耳机?