当前位置:   article > 正文

基于CentOS 7.6搭建Kubernetes 1.17.3集群demo_kubenets 1.17.3

kubenets 1.17.3

本demo仅涉及基本的Kubernetes功能实践与介绍,无高可用配置。部署版本为当前时间阿里开源镜像站提供的最新版本1.17.3。

部署环境

IP地址主机名角色操作系统主机配置
192.168.88.21k8s-01masterCentOS 7.64U8G
192.168.88.22k8s-02nodeCentOS 7.64U8G
192.168.88.23k8s-03nodeCentOS 7.64U8G

安装准备

以下操作除特殊说明外在所有节点执行

域名解析

cat >> /etc/hosts <<EOF
192.168.88.21 k8s-01
192.168.88.22 k8s-02
192.168.88.23 k8s-03
EOF
  • 1
  • 2
  • 3
  • 4
  • 5

关闭SELinux和防火墙

各节点运行的kube-proxy组件均要借助iptables或ipvs构建Service对象,为避免干扰在部署Kubernetes之前关闭SELinux和防火墙。

setenforce 0
sed -i 's/=enforcing/=disabled/' /etc/sysconfig/selinux
systemctl stop firewalld 
systemctl disable firewalld
  • 1
  • 2
  • 3
  • 4

配置yum源

centos

