云原生|kubernetes|kubeadm方式安装部署 kubernetes1.20(可离线安装,修订版---2022-10-15)(一)

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
简介: 云原生|kubernetes|kubeadm方式安装部署 kubernetes1.20(可离线安装,修订版---2022-10-15)

前言:


首先呢,kubernetes通常简称为k8s(首尾字母是k和s,中间有8个字母),下面就都使用简称了,k8s的版本不多,但版本变化剧烈,据说1.22版本后不支持docker了,现在的主流版本是1.20。

其实,k8s指的是一个各种组件组成的一个完整的分布式套件集群,和大数据组合套件一样,有各种各样的组件,比如etcd,flummer,kubelet,kubectl,kube-proxy这些组件,和CDH类似,但又不是完全相同。

既然是集群了,那么部署的时候,三个要素是必须要有的,第一,时间服务器统一集群内的所有机器时间,第二,各个服务器之间可免密登录,第三,域名解析或者简化版的hosts统一配置。当然,我说的这三个要素是一个普遍的集群部署套路,MySQL集群,Oracle集群,weblogic集群,Redis集群等等,凡是集群,目前来说,我还没发现有可以缺少这三个要素的。

那么,部署集群的时候还需要考虑一个因素,就是集群和相关依赖环境的版本匹配问题,比如,k8s集群部署的时候,是基于docker引擎来驱动的,因此,docker的版本至关重要,在本文这个示例中,k8s的版本是1.20,而docker的版本应该不高于19.3为好,如果强行使用高版本docker,比如20.7,那么,可能会有各种各样的稀奇古怪的问题产生,因此,如非必要,请使用19.3版本的docker,会更配k8s1.20哦。

现在还有一个新的问题,k8s对于硬件的需求到底是怎么样的。这里,我需要解释一下,k8s是基于go语言所写的一系列组件,因此,对于硬件的支持是比较友好的,不像大数据集群CDH,HDP这些平台,java开发的平台,十分吃内存(话说回来,大数据计算的算力需求也是吃内存的一点因素),因此,硬件配置方面,多核CPU,4g以上内存足矣(当然,硬盘没人会嫌弃大,大一点好,毕竟,扩展硬盘容量是有风险的操作哦)。

小结:


k8s的集群部署,硬件方面应该至少需要双核CPU,4G以上内存,硬盘不要太小了,如果是实验性质,50G起步是比较好的,同时,不管哪种集群,基本都会要求组成集群的服务器数量是奇数数目,比如,三台服务器,五台服务器,一般偶数是不可接受的,比如2台服务器,四台服务器。同样的,k8s集群也是需要奇数个服务器组成集群,最小为3台服务器。

环境方面,时间服务器同步各个节点的时间(这里需要说明一下,时间非常重要,如果不同步,集群运行的时候会出各种稀奇古怪的问题,),节点之间互相免密登录(集群之间的通信,以及某些文件的共享,快速的分发需要免密登录支持),主机名和IP所有映射关系都应该有(如果有DNS更好,一次配置,免去后续的烦恼)。这些,是基本的一个集群的要求。

本次实验的环境介绍:


计划使用三台服务器组建一个最小化的k8s集群,主机名为master做主节点,其余为从节点。本文其后以ip地址末尾数字代指服务器,比如,16服务器,指的是192.168.0.16 。主机名的修改就不需要说了,太基础的东西,瞧不起谁呢!~~~~对吧

image.png

本次集群部署采用的方式为yum安装方式,后面我会提供离线包,可以完全不需要互联网安装k8s集群。

一,时间服务器的搭建


16服务器上:yum install ntp -y && systemctl enable ntpd  &&systemctl start ntpd

编辑ntp服务器的配置文件 /etc/ntp.conf ,将多余的server 字段删除,只保留以下server字段:

server 127.127.1.0
fudge 127.127.1.0 stratum 10

重启ntpd服务,systemctl restart ntpd

17和18服务器上相同的操作:

yum install ntp -y && systemctl enable ntpd  &&systemctl start ntpd

编辑ntp服务器的配置文件 /etc/ntp.conf ,将多余的server 字段删除,只保留以下server字段:

server 192.168.0.16

这个时间服务器其实指的的是192.168.0.16这个服务器,该服务器给17和18服务器提供授时服务。该种时间服务器是局域网内的通常做法,如果可连接互联网,那么,在16服务器上先手动同步一次比如阿里云的时间服务器,然后以本机时间为第一层级,阿里云时间服务器为第二层级即可,具体的互联网时间服务器请百度,在此不在赘述。

二,服务器之间的免密登录


在16服务器上执行四个命令:

ssh-keygen -t rsa   (这个需要回车到底)

