赞
踩
本demo仅涉及基本的Kubernetes功能实践与介绍,无高可用配置。部署版本为当前时间阿里开源镜像站提供的最新版本1.17.3。
IP地址 | 主机名 | 角色 | 操作系统 | 主机配置 |
---|---|---|---|---|
192.168.88.21 | k8s-01 | master | CentOS 7.6 | 4U8G |
192.168.88.22 | k8s-02 | node | CentOS 7.6 | 4U8G |
192.168.88.23 | k8s-03 | node | CentOS 7.6 | 4U8G |
以下操作除特殊说明外在所有节点执行
cat >> /etc/hosts <<EOF
192.168.88.21 k8s-01
192.168.88.22 k8s-02
192.168.88.23 k8s-03
EOF
各节点运行的kube-proxy组件均要借助iptables或ipvs构建Service对象,为避免干扰在部署Kubernetes之前关闭SELinux和防火墙。
setenforce 0
sed -i 's/=enforcing/=disabled/' /etc/sysconfig/selinux
systemctl stop firewalld
systemctl disable firewalld
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
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
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
将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
在node节点同步时间
yum -y install ntp
ntpdate k8s-01
临时禁用
swapoff -a
永久禁用
sed -i '/swap/s/^/#/' /etc/fstab
如果内存资源吃紧,也可以选择在执行 kubeadm init 时设置忽略检查错误。
本Kubernetes集群demo网络插件使用flannel,该网络需要设置内核参数bridge-nf-call-iptables=1,修改这个参数需要系统有br_netfilter模块。
查看br_netfilter模块
lsmod |grep br_netfilter
如果系统没有br_netfilter模块则执行下面的新增命令,如有则忽略以下操作。
临时新增br_netfilter模块
modprobe br_netfilter
该方式重启后会失效
永久新增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
内核参数临时修改
sysctl net.bridge.bridge-nf-call-iptables=1
sysctl net.bridge.bridge-nf-call-ip6tables=1
内核参数永久修改
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
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
修改文件权限,并且手动为当前系统环境加载内核模块
chmod +x /etc/sysconfig/modules/ipvs.modules
/etc/sysconfig/modules/ipvs.modules
lsmod |grep ip_vs
以下操作除特殊说明外在所有节点执行
docker版本列举
yum list docker-ce --showduplicates |sort -r
选择指定版本安装(无要求直接安装最新版)
yum -y install docker-ce
systemctl enable docker
systemctl restart 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
国内访问DockerHub下载镜像的速度较慢,建议使用国内的镜像对其进行加速(这里的操作与修改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
以下操作除特殊说明外在所有节点执行
kubelet是运行于集群每个节点上的Kubernetes代理程序,以自托管方式部署的Kubernetes集群,除kubelet和docker外的所有组件均以Pod的形式运行。
检查版本
yum list |grep kube
yum list kubelet --showduplicates
安装
yum -y install kubelet-1.17.3-0 kubeadm-1.17.3-0 kubectl-1.17.3-0
编辑kubelet的配置文件 /etc/sysconfig/kubelet,忽略禁止使用swap的限制(可选)
KUBELET_EXTRA_ARGS="--fail-swap-on=false"
设置kubelet服务开机自启(kubeadm强制要求)
systemctl enable kubelet
在master节点执行
echo "source <(kubectl completion bash)" >> ~/.bash_profile
source .bash_profile
以下操作在master节点执行
将集群初始化配置文件导出
kubeadm config print init-defaults --kubeconfig ClusterConfiguration > kubeadm.yml
修改配置文件里主机IP地址为本机地址
advertiseAddress: 192.168.88.21
修改配置文件里获取系统镜像时使用的镜像仓库
imageRepository: registry.aliyuncs.com/google_containers
修改配置文件里声明的kubernetes版本
kubernetesVersion: v1.17.3
设置Pod网络
podSubnet: 10.244.0.0/16
查看所需镜像列表
kubeadm config images list --config kubeadm.yml
提前拉取镜像
kubeadm config images pull --config kubeadm.yml
根据准备好的配置文件进行初始化
kubeadm init --config kubeadm.yml
初始化成功会得到以下信息,注意一定要留存
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
根据上面给出的提示执行
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
kubectl get cs
NAME STATUS MESSAGE ERROR
scheduler Healthy ok
controller-manager Healthy ok
etcd-0 Healthy {"health":"true"}
在master节点使用在线版的配置文件部署flannel
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
查看node状态
kubectl get node
NAME STATUS ROLES AGE VERSION
k8s-01 Ready master 67m v1.17.3
在node节点执行集群初始化时获得的kubeadm join命令
kubeadm join 192.168.88.21:6443 --token abcdef.0123456789abcdef \
--discovery-token-ca-cert-hash sha256:dfcb727e5828cc811e710edbdb1dde5b104bb4f2650177fa30efbffad5ab0e0f
再次查看集群节点状态
kubectl get node
NAME STATUS ROLES AGE VERSION
k8s-01 Ready master 80m v1.17.3
k8s-02 Ready <none> 5m57s v1.17.3
到此一个基础的Kubernetes集群部署完成。
安装docker-ce时安装了一个依赖软件包:container-selinux,此后Linux系统中的selinux被其取代,此时查看selinux的状态发现变为Enforcing,但是并不影响Kubernetes的部署。
docker默认使用的Cgroup Driver是cgroupfs,而Kubernetes推荐使用的是systemd。
直接进行集群初始化会报错并退出,需要修改。
cat >> /etc/docker/daemon.json <<EOF
{
"exec-opts": ["native.cgroupdriver=systemd"]
}
EOF
systemctl daemon-reload
systemctl restart docker
提示需要修改一个内核参数
echo 1 > /proc/sys/net/bridge/bridge-nf-call-iptables
如果第一次集群初始化已经将apiserver等Pod拉起但是后面失败的话,重新执行初始化命令会提示pod已经存在、端口已被占用等等信息,此时需要将集群重置。
kubeadm reset
使用阿里云服务器将配置清单下载
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。