mv -f /etc/yum.repos.d/*.repo /tmp/
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
yum clean all
yum makecache fast
  • 1
  • 2
  • 3
  • 4

docker-ce

yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
  • 1
  • 2

kubernetes

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
yum clean all
yum makecache fast
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

时间同步

将master节点配置成NTP服务器,再将node节点的时间与master节点同步。

在master节点部署NTP服务器

yum -y install ntp
sed -i 17c"restrict 0.0.0.0 mask 255.255.255.0 nomodify notrap" /etc/ntp.conf
sed -i 20a"server 127.127.1.0" /etc/ntp.conf
sed -i 21a"fudge 127.127.1.0 stratum 10" /etc/ntp.conf
systemctl enable ntpd
systemctl restart ntpd
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

在node节点同步时间

yum -y install ntp
ntpdate k8s-01
  • 1
  • 2

禁用swap

临时禁用

swapoff -a
  • 1

永久禁用

sed -i '/swap/s/^/#/' /etc/fstab
  • 1

如果内存资源吃紧,也可以选择在执行 kubeadm init 时设置忽略检查错误。

加载br_netfilter模块

本Kubernetes集群demo网络插件使用flannel,该网络需要设置内核参数bridge-nf-call-iptables=1,修改这个参数需要系统有br_netfilter模块。

查看br_netfilter模块

lsmod |grep br_netfilter
  • 1

如果系统没有br_netfilter模块则执行下面的新增命令,如有则忽略以下操作。

临时新增br_netfilter模块

modprobe br_netfilter
  • 1

该方式重启后会失效

永久新增br_netfilter模块

cat > /etc/rc.sysinit << EOF
#!/bin/bash
for file in /etc/sysconfig/modules/*.modules ; do
[ -x \$file ] && \$file
done
EOF
cat > /etc/sysconfig/modules/br_netfilter.modules << EOF
modprobe br_netfilter
EOF
chmod +x /etc/sysconfig/modules/br_netfilter.modules
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

内核参数修改

内核参数临时修改

sysctl net.bridge.bridge-nf-call-iptables=1
sysctl net.bridge.bridge-nf-call-ip6tables=1
  • 1
  • 2

内核参数永久修改

cat > /etc/sysctl.d/k8s.conf <<EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl -p /etc/sysctl.d/k8s.conf
  • 1
  • 2
  • 3
  • 4
  • 5

加载ipvs内核模块

Kubernetes默认使用ipvs代理模式的Service资源,但它依赖的ipvs相关的内核模块不会自动加载,需要手动载入。

cat > ipvs.modules <<EOF
#!/bin/bash
ipvs_mods_dir="/usr/lib/modules/\$(uname -r)/kernel/net/netfilter/ipvs"
for i in \$(ls \$ipvs_mods_dir | grep -o "^[^.]*");  do
    /sbin/modinfo -F filename \$i &> /dev/null
    if [ \$? -eq 0 ]; then
        /sbin/modprobe \$i
    fi
done
EOF
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

修改文件权限,并且手动为当前系统环境加载内核模块

chmod +x /etc/sysconfig/modules/ipvs.modules
/etc/sysconfig/modules/ipvs.modules
lsmod |grep ip_vs
  • 1
  • 2
  • 3

部署docker容器运行环境

以下操作除特殊说明外在所有节点执行

安装docker-ce

docker版本列举

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

选择指定版本安装(无要求直接安装最新版)

yum -y install docker-ce
systemctl enable docker
systemctl restart docker
  • 1
  • 2
  • 3

Docker文件配置

Docker自动设置iptables的FORWARD链默认策略为DROP,会影响到Kubernetes集群依赖的报文转发功能,因此需要在docker启动后重新将FORWARD链的默认策略设置为ACCEPT。

sed -i '/ExecStart=\/usr\/bin\/dockerd/aExecStartPost=/usr/sbin/iptables -P FORWARD ACCEPT' /usr/lib/systemd/system/docker.service
  • 1

配置镜像加速器

国内访问DockerHub下载镜像的速度较慢,建议使用国内的镜像对其进行加速(这里的操作与修改Cgroup Driver合并)

修改Cgroup Driver

cat >> /etc/docker/daemon.json <<EOF
{
  "registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"],
  "exec-opts": ["native.cgroupdriver=systemd"]
}
EOF
systemctl daemon-reload
systemctl restart docker
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

部署Kubernetes

以下操作除特殊说明外在所有节点执行

安装kubelet、kubeadm和kubectl

kubelet是运行于集群每个节点上的Kubernetes代理程序,以自托管方式部署的Kubernetes集群,除kubelet和docker外的所有组件均以Pod的形式运行。

  • kubelet 运行在集群所有节点上,用于启动Pod和容器等对象的工具
  • kubeadm 用于初始化集群,启动集群的命令工具
  • kubectl 用于和集群通信的命令行,通过kubectl可以部署和管理应用,查看各种资源,创建、删除和更新各种组件

检查版本

yum list |grep kube
yum list kubelet --showduplicates
  • 1
  • 2

安装

yum -y install kubelet-1.17.3-0 kubeadm-1.17.3-0 kubectl-1.17.3-0
  • 1

配置kubelet

编辑kubelet的配置文件 /etc/sysconfig/kubelet,忽略禁止使用swap的限制(可选)

KUBELET_EXTRA_ARGS="--fail-swap-on=false"
  • 1

设置kubelet服务开机自启(kubeadm强制要求)

systemctl enable kubelet
  • 1

kubectl命令补全

在master节点执行

echo "source <(kubectl completion bash)" >> ~/.bash_profile
source .bash_profile
  • 1
  • 2

集群初始化

以下操作在master节点执行

编辑集群初始化配置文件

将集群初始化配置文件导出

kubeadm config print init-defaults --kubeconfig ClusterConfiguration > kubeadm.yml
  • 1

修改配置文件里主机IP地址为本机地址

  advertiseAddress: 192.168.88.21
  • 1

修改配置文件里获取系统镜像时使用的镜像仓库

imageRepository: registry.aliyuncs.com/google_containers
  • 1

修改配置文件里声明的kubernetes版本

kubernetesVersion: v1.17.3
  • 1

设置Pod网络

  podSubnet: 10.244.0.0/16
  • 1

下载镜像

查看所需镜像列表

kubeadm config images list --config kubeadm.yml
  • 1

提前拉取镜像

kubeadm config images pull --config kubeadm.yml
  • 1

集群初始化

根据准备好的配置文件进行初始化

kubeadm init --config kubeadm.yml
  • 1

初始化成功会得到以下信息,注意一定要留存

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

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.88.21:6443 --token abcdef.0123456789abcdef \
    --discovery-token-ca-cert-hash sha256:dfcb727e5828cc811e710edbdb1dde5b104bb4f2650177fa30efbffad5ab0e0f 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

加载环境变量

根据上面给出的提示执行

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

验证各组件是否正常

kubectl get cs
NAME                 STATUS    MESSAGE             ERROR
scheduler            Healthy   ok                  
controller-manager   Healthy   ok                  
etcd-0               Healthy   {"health":"true"}   
  • 1
  • 2
  • 3
  • 4
  • 5

部署网络插件

在master节点使用在线版的配置文件部署flannel

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

查看node状态

kubectl get node
NAME     STATUS   ROLES    AGE   VERSION
k8s-01   Ready    master   67m   v1.17.3
  • 1
  • 2
  • 3

将Node节点加入集群

在node节点执行集群初始化时获得的kubeadm join命令

kubeadm join 192.168.88.21:6443 --token abcdef.0123456789abcdef \
    --discovery-token-ca-cert-hash sha256:dfcb727e5828cc811e710edbdb1dde5b104bb4f2650177fa30efbffad5ab0e0f
  • 1
  • 2

再次查看集群节点状态

kubectl get node
NAME     STATUS   ROLES    AGE     VERSION
k8s-01   Ready    master   80m     v1.17.3
k8s-02   Ready    <none>   5m57s   v1.17.3
  • 1
  • 2
  • 3
  • 4

到此一个基础的Kubernetes集群部署完成。

部署问题记录

selinux状态变为Enforcing

安装docker-ce时安装了一个依赖软件包:container-selinux,此后Linux系统中的selinux被其取代,此时查看selinux的状态发现变为Enforcing,但是并不影响Kubernetes的部署。

Cgroup Driver不符合要求

docker默认使用的Cgroup Driver是cgroupfs,而Kubernetes推荐使用的是systemd。

直接进行集群初始化会报错并退出,需要修改。

cat >> /etc/docker/daemon.json <<EOF
{
  "exec-opts": ["native.cgroupdriver=systemd"]
}
EOF
systemctl daemon-reload
systemctl restart docker
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

[ERROR FileContent–proc-sys-net-bridge-bridge-nf-call-iptables]: /proc/sys/net/bridge/bridge-nf-call-iptables contents are not set to 1

提示需要修改一个内核参数

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

集群初始化失败重新执行

如果第一次集群初始化已经将apiserver等Pod拉起但是后面失败的话,重新执行初始化命令会提示pod已经存在、端口已被占用等等信息,此时需要将集群重置。

kubeadm reset
  • 1

因为网络原因无法通过在线的配置清单部署flannel

使用阿里云服务器将配置清单下载

wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
  • 1
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/128295
推荐阅读
相关标签
  

闽ICP备14008679号