ssh-copy-id 192.168.0.16  (根据提示,输入yes,输入16的密码)

ssh-copy-id 192.168.0.17  (根据提示,输入yes,输入17的密码)

ssh-copy-id 192.168.0.18  (根据提示,输入yes,输入18的密码)

在17服务器上执行四个命令:

ssh-keygen -t rsa   (这个需要回车到底)

ssh-copy-id 192.168.0.16  (根据提示,输入yes,输入16的密码)

ssh-copy-id 192.168.0.17  (根据提示,输入yes,输入17的密码)

ssh-copy-id 192.168.0.18  (根据提示,输入yes,输入18的密码)

在18服务器上执行四个命令:

ssh-keygen -t rsa   (这个需要回车到底)

ssh-copy-id 192.168.0.16  (根据提示,输入yes,输入16的密码)

ssh-copy-id 192.168.0.17  (根据提示,输入yes,输入17的密码)

ssh-copy-id 192.168.0.18  (根据提示,输入yes,输入18的密码)

三,简单的dns手动解析

vim /etc/hosts 在该文件末尾添加如下内容:

192.168.0.16 master k8s1.com
192.168.0.17 slave1 k8s2.com
192.168.0.18 slave2 k8s3.com

三、台服务器的/etc/hosts文件内容都一样,不管什么方法,保持一样。


四,以上的环境配置检查,是否达到预期


在16,17,18 服务器上都执行同一个命令以检测时间服务器是否正常: (只要有synchronised和  time correct 这样的字段即可,如果没有,检查配置,并耐心等待片刻。)

[root@master ~]# ntpstat 
synchronised to local net at stratum 6 
   time correct to within 11 ms
   polling server every 64 s

检查免密登录是否正常:

在16,17,18 上执行以下三个ssh命令,都能免密登录为正常。

[root@master ~]# ssh slave1
Last login: Sat Aug 14 11:04:22 2021 from 192.168.0.111
[root@slave1 ~]# logout
Connection to slave1 closed.
[root@master ~]# ssh slave2
Last login: Sat Aug 14 11:04:24 2021 from 192.168.0.111
[root@slave2 ~]# logout
Connection to slave2 closed.
[root@master ~]# ssh master
Last login: Sat Aug 14 11:04:19 2021 from 192.168.0.111

五,docker的安装


docker采用可离线化的二进制安装包方式。具体安装方法见本人博客:docker的离线安装以及本地化配置_zsk_john的博客-CSDN博客_docker本地化部署

注意一点,前面也反复强调,使用docker-ce的19.3版本,一定不要搞错了。三台服务器都要安装哦,其实已经配置免密了,安装起来也十分简单了。

六,安装离线包内的k8s


链接:https://pan.baidu.com/s/1aVPG3Dfdu0caf8f203qvOQ

提取码:k8es

百度网盘内的文件解压后,最终是两个文件夹,一个是images.tar.gz 解压后的文件是docker引擎启动容器的镜像文件,一个是k8s.tar.gz ,里面有docker的二进制安装包和服务文件,以及k8s的各个组件的RPM安装文件,执行命令 rpm -ivh *.rpm 即可安装完k8s。

三个节点都需要安装k8s,也就是那些RPM包,也需要运行 kubectl apply -f k8s.yaml 这个命令。

七,k8s集群的初始化


(1)初始化之前,需要关闭交换内存:关闭命令为(三台服务器都执行此命令):

swapoff -a && sed -ri 's/.*swap.*/#&/' /etc/fstab 

此命令意思为关闭交换内存,然后删除/etc/fstab里关于swap的挂载选项

(2)初始化命令如下:

kubeadm init --kubernetes-version=1.20.0 --apiserver-advertise-address=192.168.0.16 --image-repository registry.aliyuncs.com/google_containers --service-cidr=10.20.0.0/16 --pod-network-cidr=10.244.0.0/16

初始化的工作内容主要是生成各个组件需要的tls证书以及相关配置文件(主要存放路径是 /etc/kubernetes/这个目录下),并安装了coredns和kube-proxy 这两个核心组件以及客户端kubelet和kubectl这两个工具,下面的日志有比较清楚的记录。

该命令输出的日志如下:

[init] Using Kubernetes version: v1.20.0
[preflight] Running pre-flight checks
    [WARNING IsDockerSystemdCheck]: detected "cgroupfs" as the Docker cgroup driver. The recommended driver is "systemd". Please follow the guide at https://kubernetes.io/docs/setup/cri/
