centos7部署k8s集群环境

Kubernetes是一个开源的,用于管理云平台中多个主机上的容器化的应用,Kubernetes的目标是让部署容器化的应用简单并且高效(powerful),Kubernetes提供了应用部署,规划,更新,维护的一种机制。
安装要求:
内存2GB或更多,CPU2核或更多,硬盘30GB或更多
集群中的所有机器之间网络互通
可以访问外网,需要拉取镜像
禁止swap分区

系统约定

k8s-master 192.168.90.220 Centos7
k8s-node1 192.168.90.221 Centos7
k8s-node2 192.168.90.222 Centos7

我们使用kubeadm搭建k8s集群,为了支持master与node之前的通信,我们还需要在master上安装flannel来实现maste与node之间的网络通信
我们先做环境的配置,来满足K8s安装的要求,以下操作在所有机器上需要做
关闭防火墙

systemctl stop firewalld
systemctl disable firewalld

关闭selinux:

sed -i 's/enforcing/disabled/' /etc/selinux/config
setenforce 0

关闭swap交换分区

swapoff -a #临时关闭

永久关闭需要注释掉/etc/fstab文件中的swap行

安装一些必要的工具和依赖

yum install -y yum-utils device-mapper-persistent-data lvm2

添加阿里云的docker软件源,方便yum安装软件

yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo

添加K8S的阿里云yum源

vi /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

清除缓存列表并更新

yum clean all
yum makecache fast
yum update -y

设置主机名,在每个节点设置对应的主机名
192.168.90.220机器设置以下主机名

hostnamectl set-hostname k8s-master

192.168.90.221机器设置以下主机名

hostnamectl set-hostname k8s-node1

192.168.90.222机器设置以下主机名

hostnamectl set-hostname k8s-node2

编辑节点hosts文件,将所有节点的ip和主机名一一对应,所有节点hosts文件均需要修改

192.168.90.220     k8s-master
192.168.90.221      k8s-node1
192.168.90.222     k8s-node2

将桥接的IPv4流量传递到iptables的链,在每个节点添加如下的命令

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

开启IP转发功能

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

加载br_netfilter模块

modprobe br_netfilter

查看是否加载

lsmod | grep br_netfilter

使配置生效

sysctl --system

同步所有节点时间,也可以自行配置时钟源服务器,作为集群内时间服务器

yum install ntpdate -y
ntpdate time.windows.com

开启ipvs

yum -y install ipset ipvsadm

在所有节点执行以下命令

cat > /etc/sysconfig/modules/ipvs.modules <<EOF
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
EOF

授权、运行、检查是否加载

chmod 755 /etc/sysconfig/modules/ipvs.modules
bash /etc/sysconfig/modules/ipvs.modules

检查加载是否成功

lsmod | grep -e ipvs -e nf_conntrack_ipv4

所有节点安装docker、kubeadm、kubelet
安装docker

yum -y install docker-ce-18.06.1.ce-3.el7

设置docker开机启动并启动服务

systemctl enable docker
systemctl start docker
docker --version #查看docker版本
Docker version 18.06.1-ce, build e68fc7a

设置Docker镜像加速器,添加daemon.json配置文件

mkdir -p /etc/docker
vi /etc/docker/daemon.json 
{
  "exec-opts": ["native.cgroupdriver=systemd"],    
  "registry-mirrors": ["https://b9pmyelo.mirror.aliyuncs.com"]
}

重载,并重启服务

systemctl daemon-reload
systemctl restart docker

安装kubeadm、kubelet和kubectl,版本需要和docker匹配,这里选择的是1.18.0版本,所以有节点均要安装

yum install -y kubelet-1.18.20 kubeadm-1.18.20 kubectl-1.18.20

查看创建集群需要的镜像版本

kubeadm config images list
I1119 10:23:26.794266    7172 version.go:255] remote version is much newer: v1.22.4; falling back to: stable-1.18
W1119 10:23:27.798322    7172 configset.go:202] WARNING: kubeadm cannot validate component configs for API groups [kubelet.config.k8s.io kubeproxy.config.k8s.io]
k8s.gcr.io/kube-apiserver:v1.18.20
k8s.gcr.io/kube-controller-manager:v1.18.20
k8s.gcr.io/kube-scheduler:v1.18.20
k8s.gcr.io/kube-proxy:v1.18.20
k8s.gcr.io/pause:3.2
k8s.gcr.io/etcd:3.4.3-0
k8s.gcr.io/coredns:1.6.7

