K8S超级完整安装配置

本文涉及的产品
云防火墙,500元 1000GB
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
简介: K8S超级完整安装配置

前言: 采坑



k8s有3种安装方式,如下所示:


  • minikube:这是一个k8s集群模拟器,只有一个节点的集群,只为了测试使用,master和node都在一台机器上
  • 直接使用带有容器功能的云平台安装:这个可以采用阿里云或者腾讯云服务器带有容器功能的,这个的优点就是可视化搭建,步骤简单,完全不用自己去安装了,缺点是收费。
  • 裸机安装:至少有两台服务器,一个主节点,一个工作节点。需要在即安装k8s的组件。配置稍微麻烦点。


我因为是自己学习使用,所以采用裸机安装。全程自己操作,我是通过在本机安装虚拟机,安装了3台虚拟机,我的环境是mac笔记本。如果想要参考mac笔记本安装虚拟机,可以看这篇文章:https://www.cnblogs.com/ITPower/p/15906012.html


一. 环境准备


操作系统:macOS 笔记本

虚拟机: Parallels

网络环境搭建:参考文章- https://www.cnblogs.com/ITPower/p/15906012.html


二. 集群搭建



1、搭建环境需要的组件


1) master节点需要的组件


  • docker
  • kubectl:集群命令行交互工具
  • kubeadm:集群初始化工具


2)node节点需要的组件


  • docker
  • kubelet:管理pod的容器,确保他们健康稳定的运行
  • Kube-proxy: 网络代理,负责网络相关工作


2、开始搭建


第一步:设置每个节点的主机名


sudo hostnamectl set-hostname master
sudo hostnamectl set-hostname node1
sudo hostnamectl set-hostname node2

这条命令会删除/etc/hostname文件中的主机名,然后替换为新的主机名。系统会更新/etc/hosts文件.


然后输入名称查询是否已经变更了主机名


hostname

第二步:添加ip和主机名的映射关系


获取服务器的ip,并在宿主机访问. 我的三台虚拟机的ip是


10.211.55.200
10.211.55.201
10.211.55.202

将ip和主机名的映射关系添加到3台服务器中,执行命令


sudo vim /etc/hosts

然后将下列代码拷贝进去


10.211.55.200 master
10.211.55.201 node1
10.211.55.202 node2

全部都配置好了以后,在三台服务ping一下,看看是否能访问通


ping master
ping node1
ping node2

能ping通就说明配置没问题。


第三步:关闭所有节点的SELINUX


关闭所有节点的SELINUX, Redhat使用了SELinux来增强安全


setenforce 0  
sed -i --follow-symlinks 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/sysconfig/selinux

上面两个命令的含义:第一个是临时关闭防火墙,不需要重启服务;第二个是永久关闭防火墙,需要重启。


验证防火墙是否关闭成功


getenforce  或者 sestatus

SELINUX相关命令科普


sestatus # 查询SELINUX的状态

关闭selinux的方法有两种:临时关闭和永久关闭。

  1. 临时关闭防火墙
    临时关闭在重启后会失效。
    临时关闭命令:


setenforce 0
  1. 查看是否关闭成功:
getenforce
  1. 临时关闭报错 setenforce: setenforce() failed ,问题是权限不够,我们需要管理员权限才可以。要先获取root权限
su  - root 
setenforce  0
  1. 永久关闭防火墙
    编辑配置文件 /etc/selinux/config 。需要重启才可以生效
sed -i '/^SELINUX=/s/enforcing/disabled/' /etc/selinux/config
  1. 我们常用的方法是,先配置临时生效,再更改配置文件。这样就算服务器重启了,selinux也还是关闭的。


第四步:关闭所有节点的防火墙和swapoff


systemctl stop firewalld
systemctl disable firewalld

验证防火墙的状态


systemctl status firewalld

关闭swapoff


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

第五步:添加k8s安装源和docker安装源


添加k8s安装源


cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

添加docker安装源


sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

第六步:安装k8s组件


yum install -y kubelet kubeadm kubectl docker-ce

三台服务器都安装。


第七步:启动kubelet、docker,并设置开机启动


systemctl enable kubelet
systemctl start kubelet
systemctl enable docker
systemctl start docker

Kubelet组件运行在Node节点上,维持运行中的Pods以及提供kuberntes运行时环境,主要完成以下使命:


1.监视分配给该Node节点的pods

2.挂载pod所需要的volumes

3.下载pod的secret

4.通过docker/rkt来运行pod中的容器

5.周期的执行pod中为容器定义的liveness探针

6.上报pod的状态给系统的其他组件

7.上报Node的状态


