K8S完整安装配置

一. 环境准备
裸机安装:至少有两台服务器,一个主节点,一个工作节点。需要在即安装k8s的组件。
环境搭建:参考文章-https://cloud.tencent.com/developer/article/1997451

二. 集群搭建
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

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

systemctl stop firewalld
systemctl disable firewalld

验证防火墙的状态

systemctl status firewalld

关闭swapoff

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

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

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

第八步:修改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节点执行)

注意:只在主节点运行
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

//用命令检查kubelet的状态
systemctl status kubelet

状态返回异常
在这里插入图片描述
然后看日志,看看日志包的什么错?

journalctl -xefu kubelet

在这里插入图片描述
日志说的很清楚,没有找到/var/lib/kubelet/config.yaml文件
这个问题最后我卸载了kubelet,然后重新装了一遍就好了。

我在启动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

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

在这里插入图片描述

异常: failed to pull image “registry.k8s.io/pause:3.6”

如果直接改/etc/containerd/config.toml可能不成功,因为这个文件不完整,启动的时候还是不会使用这个文件

containerd config default > /etc/containerd/config.toml
vi /etc/containerd/config.toml

在这里插入图片描述
改为sandbox_image = “registry.aliyuncs.com/google_containers/pause:3.9”
在这里插入图片描述
改为SystemdCgroup = true

systemctl restart containerd

在这里插入图片描述
出现上面现象,允许下面命令

mkdir -p $HOME/.kube
sudo 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

看到如下结果就成功了:
在这里插入图片描述
接下来可以使用kubectl来查看子节点

kubectl get node

在这里插入图片描述
我们看到有一个master节点,两个node节点。他们的状态都是NotReady ;master节点是一个控制平台,并且是主节点。

第十二步:安装网络插件(在master上安装)
为什么上面节点都是NotReady呢?因为我们还需要安装一个网络插件,他们才能工作。

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

安装成功的图如下:
在这里插入图片描述
然后再查看节点状态

kubectl get node

在这里插入图片描述
现在就都是ready状态了。

公网部署:

cat <<EOF >  /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF

sysctl --system

给所有节点创建一个与外网IP一样的虚拟IP

cat > /etc/sysconfig/network-scripts/ifcfg-eth0:1 <<EOF
BOOTPROTO=static
DEVICE=eth0:1
IPADDR=xxx.xxx.xxx.xxx //公网ip
PREFIX=32
TYPE=Ethernet
USERCTL=no
ONBOOT=yes
EOF

重启网络:

systemctl restart network

kubeadm init 时出现错误: [ERROR FileContent–proc-sys-net-ipv4-ip_forward]:
/proc/sys/net/ipv4/ip_forward contents are not set to 1

echo 1 > /proc/sys/net/ipv4/ip_forward

节点进入 NotReady 状态排查

kubectl get node

在这里插入图片描述

kubectl describe node master

查看输出中是否有以下几种资源压力:

MemoryPressure: 表示节点内存不足。
DiskPressure: 表示节点磁盘使用率过高。
PIDPressure: 表示节点上的进程数达到系统限制。 Ready: 表示节点是否就绪。

配置CNI网络
创建CNI配置文件: 在/etc/cni/net.d/目录下创建一个配置文件,例如10-mynet.conf,内容如下:

{
    "cniVersion": "0.4.0",
    "name": "mynet",
    "type": "bridge",
    "bridge": "cni0",
    "isGateway": true,
    "ipMasq": true,
    "ipam": {
        "type": "host-local",
        "subnet": "10.22.0.0/16",
        "routes": [
            { "dst": "0.0.0.0/0" }
        ]
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值