熬命肝出来的kubernets安装攻略
一、安装环境
Windows(VirtualBox(ubuntu22.04.1))、虚拟机准备三台分别作为Console(也可以使用Master、Worker作为Console)、Master(最低配置两核四G)、Worker(配置相比于Master节点可以略低一些)
kubeadm/kubernets1.23.3、CNI插件0.7.1
Docker:latest
二、相关配置
1、由于kubernets使用主机名来区分集群节点,所以每个节点hostname不能重名
sudo vi /etc/hostname j节点名字最好具有辨识度如设置为Master、Worker
2、修改/etc/docker/daemon.json把cgroup驱动程序改成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
sudo systemctl enable docker
sudo systemctl daemon-reload
sudo systemctl restart docker
3、为了让kubernets能够检查、转发网络流量、需要修改iptables配置、启用br_netfilter模块
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
4、修改/etc/fstab,关闭Linux的swap分区,提升Kubernets性能,tip:不关的话有可能导致kubectl启动不了
sudo swapoff -a
sudo sed -ri ‘/|sswaps/s/^#?/#/’ /etc/fstab
5、重启系统,Tip:记得拍个快照做备份哦
reboot
三、安装kubeadm
1、首先在Master节点安装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 add -
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
第二步:下载安装kubeadm:1.23.3
sudo apt install -y kubeadm=1.23.3-00 kubelet=1.23.3-00 kubectl=1.23.3-00
Tip:下载kubeadm有可能遇到的坑之GPG错误、当然如果没有遇到更好
解决办法如下:
gpg –keyserver keyserver.ubuntu.com –recv ED444FF07D8D0BF6(gpg里提示的,仔细看下能找到)
gpg –export –armor ED444FF07D8D0BF6 | sudo apt-key add –
之后执行 apt-get update 就可以成功了
使用以下命令验证kubeadm、kubectl是否下载成功
kubeadm version
kubectl version --client
如果出现版本号、恭喜你成功了,如果不成功我也没办法了毕竟我没遇到过,哈哈
第三步:按照官方的要求,我们最好锁定这三个软件的版本,具体做法
sudo apt-mart hold kubeadm kubelet kubectl
2、在Master节点下载kubernets镜像
因为这些镜像是放在Google自己的镜像仓库网站gcr.io,他的访问较为困难,所以我这里采用的是从国内镜像网站下载,然后使用tag改名,使用shell编程实现自动化
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
Tip:这种方法有隐患,万一网站不提供服务,或者改动了镜像就比较危险了
四、安装初始化Master节点
使用kubeadm init就可以,不过需要注意以下参数可以使用-h查看
Tip:如果init过程中出现10250端口被占用情况,那说明你已经失败过了,问题不大,使用kubeadm reset命令之后再次init
sudo kubeadm init
--pod-network-cidr=10.10.0.0/16
--apiserver-advertise-address=192.168.10.210
--kubernetes-version=v1.23.3
10.10.0.0/16是指定的Pod的地址段
192.168.10.210是虚拟机其中一块网卡的Ip(可以使用ifconfig命令查看)选择哪个网卡,就说明使用哪个网卡对外提供服务
如果你有两个网卡,那么对应的应该会有两个eth0(当然这个标签不是固定的,自行斟酌)
安装完之后可能会有如下提示,按照要求跟着做就是了,一定要做,不做的话你的pod可能会因为签名问题起不来
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
还有一个很重要的kubeadm join提示,其他节点加入集群全指望这个命令的token和ca证书,所以一定要保存好
Then you can join any number of worker nodes by running the following on each as root:
kubeadm join 192.168.10.210:6443 --token tv9mkx.tw7it9vphe158e74
--discovery-token-ca-cert-hash sha256:e8721b8630d5b562e23c010c70559a6d3084f629abad6a2920e87855f8fb96f3
通过kubectl get node 查看节点状态,此时应该只能看到一个master节点,而且status显示应该还是NotReady
通过kubectl get pods –all-namespaces查看pod运行情况,会发现有两个DNS POD正处于Pending状态
以上原因主要是因为缺少网络插件,这里采用Flannel
五、安装Flannel、和CNI
1、安装Flannel、友情提示先看下边的tip提示
安装flannel我们可以使用kube-flannel.yml文件在kubernets里部署就可以了,部署之前需要在该文件里修改net-conf.json字段
把Network改成kubeadm初始化时指定的–pod-network-cidr对应的地址段也就是10.10.0.0/16
net-conf.json: |
{
"Network": "10.10.0.0/16",
"Backend": {
"Type": "vxlan"
}
}
改好之后使用命令:kubectl apply -f kube-flannel.yml 就可以完成安装Flannel网络了
Tip:以下才是重点,必坑绝技
如何下载kube-flannel.yml文件?
使用以下命令
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
但是,记住但是,这样子你很可能是下载不了的,当然不是绝对,我在云服务器上就能下载下来,只是很慢而已,但是在虚拟机上直接超时压根下载不了。
怎么办呢?不急,咱绕个弯。
首先在网上先找到kube-flannel.yml文件的内容,拷贝下来然后在你的主机上先创建一个kube-flannel.yml(路径没有要求哈)
搞好之后,下一步就是如何把这个文件搞到VirtualBox虚拟机上,当然方法不唯一呀
我这里使用的是主机与虚拟机共享文件夹的方式,我感觉这种方式可以快速的调试
然后在虚拟机里创建相应的文件比如/home/共享
再执行挂在指令:sudo mount -t vboxsf 共享 /home /共享
最后就可以试一下,在主机的共享文件夹下新建一个文件,在虚拟机的共享文件夹下能不能看到,成了恭喜你迈出了一大步
最后一个坑:flannel安装成功,并且相应的pod已经启动,但是两个DNS POD还是pending状态,node节点还是Notready处于不可用状态
这个问题的原因就是因为未安装CNI插件:根据以下方法安装
cd /server/software/k8s
wget https://github.com/containernetworking/plugins/releases/download/v0.7.1/cni-plugins-amd64-v0.7.1.tgz
mkdir -pv /opt/cni/bin
tar xf cni-plugins-amd64-v0.7.1.tgz -C /opt/cni/bin
ls -l /opt/cni/bin
cd $HOME
vi /etc/cni/net.d/10-mynet.conf
{
"cniVersion": "0.7.0",
"name": "mynet",
"type": "bridge",
"bridge": "cni0",
"isGateway": true,
"ipMasq": true,
"ipam": {
"type": "host-local",
"subnet": "172.30.0.0/16",
"routes": [
{ "dst": "0.0.0.0/0" }
]
}
}
cat >/etc/cni/net.d/99-loopback.conf <<EOF
{
"cniVersion": "0.6.0",
"name": "lo",
"type": "loopback"
}
EOF
以下操作我还没尝试,但是此时我的node状态和pod状态都已经可以了,如果你的还是不行那就继续下边的步骤吧
etcdctl
--endpoints=${ETCD_ENDPOINTS}
--ca-file=/etc/kubernetes/cert/ca.pem
--cert-file=/etc/flanneld/cert/flanneld.pem
--key-file=/etc/flanneld/cert/flanneld-key.pem
ls ${FLANNEL_ETCD_PREFIX}/subnets
/kubernetes/network/subnets/172.30.43.0-24
/kubernetes/network/subnets/172.30.49.0-24
/kubernetes/network/subnets/172.30.30.0-24
/kubernetes/network/subnets/172.30.44.0-24
echo 1 > /sys/devices/virtual/net/docker0/bridge/nf_call_iptables
插件必须设置net/bridge/bridge-nf-call-iptables sysctl为1,以确保iptables代理功能正常。