一定要检查kubelet的状态是否正常


systemctl daemon-reload
systemctl status kubelet


1187916-20220224183444464-2069159299.png


这是启动成功的状态。


我在启动kubelet这里遇到的麻烦,总是提示启动失败。各种排查都没有找到原因。最后卸载重新安装了,记录一下卸载流程

第一步:我使用的yum install安装的,所以卸载使用 yum remove

yum -y remove kubelet  //-y表示又询问都是yes

第二步:查看kubelet包在linux中是否存在

yum list kubelet

我们看到包还在,原因是软件卸载了,并没有删除软件包

第三步:检查删除的状态

systemctl status kubelet

状态提示:

Warning: kubelet.service changed on disk. Run 'systemctl daemon-reload' to reload units.

第四步:验证删除成功

执行systemctl daemon-reload

systemctl daemon-reload

执行完以后在查询状态

systemctl status kubelet

Unit kubelet.service could not be found.

第五步:重新安装

yum -y install kubelet

第六步:启动kubelet,并开机启动

systemctl enable kubelet
systemctl start kubelet

第八步:修改docker配置


kuberneters官方推荐docker等使用systemd作为cgroupdriver,否则kubelet启动不了

为什么要修改docker的cgroup driver?

https://www.cnblogs.com/architectforest/p/12988488.html


cat <<EOF > /etc/docker/daemon.json
{
    "registry-mirrors": ["https://registry.docker-cn.com"],
    "exec-opts": ["native.cgroupdriver=systemd"]
}
EOF

重启docker


// 守护进程重启
systemctl daemon-reload
systemctl restart docker

验证docker的Cgroup是否是systemd


docker info |grep Cgroup

应该返回如下内容


[root@node1~]# docker info |grep Cgroup
Cgroup Driver: systemd
#docker驱动程序为 systemd

第九步:用kubeadm来初始化集群(仅master节点执行)


注意:这个命令仅在master节点执行


什么是kubeadm?


我们来看看官网的介绍


Kubeadm是一个工具,它提供kubeadm init和kubeadm join作为创建Kubernetes集群的最佳实践“快捷路径”。

kubeadm执行必要的操作来启动和运行最小可行集群。按照设计,它只关心引导,而不关心配置机器。同样,安装各种漂亮的插件(比如Kubernetes Dashboard、监控解决方案和特定于云的插件)也不在讨论范围之内。

相反,我们期望在kubeadm的基础上构建更高级、更定制化的工具,理想情况下,使用kubeadm作为所有部署的基础将使创建符合规范的集群变得更容易。

kubeadm 让k8s使用容器化的方案运行。


1)初始化集群控制台, 失败了可以用kubeadm reset重置


注意:只在主节点运行
kubeadm init --kubernetes-version=1.23.4 \
--apiserver-advertise-address=10.211.55.200 \
--image-repository registry.aliyuncs.com/google_containers \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16
  • 执行了这个命令以后,会帮我们创建集群的控制台
  • --image-repository registry.aliyuncs.com/google_containers 指定镜像源,由于kubeadm 默认从官网k8s.grc.io下载所需镜像,国内无法访问,因此需要通过--image-repository指定阿里云镜像仓库地址
  • --kubernetes-version:版本信息 kubectl version 查询
  • 定义POD的网段为: 10.244.0.0/16
  • apiserver地址就是master本机IP地址
  • --service-cidr=10.96.0.0/12 : 这个参数后的IP地址直接就套用10.96.0.0/12 ,以后安装时也套用即可,不要更改


--pod-network-cidr=10.244.0.0/16 : k8s内部的pod节点之间网络可以使用的IP段,不能和service-cidr写一样,如果不知道怎么配,就先用这个10.244.0.0/16


初始化失败的可以重置,使用命令


kubeadm reset

重置以后会有这样一段提示


The reset process does not clean your kubeconfig files and you must remove them manually.

Please, check the contents of the $HOME/.kube/config file.

意思是kubeadm reset 执行后不会删除$HOME/.kube文件,需要手动执行rm -rf $HOME/.kube


然后重新初始化。


初始化的过程中异常记录


异常1:

1187916-20220224171134777-117432905.png

It seems like the kubelet isn't running or healthy.


首先可以用命令检查kubelet的状态


systemctl status kubelet

状态返回异常

1187916-20220224175058749-1859231625.png


然后看日志,看看日志包的什么错?


journalctl -xefu kubelet


1187916-20220224175140492-1917246104.png


日志说的很清楚,没有找到/var/lib/kubelet/config.yaml文件


这个问题最后我卸载了kubelet,然后重新装了一遍就好了。