[preflight] Pulling images required for setting up a Kubernetes cluster
[preflight] This might take a minute or two, depending on the speed of your internet connection
[preflight] You can also perform this action in beforehand using 'kubeadm config images pull'
[certs] Using certificateDir folder "/etc/kubernetes/pki"
[certs] Generating "ca" certificate and key
[certs] Generating "apiserver" certificate and key
[certs] apiserver serving cert is signed for DNS names [kubernetes kubernetes.default kubernetes.default.svc kubernetes.default.svc.cluster.local master] and IPs [192.168.0.1 192.168.0.16]
[certs] Generating "apiserver-kubelet-client" certificate and key
[certs] Generating "front-proxy-ca" certificate and key
[certs] Generating "front-proxy-client" certificate and key
[certs] Generating "etcd/ca" certificate and key
[certs] Generating "etcd/server" certificate and key
[certs] etcd/server serving cert is signed for DNS names [localhost master] and IPs [192.168.0.16 127.0.0.1 ::1]
[certs] Generating "etcd/peer" certificate and key
[certs] etcd/peer serving cert is signed for DNS names [localhost master] and IPs [192.168.0.16 127.0.0.1 ::1]
[certs] Generating "etcd/healthcheck-client" certificate and key
[certs] Generating "apiserver-etcd-client" certificate and key
[certs] Generating "sa" key and public key
[kubeconfig] Using kubeconfig folder "/etc/kubernetes"
[kubeconfig] Writing "admin.conf" kubeconfig file
[kubeconfig] Writing "kubelet.conf" kubeconfig file
[kubeconfig] Writing "controller-manager.conf" kubeconfig file
[kubeconfig] Writing "scheduler.conf" kubeconfig file
[kubelet-start] Writing kubelet environment file with flags to file "/var/lib/kubelet/kubeadm-flags.env"
[kubelet-start] Writing kubelet configuration to file "/var/lib/kubelet/config.yaml"
[kubelet-start] Starting the kubelet
[control-plane] Using manifest folder "/etc/kubernetes/manifests"
[control-plane] Creating static Pod manifest for "kube-apiserver"
[control-plane] Creating static Pod manifest for "kube-controller-manager"
[control-plane] Creating static Pod manifest for "kube-scheduler"
[etcd] Creating static Pod manifest for local etcd in "/etc/kubernetes/manifests"
[wait-control-plane] Waiting for the kubelet to boot up the control plane as static Pods from directory "/etc/kubernetes/manifests". This can take up to 4m0s
[apiclient] All control plane components are healthy after 19.505408 seconds
[upload-config] Storing the configuration used in ConfigMap "kubeadm-config" in the "kube-system" Namespace
[kubelet] Creating a ConfigMap "kubelet-config-1.20" in namespace kube-system with the configuration for the kubelets in the cluster
[upload-certs] Skipping phase. Please see --upload-certs
[mark-control-plane] Marking the node master as control-plane by adding the labels "node-role.kubernetes.io/master=''" and "node-role.kubernetes.io/control-plane='' (deprecated)"
[mark-control-plane] Marking the node master as control-plane by adding the taints [node-role.kubernetes.io/master:NoSchedule]
[bootstrap-token] Using token: 6z627c.k3x3vtcsq9j3xay0
[bootstrap-token] Configuring bootstrap tokens, cluster-info ConfigMap, RBAC Roles
[bootstrap-token] configured RBAC rules to allow Node Bootstrap tokens to get nodes
[bootstrap-token] configured RBAC rules to allow Node Bootstrap tokens to post CSRs in order for nodes to get long term certificate credentials
[bootstrap-token] configured RBAC rules to allow the csrapprover controller automatically approve CSRs from a Node Bootstrap Token
[bootstrap-token] configured RBAC rules to allow certificate rotation for all node client certificates in the cluster
[bootstrap-token] Creating the "cluster-info" ConfigMap in the "kube-public" namespace
[kubelet-finalize] Updating "/etc/kubernetes/kubelet.conf" to point to a rotatable kubelet client certificate and key
[addons] Applied essential addon: CoreDNS
[addons] Applied essential addon: kube-proxy
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/config
Alternatively, if you are the root user, you can run:
  export KUBECONFIG=/etc/kubernetes/admin.conf
You 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.0.16:6443 --token 6z627c.k3x3vtcsq9j3xay0 \
    --discovery-token-ca-cert-hash sha256:1abb02d9c8f0f65fd303d91f52484f21e99720a211af9e14a9eb2b0f047da716


