一,环境
机器: 1台master(2c4g) 1台woker(1c2g)
操作系统版本:Ubuntu 22.04.1
用户:root
二. 准备工作 (所有机器)
2.1修改host
# 将master和worker两台主机的名字分别改了
vi /etc/hostname
# 将master和worker的ip分别配置上
vi /etc/hosts
2.2安装docker
apt install -y docker.io
service docker start
usermod -aG docker ${USER}
# 修改docker的驱动配置为systemd
cat <<EOF | sudo tee /etc/docker/daemon.json
{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2"
}EOF
# 重启docker
sudo systemctl enable docker
sudo systemctl daemon-reload
sudo systemctl restart docker
# 如果想复核一下,查看docker的驱动的方法:
docker info | grep -i "Cgroup Driver"
2.3修改转发配置,修改iptables
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
br_netfilter
EOF
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward=1 # better than modify /etc/sysctl.conf
EOF
sudo sysctl --system
2.4修改swap分区
sudo swapoff -a
sudo sed -ri '/\sswap\s/s/^#?/#/' /etc/fstab
附:此处是在别的版本上遇到问题时的一些解决方法,不需要执行!!!不需要执行!!!
# 关闭防火墙,可以通过firewall-cmd --list-ports查看开放的端口,否则即使disable了firewalld,其实端口还是关着的
systemctl start firewalld
firewall-cmd --zone=public --add-port=6443/tcp --permanent
firewall-cmd --reload
systemctl disable firewalld
systemctl stop firewalld
# 巨坑,有的机器还有iptables的规则配置,也需要放通
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
# 关闭selinux
# 临时禁用selinux
setenforce 0
# 永久关闭 修改/etc/sysconfig/selinux文件设置
sed -i 's/SELINUX=permissive/SELINUX=disabled/' /etc/sysconfig/selinux
sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config
三. 下载相关镜像(所有机器)
3.1安装kubeadm
sudo apt install -y apt-transport-https ca-certificates curl
curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | sudo apt-key a
cat <<EOF | sudo tee /etc/apt/sources.list.d/kubernetes.list
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF
sudo apt update
apt install -y kubeadm=1.23.3-00 kubelet=1.23.3-00 kubectl=1.23.3-00
# 锁定版本
apt-mark hold kubeadm kubelet kubectl
3.2下载各个组件的镜像
repo=registry.aliyuncs.com/google_containers
for name in `kubeadm config images list --kubernetes-version v1.23.3`; do
src_name=${name#k8s.gcr.io/}
src_name=${src_name#coredns/}
docker pull $repo/$src_name
docker tag $repo/$src_name $name
docker rmi $repo/$src_name
done
四. 安装master节点
4.1初始化:–pod-network-cidr,设置集群里 Pod 的 IP 地址段。 --apiserver-advertise-address,设置 apiserver 的 IP 地址,对于多网卡服务器来说很重要(比如 VirtualBox 虚拟机就用了两块网卡),可以指定 apiserver 在哪个网卡上对外提供服务 。
kubeadm init \
--pod-network-cidr=10.10.0.0/16 \
--apiserver-advertise-address=192.168.33.10 \
--kubernetes-version=v1.23.3
4.2按照提示,创建配置文件
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
4.3保留让子节点加入的命令,如果丢失,可以通过下面命令获取
kubeadm token create --print-join-command
4.4使用任意浏览器下载:https://raw.githubusercontent.com/flannel-io/flannel/v0.20.2/Documentation/kube-flannel.yml
将文件内容在master机器中,拷贝至任意路径下,新建的一个flannel.yml文件中,修改其中的net-conf.json 字段,其中Network 改为上面init时填入的–pod-network-cidr参数。然后执行kubectl apply -f flannel.yml
net-conf.json: |
{
"Network": "10.10.0.0/16",
"Backend": {
"Type": "vxlan"
}
}
附:
如果出现问题,可以通过journalctl -xfeu kubelet能看到error信息。解决后再
rm -rf $HOME/.kube
kubeadm reset
# 重复上述的init操作
五. 安装Worker节点
加入Master节点的集群
# 加入集群 这里加入集群的命令每个人都不一样,根据主节点kubeadm token create --print-join-command的结果来执行
kubeadm join 192.168.33.10:6443 --token kcnq89.a7f2hsvlioyyko2a --discovery-token-ca-cert-hash sha256:ec019c01b1751a609259827b65cda70fde7e2242849934a8b22c4708772e2c94
加入成功后,可以在master节点上使用kubectl get nodes命令查看到加入的节点。
问题参考
一
在安装成功后。kubectl看不了worker节点的日志,也无法通过exec连上worker节点。但是其他自动伸缩、部署之类的都能在worker节点上拉起pod。
最后是通过在worker节点上,修改/etc/hosts,把master和worker的ip加上去才好了。
二
先使用kubectl get po -o wide获取各个pod所在节点。然后登陆某个节点的一个pod上(不能直接在节点上ping,因为pod是建立在虚拟网络上,节点ping pod是肯定ping不通的),ping另一个节点的pod的ip,发现ping不通。
后来发现是因为flannel启动时,使用的网卡不对,在vagrant部署时,多生成了一块网卡。参考https://www.jianshu.com/p/ed1ae8443fff解决了问题。
具体方法是,修改flannel.yml文件中,对应着command为flanneld的那个代码块,在args中加上- -iface=网卡名(对应host-only模式的那个网卡,比如192.168.33.10)。然后kubectl replace --force -f flannel.yml