为了学习k8s,想先搭个集群玩一下,没想到这一搭就是3天,还没有完全完善,先把前面的步骤给记录一下以免忘记。
由于我是一台学校内的自己建的服务器,一台是购买的腾讯云的服务器,因此不在同一个局域网内,节点之间无法直接通信,给搭建带来了许多麻烦,参考了N多文章总结出下述版本。
1.设备准备
两台服务器,均是2核、4G内存以上配置,一台ubuntu16系统,一台ubuntu18系统。默认都在root模式下,sudo su开启。
2.环境准备
2.1内核参数调整(还没研究作用)
cat > k8s.conf <<EOF
#开启网桥模式
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
#开启转发
net.ipv4.ip_forward = 1
##关闭ipv6
net.ipv6.conf.all.disable_ipv6=1
EOF
cp k8s.conf /etc/sysctl.d/k8s.conf
sysctl -p /etc/sysctl.d/k8s.conf
2.2修改主机名
vi /etc/hostname
vi /etc/hosts
#其中每一台服务器都需要修改,并且要把所有的hostip hostname数据对都写入hosts文件中
#其中hostip如果是内网的话,就写各自服务器对应的内网ip,如果是跨局域网连接,这里可能要写对应的公网ip
?
2.3关闭防火墙、swap分区
# 为了方便本操作关闭了防火墙,也建议你这样操作
systemctl stop firewalld
systemctl disable firewalld
# 关闭 SeLinux
setenforce 0
sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config
# 临时关闭 swap
swapoff -a
#开启
swapoff -a
#永久关闭
# 用vi修改/etc/fstab文件,在swap分区这行前加 # 禁用掉,保存退出
vi /etc/fstab
2.4调整时区一致
timedatectl status #检查所有节点的时区时间是否一致,如果不一致可以执行下列命令
# 设置系统时区为 中国/上海
timedatectl set-timezone Asia/Shanghai
# 将当前的UTC时间写入硬件时钟
timedatectl set-local-rtc 0
# 重启依赖于系统时间的服务
systemctl restart rsyslog
systemctl restart cron
2.5日志服务设置
默认有两个日志服务,使用journald关闭rsyslogd
mkdir /var/log/journal # 持久化保存日志的目录
mkdir /etc/systemd/journald.conf.d
cat > /etc/systemd/journald.conf.d/99-prophet.conf <<EOF
[Journal]
# 持久化
Storage=persistent
# 压缩历史日志
Compress=yes
SysnIntervalSec=5m
RateLimitInterval=30s
RateLimitBurst=1000
# 最大占用空间 10G
SystemMaxUse=10G
# 单日志文件最大 200M
SystemMaxFileSize=200M
# 日志保存时间 2 周
MaxRetentionSec=2week
# 不将日志转发到 syslog
ForwardToSyslog=no
EOF
systemctl restart systemd-journald
2.6虚拟网卡设置(最关键的一步!)
对于跨局域网的节点来说,一定要有外部方法来使得它们之间的信息可以互通,尤其是在当前采用公网ip来搭建k8s集群。通过查阅发现一般有三种方法:
1.利用iptables转发
2.虚拟网卡,在本地虚拟一个绑定公网IP的网卡,把内网的流量复制过来
3.看能不能设置etcd监听的IP。参考k8s——部署基于公网的k8s集群 - 知乎
本文采用第二种方法
首先ubuntu开启ipvs
lsmod | grep ip_vs #检查是否有开启
#临时开启ip_vs
for i in $(ls /lib/modules/$(uname -r)/kernel/net/netfilter/ipvs|grep -o "^[^.]*");do echo $i; /sbin/modinfo -F filename $i >/dev/null 2>&1 && /sbin/modprobe $i; done
#永久开启
ls /lib/modules/$(uname -r)/kernel/net/netfilter/ipvs|grep -o "^[^.]*" >> /etc/modules
然后建立虚拟IP
#ifconfig查看网卡有哪些
#临时建立虚拟网卡,注意如果多个服务器都是公网内网分离,则都需要建立虚拟网卡
ifconfig eth1:0 公网IP netmask 255.255.255.0 up
#删除
ifconfig eth1:0 down
#永久建立
vim /etc/network/interfaces
auto eth1:0
iface eth1:0 inet static
name Ethernet alias LAN card
address 192.168.33.149
netmask 255.255.255.0
broadcast 192.168.33.255
/etc/init.d/networking restart
观察参数修改是否生效命令:
sysctl --system
?
3.docker安装
这一步我是直接参考菜鸟的教程,也可以参考网上各个教程
Ubuntu Docker 安装 | 菜鸟教程
例如下述步骤
# 安装 Docker CE
# 设置仓库
# 安装所需包
yum install -y yum-utils \
device-mapper-persistent-data \
lvm2
# 新增 Docker 仓库,速度慢的可以换阿里云的源。
yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
# 建议国内网络替换为阿里云源地址
# http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 安装 Docker CE,可以换成最新版本.
yum install -y containerd.io-1.2.10 \
docker-ce-19.03.4 \
docker-ce-cli-19.03.4
# 启动 Docker 并添加开机启动
systemctl start docker
systemctl enable docker
4.k8s相关组建安装
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
# 安装kubelet、kubeadm、kubectl
yum install -y kubelet kubeadm kubectl
修改kubelet的文件
vim /usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf
# 注意,这步很重要,如果不做,节点仍然会使用内网IP注册进集群
# 在末尾添加参数 --node-ip=公网IP
# Note: This dropin only works with kubeadm and kubelet v1.11+
[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/sysconfig/kubelet
ExecStart=
ExecStart=/usr/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_CONFIG_ARGS $KUBELET_KUBEADM_ARGS $KUBELET_EXTRA_ARGS --node-ip=公网ip
5.创建master节点
采用kubeadm工具辅助创建,一般有两种模式
kubeadm init --config=xxx.xx
kubeadm init --......一些配置
这里采用第一种模式,建立下列kubeadm.yaml文件,然后运行第一条命令即可
apiVersion: kubeadm.k8s.io/v1beta3
kind: InitConfiguration
apiVersion: kubeadm.k8s.io/v1beta3
kind: ClusterConfiguration
kubernetesVersion: v1.23.0
apiServer:
certSANs: #填写所有kube-apiserver节点的hostname、IP、VIP
- master #请替换为hostname
- 175.24.199.49 #请替换为公网
- 10.0.12.15 #请替换为私网
- 10.96.0.1 #不要替换,此IP是API的集群地址,部分服务会用到
controlPlaneEndpoint: 175.24.199.49
networking:
podSubnet: 192.168.0.0/16 //这里需要根据你使用的网络插件来更换,例如calico就用这个,falnnel需要换成10.244.0.0/16
serviceSubnet: 10.96.0.0/12
kubeProxy:
config:
mode: ipvs #kubeproxy采用ipvs的方式
imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers
如果失败了,就在init命令最后添加-v=10来查看什么错误。并通过kubeadm reset删除原有安装,别忘了如果配置了网络之类的都要单独删除,具体reset命令完成后会给提示。
运行成功以后,需要运行
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
从节点运行(注意这里如果是腾讯云服务器,要在防火墙规则里添加端口6443—TCP允许通过规则)
kubeadm join 公网ip:6443 --token akiuj0.43tnlcp33c8ztycn \
--discovery-token-ca-cert-hash sha256:f22ff568135c06296e98972cec62a9e1f5af0f8cf8f50811c43129523ace3a16
至此一个master一个worker就都已经组建完成了,master还需要配置网络才能真正启动。
1)Calico插件安装:
wget https://docs.projectcalico.org/manifests/calico.yaml
Vim calico.yaml 修改 CALICO_IPV4POOL_CIDR参数和pod-network-cidr一致
kubectl apply -f calico.yaml
2)flannel插件安装:
wget?https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
kubectl apply -f kube-flannel.yml
3)weave插件安装:
kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')"
|