相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
相关文章
|
3天前
|
存储 Kubernetes 开发者
容器化时代的领航者:Docker 和 Kubernetes 云原生时代的黄金搭档
Docker 是一种开源的应用容器引擎,允许开发者将应用程序及其依赖打包成可移植的镜像,并在任何支持 Docker 的平台上运行。其核心概念包括镜像、容器和仓库。镜像是只读的文件系统,容器是镜像的运行实例,仓库用于存储和分发镜像。Kubernetes(k8s)则是容器集群管理系统,提供自动化部署、扩展和维护等功能,支持服务发现、负载均衡、自动伸缩等特性。两者结合使用,可以实现高效的容器化应用管理和运维。Docker 主要用于单主机上的容器管理,而 Kubernetes 则专注于跨多主机的容器编排与调度。尽管 k8s 逐渐减少了对 Docker 作为容器运行时的支持,但 Doc
28 5
容器化时代的领航者:Docker 和 Kubernetes 云原生时代的黄金搭档
|
15天前
|
人工智能 缓存 异构计算
云原生AI加速生成式人工智能应用的部署构建
本文探讨了云原生技术背景下,尤其是Kubernetes和容器技术的发展,对模型推理服务带来的挑战与优化策略。文中详细介绍了Knative的弹性扩展机制,包括HPA和CronHPA,以及针对传统弹性扩展“滞后”问题提出的AHPA(高级弹性预测)。此外,文章重点介绍了Fluid项目,它通过分布式缓存优化了模型加载的I/O操作,显著缩短了推理服务的冷启动时间,特别是在处理大规模并发请求时表现出色。通过实际案例,展示了Fluid在vLLM和Qwen模型推理中的应用效果,证明了其在提高模型推理效率和响应速度方面的优势。
云原生AI加速生成式人工智能应用的部署构建
|
6天前
|
存储 Kubernetes 容器
K8S部署nexus
该配置文件定义了Nexus 3的Kubernetes部署,包括PersistentVolumeClaim、Deployment和服务。PVC请求20Gi存储,使用NFS存储类。Deployment配置了一个Nexus 3容器,内存限制为6G,CPU为1000m,并挂载数据卷。Service类型为NodePort,通过30520端口对外提供服务。所有资源位于`nexus`命名空间中。
|
11天前
|
Kubernetes 应用服务中间件 nginx
二进制安装Kubernetes(k8s)v1.32.0
本指南提供了一个详细的步骤,用于在Linux系统上通过二进制文件安装Kubernetes(k8s)v1.32.0,支持IPv4+IPv6双栈。具体步骤包括环境准备、系统配置、组件安装和配置等。
121 10
|
29天前
|
Kubernetes Cloud Native 微服务
云原生入门与实践:Kubernetes的简易部署
云原生技术正改变着现代应用的开发和部署方式。本文将引导你了解云原生的基础概念,并重点介绍如何使用Kubernetes进行容器编排。我们将通过一个简易的示例来展示如何快速启动一个Kubernetes集群,并在其上运行一个简单的应用。无论你是云原生新手还是希望扩展现有知识,本文都将为你提供实用的信息和启发性的见解。
|
1月前
|
敏捷开发 Kubernetes Cloud Native
阿里云云原生技术为企业提供了一套高效、灵活的解决方案,支持跨云部署与管理
在多云环境中,阿里云云原生技术为企业提供了一套高效、灵活的解决方案,支持跨云部署与管理。通过容器化、服务网格等技术,实现了应用的一致性与可移植性,简化了多云环境下的资源管理和服务治理,帮助企业应对复杂的云环境挑战,加速数字化转型。
43 5
|
1月前
|
Kubernetes Cloud Native 开发者
云原生入门:Kubernetes的简易指南
【10月更文挑战第41天】本文将带你进入云原生的世界,特别是Kubernetes——一个强大的容器编排平台。我们将一起探索它的基本概念和操作,让你能够轻松管理和部署应用。无论你是新手还是有经验的开发者,这篇文章都能让你对Kubernetes有更深入的理解。
|
1月前
|
运维 Kubernetes Cloud Native
云原生技术入门:Kubernetes和Docker的协同工作
【10月更文挑战第43天】在云计算时代,云原生技术成为推动现代软件部署和运行的关键力量。本篇文章将带你了解云原生的基本概念,重点探讨Kubernetes和Docker如何协同工作以支持容器化应用的生命周期管理。通过实际代码示例,我们将展示如何在Kubernetes集群中部署和管理Docker容器,从而为初学者提供一条清晰的学习路径。
|
1月前
|
Kubernetes 负载均衡 Cloud Native
探索Kubernetes:云原生应用的基石
探索Kubernetes:云原生应用的基石
|
1月前
|
Kubernetes 监控 负载均衡
深入云原生:Kubernetes 集群部署与管理实践
【10月更文挑战第37天】在数字化转型的浪潮中,云原生技术以其弹性、可扩展性成为企业IT架构的首选。本文将引导你了解如何部署和管理一个Kubernetes集群,包括环境准备、安装步骤和日常维护技巧。我们将通过实际代码示例,探索云原生世界的秘密,并分享如何高效运用这一技术以适应快速变化的业务需求。
67 1