最后,看到下面的内容,就表示安装成功了


1187916-20220224204012288-853987472.png

复制出来最后两行, 并进行保存


kubeadm join 10.211.55.200:6443 --token c8ysgy.uvo10ecrlqktmvft \
  --discovery-token-ca-cert-hash sha256:1ef77481c6c0efc18455e611d84567c3bb236da39cf98c2d0393c5454c4ba213

如果当时忘了复制,也没有关系, 使用命令重新获取


重新获取token的命令:


kubeadm token create --print-join-command

第十步:复制授权文件(仅master节点执行)


注意:这个授权文件要去在root权限下执行


复制授权文件,以便kubectl有权限访问集群
su - root
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config

第十一步:将工作节点加入到集群(仅在node节点执行)


将初始化主节点时生产的代码在node节点执行一下即可。


注意:要删掉第一个行后面的“\”


kubeadm join 10.211.55.200:6443 --token c8ysgy.uvo10ecrlqktmvft --discovery-token-ca-cert-hash sha256:1ef77481c6c0efc18455e611d84567c3bb236da39cf98c2d0393c5454c4ba213

在两个node节点都执行一遍


异常问题记录


异常1:

/proc/sys/net/bridge/bridge-nf-call-iptables contents are not set to 1

这时我们手动设置这个为1


echo 1 > /proc/sys/net/bridge/bridge-nf-call-iptables

当多次调整都不成功的时候,可以重新获取一下token


kubeadm token create --print-join-command

看到如下结果就成功了:


1187916-20220228111514201-1275208564.png

接下来可以使用kubectl来查看子节点

kubectl get node

1187916-20220228111823280-2038055408.png


我们看到有一个master节点,两个node节点。他们的状态都是NotReady ;master节点是一个控制平台,并且是主节点。


第十二步:安装网络插件(在master上安装)


为什么上面节点都是NotReady呢?因为我们还需要安装一个网络插件,他们才能工作。

kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

安装成功的图如下:

1187916-20220228114317436-1512167428.png

然后再查看节点状态


kubectl get node


1187916-20220228114436383-1577210157.png


现在就都是ready状态了。

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
6月前
|
缓存 Kubernetes Docker
容器服务ACK常见问题之容器服务ACK ingress websocket配置失败如何解决
容器服务ACK(阿里云容器服务 Kubernetes 版)是阿里云提供的一种托管式Kubernetes服务,帮助用户轻松使用Kubernetes进行应用部署、管理和扩展。本汇总收集了容器服务ACK使用中的常见问题及答案,包括集群管理、应用部署、服务访问、网络配置、存储使用、安全保障等方面,旨在帮助用户快速解决使用过程中遇到的难题,提升容器管理和运维效率。
|
2月前
|
JSON Kubernetes API
深入理解Kubernetes配置:编写高效的YAML文件
深入理解Kubernetes配置:编写高效的YAML文件
|
9天前
|
Kubernetes 监控 Java
如何在Kubernetes中配置镜像和容器的定期垃圾回收
如何在Kubernetes中配置镜像和容器的定期垃圾回收
|
6月前
|
Kubernetes 负载均衡 应用服务中间件
深入理解 Kubernetes Ingress:路由流量、负载均衡和安全性配置
深入理解 Kubernetes Ingress:路由流量、负载均衡和安全性配置
1081 1
|
3月前
|
Kubernetes Go 网络安全
Kubernetes 中使用consul-template渲染配置
Kubernetes 中使用consul-template渲染配置
58 1
Kubernetes 中使用consul-template渲染配置
|
3月前
|
Kubernetes 网络性能优化 调度
在K8S中,Kubernets资源限制是如何配置的,是否根据Qos?
在K8S中,Kubernets资源限制是如何配置的,是否根据Qos?
|
3月前
|
Kubernetes 调度 Perl
在K8S中,Pod多副本配置了硬亲和性,会调度到同⼀个节点上吗?
在K8S中,Pod多副本配置了硬亲和性,会调度到同⼀个节点上吗?
|
3月前
|
存储 Kubernetes Linux
Kubernetes 的配置资源 ConfigMap(01部分)
Kubernetes 的配置资源 ConfigMap(01部分)
|
4月前
|
Kubernetes 应用服务中间件 调度
云上应用管理问题之如何在Kubernetes集群中配置跨可用区的Pod调度
云上应用管理问题之如何在Kubernetes集群中配置跨可用区的Pod调度
|
3月前
|
Kubernetes 容器
Kubernetes(K8S) 配置静态资源服务
Kubernetes(K8S) 配置静态资源服务
58 0