centos7使用docker部署k8s集群环境

Kubernetes是一个开源的,用于管理云平台中多个主机上的容器化的应用,Kubernetes的目标是让部署容器化的应用简单并且高效(powerful),Kubernetes提供了应用部署,规划,更新,维护的一种机制。
系统约定

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

设置主机名,在每个节点设置对应的主机名

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
fs.may_detach_mounts = 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,首先安装源

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

列出所有版本

yum list docker-ce --showduplicates | sort -r

安装并固定版本

yum install -y docker-ce-19.03.15 docker-ce-cli-19.03.15

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

systemctl enable docker
systemctl start docker
docker --version #查看docker版本

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

mkdir -p /etc/docker
cat > /etc/docker/daemon.json <<EOF
{
  "exec-opts": ["native.cgroupdriver=systemd"],    
  "registry-mirrors": ["https://b9pmyelo.mirror.aliyuncs.com"],
  "log-driver": "json-file",
  "log-opts":{ "max-size":"10m","max-file":"1"},
  "storage-driver": "overlay2",
  "insecure-registries": ["192.168.1.78:5000"]
}
EOF

重载,并重启服务

systemctl daemon-reload
systemctl restart docker

安装kubeadm、kubelet和kubectl,首先我们添加安装源

cat > /etc/yum.repos.d/kubernetes.repo << EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=0
EOF

然后进行k8s相关组件的安装

yum install -y kubelet-1.23.0 kubeadm-1.23.0 kubectl-1.23.0

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

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

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

systemctl enable kubelet

在k8s-master操作,首先生成default.yaml部署配置文件

cd /etc/kubernetes
kubeadm config print init-defaults > default.yaml

然后修改配置文件

sed -i "s/1.2.3.4/0.0.0.0/" /etc/kubernetes/default.yaml #修改集群能被所有ip访问
sed -i "s#k8s.gcr.io#registry.cn-hangzhou.aliyuncs.com/google_containers#" /etc/kubernetes/default.yaml #修改成国内源
sed -i '/10.96.0.0\/12/a\  podSubnet: 10.244.0.0\/16' /etc/kubernetes/default.yaml #增加POD网段
sed -i "s/name: node/name: $HOSTNAME/g" /etc/kubernetes/default.yaml #配置文件默认节点不是主机名,替换成主机名

然后初始化集群,注意此处记录下生成的token密钥

kubeadm init --config=default.yaml

微信截图_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