为了实现Docker使用的cgroup drvier和kubelet使用的cgroup drver一致,建议修改"/etc/sysconfig/kubelet"文件的内容:

vi /etc/sysconfig/kubelet
KUBELET_EXTRA_ARGS="--cgroup-driver=systemd"

设置为开机自启动即可,由于没有生成配置文件,集群初始化后自动启动

systemctl enable kubelet

在k8s-master操作,注意此处记录下生成的token密钥

kubeadm init \
  --apiserver-advertise-address=192.168.90.220 \
  --image-repository registry.aliyuncs.com/google_containers \
  --kubernetes-version v1.18.20 \
  --service-cidr=10.96.0.0/12 \
  --pod-network-cidr=10.244.0.0/16

微信截图_20211119095847.png

初始化如果报错,可以尝试使用下面的方法修复

The HTTP call equal to 'curl -sSL http://localhost:10248/healthz' failed with error: Get http://localhost:10248/healthz: dial tcp [::1]:10248: connect: connection refused.

解决方法:
修改/etc/systemd/system/kubelet.service.d/10-kubeadm.conf文件解决,如果目录不存在需要创建这层目录

vi /etc/systemd/system/kubelet.service.d/10-kubeadm.conf
[Service]
Environment="KUBELET_KUBECONFIG_ARGS=--bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf"
Environment="KUBELET_CONFIG_ARGS=--config=/var/lib/kubelet/config.yaml"
# This is a file that "kubeadm init" and "kubeadm join" generates at runtime, populating the KUBELET_KUBEADM_ARGS variable dynamically
EnvironmentFile=-/var/lib/kubelet/kubeadm-flags.env
# This is a file that the user can use for overrides of the kubelet args as a last resort. Preferably, the user should use
# the .NodeRegistration.KubeletExtraArgs object in the configuration files instead. KUBELET_EXTRA_ARGS should be sourced from this file.
EnvironmentFile=-/etc/default/kubelet
ExecStart=
ExecStart=/usr/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_CONFIG_ARGS $KUBELET_KUBEADM_ARGS $KUBELET_EXTRA_ARGS

保存退出,然后重启下服务

systemctl daemon-reload
systemctl restart kubelet

根据提示信息,在k8s-master节点上使用kubectl工具,配置常规用户如何使用kubectl访问集群

mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config

添加k8s的Node节点,分别在两个k8s-node节点执行,token密钥在k8s-master初始化时生成的

kubeadm join =192.168.90.220:6443 --token mrmhs6.bxlyxuaz5ug68x4z \
    --discovery-token-ca-cert-hash sha256:efe69c7e82331ff97543e9fbeff929bc23c378e899dcff2e8a2d70e8990c8687

微信截图_20211119100248.png

安装完成以后可以看到节点都添加进来了

kubectl get node

微信截图_20211119100349.png

在k8s-master节点部署CNI网络插件Flannel,如果安装失败,我们可以下载这个yml文件到本地然后再试

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

查看是否安装成功

kubectl get pod -n kube-system

微信截图_20211119100434.png

在k8s-master节点使用kubectl工具查看节点状态

kubectl get nodes

微信截图_20211119100516.png

查看集群健康状态

kubectl get cs
kubectl cluster-info

微信截图_20211119100654.png

报如下错误

NAME                 STATUS      MESSAGE                                                    ERROR
controller-manager   Unhealthy   Get http://127.0.0.1:10252/healthz: dial tcp 127.0.0.1:10252: connect: connection refused   
scheduler            Unhealthy   Get http://127.0.0.1:10251/healthz: dial tcp 127.0.0.1:10251: connect: connection refused   
etcd-0               Healthy     {"health":"true"}

有点问题,可以按以下方式解决

vi /etc/kubernetes/manifests/kube-scheduler.yaml
vi /etc/kubernetes/manifests/kube-controller-manager.yaml
#将以上两个文件中的- --port=0 注释掉即可
- --port=0

修改完,再次使用查看集群状态

kubectl get node

微信截图_20211119101433.png

kubectl cluster-info

微信截图_20211119100707.png

到此K8S集群环境就部署成功了,本次基本重新整理了下,所有集群软件安装整理的匹配版本v1.18.20,部署中遇到的问题已收集在相应的地方提供了解决方法。

k8s

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://sulao.cn/post/802.html

我要评论

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。